@ronaldjdevfs/forge 1.3.5 → 1.3.6

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <img src="favicon.svg" alt="Forge Logo" width="100" height="100">
2
2
 
3
- > **v1.3.5** — R13 Platform Domain Guard & Legacy Cleanup
3
+ > **v1.3.6** — Multi-Agent Path Resolution Fix
4
4
 
5
5
  ## Forge — Backend Architecture Operating System
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ronaldjdevfs/forge",
3
- "version": "1.3.5",
3
+ "version": "1.3.6",
4
4
  "description": "Forge — Architecture Operating System for backend systems. Arquitectura Hexagonal, DDD pragmático y vertical slices.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -75,7 +75,7 @@ En esencia:
75
75
  ANTES de cualquier acción, Forge DEBE ejecutar `forge-boot.mjs` con la profundidad adecuada al comando:
76
76
 
77
77
  ```bash
78
- boot=$(node .opencode/skills/forge/scripts/forge-boot.mjs --depth <depth> --json 2>/dev/null)
78
+ boot=$(node {{AGENT_PATH}}/scripts/forge-boot.mjs --depth <depth> --json 2>/dev/null)
79
79
  ```
80
80
 
81
81
  La profundidad (`--depth`) depende del comando (ver Execution Flow):
@@ -193,7 +193,7 @@ El agente DEBE leer este archivo al inicio de cada interacción y actualizarlo a
193
193
  Forge incluye tests unitarios con `node:test` (sin dependencias externas).
194
194
 
195
195
  ```bash
196
- node --test .opencode/skills/forge/tests/core.test.mjs
196
+ node --test {{AGENT_PATH}}/tests/core.test.mjs
197
197
  ```
198
198
 
199
199
  | Módulo | Tests | Descripción |
