@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 +34 -0
- package/README.md +3 -10
- package/assets/adapters/opencode/HOOKS.md +2 -2
- package/assets/core/hooks/session-start.sh +1 -1
- package/assets/core/templates/claude-md/project.md +1 -1
- package/assets/core/workflows/sprint.md +0 -7
- package/assets/manifest.json +1 -1
- package/assets/templates/modes/enterprise.yaml.tpl +4 -4
- package/assets/templates/modes/new-stack.yaml.tpl +2 -2
- package/dist/lib/paths.d.ts +1 -1
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +5 -7
- package/dist/lib/paths.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +2 -2
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+**
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
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**:
|
|
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
|
|
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
|
|
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:
|
package/assets/manifest.json
CHANGED
|
@@ -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
|
|
6
|
-
#
|
|
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
|
|
90
|
-
# Usar --json en CI:
|
|
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:
|
|
18
|
+
# 5. Correr: npx @cristiancorreau/forge generate --runtime claude-code
|
|
19
19
|
#
|
|
20
20
|
# Atajo: usar el scaffold automático:
|
|
21
|
-
#
|
|
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.
|
package/dist/lib/paths.d.ts
CHANGED
|
@@ -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.
|
|
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
|
package/dist/lib/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,
|
|
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.
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
package/dist/lib/paths.js.map
CHANGED
|
@@ -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,
|
|
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
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,OAAO,
|
|
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
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
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": "
|
|
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",
|