@cristiancorreau/forge 3.0.1 → 3.2.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +265 -109
  3. package/assets/adapters/claude-code/commands/laravel-eloquent.md +7 -0
  4. package/assets/adapters/claude-code/commands/laravel-mcp.md +7 -0
  5. package/assets/adapters/claude-code/commands/laravel-pest.md +7 -0
  6. package/assets/adapters/claude-code/commands/laravel-security.md +7 -0
  7. package/assets/adapters/claude-code/commands/laravel-verify.md +7 -0
  8. package/assets/core/hooks/pre-bash-check.js +46 -0
  9. package/assets/core/hooks/pre-edit-check.js +24 -1
  10. package/assets/core/schemas/project.schema.json +3 -1
  11. package/assets/core/skills/laravel-eloquent/SKILL.md +453 -0
  12. package/assets/core/skills/laravel-mcp/SKILL.md +468 -0
  13. package/assets/core/skills/laravel-pest/SKILL.md +686 -0
  14. package/assets/core/skills/laravel-security/SKILL.md +658 -0
  15. package/assets/core/skills/laravel-verify/SKILL.md +462 -0
  16. package/assets/manifest.json +27 -2
  17. package/assets/profiles/astro/agents/frontend-engineer.md +2 -0
  18. package/assets/profiles/django/agents/api-engineer.md +2 -0
  19. package/assets/profiles/expo/agents/mobile-engineer.md +2 -0
  20. package/assets/profiles/express/agents/api-engineer.md +2 -0
  21. package/assets/profiles/fastapi/agents/api-engineer.md +2 -0
  22. package/assets/profiles/flask/agents/api-engineer.md +2 -0
  23. package/assets/profiles/flutter/agents/mobile-engineer.md +12 -10
  24. package/assets/profiles/go-gin/agents/api-engineer.md +3 -1
  25. package/assets/profiles/hono-drizzle/agents/api-engineer.md +2 -0
  26. package/assets/profiles/laravel/README.md +16 -2
  27. package/assets/profiles/laravel/agents/api-engineer.md +2 -0
  28. package/assets/profiles/laravel/agents/fullstack-engineer.md +4 -2
  29. package/assets/profiles/laravel/agents/laravel-specialist.md +607 -0
  30. package/assets/profiles/laravel/agents/laravel-test-engineer.md +448 -0
  31. package/assets/profiles/nestjs/agents/api-engineer.md +3 -1
  32. package/assets/profiles/nextjs-admin/agents/admin-engineer.md +2 -0
  33. package/assets/profiles/playwright-crawler/agents/scanner-engineer.md +2 -0
  34. package/assets/profiles/rails/agents/fullstack-engineer.md +2 -0
  35. package/assets/profiles/rust/agents/api-engineer.md +2 -0
  36. package/assets/profiles/springboot/agents/api-engineer.md +11 -9
  37. package/assets/profiles/sveltekit/agents/frontend-engineer.md +4 -2
  38. package/assets/profiles/vuenuxt/agents/frontend-engineer.md +12 -10
  39. package/assets/profiles/wordpress/agents/divi-engineer.md +2 -0
  40. package/assets/profiles/wordpress/agents/elementor-engineer.md +2 -0
  41. package/dist/cli.js +15 -0
  42. package/dist/cli.js.map +1 -1
  43. package/dist/commands/add.d.ts +2 -0
  44. package/dist/commands/add.d.ts.map +1 -0
  45. package/dist/commands/add.js +187 -0
  46. package/dist/commands/add.js.map +1 -0
  47. package/dist/commands/mcp.d.ts +42 -0
  48. package/dist/commands/mcp.d.ts.map +1 -0
  49. package/dist/commands/mcp.js +141 -0
  50. package/dist/commands/mcp.js.map +1 -0
  51. package/dist/commands/update.d.ts +30 -0
  52. package/dist/commands/update.d.ts.map +1 -0
  53. package/dist/commands/update.js +180 -0
  54. package/dist/commands/update.js.map +1 -0
  55. package/dist/commands/validate.d.ts.map +1 -1
  56. package/dist/commands/validate.js +40 -1
  57. package/dist/commands/validate.js.map +1 -1
  58. package/dist/lib/catalog.d.ts +7 -0
  59. package/dist/lib/catalog.d.ts.map +1 -1
  60. package/dist/lib/catalog.js +20 -0
  61. package/dist/lib/catalog.js.map +1 -1
  62. package/dist/lib/mcp-tools.d.ts +37 -0
  63. package/dist/lib/mcp-tools.d.ts.map +1 -0
  64. package/dist/lib/mcp-tools.js +124 -0
  65. package/dist/lib/mcp-tools.js.map +1 -0
  66. package/dist/lib/skill-security.d.ts +66 -0
  67. package/dist/lib/skill-security.d.ts.map +1 -0
  68. package/dist/lib/skill-security.js +225 -0
  69. package/dist/lib/skill-security.js.map +1 -0
  70. package/dist/lib/skill-source.d.ts +29 -0
  71. package/dist/lib/skill-source.d.ts.map +1 -0
  72. package/dist/lib/skill-source.js +94 -0
  73. package/dist/lib/skill-source.js.map +1 -0
  74. package/dist/tui/dashboard.d.ts.map +1 -1
  75. package/dist/tui/dashboard.js +3 -6
  76. package/dist/tui/dashboard.js.map +1 -1
  77. package/dist/tui/panel.d.ts.map +1 -1
  78. package/dist/tui/panel.js +3 -6
  79. package/dist/tui/panel.js.map +1 -1
  80. package/dist/tui/wizard.d.ts.map +1 -1
  81. package/dist/tui/wizard.js +3 -13
  82. package/dist/tui/wizard.js.map +1 -1
  83. package/dist/ui/colors.d.ts +3 -1
  84. package/dist/ui/colors.d.ts.map +1 -1
  85. package/dist/ui/colors.js +11 -2
  86. package/dist/ui/colors.js.map +1 -1
  87. package/dist/ui/header.d.ts.map +1 -1
  88. package/dist/ui/header.js +4 -3
  89. package/dist/ui/header.js.map +1 -1
  90. package/dist/ui/theme.d.ts +24 -0
  91. package/dist/ui/theme.d.ts.map +1 -0
  92. package/dist/ui/theme.js +32 -0
  93. package/dist/ui/theme.js.map +1 -0
  94. package/dist/version.d.ts +1 -1
  95. package/dist/version.js +1 -1
  96. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,44 @@ Versioning: [Semantic Versioning](https://semver.org/lang/es/)
7
7
 
8
8
  ---
9
9
 
10
+ ## [3.2.0] — 2026-06-06
11
+
12
+ > Ecosistema Laravel 13 + dos features nuevas (registro abierto y servidor MCP), refuerzo de seguridad, resiliencia de versiones e identidad visual ember.
13
+
14
+ ### Agregado
15
+ - **`forge add <owner/repo[@ref]>`** (SPEC-045) — instala skills desde una fuente externa detrás de una pipeline de seguridad en capas (higiene Unicode, scan de riesgo offline por severidad, degradación en banda, capability-scoping). La red es **opt-in y vive solo en este comando**; pin a sha inmutable + provenance en `.forge/externals.json`. Los guardrail hooks son el backstop en runtime.
16
+ - **`forge mcp`** (SPEC-047 / RFC-003) — servidor MCP **stdio-only, opt-in**, con 2 tools dinámicos read-only: `guardrail_status` (veredicto vivo de los hooks) y `wiki_search` (búsqueda confinada a `wiki/`). El SDK de MCP es lazy y **no es dependencia** (cold-start de `npx` intacto). Regla de oro: MCP es aditivo, nada del conocimiento vive solo ahí (enforced por test de allowlist).
17
+ - **Skills + agentes de Laravel 13** (SPEC-044) — 5 skills (`laravel-eloquent`, `laravel-pest`, `laravel-security`, `laravel-verify`, `laravel-mcp`) + 2 agentes Tier 2 (`laravel-specialist`, `laravel-test-engineer`).
18
+
19
+ ### Cambiado
20
+ - **Paleta ember del CLI** (SPEC-048) — el terminal (banner, header y TUI wizard/dashboard/panel) ahora usa el acento ember `#ff8a1c` sobre near-black, unificado con el landing. Nuevo `ui/theme.ts` compartido + gradiente por fila del banner.
21
+
22
+ ### Seguridad
23
+ - **Refuerzo de la capa Guardrail** (SPEC-046) — `pre-bash-check.js` bloquea **incondicionalmente** (no solo en prod) exfiltración de secretos (`.env`/`id_rsa`/`~/.ssh`/`~/.aws` por red), ofuscación (`base64 -d | sh`) y reverse shells, sin falsos positivos en instaladores `curl|sh`. `pre-edit-check.js` advierte sobre escalada de privilegios en `.claude/settings.json`.
24
+
25
+ ### Resiliencia de versiones (RFC-002)
26
+ - El guard anti-staleness de `assets.test.mjs` era un no-op (solo cazaba el major con coma); ahora caza el major pelado de 12 frameworks y su scope cubre skills/commands. Se purgaron las 74 aserciones de versión mayor en assets forge-owned y se propagó la **directiva operativa de detección de versión a tiempo-de-uso** a los 24/25 profile agents (lee el manifiesto y contrasta contra el código instalado).
27
+
28
+ ### Documentación
29
+ - **RFC-001/002/003** en `docs/proposals/` (qué tomar de Laravel 13/Boost, resiliencia de versiones, servidor MCP recortado). README: logo = banner FORGE en SVG + imágenes por URL absoluta (renderizan en GitHub y npm).
30
+
31
+ ---
32
+
33
+ ## [3.1.0] — 2026-06-05
34
+
35
+ > Cierre de los 5 follow-ups acumulados tras la migración a CLI TS (SPEC-043).
36
+
37
+ ### Agregado
38
+ - **Comando `forge update [--dry-run] [--force]`** (#75). Re-sincroniza los archivos gestionados por forge (agentes, hooks, slash commands) con el catálogo bundleado **respetando tus ediciones locales**. Lee `.forge/manifest.json`, compara para cada archivo el hash en disco vs. el de instalación (¿lo editaste?) y vs. la fuente actual del catálogo: actualiza los no modificados, **preserva** los editados por el usuario (salvo `--force`), restaura los que falten y refresca el manifest. `--dry-run` imprime el plan sin escribir; es idempotente. Mapea `.claude/hooks/* → core/hooks/*`, `.claude/commands/* → adapters/claude-code/commands/*`, `.claude/agents/* → core/agents/*` (o el `agents/` de un profile); los archivos generados (CLAUDE.md, settings.json, architecture.rules) nunca se tocan.
39
+ - **Detección de debug para Java/Kotlin, Rust y Dart** en `core/hooks/pre-edit-check.js` (#72). Nuevos patrones: `System.out.print(ln)?` / `printStackTrace(` (Java/Kotlin), `println!` / `eprintln!` / `dbg!` (Rust), `debugPrint(` (Dart/Flutter). Se agregaron `.kt` y `.dart` a la lista de extensiones de código para que el hook los clasifique como tales.
40
+ - **Automatización de publicación de la extensión VS Code** (#73, References). `.github/workflows/publish-vscode.yml` (`workflow_dispatch` + tag `vscode-v*`) empaqueta y publica con `@vscode/vsce` usando el secret `VSCE_PAT`; documentado en `vscode-extension/README.md`. La primera publicación al Marketplace requiere que el maintainer cargue el PAT.
41
+ - **Checklist de validación en Windows** (#74, References). `docs/windows-validation.md` con los pasos para validar el render OpenTUI en Windows real (Bun + Windows Terminal, conhost legacy, fallback `FORGE_ASCII` y Node).
42
+
43
+ ### Corregido
44
+ - **`forge validate` ya no rechaza profiles válidos por drift del enum** (#71). La validación de `agents.profiles` ahora se resuelve **dinámicamente** desde el directorio `profiles/` del forge root: acepta cualquier profile que exista como directorio y solo marca los inexistentes. Además se agregaron `laravel` y `wordpress` al enum de `core/schemas/project.schema.json` (que pasa a ser documentación de referencia, ya que la validación es dinámica).
45
+
46
+ ---
47
+
10
48
  ## [3.0.1] — 2026-06-05
11
49
 
12
50
  ### Eliminado
package/README.md CHANGED
@@ -1,191 +1,347 @@
1
- # forge
1
+ <div align="center">
2
2
 
3
- [![tests](https://github.com/cristiancorreau/forge/actions/workflows/tests.yml/badge.svg)](https://github.com/cristiancorreau/forge/actions/workflows/tests.yml)
4
- [![npm](https://img.shields.io/npm/v/@cristiancorreau/forge)](https://www.npmjs.com/package/@cristiancorreau/forge)
5
- [![license](https://img.shields.io/badge/license-Apache%202.0-green)](LICENSE)
3
+ <br>
6
4
 
7
- **Configura cualquier proyecto para trabajar con agentes IA en un comando.**
5
+ <!-- forge logo SVG (vectorial, nítido). Ruta relativa: GitHub lo sirve como image/svg+xml. -->
6
+ <img alt="forge" height="92" src="docs/assets/forge-logo.svg">
8
7
 
9
- Wizard interactivo que detecta tu stack, instala agentes especializados, genera guardrails y mantiene un manifest con SHA-256 para auditar cada cambio.
8
+ <br>
9
+ <br>
10
+
11
+ ### Configura cualquier proyecto para trabajar con agentes de IA en un solo comando
12
+
13
+ Un equipo de agentes, todos los runtimes — **Claude Code · OpenCode · Codex CLI · Kiro** desde un único `project.yaml`.
14
+
15
+ <br>
16
+
17
+ [![npm version](https://img.shields.io/npm/v/@cristiancorreau/forge?style=for-the-badge&labelColor=0a0a0a&color=FF9F1C&logo=npm)](https://www.npmjs.com/package/@cristiancorreau/forge)
18
+ [![CI tests](https://img.shields.io/github/actions/workflow/status/cristiancorreau/forge/tests.yml?branch=main&style=for-the-badge&labelColor=0a0a0a&color=FFD26F&label=tests)](https://github.com/cristiancorreau/forge/actions/workflows/tests.yml)
19
+ [![license](https://img.shields.io/badge/license-Apache--2.0-FF9F1C?style=for-the-badge&labelColor=0a0a0a)](LICENSE)
20
+ [![node](https://img.shields.io/badge/node-%3E%3D20-FFD26F?style=for-the-badge&labelColor=0a0a0a&logo=node.js&logoColor=white)](https://nodejs.org)
21
+
22
+ <br>
23
+
24
+ **[Landing](https://cristiancorreau.github.io/forge/)**
25
+ &nbsp;&nbsp;•&nbsp;&nbsp;
26
+ **[Documentación](docs/guide.md)**
27
+ &nbsp;&nbsp;•&nbsp;&nbsp;
28
+ **[npm](https://www.npmjs.com/package/@cristiancorreau/forge)**
29
+ &nbsp;&nbsp;•&nbsp;&nbsp;
30
+ **[Issues](https://github.com/cristiancorreau/forge/issues)**
31
+
32
+ <br>
33
+
34
+ </div>
35
+
36
+ ```bash
37
+ npx @cristiancorreau/forge init
38
+ ```
39
+
40
+ <div align="center">
41
+
42
+ <br>
43
+
44
+ <img alt="Panel interactivo de forge en la terminal (OpenTUI): agentes, skills, hooks y profiles" width="780" src="https://raw.githubusercontent.com/cristiancorreau/forge/main/docs/assets/cli-preview.png">
45
+
46
+ <sub>El panel interactivo de forge (<code>forge panel</code>) requiere Bun (OpenTUI) — explora agentes, skills, hooks y profiles sin salir de la terminal.</sub>
47
+
48
+ <br>
49
+
50
+ </div>
51
+
52
+ ---
53
+
54
+ ## ¿Qué es forge?
55
+
56
+ **forge** es un framework de _agentic development_ multi-runtime. Un solo comando analiza tu proyecto, instala un equipo de agentes especializados, cablea guardrails de seguridad y deja un `project.yaml` como **única fuente de verdad** desde la que se regenera la configuración nativa de cada runtime de IA.
57
+
58
+ En vez de copiar y pegar reglas de agentes entre proyectos y entre herramientas, defines el equipo **una vez** y forge lo materializa para Claude Code, OpenCode, Codex CLI y Kiro.
59
+
60
+ - 🤖 **Equipos de agentes multi-runtime** — 7 agentes universales + 19 profiles de stack
61
+ - 📐 **Flujo SDD spec-first** — ninguna tarea de código sin una spec `APPROVED`
62
+ - 🪝 **Guardrail hooks en JS puro** — branch-guard, debug, secretos y prod-safety, cero Python
63
+ - 🔁 **Un `project.yaml`, cada CLI** — Claude Code, OpenCode, Codex, Kiro
64
+ - ⚖️ **Compliance con veto vinculante** — revisor GDPR/LGPD/CCPA que bloquea el merge
65
+ - 🔄 **Operaciones reversibles** — manifest SHA-256 + `--dry-run` para auditar cada cambio
66
+ - 📚 **Knowledge base del proyecto** — wiki que ingesta, lintea y responde con citas
67
+
68
+ ---
69
+
70
+ ## ¿Por qué forge?
71
+
72
+ ### vs. reglas de agente hechas a mano
73
+
74
+ - **Un `project.yaml`, cuatro runtimes** — escribes el equipo una vez, no cuatro.
75
+ - **Spec-first por defecto** — el `orchestrator` rechaza spawnear agentes sin spec aprobada.
76
+ - **Guardrails ya cableados** — hooks de seguridad listos, sin instalar nada de Python.
77
+ - **Regenerable** — `forge generate` reconstruye todo el equipo desde la fuente de verdad.
78
+
79
+ ### vs. copiar y pegar agentes entre proyectos
80
+
81
+ - **TIERs componibles** — universal → stack → dominio, con resolución de colisiones predecible.
82
+ - **19 profiles de stack** listos — Next.js, FastAPI, Django, Rails, Laravel, Go, Rust, Flutter…
83
+ - **Operaciones reversibles** — manifest SHA-256 detecta drift; `forge teardown` desinstala limpio.
84
+ - **Drift bajo control** — `forge update` re-sincroniza con el catálogo preservando tus ediciones.
10
85
 
11
86
  ---
12
87
 
13
88
  ## Instalación
14
89
 
15
- forge corre con **Node.js 20+** y funciona con cualquier gestor.
90
+ forge corre con **Node.js 20+**. Con **Bun** se desbloquea el panel full-screen (OpenTUI, `@opentui/core`); en Node cae a prompts [@clack](https://github.com/bombshell-dev/clack); en consolas legacy, a ASCII.
16
91
 
17
- **Probar sin instalar** (one-off con `npx`):
92
+ **Probar sin instalar:**
18
93
 
19
94
  ```bash
20
95
  npx @cristiancorreau/forge init
21
96
  ```
22
97
 
23
- **Instalar el comando global `forge`** (para usar `forge init`, `forge doctor`, … directo):
98
+ **Instalar el comando global `forge`:**
24
99
 
25
100
  ```bash
26
- npm install -g @cristiancorreau/forge # npm
27
- pnpm add -g @cristiancorreau/forge # pnpm (requiere `pnpm setup` una vez)
28
- bun add -g @cristiancorreau/forge # bun (requiere ~/.bun/bin en el PATH)
101
+ npm install -g @cristiancorreau/forge
29
102
  ```
30
103
 
31
- Luego:
104
+ <details>
105
+ <summary>Otros gestores y troubleshooting de PATH</summary>
106
+
107
+ <br>
32
108
 
33
109
  ```bash
34
- forge init
110
+ pnpm add -g @cristiancorreau/forge # pnpm (requiere `pnpm setup` una vez)
111
+ bun add -g @cristiancorreau/forge # bun (requiere ~/.bun/bin en el PATH)
112
+ ```
113
+
114
+ ¿El comando `forge` no se reconoce tras el install global? El directorio de binarios globales no está en tu `PATH`. `npx @cristiancorreau/forge <cmd>` siempre funciona sin instalar; para el comando a secas:
115
+
116
+ - **npm:** `export PATH="$(npm prefix -g)/bin:$PATH"`
117
+ - **pnpm:** ejecuta `pnpm setup` y reabre la terminal
118
+ - **bun:** agrega `export PATH="$HOME/.bun/bin:$PATH"` a tu shell rc
119
+
120
+ </details>
121
+
122
+ ---
123
+
124
+ ## Quickstart (30 s)
125
+
126
+ ```bash
127
+ # 1. Inicializa forge en tu proyecto
128
+ # (wizard: detecta stack, instala agentes + hooks, escribe el manifest)
129
+ npx @cristiancorreau/forge init
130
+
131
+ # 2. Verifica el entorno y la conformidad
35
132
  forge doctor
36
- forge --version
133
+ forge validate
134
+
135
+ # 3. Regenera la configuración nativa de cada runtime desde project.yaml
136
+ forge generate
37
137
  ```
38
138
 
39
- > **El comando `forge` no se reconoce tras el install global?** El directorio de binarios
40
- > globales no está en tu `PATH`. `npx @cristiancorreau/forge <cmd>` siempre funciona sin
41
- > instalar; para el comando pelado:
42
- > - **npm:** `export PATH="$(npm prefix -g)/bin:$PATH"`
43
- > - **pnpm:** corré `pnpm setup` y reabrí la terminal
44
- > - **bun:** agregá `export PATH="$HOME/.bun/bin:$PATH"` a tu shell rc
139
+ ¿Ya tienes un codebase en marcha? Intégralo sin partir de cero:
140
+
141
+ ```bash
142
+ forge adopt # analiza el repo existente + auto-wiki
143
+ ```
45
144
 
46
145
  ---
47
146
 
48
- ## Cómo funciona
147
+ ## Las 5 capas
49
148
 
50
- El wizard detecta y configura el proyecto en cinco pasos:
149
+ forge se organiza en cinco capas que van de la fuente de verdad a la materialización por runtime.
51
150
 
52
- 1. **Detecta el stack** — lee `package.json`, lockfiles y `Dockerfile` para identificar framework, lenguaje y dependencias.
53
- 2. **Selecciona agentes** — muestra un selector de flechas con los agentes disponibles para tu stack (TypeScript, Python, Ruby, Go, PHP).
54
- 3. **Instala configuración** escribe `.claude/agents/`, `CLAUDE.md`, `settings.json` y `architecture.rules` en el repositorio.
55
- 4. **Instala hooks** genera hooks de guardrail en JavaScript puro; sin dependencias de Python ni binarios externos.
56
- 5. **Crea el manifest** `forge/.forge/manifest.json` con SHA-256 de cada archivo gestionado para rastrear derivaciones futuras.
151
+ | Capa | Responsabilidad |
152
+ |------|-----------------|
153
+ | 🧠 **Memory** | `project.yaml` como única fuente de verdad — stack, equipo, skills, reglas. |
154
+ | 📚 **Knowledge** | Agentes + profiles de stack que aportan el saber de cada rol y framework. |
155
+ | 🛡️ **Guardrail** | Enforcement de compliance y seguridad: hooks, branch-guard, detección de secretos. |
156
+ | 🎯 **Delegation** | Orquestación y despacho de skills: qué agente atiende qué tarea. |
157
+ | 📡 **Distribution** | Adapters de runtime que traducen la fuente de verdad a Claude Code, OpenCode, Codex y Kiro. |
57
158
 
58
159
  ---
59
160
 
60
- ## Funcionalidades
161
+ ## Sistema de TIERs
61
162
 
62
- | Funcionalidad | Descripción | Estado | Runtime |
63
- |---|---|---|---|
64
- | 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 |
65
- | 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 |
66
- | 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 |
67
- | 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 |
68
- | 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 |
69
- | Operaciones reversibles | Manifest SHA-256 + dry-run para instalaciones reversibles y verificables. | 🚧 | Claude Code, OpenCode, Codex, Kiro |
70
- | Multi-runtime | Un mismo proyecto forge se adapta a varios runtimes con sus marcadores de detección y niveles de soporte. | ✅ | Claude Code (completo), OpenCode, Codex, Kiro |
71
- | Auto-detección de stack | Detección por marcadores (`CLAUDE.md`+`.claude/`, `AGENTS.md`+`.opencode/`, `.codex/`, `.kiro/`) para activar profiles y adapters. | 🚧 | Claude Code, OpenCode, Codex, Kiro |
72
- | Skills | Biblioteca de skills invocables (`spec`, `new-feature`, `security-audit`, `db-migrate`, `local2prod`, `browser-test`, `wiki-*`, etc.). | ✅ | Claude Code, OpenCode, Codex, Kiro |
73
- | Compliance (GDPR/LGPD/CCPA) | `compliance-reviewer` (Tier 1, model opus) revisa cada PR contra los marcos de compliance activos con poder de veto vinculante antes de mergear. | ✅ | Claude Code, OpenCode, Codex, Kiro |
74
- | forge wiki (knowledge base) | Knowledge base del proyecto: ingesta fuentes, compila páginas, mantiene índice y responde queries citando páginas (`wiki-ingest` / `wiki-lint` / `wiki-query`). | 🚧 | Claude Code, OpenCode, Codex, Kiro |
75
- | Browser testing | Automatización de navegador (agent-browser sobre CDP) para verificar UI, flujos críticos, evidencia y diffs visuales/responsive (`/browser-test`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
76
- | DB migrations | Flujo seguro de migraciones compatible con Prisma, Drizzle, ActiveRecord, Alembic y Goose (`/db-migrate`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
77
- | Deploy a producción | Publicación con gate `READY/SUCCESS` sobre Vercel, Railway, Fly.io, GitHub Actions y pipelines custom (`/local2prod`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
78
- | Migración v1→v2 | Migración de `project.yaml` v1 a v2 con detección automática de versión, soporte `--dry-run` y `--backup` (`forge migrate`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
79
- | Scaffold / Teardown | `forge scaffold` genera profiles Tier 2 (`--force`, `--description`, `--stack-details`) y `forge teardown` desinstala forge limpiamente vía manifest (`--dry-run`, `--keep-config`). Ambos en la CLI TypeScript con tests. | ✅ | Claude Code, OpenCode, Codex, Kiro |
80
-
81
- Leyenda: ✅ disponible · 🚧 parcial · ❌ pendiente.
163
+ Tres niveles componibles, de lo general a lo específico. Cada tier hereda y especializa al anterior; ante una colisión, gana el más concreto.
164
+
165
+ | Tier | Qué es | Ejemplos |
166
+ |------|--------|----------|
167
+ | **Tier 1 universal** | 7 agentes definidos por su _output_, no por el stack. Sirven en cualquier proyecto. | `orchestrator`, `backend-engineer`, `frontend-engineer`, `test-engineer`, `docs-writer`, `compliance-reviewer`, `security-auditor` |
168
+ | **Tier 2 stack** | Los mismos roles con instrucciones del framework. 19 profiles disponibles. | Next.js, FastAPI, Django, Rails, Laravel, Go-Gin, Rust, NestJS… |
169
+ | **Tier 3 dominio** | Agentes que conocen el negocio del proyecto. Viven en el repo, se registran en `agents.specialized`. | `dsar-specialist`, `gcm-engineer`, `policy-engineer`… |
170
+
171
+ Detalle completo en [docs/tiers.md](docs/tiers.md).
82
172
 
83
173
  ---
84
174
 
85
175
  ## Comandos
86
176
 
177
+ Los 16 comandos de la CLI.
178
+
87
179
  | Comando | Qué hace |
88
180
  |---------|----------|
89
- | `forge init` | Wizard completo: detecta stack, instala agentes, hooks y genera configuración |
90
- | `forge generate` | Regenera configuración nativa de cada runtime desde `project.yaml` sin ejecutar el wizard completo |
91
- | `forge migrate` | Migra `project.yaml` del schema v1 al v2 (`--dry-run`, `--backup`) |
92
- | `forge scaffold` | Genera un agente nuevo: profile Tier 2 o agente de dominio Tier 3 (`--tier 3`, `--name`) |
93
- | `forge teardown` | Desinstala forge del proyecto de forma limpia vía manifest (`--dry-run`, `--keep-config`) |
94
- | `forge audit` | Verifica el estado del proyecto contra el manifest; detecta archivos modificados o faltantes |
95
- | `forge validate` | Valida que los archivos generados cumplan el esquema esperado |
96
- | `forge doctor` | Health-check del entorno: Node.js, git, runtime de IA activo, permisos |
97
- | `forge skills` | Lista los skills disponibles agrupados por categoría |
98
- | `forge aitmpl-search` | Busca en el catálogo curado offline (frameworks, MCP servers, profiles) |
99
- | `forge session-start` | Abre una sesión de trabajo: detecta estado del repo y enruta |
100
- | `forge session-close` | Cierra una sesión de trabajo: commit daily note sync → PR |
101
- | `forge wiki` | Gestiona la knowledge base del proyecto (`status` \| `ingest` \| `query` \| `lint`) |
102
-
103
- > **Dashboard post-install.** Cuando `forge init` corre con Bun, al terminar abre un dashboard interactivo navegable con OpenTUI: panel con paneles para explorar agentes instalados, skills, profiles activos y estado del manifest sin salir de la terminal. Con Node.js el wizard cae al flujo de prompts estándar.
181
+ | `forge init` | Wizard completo: detecta el stack, instala agentes y hooks, escribe el manifest. |
182
+ | `forge adopt` | Onboarda forge en un codebase **existente** (análisis + auto-wiki). |
183
+ | `forge generate` | Regenera la configuración nativa de cada runtime desde `project.yaml`. |
184
+ | `forge update` | Re-sincroniza archivos gestionados con el catálogo preservando ediciones locales (drift SHA-256). |
185
+ | `forge validate` | Valida que `project.yaml` y los archivos generados cumplan el esquema. |
186
+ | `forge doctor` | Health-check del entorno: Node.js, git, runtime de IA activo, permisos. |
187
+ | `forge migrate` | Migra `project.yaml` del schema v1 al v2 (`--dry-run`, `--backup`). |
188
+ | `forge audit` | Verifica el proyecto contra el manifest; detecta archivos modificados o faltantes. |
189
+ | `forge scaffold` | Genera un agente nuevo: profile Tier 2 o agente de dominio Tier 3. |
190
+ | `forge teardown` | Desinstala forge del proyecto de forma limpia vía manifest (`--dry-run`, `--keep-config`). |
191
+ | `forge skills` | Lista los skills disponibles agrupados por categoría. |
192
+ | `forge aitmpl-search` | Busca en el catálogo curado offline (frameworks, MCP servers, profiles). |
193
+ | `forge wiki` | Gestiona la knowledge base del proyecto (`status` \| `ingest` \| `query` \| `lint`). |
194
+ | `forge panel` | Panel interactivo OpenTUI (config / monitor / skills / hooks / templates). |
195
+ | `forge session-start` | Abre una sesión de trabajo: detecta el estado del repo y enruta. |
196
+ | `forge session-close` | Cierra una sesión: commit → daily note → sync → PR. |
197
+
198
+ > **Panel interactivo.** Con Bun, `forge panel` (y el dashboard post-`init`) abre un panel navegable OpenTUI para explorar agentes, skills, hooks y profiles sin salir de la terminal. Con Node cae al flujo de prompts estándar.
104
199
 
105
200
  ---
106
201
 
107
- ## Runtimes soportados
202
+ ## Stacks / Profiles (19)
203
+
204
+ Profiles Tier 2 listos para activar. Cada uno aporta reglas de arquitectura, convenciones de código y patrones del framework.
205
+
206
+ <details open>
207
+ <summary>Ver los 19 profiles</summary>
108
208
 
109
- | Runtime | Soporte |
110
- |---------|---------|
111
- | **Claude Code** | Completo agentes, `CLAUDE.md`, `settings.json`, hooks |
112
- | **OpenCode** | `AGENTS.md` generado |
113
- | **Codex CLI** | `AGENTS.md` enriquecido para contexto de proyecto |
114
- | **Kiro** | Steering files |
209
+ <br>
210
+
211
+ | TypeScript / JS | Python | PHP | Otros |
212
+ |---|---|---|---|
213
+ | `astro` | `django` | `laravel` | `go-gin` (Go) |
214
+ | `express` | `fastapi` | `wordpress` | `rust` |
215
+ | `hono-drizzle` | `flask` | | `springboot` (Java) |
216
+ | `nestjs` | | | `rails` (Ruby) |
217
+ | `nextjs-admin` | | | `flutter` (Dart) |
218
+ | `sveltekit` | | | |
219
+ | `vuenuxt` | | | |
220
+ | `expo` | | | |
221
+ | `playwright-crawler` | | | |
222
+
223
+ </details>
115
224
 
116
225
  ---
117
226
 
118
- ## Stacks soportados
227
+ ## Runtimes
119
228
 
120
- | Lenguaje | Frameworks |
121
- |----------|------------|
122
- | TypeScript | Hono, Next.js, NestJS, Astro |
123
- | Python | FastAPI, Django |
124
- | Ruby | Rails |
125
- | Go | Gin |
126
- | PHP | Laravel |
229
+ Un mismo proyecto forge se adapta a cuatro runtimes, cada uno con su salida nativa.
127
230
 
128
- Cada stack instala agentes especializados con reglas de arquitectura, convenciones de código y patrones específicos del framework.
231
+ | Runtime | Soporte | Salida |
232
+ |---------|---------|--------|
233
+ | **Claude Code** | ✅ Completo | `CLAUDE.md`, `.claude/agents/`, `.claude/commands/`, `.claude/settings.json`, hooks |
234
+ | **OpenCode** | ✅ Soportado | `AGENTS.md` generado desde la raíz |
235
+ | **Codex CLI** | ✅ Soportado | `AGENTS.md` enriquecido para contexto de proyecto |
236
+ | **Kiro** | 🔭 Monitoring | steering files (`.kiro/steering/*.md`) |
237
+
238
+ Detalle por runtime en [docs/runtimes/](docs/runtimes/).
129
239
 
130
240
  ---
131
241
 
132
- ## Sistema de TIERs
242
+ ## Skills
133
243
 
134
- forge organiza agentes y configuración en tres niveles que se componen de lo general a lo específico. Cada tier hereda y especializa al anterior, y la resolución de colisiones favorece siempre al tier más concreto.
244
+ 12 skills **generales** que encapsulan flujos completos, mapeados por runtime y disparables como slash commands (`/spec`, `/new-feature`, `/db-migrate`…), más skills **por stack**.
135
245
 
136
- **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.
246
+ | Skill | Para qué |
247
+ |-------|----------|
248
+ | `spec` | Redacta specs SDD en `docs/specs/`. |
249
+ | `new-feature` | Kickoff de feature spec-first, de plan a deploy. |
250
+ | `security-audit` | Checklist de auditoría de seguridad. |
251
+ | `db-migrate` | Migraciones seguras (Prisma, Drizzle, ActiveRecord, Alembic, Goose). |
252
+ | `local2prod` | Deploy con gate de producción multi-provider. |
253
+ | `browser-test` | Verificación de UI y flujos críticos vía navegador. |
254
+ | `phase-kickoff` | Arranque de una fase del roadmap. |
255
+ | `obsidian-sync` | Sincronización con Obsidian. |
256
+ | `aitmpl-search` | Busca en el catálogo curado offline. |
257
+ | `wiki-ingest` | Ingesta fuentes a la knowledge base. |
258
+ | `wiki-lint` | Lintea la consistencia de la wiki. |
259
+ | `wiki-query` | Responde queries citando páginas de la wiki. |
137
260
 
138
- **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.
261
+ > Además, `session-start` y `session-close` están disponibles como comandos de la CLI.
139
262
 
140
- **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`.
263
+ > **Skills por stack.** El profile **Laravel** suma 5 skills orientados a Laravel 13: `/laravel-eloquent`, `/laravel-pest`, `/laravel-security`, `/laravel-verify` y `/laravel-mcp` (Boost, `laravel/mcp`, AI SDK, embeddings/pgvector).
141
264
 
142
- Detalle completo en [docs/tiers.md](docs/tiers.md).
265
+ Catálogo completo en [docs/skills.md](docs/skills.md).
143
266
 
144
267
  ---
145
268
 
146
- ## Skills
269
+ ## SDD: spec-first, no opcional
147
270
 
148
- forge incluye 14 skills invocables que encapsulan flujos completos: `session-start` (abre sesión), `session-close` (cierra sesión), `spec` (redacta specs SDD), `new-feature` (kickoff de feature spec-first), `security-audit`, `db-migrate`, `local2prod` (deploy con gate de producción), `browser-test`, `phase-kickoff`, `obsidian-sync`, `aitmpl-search` y la familia `wiki-*` (`wiki-ingest`, `wiki-lint`, `wiki-query`) para la knowledge base del proyecto. Se invocan como slash commands (`/spec`, `/new-feature`, `/db-migrate`, …) y se mapean por runtime.
271
+ forge aplica **Spec-Driven Development** con un gate real, no una sugerencia:
149
272
 
150
- Catálogo completo en [docs/skills.md](docs/skills.md).
273
+ - Ninguna tarea de código arranca sin una spec en estado **`APPROVED`** dentro de `docs/specs/`.
274
+ - El **`orchestrator` veta** spawnear agentes de implementación si no hay spec aprobada.
275
+ - El skill `/spec` redacta la spec; `/new-feature` la lleva de plan a deploy.
276
+
277
+ El resultado: el equipo de agentes no improvisa código sobre requisitos ambiguos — primero se acuerda el _qué_, después se genera el _cómo_.
151
278
 
152
279
  ---
153
280
 
154
- ## Node.js, sin dependencias de sistema
281
+ ## Compliance con veto vinculante
282
+
283
+ El agente **`compliance-reviewer`** (Tier 1, model `opus`) revisa cada PR contra los marcos de compliance activos — **GDPR / LGPD / CCPA** — con **poder de veto vinculante** antes de mergear.
284
+
285
+ Sumado a los **guardrail hooks en JavaScript puro** (cero Python):
155
286
 
156
- Toda la CLI corre en Node.js 20+. Los hooks de guardrail son JavaScript puro: no hay dependencias de sistema fuera de Node.js.
287
+ - 🚫 **branch-guard** evita commits directos sobre ramas protegidas.
288
+ - 🐛 **debug detection** — bloquea `console.log` / `print` de depuración.
289
+ - 🔐 **secret detection** — frena secretos hardcodeados antes del commit.
290
+ - 🚀 **prod-safety** — protege operaciones sensibles contra producción.
157
291
 
158
292
  ---
159
293
 
160
294
  ## Comparativa
161
295
 
162
296
  | Capacidad | forge | autoskills | cc-sdd |
163
- |---|---|---|---|
164
- | Enfoque principal | Framework de agentic development end-to-end (agentes + skills + profiles + wiki + compliance) | Librería/colección de skills reutilizables | Spec-Driven Development para Claude Code |
165
- | SDD spec-first con gate | ✅ spec `APPROVED` obligatoria, veto del orchestrator | ❌ | ✅ núcleo del producto |
166
- | Agentes especializados por tier | ✅ Tier 1/2/3 (universal, stack, dominio) | ❌ | ❌ |
167
- | Profiles por stack | ✅ 15+ stacks (Hono, FastAPI, Django, Rails, Laravel, Go, WordPress, Expo…) | 🚧 parcial | ❌ |
168
- | Skills invocables | ✅ 14+ skills | ✅ foco central | 🚧 limitado |
169
- | Multi-runtime | ✅ Claude Code, OpenCode, Codex, Kiro | 🚧 principalmente Claude Code | 🚧 Claude Code + parcial |
170
- | Compliance con veto (GDPR/LGPD/CCPA) | ✅ `compliance-reviewer` vinculante | ❌ | ❌ |
171
- | Hooks de guardrail (branch/secrets/prod) | 🚧 parcial, sin Python | ❌ | ❌ |
172
- | Knowledge base / wiki del proyecto | ✅ ingest/lint/query con citas | ❌ | ❌ |
173
- | Operaciones reversibles (manifest SHA-256, dry-run) | 🚧 parcial | ❌ | ❌ |
174
- | Auto-detección de stack | 🚧 parcial | ❌ | ❌ |
297
+ |---|:---:|:---:|:---:|
298
+ | Enfoque | Framework agentic end-to-end | Colección de skills | SDD para Claude Code |
299
+ | SDD spec-first con gate | ✅ veto del orchestrator | ❌ | ✅ núcleo |
300
+ | Agentes por tier (1/2/3) | | ❌ | ❌ |
301
+ | Profiles de stack | ✅ 19 | 🚧 parcial | ❌ |
302
+ | Skills invocables | ✅ 12 | ✅ foco central | 🚧 |
303
+ | Multi-runtime | ✅ 4 runtimes | 🚧 sobre todo Claude Code | 🚧 |
304
+ | Compliance con veto (GDPR/LGPD/CCPA) | ✅ vinculante | ❌ | ❌ |
305
+ | Guardrail hooks (branch/secrets/prod) | sin Python | ❌ | ❌ |
306
+ | Knowledge base / wiki con citas | ✅ ingest/lint/query | ❌ | ❌ |
307
+ | Operaciones reversibles (SHA-256, dry-run) | | ❌ | ❌ |
175
308
  | Deploy con gate de producción | ✅ multi-provider | ❌ | ❌ |
176
- | Posicionamiento | Plataforma completa de orquestación de agentes, compliance-first y multi-runtime | Catálogo de skills sueltas | Especialista en disciplina de specs |
177
309
 
178
310
  ---
179
311
 
180
312
  ## Documentación
181
313
 
182
- - [Guía completa](docs/guide.md)
183
- - [Skills](docs/skills.md)
184
- - [Wiki / knowledge base](docs/wiki.md)
185
- - [Runtimes](docs/runtimes/)
314
+ - 🌐 **[Landing](https://cristiancorreau.github.io/forge/)** — el pitch en una página.
315
+ - 📖 **[Guía completa](docs/guide.md)**
316
+ - 🧩 **[Skills](docs/skills.md)**
317
+ - 🏗️ **[TIERs](docs/tiers.md)**
318
+ - 📚 **[Wiki / knowledge base](docs/wiki.md)**
319
+ - 📡 **[Runtimes](docs/runtimes/)**
320
+
321
+ ---
322
+
323
+ <div align="center">
324
+
325
+ <br>
326
+
327
+ ### Forja tu equipo de agentes en un comando
328
+
329
+ ```bash
330
+ npx @cristiancorreau/forge init
331
+ ```
332
+
333
+ **[Empieza en la landing →](https://cristiancorreau.github.io/forge/)**
334
+
335
+ <br>
336
+
337
+ <sub>Hecho con fuego, yunque y mucho dogfooding.</sub>
338
+
339
+ <br>
340
+
341
+ </div>
186
342
 
187
343
  ---
188
344
 
189
345
  ## Licencia
190
346
 
191
- Apache 2.0 — Copyright [Cristian Correa](https://github.com/cristiancorreau), 2026.
347
+ [Apache-2.0](LICENSE) — Copyright © 2026 [Cristian Correa](https://github.com/cristiancorreau).
@@ -0,0 +1,7 @@
1
+ # laravel-eloquent
2
+
3
+ Eloquent en Laravel: modelos, relaciones, eager loading y prevención de N+1, casts, scopes y pgvector.
4
+
5
+ Use the laravel-eloquent skill for: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user what to work on. The full playbook lives in core/skills/laravel-eloquent/SKILL.md.
@@ -0,0 +1,7 @@
1
+ # laravel-mcp
2
+
3
+ Laravel para agentes y MCP: Laravel Boost, servidores laravel/mcp, AI SDK, embeddings y RAG con pgvector.
4
+
5
+ Use the laravel-mcp skill for: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user what to work on. The full playbook lives in core/skills/laravel-mcp/SKILL.md.
@@ -0,0 +1,7 @@
1
+ # laravel-pest
2
+
3
+ TDD con Pest 3 (y PHPUnit) en Laravel: factories, fakes, Feature/Unit/HTTP tests y coverage.
4
+
5
+ Use the laravel-pest skill for: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user what to work on. The full playbook lives in core/skills/laravel-pest/SKILL.md.
@@ -0,0 +1,7 @@
1
+ # laravel-security
2
+
3
+ Seguridad Laravel: auth (Sanctum/Fortify/Passport), policies, Form Requests, CSRF, rate limiting y deploy seguro.
4
+
5
+ Use the laravel-security skill for: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user what to work on. The full playbook lives in core/skills/laravel-security/SKILL.md.
@@ -0,0 +1,7 @@
1
+ # laravel-verify
2
+
3
+ Loop de verificación Laravel: Pint, Larastan/PHPStan, Pest con coverage y composer audit.
4
+
5
+ Use the laravel-verify skill for: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user what to work on. The full playbook lives in core/skills/laravel-verify/SKILL.md.
@@ -77,6 +77,38 @@ function matchDangerous(command) {
77
77
  return null;
78
78
  }
79
79
 
80
+ // ---------------------------------------------------------------------------
81
+ // CRITICAL patterns — blocked UNCONDITIONALLY (not just in production context).
82
+ // There is no legitimate development reason for these; they are the runtime
83
+ // backstop against malicious agent instructions (e.g. from a `forge add` skill),
84
+ // bad first-party prompts, or model mistakes. High confidence, low false-positive:
85
+ // plain `curl … | sh` (legit installers) is intentionally NOT here.
86
+ // ---------------------------------------------------------------------------
87
+ // Unambiguous secret-file references only — a `/credentials` URL path or a public
88
+ // `.pem` cert would false-positive, so they are intentionally excluded.
89
+ const SECRET_REF = String.raw`(\.env\b|\bid_rsa\b|/\.ssh/|/\.aws/)`;
90
+ const CRITICAL = [
91
+ // Secret exfiltration over the network (file referenced by a network tool).
92
+ [new RegExp(String.raw`\b(curl|wget|ncat|nc)\b[^\n]*${SECRET_REF}`, 'i'),
93
+ 'exfiltracion de secretos (.env/credenciales enviados por red)'],
94
+ // Secret piped into a network tool.
95
+ [new RegExp(`${SECRET_REF}[^\\n|]*\\|[^\\n]*\\b(curl|wget|ncat|nc)\\b`, 'i'),
96
+ 'exfiltracion de secretos (pipe a una herramienta de red)'],
97
+ // Obfuscated payload: base64-decode piped to an interpreter.
98
+ [/\bbase64\b[^\n]*(-d|--decode|-D)\b[^\n]*\|\s*(sh|bash|zsh|node|python3?|perl|ruby)\b/i,
99
+ 'ofuscacion: base64 decode -> interprete'],
100
+ // Reverse shells.
101
+ [/\bnc\b[^\n]*\s-[a-z]*e\b|\bbash\b\s+-i\b[^\n]*\/dev\/tcp\/|\/dev\/tcp\/\d/i,
102
+ 'reverse shell'],
103
+ ];
104
+
105
+ function matchCritical(command) {
106
+ for (const [re, label] of CRITICAL) {
107
+ if (re.test(command)) return label;
108
+ }
109
+ return null;
110
+ }
111
+
80
112
  function matchForbidden(command, project) {
81
113
  try {
82
114
  const forbidden = (project.rules || {}).forbidden_in_production;
@@ -118,6 +150,20 @@ process.stdin.on('end', () => {
118
150
  if (!command) process.exit(0);
119
151
  dbg(`command: ${command.slice(0, 200)}`);
120
152
 
153
+ // CRITICAL: block unconditionally (exfiltration / obfuscation / reverse shell).
154
+ const critical = matchCritical(command);
155
+ if (critical) {
156
+ const snip = command.slice(0, 120) + (command.length > 120 ? '...' : '');
157
+ process.stdout.write(
158
+ `forge: BLOQUEADO — patron critico de seguridad.\n\n` +
159
+ ` Comando: ${snip}\n Patron: ${critical}\n\n` +
160
+ ` Este patron no tiene un uso legitimo de desarrollo (exfiltracion de\n` +
161
+ ` secretos, ofuscacion o reverse shell). Si una instruccion te pidio esto,\n` +
162
+ ` desconfia de su origen. No se ejecuto nada.\n`
163
+ );
164
+ process.exit(2);
165
+ }
166
+
121
167
  const project = loadProjectYaml();
122
168
  const label = matchDangerous(command) || matchForbidden(command, project);
123
169
  if (!label) process.exit(0);