@@ -30,13 +30,13 @@ Si el subcomando NO tiene flags en $ARGUMENTS y tiene flags disponibles (ver tab
30
30
  Inicializa el proyecto arquitectónicamente. Ejecuta context + bootstrap + profile + armorer + graph + chain + inscribe.
31
31
 
32
32
  ```
33
- node .opencode/skills/forge/scripts/context.mjs
34
- node .opencode/skills/forge/scripts/bootstrap.mjs
35
- node .opencode/skills/forge/scripts/profile.mjs
36
- node .opencode/skills/forge/scripts/armorer.mjs
37
- node .opencode/skills/forge/scripts/graph.mjs
38
- node .opencode/skills/forge/scripts/chain.mjs
39
- node .opencode/skills/forge/scripts/architecture.mjs
33
+ node {{AGENT_PATH}}/scripts/context.mjs
34
+ node {{AGENT_PATH}}/scripts/bootstrap.mjs
35
+ node {{AGENT_PATH}}/scripts/profile.mjs
36
+ node {{AGENT_PATH}}/scripts/armorer.mjs
37
+ node {{AGENT_PATH}}/scripts/graph.mjs
38
+ node {{AGENT_PATH}}/scripts/chain.mjs
39
+ node {{AGENT_PATH}}/scripts/architecture.mjs
40
40
  ```
41
41
 
42
42
  ### cast
@@ -52,7 +52,7 @@ Migra un feature existente. Puede targetizar platform/, shared/, infra/ o featur
52
52
  Genera ARCHITECTURE.md con grafo arquitectónico, ownership y platform.
53
53
 
54
54
  ```
55
- node .opencode/skills/forge/scripts/architecture.mjs
55
+ node {{AGENT_PATH}}/scripts/architecture.mjs
56
56
  ```
57
57
 
58
58
  ### graph
@@ -60,13 +60,13 @@ node .opencode/skills/forge/scripts/architecture.mjs
60
60
  Construye el grafo arquitectónico del proyecto (4 capas: platform, feature, shared, infra) con reglas R1-R9.
61
61
 
62
62
  ```
63
- node .opencode/skills/forge/scripts/graph.mjs
63
+ node {{AGENT_PATH}}/scripts/graph.mjs
64
64
  ```
65
65
 
66
66
  Para salida JSON:
67
67
 
68
68
  ```
69
- node .opencode/skills/forge/scripts/graph.mjs --json
69
+ node {{AGENT_PATH}}/scripts/graph.mjs --json
70
70
  ```
71
71
 
72
72
  ### smelt
@@ -78,7 +78,7 @@ Extrae código reutilizable a shared/ (solo código puro, sin dependencias infra
78
78
  Inicializa platform, shared e infra layers (uso interno, se ejecuta automáticamente).
79
79
 
80
80
  ```
81
- node .opencode/skills/forge/scripts/bootstrap.mjs
81
+ node {{AGENT_PATH}}/scripts/bootstrap.mjs
82
82
  ```
83
83
 
84
84
  ## Evaluate
@@ -88,13 +88,13 @@ node .opencode/skills/forge/scripts/bootstrap.mjs
88
88
  Audita la conformidad arquitectónica completa. 6 categorías: structure(20), layers(20), ownership(20), platform(15), dependencies(15), graph(20).
89
89
 
90
90
  ```
91
- node .opencode/skills/forge/scripts/inspect.mjs
91
+ node {{AGENT_PATH}}/scripts/inspect.mjs
92
92
  ```
93
93
 
94
94
  Para salida JSON:
95
95
 
96
96
  ```
97
- node .opencode/skills/forge/scripts/inspect.mjs --json
97
+ node {{AGENT_PATH}}/scripts/inspect.mjs --json
98
98
  ```
99
99
 
100
100
  ### assay
@@ -102,16 +102,16 @@ node .opencode/skills/forge/scripts/inspect.mjs --json
102
102
  Ensayo arquitectónico multi-persona. Interpretación cualitativa del audit desde 5 perspectivas (Bezos, Fowler, Hacker, PM, Arquitecta Senior).
103
103
 
104
104
  ```
105
- node .opencode/skills/forge/scripts/assay.mjs
105
+ node {{AGENT_PATH}}/scripts/assay.mjs
106
106
  ```
107
107
 
108
108
  Filtros:
109
109
 
110
110
  ```
111
- node .opencode/skills/forge/scripts/assay.mjs --persona=bezos
112
- node .opencode/skills/forge/scripts/assay.mjs --json
113
- node .opencode/skills/forge/scripts/assay.mjs --save
114
- node .opencode/skills/forge/scripts/assay.mjs history
111
+ node {{AGENT_PATH}}/scripts/assay.mjs --persona=bezos
112
+ node {{AGENT_PATH}}/scripts/assay.mjs --json
113
+ node {{AGENT_PATH}}/scripts/assay.mjs --save
114
+ node {{AGENT_PATH}}/scripts/assay.mjs history
115
115
  ```
116
116
 
117
117
  ### quench
@@ -119,7 +119,7 @@ node .opencode/skills/forge/scripts/assay.mjs history
119
119
  Valida reglas arquitectónicas R1-R9.
120
120
 
121
121
  ```
122
- node .opencode/skills/forge/scripts/detect.mjs
122
+ node {{AGENT_PATH}}/scripts/detect.mjs
123
123
  ```
124
124
 
125
125
  ### chain
@@ -127,13 +127,13 @@ node .opencode/skills/forge/scripts/detect.mjs
127
127
  Orden topológico de dependencias multi-capa (platform, features, shared, infra).
128
128
 
129
129
  ```
130
- node .opencode/skills/forge/scripts/chain.mjs
130
+ node {{AGENT_PATH}}/scripts/chain.mjs
131
131
  ```
132
132
 
133
133
  Para salida JSON:
134
134
 
135
135
  ```
136
- node .opencode/skills/forge/scripts/chain.mjs --json
136
+ node {{AGENT_PATH}}/scripts/chain.mjs --json
137
137
  ```
138
138
 
139
139
  ### armorer
@@ -141,7 +141,7 @@ node .opencode/skills/forge/scripts/chain.mjs --json
141
141
  Reporte de ownership: huérfanos, duplicados, componentes mal ubicados.
142
142
 
143
143
  ```
144
- node .opencode/skills/forge/scripts/armorer.mjs
144
+ node {{AGENT_PATH}}/scripts/armorer.mjs
145
145
  ```
146
146
 
147
147
  ## Refine
@@ -23,26 +23,26 @@ Genera un **ensayo arquitectónico multi-persona** que evalúa el estado actual
23
23
 
24
24
  ```bash
25
25
  # Ensayo completo con todas las personas
26
- node .opencode/skills/forge/scripts/assay.mjs
26
+ node {{AGENT_PATH}}/scripts/assay.mjs
27
27
 
28
28
  # Solo la opinión de una persona
29
- node .opencode/skills/forge/scripts/assay.mjs --persona=bezos
30
- node .opencode/skills/forge/scripts/assay.mjs --persona=fowler
31
- node .opencode/skills/forge/scripts/assay.mjs --persona=hacker
32
- node .opencode/skills/forge/scripts/assay.mjs --persona=pm
33
- node .opencode/skills/forge/scripts/assay.mjs --persona=senior
29
+ node {{AGENT_PATH}}/scripts/assay.mjs --persona=bezos
30
+ node {{AGENT_PATH}}/scripts/assay.mjs --persona=fowler
31
+ node {{AGENT_PATH}}/scripts/assay.mjs --persona=hacker
32
+ node {{AGENT_PATH}}/scripts/assay.mjs --persona=pm
33
+ node {{AGENT_PATH}}/scripts/assay.mjs --persona=senior
34
34
 
35
35
  # Salida JSON (para consumo por herramientas)
36
- node .opencode/skills/forge/scripts/assay.mjs --json
36
+ node {{AGENT_PATH}}/scripts/assay.mjs --json
37
37
 
38
38
  # Persistir ensayo en .forge/assay/
39
- node .opencode/skills/forge/scripts/assay.mjs --save
39
+ node {{AGENT_PATH}}/scripts/assay.mjs --save
40
40
 
41
41
  # Ver historial de ensayos
42
- node .opencode/skills/forge/scripts/assay.mjs history
42
+ node {{AGENT_PATH}}/scripts/assay.mjs history
43
43
 
44
44
  # Leer un ensayo previo
45
- node .opencode/skills/forge/scripts/assay.mjs read assay-2026-06-25T00-00-00.md
45
+ node {{AGENT_PATH}}/scripts/assay.mjs read assay-2026-06-25T00-00-00.md
46
46
  ```
47
47
 
48
48
  ## Formato de salida
@@ -54,13 +54,13 @@ container.registerSingleton<ICreditRepository>(
54
54
 
55
55
  ```bash
56
56
  # Grafo de dependencias entre features (API legacy)
57
- node .opencode/skills/forge/scripts/chain.mjs
57
+ node {{AGENT_PATH}}/scripts/chain.mjs
58
58
 
59
59
  # Grafo arquitectónico completo (nodos, edges, violaciones)
60
- node .opencode/skills/forge/scripts/graph.mjs
60
+ node {{AGENT_PATH}}/scripts/graph.mjs
61
61
 
62
62
  # ARCHITECTURE.md con grafo incluido
63
- node .opencode/skills/forge/scripts/architecture.mjs
63
+ node {{AGENT_PATH}}/scripts/architecture.mjs
64
64
  ```
65
65
 
66
66
  `chain.mjs` ahora es un wrapper sobre `graph.mjs`. Produce el mismo formato de salida para compatibilidad (nodos, edges, features, orden topológico). El nuevo `graph.mjs` amplía el análisis a todos los tipos de nodo (core, feature, domain, infra, adapter) y detecta violaciones de reglas arquitectónicas (R1-R6).
@@ -85,10 +85,10 @@ jobs:
85
85
  runs-on: ubuntu-latest
86
86
  steps:
87
87
  - uses: actions/checkout@v4
88
- - run: node .opencode/skills/forge/scripts/detect.mjs
88
+ - run: node {{AGENT_PATH}}/scripts/detect.mjs
89
89
  env:
90
90
  FORGE_STRICT: "true"
91
- - run: node .opencode/skills/forge/scripts/chain.mjs --json
91
+ - run: node {{AGENT_PATH}}/scripts/chain.mjs --json
92
92
  ```
93
93
 
94
94
  ---
@@ -52,9 +52,9 @@ Inspecciona la conformidad arquitectónica del proyecto.
52
52
  ## Ejecución
53
53
 
54
54
  ```bash
55
- node .opencode/skills/forge/scripts/inspect.mjs
56
- node .opencode/skills/forge/scripts/inspect.mjs --json
57
- node .opencode/skills/forge/scripts/detect.mjs --severity ERROR
55
+ node {{AGENT_PATH}}/scripts/inspect.mjs
56
+ node {{AGENT_PATH}}/scripts/inspect.mjs --json
57
+ node {{AGENT_PATH}}/scripts/detect.mjs --severity ERROR
58
58
 
59
59
  ## Ver también
60
60
 
@@ -64,13 +64,13 @@ El grafo se construye automáticamente con `scripts/graph.mjs` y las violaciones
64
64
 
65
65
  ```bash
66
66
  # Validación completa
67
- node .opencode/skills/forge/scripts/detect.mjs
67
+ node {{AGENT_PATH}}/scripts/detect.mjs
68
68
 
69
69
  # Solo errores y críticos
70
- node .opencode/skills/forge/scripts/detect.mjs --severity ERROR
70
+ node {{AGENT_PATH}}/scripts/detect.mjs --severity ERROR
71
71
 
72
72
  # Solo un tipo específico
73
- node .opencode/skills/forge/scripts/detect.mjs --type layers
73
+ node {{AGENT_PATH}}/scripts/detect.mjs --type layers
74
74
 
75
75
  ## Ver también
76
76
 
@@ -23,10 +23,10 @@ Renombra un único archivo según las convenciones de `reference/patterns.md` y
23
23
  ### Flujo
24
24
 
25
25
  1. Identificar la ruta del archivo (relativa a la raíz del proyecto)
26
- 2. Ejecutar `node .opencode/skills/forge/scripts/rename.mjs --detect --file <path>` para detectar violación
26
+ 2. Ejecutar `node {{AGENT_PATH}}/scripts/rename.mjs --detect --file <path>` para detectar violación
27
27
  3. Si el archivo ya cumple naming, informar y terminar
28
28
  4. Mostrar preview del cambio al usuario
29
- 5. Ejecutar `node .opencode/skills/forge/scripts/rename.mjs --file <path>` que:
29
+ 5. Ejecutar `node {{AGENT_PATH}}/scripts/rename.mjs --file <path>` que:
30
30
  - Renombra físicamente el archivo
31
31
  - Escanea todos los `.ts`/`.js` del proyecto
32
32
  - Actualiza imports que referencian el path antiguo (relativos y absolutos)
@@ -57,9 +57,9 @@ $ forge reforge src/features/users/domain/userEntity.ts
57
57
  1. Ejecutar `forge inspect` para obtener estado actual
58
58
  2. Identificar violaciones en el grafo arquitectónico
59
59
  3. Identificar ownership problemático (huérfanos, duplicados, mal ubicados)
60
- 4. **Detectar naming violations**: Ejecutar `node .opencode/skills/forge/scripts/rename.mjs --detect --json`
60
+ 4. **Detectar naming violations**: Ejecutar `node {{AGENT_PATH}}/scripts/rename.mjs --detect --json`
61
61
  5. Si hay naming violations, preguntar al usuario: "¿Corregir naming conventions automáticamente?"
62
- - Si acepta, ejecutar `node .opencode/skills/forge/scripts/rename.mjs --all`
62
+ - Si acepta, ejecutar `node {{AGENT_PATH}}/scripts/rename.mjs --all`
63
63
  6. Decidir las acciones correctivas en orden:
64
64
  - Violaciones CRITICAL primero (R1, R2, R5, R6)
65
65
  - Violaciones ERROR después (R3, R4, R8, R9)
@@ -17,7 +17,7 @@ const ROOT = process.cwd();
17
17
  const CACHE_PATH = join(ROOT, ".forge", "version-cache.json");
18
18
  const CACHE_TTL = 86400000; // 24h
19
19
  const VERSION_URL = "https://forge.dev/latest";
20
- const CURRENT_VERSION = "1.3.5";
20
+ const CURRENT_VERSION = "1.3.6";
21
21
 
22
22
  function readJson(path) {
23
23
  try {
package/src/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { copyFileSync, mkdirSync, existsSync, writeFileSync, readFileSync, cpSync, readdirSync } from "fs";
3
+ import { copyFileSync, mkdirSync, existsSync, writeFileSync, readFileSync, cpSync, readdirSync, statSync } from "fs";
4
4
  import { join, dirname, relative } from "path";
5
5
  import { fileURLToPath } from "url";
6
6
  import { execSync } from "child_process";
@@ -43,6 +43,20 @@ function copyRecursive(src, dest) {
43
43
  cpSync(src, dest, { recursive: true, force: true });
44
44
  }
45
45
 
46
+ function renderSkillPaths(skillDest, skillPath) {
47
+ for (const entry of readdirSync(skillDest)) {
48
+ const fullPath = join(skillDest, entry);
49
+ if (statSync(fullPath).isDirectory()) {
50
+ renderSkillPaths(fullPath, skillPath);
51
+ } else if (entry.endsWith(".md")) {
52
+ const content = readFileSync(fullPath, "utf-8");
53
+ if (content.includes("{{AGENT_PATH}}")) {
54
+ writeFileSync(fullPath, content.replace(/\{\{AGENT_PATH\}\}/g, skillPath), "utf-8");
55
+ }
56
+ }
57
+ }
58
+ }
59
+
46
60
  function detectPM(configDir) {
47
61
  if (existsSync(join(configDir, "pnpm-lock.yaml")) || existsSync(join(process.cwd(), "pnpm-lock.yaml"))) return "pnpm";
48
62
  if (existsSync(join(configDir, "bun.lock")) || existsSync(join(configDir, "bun.lockb"))) return "bun";
@@ -143,8 +157,11 @@ async function installOpenCode(isGlobal = false) {
143
157
 
144
158
  const s = spinner();
145
159
 
160
+ const skillPath = isGlobal ? join("~/.config/opencode", "skills", "forge") : join(".opencode", "skills", "forge");
161
+
146
162
  s.start("Copiando skill a " + rel);
147
163
  copyRecursive(SKILL_SRC, target);
164
+ renderSkillPaths(target, skillPath);
148
165
  s.stop("Skill copiada a " + rel);
149
166
 
150
167
  s.start("Generando comandos /forge-*");
@@ -192,6 +209,9 @@ async function installAgentTemplates(agentDir, agentName) {
192
209
  writeFileSync(join(skillDest, "SKILL.md"), rendered, "utf-8");
193
210
  }
194
211
 
212
+ // Render {{AGENT_PATH}} in remaining .md files (command/forge.md, reference/*.md)
213
+ renderSkillPaths(skillDest, config.skillPath);
214
+
195
215
  s.stop(`${agentName} configurado en ${agentDir}/`);
196
216
  log.success(`${agentName} listo (skill + ${config.postInstall || "templates"})`);
197
217
  }