@cristiancorreau/forge 2.19.0 → 3.0.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 CHANGED
@@ -7,6 +7,40 @@ Versioning: [Semantic Versioning](https://semver.org/lang/es/)
7
7
 
8
8
  ---
9
9
 
10
+ ## [3.0.0] — 2026-06-05
11
+
12
+ > **Release mayor / breaking.** Sunset de la CLI Python legacy (Epic #76).
13
+
14
+ ### Removido
15
+ - **CLI Python legacy eliminada (breaking).** Se removieron `forge.py`, los 11
16
+ `scripts/*.py` (aitmpl-search, forge-add-opportunities, forge-audit,
17
+ forge-generate-all, forge-init, forge-migrate-project-yaml, forge-scaffold-profile,
18
+ forge-teardown, forge-validate-project-yaml, forge-wizard, token-stats), los 19
19
+ `tests/*.py` (suite pytest legacy), `requirements.txt`, `scripts/team-install.sh`
20
+ (helper del flujo legacy por submódulo) y el workflow CI `tests-legacy.yml`. La
21
+ CLI es 100% TypeScript desde la v2.8.0 y `npx @cristiancorreau/forge` es ahora la
22
+ **única** forma soportada de usar forge. La documentación (README, guía, runtimes,
23
+ team-install, RELEASE-CHECKLIST y MIGRATION) se actualizó para quitar el flujo
24
+ `python3 .agentic/...` y las notas de deprecación.
25
+
26
+ **Migración:** quien todavía invoque `python3 .agentic/forge.py` o cualquier
27
+ `scripts/*.py` debe migrar a `npx @cristiancorreau/forge` (ver
28
+ [MIGRATION.md](MIGRATION.md) para el mapeo de comandos). No requiere submódulo,
29
+ ni Python, ni `pip install`.
30
+
31
+ **Se mantiene `Python` como lenguaje de stack:** los profiles FastAPI / Flask /
32
+ Django y sus agentes Tier 2, la detección de `requirements.txt`/`pyproject.toml`
33
+ y la allowlist `Bash(python3 *)` para proyectos Python siguen intactos. Lo
34
+ removido es la *CLI* Python, no el soporte de Python como stack.
35
+
36
+ ### Cambiado
37
+ - **Sync de versión en 4 fuentes** (ya no 5): `packages/cli/package.json`,
38
+ `packages/cli/src/version.ts`, `manifest.json` y `.forge/manifest.json`
39
+ (`forge.py` dejó de existir). `tests.yml` (Node 20/22 en ubuntu + windows-latest)
40
+ es el único gate de tests.
41
+
42
+ ---
43
+
10
44
  ## [2.19.0] — 2026-06-04
11
45
 
12
46
  ### Agregado
package/README.md CHANGED
@@ -8,14 +8,11 @@
8
8
 
9
9
  Wizard interactivo que detecta tu stack, instala agentes especializados, genera guardrails y mantiene un manifest con SHA-256 para auditar cada cambio.
10
10
 
11
- > ⚠️ **Deprecation Notice**: `forge.py` y los scripts Python (`scripts/*.py`) están deprecados y serán removidos en **v3.0.0**.
12
- > Usa `npx @cristiancorreau/forge` para todos los comandos (Node/Bun, sin Python). Ver [MIGRATION.md](MIGRATION.md).
13
-
14
11
  ---
15
12
 
16
13
  ## Instalación
17
14
 
18
- forge corre con **Node.js 20+** (sin Python) y funciona con cualquier gestor.
15
+ forge corre con **Node.js 20+** y funciona con cualquier gestor.
19
16
 
20
17
  **Probar sin instalar** (one-off con `npx`):
21
18
 
@@ -154,13 +151,9 @@ Catálogo completo en [docs/skills.md](docs/skills.md).
154
151
 
155
152
  ---
156
153
 
157
- ## Sin Python requerido
158
-
159
- Toda la CLI corre en Node.js. Los hooks de guardrail son JavaScript puro.
160
-
161
- No hay `pip install`, no hay `requirements.txt`, no hay dependencias de sistema fuera de Node.js 20+.
154
+ ## Node.js, sin dependencias de sistema
162
155
 
163
- > El `forge.py` y los scripts `scripts/*.py` que aún viven en el repositorio son la implementación **legacy** y están **deprecados**: serán removidos en v3.0.0. No los necesitás para usar forge vía `npx @cristiancorreau/forge`. Ver [MIGRATION.md](MIGRATION.md).
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.
164
157
 
165
158
  ---
166
159
 
@@ -131,9 +131,9 @@ OpenCode utiliza un archivo `.opencode/config.json` para configuración a nivel
131
131
 
132
132
  Dado que OpenCode no tiene hooks automáticos, el cumplimiento de los guardrails depende de:
133
133
 
134
- 1. **AGENTS.md bien escrito**: incluir las secciones de guardrails del punto 2 en el AGENTS.md generado por `generate-agents-md.py`.
134
+ 1. **AGENTS.md bien escrito**: incluir las secciones de guardrails del punto 2 en el AGENTS.md generado por `npx @cristiancorreau/forge generate --runtime opencode`.
135
135
  2. **Disciplina de sesión**: usar `/session-start` al comenzar y `/session-close` al terminar para mantener el estado documentado.
136
- 3. **Pre-commit git hook**: el hook de git en `hooks/pre-commit` funciona igual en OpenCode — instalarlo en el proyecto cliente con `git config core.hooksPath .githooks`.
136
+ 3. **Pre-commit git hook**: forge escribe un git hook compartido en `.githooks/pre-commit` (POSIX, sin Python) — instalarlo en el proyecto cliente con `git config core.hooksPath .githooks`.
137
137
 
138
138
  ---
139
139
 
@@ -89,7 +89,7 @@ for _i in 1 2 3 4 5 6; do
89
89
  done
90
90
 
91
91
  if [[ -z "$PROJECT_YAML" ]]; then
92
- check "project.yaml" "warn: project.yaml no encontrado — ejecutar forge-wizard.py"
92
+ check "project.yaml" "warn: project.yaml no encontrado — ejecutar npx @cristiancorreau/forge init"
93
93
  else
94
94
  check "project.yaml" "ok"
95
95
 
@@ -1,6 +1,6 @@
1
1
  # <NOMBRE_PROYECTO> — Contexto del proyecto
2
2
 
3
- Generado por forge v<VERSION>. Actualizar con `/forge generate-claude-md` o `python3 .agentic/scripts/forge-init.py --tool claude-code --force`.
3
+ Generado por forge v<VERSION>. Actualizar con `npx @cristiancorreau/forge generate --runtime claude-code --force`.
4
4
 
5
5
  ## Stack
6
6
 
@@ -28,13 +28,6 @@ Sprint N (14 días por defecto)
28
28
 
29
29
  El progreso se visualiza en `docs/progress.html`.
30
30
 
31
- Para actualizar manualmente:
32
- ```bash
33
- python3 .agentic/scripts/token-stats.py --patch-html docs/progress.html
34
- ```
35
-
36
- Se actualiza automáticamente en cada commit si el pre-commit hook está activo.
37
-
38
31
  ## Estado de las specs en CLAUDE.md
39
32
 
40
33
  Mantener esta sección actualizada:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge",
3
- "version": "2.19.0",
3
+ "version": "3.0.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",
@@ -2,8 +2,8 @@
2
2
  # Roster completo, compliance activo, fases de sprint con specs, CI habilitado.
3
3
  # Renombrar a project.yaml en la raíz del repositorio.
4
4
  #
5
- # CI: ejecutar forge-audit con --json para integrar en pipelines:
6
- # python3 .agentic/scripts/forge-audit.py --json | jq '.summary'
5
+ # CI: ejecutar forge audit con --json para integrar en pipelines:
6
+ # npx @cristiancorreau/forge audit --json | jq '.summary'
7
7
  # Retorna código de salida 1 si hay errores de severidad "error" o "critical".
8
8
 
9
9
  project:
@@ -86,8 +86,8 @@ deploy:
86
86
  branch: "main"
87
87
 
88
88
  # Compliance enterprise: múltiples marcos regulatorios
89
- # forge-audit verifica automáticamente los frameworks listados aquí.
90
- # Usar --json en CI: python3 .agentic/scripts/forge-audit.py --json
89
+ # forge audit verifica automáticamente los frameworks listados aquí.
90
+ # Usar --json en CI: npx @cristiancorreau/forge audit --json
91
91
  compliance:
92
92
  frameworks:
93
93
  - gdpr # Unión Europea
@@ -15,10 +15,10 @@
15
15
  # Secciones: Stack, Tu trabajo, Reglas, Workflow, No hagas
16
16
  # 3. Agregar el profile en agents.profiles (ver abajo)
17
17
  # 4. Documentar el profile en la tabla Tier 2 de docs/agent-standard.md
18
- # 5. Correr: python3 .agentic/scripts/forge-init.py --tool claude-code
18
+ # 5. Correr: npx @cristiancorreau/forge generate --runtime claude-code
19
19
  #
20
20
  # Atajo: usar el scaffold automático:
21
- # python3 .agentic/scripts/forge-scaffold-profile.py --name <stack> --engineer <agent-name>
21
+ # npx @cristiancorreau/forge scaffold --tier 2 --name <stack> --engineer <agent-name>
22
22
  #
23
23
  # Convención de nombres (ver docs/agent-standard.md):
24
24
  # El nombre del agente en el profile debe coincidir con el Tier 1 que extiende.
@@ -3,7 +3,7 @@
3
3
  * 1. FORGE_HOME env var
4
4
  * 2. assets/ next to the compiled CLI (npm package mode)
5
5
  * 3. Walk up from __dirname (dev mode)
6
- * 4. .agentic/ or forge/ in cwd (consumer project with submodule)
6
+ * 4. forge/ in cwd (consumer project with a vendored forge root)
7
7
  */
8
8
  export declare function resolveForgeRoot(): string;
9
9
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA6BzC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA2BzC"}
package/dist/lib/paths.js CHANGED
@@ -11,7 +11,7 @@ function isForgeRoot(dir) {
11
11
  * 1. FORGE_HOME env var
12
12
  * 2. assets/ next to the compiled CLI (npm package mode)
13
13
  * 3. Walk up from __dirname (dev mode)
14
- * 4. .agentic/ or forge/ in cwd (consumer project with submodule)
14
+ * 4. forge/ in cwd (consumer project with a vendored forge root)
15
15
  */
16
16
  export function resolveForgeRoot() {
17
17
  if (process.env.FORGE_HOME) {
@@ -34,12 +34,10 @@ export function resolveForgeRoot() {
34
34
  break;
35
35
  dir = parent;
36
36
  }
37
- // consumer project: look for a vendored forge under .agentic/ or forge/
38
- for (const candidate of ['.agentic', 'forge']) {
39
- const p = join(process.cwd(), candidate);
40
- if (isForgeRoot(p))
41
- return p;
42
- }
37
+ // consumer project: look for a vendored forge under forge/
38
+ const vendored = join(process.cwd(), 'forge');
39
+ if (isForgeRoot(vendored))
40
+ return vendored;
43
41
  throw new Error('forge root not found. Set FORGE_HOME or install via: npx @cristiancorreau/forge');
44
42
  }
45
43
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,+EAA+E;AAC/E,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,IAAI,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,6CAA6C,CAAC,CAAC;IACjF,CAAC;IAED,uFAAuF;IACvF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,WAAW,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAE/C,yDAAyD;IACzD,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,KAAK,MAAM,SAAS,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,+EAA+E;AAC/E,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,IAAI,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,6CAA6C,CAAC,CAAC;IACjF,CAAC;IAED,uFAAuF;IACvF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,WAAW,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAE/C,yDAAyD;IACzD,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,WAAW,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE3C,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;AACJ,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version (kept in sync with package.json). */
2
- export declare const VERSION = "2.19.0";
2
+ export declare const VERSION = "3.0.0";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version (kept in sync with package.json). */
2
- export const VERSION = '2.19.0';
2
+ export const VERSION = '3.0.0';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cristiancorreau/forge",
3
- "version": "2.19.0",
3
+ "version": "3.0.0",
4
4
  "description": "Agentic development framework — multi-runtime support for Claude Code, OpenCode, Codex and Kiro",
5
5
  "author": "Cristian Correa <cristian@socialweb.cl>",
6
6
  "license": "Apache-2.0",
@@ -28,7 +28,7 @@
28
28
  "build:all": "node scripts/build-assets.mjs && tsc",
29
29
  "dev": "tsc --watch",
30
30
  "prepublishOnly": "npm run build:all",
31
- "test": "node --test test/commands.test.mjs test/assets.test.mjs test/hook-spec-gate.test.mjs test/claude-md-specialized.test.mjs test/wiki.test.mjs test/panel.test.mjs test/catalog-install.test.mjs test/windows-compat.test.mjs test/bun-relaunch.test.mjs test/wizard-project-type.test.mjs test/adopt.test.mjs test/more-technologies.test.mjs test/tier2-profiles.test.mjs"
31
+ "test": "node --test test/commands.test.mjs test/assets.test.mjs test/hook-spec-gate.test.mjs test/claude-md-specialized.test.mjs test/wiki.test.mjs test/panel.test.mjs test/catalog-install.test.mjs test/windows-compat.test.mjs test/bun-relaunch.test.mjs test/wizard-project-type.test.mjs test/adopt.test.mjs test/more-technologies.test.mjs test/tier2-profiles.test.mjs test/python-sunset.test.mjs"
32
32
  },
33
33
  "files": [
34
34
  "dist",