@cristiancorreau/forge 2.9.5 → 2.9.7
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/assets/adapters/claude-code/commands/new-feature.md +10 -5
- package/assets/adapters/claude-code/commands/plan.md +61 -36
- package/assets/adapters/claude-code/commands/session-start.md +1 -1
- package/assets/adapters/claude-code/commands/ship.md +6 -4
- package/assets/adapters/claude-code/commands/work.md +8 -6
- package/assets/core/skills/README.md +2 -2
- package/assets/core/skills/aitmpl-search/SKILL.md +7 -19
- package/assets/core/skills/local2prod/SKILL.md +1 -1
- package/assets/core/skills/new-feature/SKILL.md +1 -1
- package/assets/core/skills/phase-kickoff/SKILL.md +2 -0
- package/assets/core/skills/spec/SKILL.md +2 -0
- package/assets/core/skills/wiki-ingest/SKILL.md +7 -7
- package/assets/core/skills/wiki-lint/SKILL.md +4 -4
- package/assets/core/skills/wiki-query/SKILL.md +3 -3
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +2 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/lib/paths.d.ts +1 -2
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +12 -16
- package/dist/lib/paths.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/assets/adapters/claude-code/generate-claude-md.py +0 -304
- package/assets/adapters/codex/generate-codex-config.py +0 -269
- package/assets/adapters/kiro/generate-steering.py +0 -367
- package/assets/adapters/opencode/generate-agents-md.py +0 -262
- package/assets/core/hooks/pre-bash-check.py +0 -202
- package/assets/core/hooks/pre-edit-check.py +0 -317
- package/assets/forge.py +0 -1265
- package/assets/requirements.txt +0 -2
- package/assets/scripts/aitmpl-search.py +0 -808
- package/assets/scripts/forge-add-opportunities.py +0 -92
- package/assets/scripts/forge-audit.py +0 -1061
- package/assets/scripts/forge-generate-all.py +0 -283
- package/assets/scripts/forge-init.py +0 -900
- package/assets/scripts/forge-migrate-project-yaml.py +0 -397
- package/assets/scripts/forge-scaffold-profile.py +0 -181
- package/assets/scripts/forge-teardown.py +0 -193
- package/assets/scripts/forge-validate-project-yaml.py +0 -457
- package/assets/scripts/forge-wizard.py +0 -1003
- package/assets/scripts/setup-codex.sh +0 -229
- package/assets/scripts/team-install.sh +0 -147
- package/assets/scripts/token-stats.py +0 -201
- package/dist/lib/python.d.ts +0 -4
- package/dist/lib/python.d.ts.map +0 -1
- package/dist/lib/python.js +0 -46
- package/dist/lib/python.js.map +0 -1
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
# new-feature
|
|
2
2
|
|
|
3
|
+
> **Atajo de orquestación.** Este comando NO es un flujo competidor: es un wrapper que delega
|
|
4
|
+
> en el pipeline SDD canónico `/plan` → `/work` → `/review` → `/ship`. Usa el mismo template de
|
|
5
|
+
> spec (`core/templates/spec-template.md`) y la misma máquina de estados
|
|
6
|
+
> (`DRAFT` → `REVIEW` → `APPROVED` → `IMPLEMENTED`). No dupliques aquí lógica de esos comandos:
|
|
7
|
+
> invocá cada uno en su etapa.
|
|
8
|
+
|
|
3
9
|
Inicia la implementación de una nueva feature siguiendo SDD (Spec-Driven Development).
|
|
4
10
|
|
|
5
11
|
Argumentos: $ARGUMENTS — nombre de la feature o ruta a la spec existente.
|
|
6
12
|
|
|
7
|
-
1. Si no existe spec para "$ARGUMENTS" en docs/specs
|
|
8
|
-
2.
|
|
9
|
-
3.
|
|
10
|
-
4.
|
|
11
|
-
5. Al terminar, actualizar la spec con las decisiones tomadas durante la implementación.
|
|
13
|
+
1. **Spec** — Si no existe spec para "$ARGUMENTS" en `docs/specs/`, ejecutar `/plan <fase> "$ARGUMENTS"` para crearla (queda en `APPROVED`). Si ya existe, leerla.
|
|
14
|
+
2. **Implementación** — Ejecutar `/work` para implementar la spec aprobada. Propone el team, espera aprobación e implementa con tests junto a la implementación, no al final. `/work` marca la spec como `IMPLEMENTED` y completa "Notas de implementación".
|
|
15
|
+
3. **Review** — Ejecutar `/review` para obtener el veredicto vinculante (persiste en `.claude/review-status.json`).
|
|
16
|
+
4. **Ship** — Si el review resultó `APPROVED` y el usuario lo pide, ejecutar `/ship` para el deploy.
|
|
@@ -16,44 +16,66 @@ Construir el nombre del archivo:
|
|
|
16
16
|
- Tomar el título, convertirlo a minúsculas, reemplazar espacios por guiones, eliminar caracteres especiales → `<slug>`
|
|
17
17
|
- Nombre final: `docs/specs/<fase>-<slug>.md`
|
|
18
18
|
|
|
19
|
-
Crear el archivo con
|
|
19
|
+
Crear el archivo con el template canónico de `core/templates/spec-template.md` (misma fuente única de verdad que el skill `spec`):
|
|
20
20
|
|
|
21
21
|
```markdown
|
|
22
|
-
#
|
|
23
|
-
**Fase:** <fase> | **Estado:** draft | **Fecha:** YYYY-MM-DD
|
|
22
|
+
# <fase> Título de la Feature
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
> Estado: DRAFT | REVIEW | APPROVED | IMPLEMENTED
|
|
25
|
+
> Responsable: [nombre o rol]
|
|
26
|
+
> Creada: YYYY-MM-DD | Actualizada: YYYY-MM-DD
|
|
27
27
|
|
|
28
|
-
##
|
|
29
|
-
[Qué NO cubre esta spec]
|
|
28
|
+
## Contexto
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
- [ ] Criterio 1 (verificable, testeable)
|
|
33
|
-
- [ ] Criterio 2
|
|
30
|
+
Por qué existe esta feature. Qué problema resuelve. Qué pasa si no la hacemos.
|
|
34
31
|
|
|
35
|
-
##
|
|
36
|
-
[Si el proyecto tiene frameworks de compliance en project.yaml, mapear qué artículos aplican. Si no aplica, escribir "N/A".]
|
|
32
|
+
## Decisión
|
|
37
33
|
|
|
38
|
-
|
|
39
|
-
[Casos límite que la implementación debe manejar]
|
|
34
|
+
Qué vamos a implementar exactamente. Ser específico: endpoints, tablas, componentes.
|
|
40
35
|
|
|
41
|
-
##
|
|
42
|
-
[Se llena durante la implementación]
|
|
36
|
+
## Alternativas consideradas
|
|
43
37
|
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
| Opción | Pros | Contras | Descartada por |
|
|
39
|
+
|--------|------|---------|----------------|
|
|
40
|
+
| Opción A | ... | ... | ... |
|
|
41
|
+
| Opción B | ... | ... | ... |
|
|
42
|
+
|
|
43
|
+
## Criterios de aceptación
|
|
44
|
+
|
|
45
|
+
- [ ] Criterio verificable 1
|
|
46
|
+
- [ ] Criterio verificable 2
|
|
47
|
+
- [ ] Criterio verificable N
|
|
48
|
+
|
|
49
|
+
## Impacto de compliance
|
|
50
|
+
|
|
51
|
+
Si el proyecto tiene `compliance.frameworks` configurado, completar:
|
|
52
|
+
|
|
53
|
+
- **Ley 21.719**: art. X → [descripción del impacto]
|
|
54
|
+
- **GDPR**: Art. Y → [descripción del impacto]
|
|
55
|
+
- No aplica (si no hay impacto de compliance)
|
|
56
|
+
|
|
57
|
+
## Dependencias
|
|
58
|
+
|
|
59
|
+
- Requiere que [otra spec ID] esté implementada
|
|
60
|
+
- Bloqueada por [issue/ticket]
|
|
61
|
+
|
|
62
|
+
## Notas de implementación
|
|
63
|
+
|
|
64
|
+
Cualquier decisión tomada durante la implementación que no estaba en la spec original.
|
|
46
65
|
```
|
|
47
66
|
|
|
67
|
+
Marcar el estado inicial como `DRAFT` (la primera línea del bloque de metadata: `> Estado: DRAFT`).
|
|
68
|
+
|
|
48
69
|
### Paso 3 — Guiar al usuario por cada sección
|
|
49
70
|
|
|
50
71
|
Preguntar una sección a la vez, en orden:
|
|
51
72
|
|
|
52
|
-
1. "¿Qué problema concreto resuelve esta feature? ¿Por qué ahora y no más adelante?"
|
|
53
|
-
2. "¿Qué
|
|
54
|
-
3. "¿
|
|
55
|
-
4.
|
|
56
|
-
5.
|
|
73
|
+
1. **Contexto**: "¿Qué problema concreto resuelve esta feature? ¿Por qué ahora y no más adelante? ¿Qué pasa si no la hacemos?"
|
|
74
|
+
2. **Decisión**: "¿Qué vamos a implementar exactamente? Ser específico: endpoints, tablas, componentes."
|
|
75
|
+
3. **Alternativas consideradas**: "¿Qué otras opciones se evaluaron y por qué se descartaron?"
|
|
76
|
+
4. **Criterios de aceptación**: "¿Cuáles son los criterios de aceptación verificables? (cada uno debe ser testeable de forma objetiva)"
|
|
77
|
+
5. Si `project.yaml` tiene frameworks de compliance: "¿Qué artículos o controles de compliance aplican a esta feature?"
|
|
78
|
+
6. **Dependencias**: "¿De qué otras specs o tickets depende esta feature?"
|
|
57
79
|
|
|
58
80
|
Completar el archivo con las respuestas del usuario a medida que avanza.
|
|
59
81
|
|
|
@@ -68,28 +90,31 @@ Leer `project.yaml` → `project.mode`:
|
|
|
68
90
|
**Cómo aplicar el Planner-Critic:**
|
|
69
91
|
|
|
70
92
|
Adoptar el rol de "Critic" y revisar la spec completa buscando:
|
|
71
|
-
- ¿Hay
|
|
93
|
+
- ¿Hay criterios de aceptación que no son objetivamente verificables?
|
|
72
94
|
- ¿Hay términos ambiguos que diferentes personas podrían interpretar distinto?
|
|
73
|
-
- ¿
|
|
74
|
-
- ¿
|
|
95
|
+
- ¿El contexto y la decisión son suficientemente específicos para evitar scope creep?
|
|
96
|
+
- ¿Faltan dependencias o alternativas relevantes que deberían documentarse?
|
|
75
97
|
|
|
76
|
-
Mostrar las críticas como bullet points. Preguntar: "¿Ajustamos la spec antes de
|
|
98
|
+
Mostrar las críticas como bullet points. Preguntar: "¿Ajustamos la spec antes de pasarla a REVIEW?"
|
|
77
99
|
|
|
78
100
|
Si el usuario ajusta: actualizar el archivo y repetir el Critic una vez más.
|
|
79
101
|
|
|
80
|
-
### Paso 5 — Marcar como
|
|
102
|
+
### Paso 5 — Marcar como APPROVED
|
|
81
103
|
|
|
82
104
|
Cuando el usuario aprueba la spec (o decide no aplicar el Critic):
|
|
83
|
-
- Cambiar
|
|
84
|
-
-
|
|
105
|
+
- Cambiar `> Estado: DRAFT` → `> Estado: APPROVED` en el archivo
|
|
106
|
+
- Actualizar la fecha de `Actualizada:` a la fecha de hoy
|
|
107
|
+
- Confirmar: "Spec aprobada: `docs/specs/<archivo>.md`. Ahora podés ejecutar `/work` para implementarla."
|
|
108
|
+
|
|
109
|
+
> Estados de spec (alineados con `core/templates/spec-template.md`): `DRAFT` → `REVIEW` → `APPROVED` → `IMPLEMENTED`. `/plan` crea en `DRAFT` y aprueba a `APPROVED`; `/work` la marca `IMPLEMENTED`.
|
|
85
110
|
|
|
86
111
|
---
|
|
87
112
|
|
|
88
113
|
## Modo listar (`/plan` sin argumentos)
|
|
89
114
|
|
|
90
|
-
Buscar todos los archivos `.md` en `docs/specs/` que contengan
|
|
115
|
+
Buscar todos los archivos `.md` en `docs/specs/` que contengan `> Estado: DRAFT` o `> Estado: REVIEW`.
|
|
91
116
|
|
|
92
|
-
Si no hay ninguno: "No hay specs en estado
|
|
117
|
+
Si no hay ninguno: "No hay specs en estado DRAFT o REVIEW. Ejecutá `/plan <fase> \"<título>\"` para crear una."
|
|
93
118
|
|
|
94
119
|
Si hay alguno: mostrarlos como lista numerada con título, fase y fecha. Ejemplo:
|
|
95
120
|
```
|
|
@@ -106,10 +131,10 @@ Preguntar: "¿Cuál continuamos?"
|
|
|
106
131
|
Leer el archivo de spec indicado.
|
|
107
132
|
|
|
108
133
|
Aplicar el Planner-Critic completo:
|
|
109
|
-
- ¿Los
|
|
110
|
-
- ¿Hay ambigüedades en el
|
|
111
|
-
- ¿
|
|
112
|
-
- ¿
|
|
134
|
+
- ¿Los criterios de aceptación son objetivamente testeables?
|
|
135
|
+
- ¿Hay ambigüedades en el contexto, la decisión o los criterios?
|
|
136
|
+
- ¿Las alternativas consideradas justifican la decisión tomada?
|
|
137
|
+
- ¿Las dependencias están completas y son explícitas?
|
|
113
138
|
|
|
114
139
|
Mostrar sugerencias de mejora como bullet points con la sección específica que afectan.
|
|
115
140
|
|
|
@@ -15,7 +15,7 @@ Ejecutar los siguientes comandos y guardar sus resultados:
|
|
|
15
15
|
## Paso 2 — Leer configuración del proyecto
|
|
16
16
|
|
|
17
17
|
- Si existe `project.yaml` en el directorio actual, leerlo para obtener: `project.mode`, `project.name`, `stack.*`, `agents.active`
|
|
18
|
-
- Si existe `
|
|
18
|
+
- Si existe `wiki/index.md`, leerlo para obtener contexto del proyecto
|
|
19
19
|
- Si ninguno existe, continuar con defaults: mode=startup, sin checks de compliance
|
|
20
20
|
|
|
21
21
|
## Paso 3 — Evaluar escenario y actuar
|
|
@@ -10,10 +10,12 @@ Leer `project.yaml`. Si no existe sección `deploy`: "deploy no configurado en p
|
|
|
10
10
|
|
|
11
11
|
## Paso 1 — Verificar review
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Leer `.claude/review-status.json` (es el archivo que persiste `/review` en su Paso 6).
|
|
14
14
|
|
|
15
|
-
- Si
|
|
16
|
-
-
|
|
15
|
+
- **Si el archivo existe**: parsear su contenido y validar el campo `verdict`.
|
|
16
|
+
- `verdict == "APPROVED"`: continuar. (Opcional: si el `timestamp` del review es anterior al último commit relevante, advertir que el review podría estar desactualizado y pedir confirmación.)
|
|
17
|
+
- `verdict == "CHANGES_REQUESTED"` o `verdict == "BLOCKED"`: "El último review resultó en `<verdict>`. Resolvé los puntos y volvé a ejecutar `/review` antes de hacer deploy." y detener.
|
|
18
|
+
- **Si el archivo NO existe** (fallback): "No se encontró `.claude/review-status.json`. ¿Confirmás que el código fue revisado y aprobado? (s/n)"
|
|
17
19
|
- Si n: "Ejecutá `/review` antes de hacer deploy." y detener.
|
|
18
20
|
|
|
19
21
|
## Paso 2 — Verificar git status
|
|
@@ -31,7 +33,7 @@ Preguntar: "¿Querés mergear el PR actual a main antes del deploy? (s/n)"
|
|
|
31
33
|
Si sí:
|
|
32
34
|
- Ejecutar `gh pr checks` para verificar que todos los checks pasan
|
|
33
35
|
- Si algún check falla: "El PR tiene checks fallando. Resolvelos antes de mergear." y detener.
|
|
34
|
-
- Si todos pasan: ejecutar `gh pr merge --merge`
|
|
36
|
+
- Si todos pasan: ejecutar `gh pr merge --merge`
|
|
35
37
|
|
|
36
38
|
Si no: continuar sin mergear.
|
|
37
39
|
|
|
@@ -6,11 +6,11 @@ Scope: $ARGUMENTS (ej: `--serial`, `--autorun`, o vacío para modo paralelo est
|
|
|
6
6
|
|
|
7
7
|
## Paso 1 — Identificar la spec
|
|
8
8
|
|
|
9
|
-
Buscar archivos `.md` en `docs/specs/` que contengan
|
|
9
|
+
Buscar archivos `.md` en `docs/specs/` que contengan `> Estado: APPROVED`.
|
|
10
10
|
|
|
11
11
|
- Si hay exactamente una: mostrarla y confirmar "Implementando: `<archivo>`."
|
|
12
12
|
- Si hay varias: mostrarlas como lista numerada y pedir que el usuario elija.
|
|
13
|
-
- Si no hay ninguna: "No hay spec en estado
|
|
13
|
+
- Si no hay ninguna: "No hay spec en estado APPROVED. Ejecutá `/plan` primero." y detener.
|
|
14
14
|
|
|
15
15
|
Leer la spec seleccionada completa antes de continuar.
|
|
16
16
|
|
|
@@ -94,8 +94,10 @@ Si hay errores o conflictos: reportar claramente y preguntar cómo proceder. No
|
|
|
94
94
|
|
|
95
95
|
## Paso 7 — Actualizar la spec
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
- Al completar exitosamente: cambiar `**Estado:** in-progress` → `**Estado:** implemented`
|
|
99
|
-
- Completar las secciones "Implementation notes" y "Decisiones tomadas" con lo que se hizo
|
|
97
|
+
Estados de spec (alineados con `core/templates/spec-template.md`): `DRAFT` → `REVIEW` → `APPROVED` → `IMPLEMENTED`.
|
|
100
98
|
|
|
101
|
-
|
|
99
|
+
- Al completar exitosamente: cambiar `> Estado: APPROVED` → `> Estado: IMPLEMENTED`
|
|
100
|
+
- Actualizar la fecha de `Actualizada:` a la fecha de hoy
|
|
101
|
+
- Completar la sección "Notas de implementación" con lo que se hizo y las decisiones tomadas
|
|
102
|
+
|
|
103
|
+
Confirmar: "Implementación completa. Spec actualizada a `IMPLEMENTED`. Podés ejecutar `/review` y luego `/ship`."
|
|
@@ -31,7 +31,7 @@ wiki-lint → health check + auto-reparación
|
|
|
31
31
|
| `security-audit` | Universal | No | new-feature, security-auditor |
|
|
32
32
|
| `db-migrate` | Universal | No (solo el ORM del proyecto) | new-feature |
|
|
33
33
|
| `browser-test` | Universal | `agent-browser` CLI (npm i -g) | new-feature, usuario directo |
|
|
34
|
-
| `wiki-ingest` | Wiki | No | usuario directo, docs-writer |
|
|
34
|
+
| `wiki-ingest` | Wiki | No | usuario directo, agente docs-writer |
|
|
35
35
|
| `wiki-query` | Wiki | No | usuario directo, new-feature |
|
|
36
36
|
| `wiki-lint` | Wiki | No | usuario directo |
|
|
37
37
|
| `local2prod` | Universal | CLI del provider de deploy | new-feature |
|
|
@@ -53,7 +53,7 @@ Configurar en `project.yaml` bajo `skills.active`:
|
|
|
53
53
|
- **`new-feature`**: checklist completo de implementación (orquesta los otros)
|
|
54
54
|
|
|
55
55
|
### Wiki — knowledge base del proyecto
|
|
56
|
-
Configurar en `project.yaml` bajo `skills
|
|
56
|
+
Configurar en `project.yaml` bajo `skills`. Generan slash commands `/wiki-ingest`, `/wiki-query`, `/wiki-lint` en Claude Code. La estructura `wiki/` se inicializa con `forge wiki ingest <archivo>`:
|
|
57
57
|
- **`wiki-ingest`**: ingesta fuentes (URL, archivo, texto) → actualiza `raw/` + páginas wiki + index + log
|
|
58
58
|
- **`wiki-query`**: responde preguntas usando el wiki como base, con citas a páginas
|
|
59
59
|
- **`wiki-lint`**: verifica integridad del wiki: links, huérfanos, frontmatter, log
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Skill: aitmpl-search
|
|
2
2
|
|
|
3
3
|
Busca en el catálogo curado de forge: frameworks de agentes IA, MCP servers instalables,
|
|
4
|
-
profiles de stack y herramientas. La búsqueda es offline (catálogo local)
|
|
5
|
-
puede extenderse a GitHub con `--github`.
|
|
4
|
+
profiles de stack y herramientas. La búsqueda es offline (catálogo local).
|
|
6
5
|
|
|
7
6
|
Triggers: /aitmpl-search, "buscar templates", "buscar en catálogo", "templates de AI",
|
|
8
7
|
"buscar template", "buscar MCP", "buscar profile".
|
|
@@ -24,33 +23,22 @@ Triggers: /aitmpl-search, "buscar templates", "buscar en catálogo", "templates
|
|
|
24
23
|
|
|
25
24
|
Búsqueda por texto en el catálogo local:
|
|
26
25
|
```bash
|
|
27
|
-
|
|
26
|
+
forge aitmpl-search "<query>" --limit 10
|
|
28
27
|
```
|
|
29
28
|
|
|
30
|
-
Filtrar por categoría (`
|
|
29
|
+
Filtrar por categoría (`mcp-server`, `framework`, `profile`):
|
|
31
30
|
```bash
|
|
32
|
-
|
|
31
|
+
forge aitmpl-search --category mcp-server
|
|
33
32
|
```
|
|
34
33
|
|
|
35
34
|
Ver todas las categorías disponibles:
|
|
36
35
|
```bash
|
|
37
|
-
|
|
36
|
+
forge aitmpl-search --list-categories
|
|
38
37
|
```
|
|
39
38
|
|
|
40
39
|
Salida JSON (para integración o análisis):
|
|
41
40
|
```bash
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Extender con búsqueda en GitHub (requiere red; límite 60 req/h sin token):
|
|
46
|
-
```bash
|
|
47
|
-
python3 .agentic/scripts/aitmpl-search.py "<query>" --github
|
|
48
|
-
export GITHUB_TOKEN=ghp_... # aumenta a 5000 req/h
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Desde el CLI interactivo:
|
|
52
|
-
```bash
|
|
53
|
-
python3 .agentic/forge.py # → "Buscar templates" → buscar o filtrar por categoría
|
|
41
|
+
forge aitmpl-search "<query>" --json
|
|
54
42
|
```
|
|
55
43
|
|
|
56
44
|
### Paso 2 — Analizar resultados
|
|
@@ -71,4 +59,4 @@ Para profiles, ofrece agregar el profile a `project.yaml` directamente.
|
|
|
71
59
|
|
|
72
60
|
- No asumir que un resultado del catálogo está actualizado — verificar el repositorio antes de recomendar
|
|
73
61
|
- No crear agentes Tier 2 sin revisar si el stack ya tiene un profile en `profiles/`
|
|
74
|
-
- No instalar MCP servers sin verificar que el usuario tiene
|
|
62
|
+
- No instalar MCP servers sin verificar que el usuario tiene las dependencias requeridas
|
|
@@ -27,7 +27,7 @@ git status # confirmar qué va al commit
|
|
|
27
27
|
|
|
28
28
|
git commit -m "tipo(scope): descripción en imperativo
|
|
29
29
|
|
|
30
|
-
Co-Authored-By:
|
|
30
|
+
Co-Authored-By: <modelo> <noreply@anthropic.com>"
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Si ya hay un commit listo, ir directo al Paso 2.
|
|
@@ -117,7 +117,7 @@ Invocar el skill `/security-audit` como checklist mental antes de escribir cualq
|
|
|
117
117
|
# > Estado: IMPLEMENTED
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
6. **Actualizar CLAUDE.md** — mover el ID de spec de "En curso" a "Completadas"
|
|
121
121
|
|
|
122
122
|
---
|
|
123
123
|
|
|
@@ -33,7 +33,7 @@ Si es texto → usar el texto tal como está
|
|
|
33
33
|
### Paso 2 — Almacenar en raw/ (inmutable)
|
|
34
34
|
|
|
35
35
|
```
|
|
36
|
-
Path:
|
|
36
|
+
Path: wiki/raw/<tema>/<YYYY-MM-DD>-<slug-del-titulo>.md
|
|
37
37
|
|
|
38
38
|
Formato del archivo raw:
|
|
39
39
|
---
|
|
@@ -59,14 +59,14 @@ Leer el contenido y identificar:
|
|
|
59
59
|
### Paso 4 — Actualizar páginas wiki
|
|
60
60
|
|
|
61
61
|
Para cada concepto identificado:
|
|
62
|
-
- Si `
|
|
62
|
+
- Si `wiki/concepts/<nombre>.md` existe → agregar sección con nueva info + citar fuente
|
|
63
63
|
- Si no existe → crear la página desde la plantilla
|
|
64
64
|
|
|
65
65
|
Para cada entidad identificada:
|
|
66
|
-
- Si `
|
|
66
|
+
- Si `wiki/entities/<nombre>.md` existe → actualizar con nueva info
|
|
67
67
|
- Si no existe → crear la página desde la plantilla
|
|
68
68
|
|
|
69
|
-
Crear siempre `
|
|
69
|
+
Crear siempre `wiki/sources/<slug>.md` con resumen de la fuente:
|
|
70
70
|
|
|
71
71
|
```markdown
|
|
72
72
|
---
|
|
@@ -95,11 +95,11 @@ tags: [tag1, tag2]
|
|
|
95
95
|
|
|
96
96
|
### Paso 5 — Actualizar index.md y log.md
|
|
97
97
|
|
|
98
|
-
En `
|
|
98
|
+
En `wiki/index.md`:
|
|
99
99
|
- Agregar filas nuevas en las tablas correspondientes (concepts, entities, sources)
|
|
100
100
|
- Si la categoría no existe, crearla
|
|
101
101
|
|
|
102
|
-
En `
|
|
102
|
+
En `wiki/log.md` (append-only — NUNCA editar entradas anteriores):
|
|
103
103
|
|
|
104
104
|
```markdown
|
|
105
105
|
## [<YYYY-MM-DD>] ingest | <título de la fuente>
|
|
@@ -180,4 +180,4 @@ Si la nueva fuente contradice algo en el wiki:
|
|
|
180
180
|
|
|
181
181
|
- `wiki-query` consume las páginas que este skill crea
|
|
182
182
|
- `wiki-lint` verifica la integridad después de un ingest
|
|
183
|
-
- `docs-writer` puede invocar wiki-ingest al documentar una decisión nueva
|
|
183
|
+
- el agente `docs-writer` (no es un skill) puede invocar wiki-ingest al documentar una decisión nueva
|
|
@@ -20,7 +20,7 @@ wiki", "wiki health", "wiki check".
|
|
|
20
20
|
|
|
21
21
|
### 1. Integridad del índice
|
|
22
22
|
|
|
23
|
-
Leer `
|
|
23
|
+
Leer `wiki/index.md` y verificar:
|
|
24
24
|
|
|
25
25
|
```
|
|
26
26
|
✓ Cada [[link]] del índice apunta a un archivo que existe
|
|
@@ -32,10 +32,10 @@ Auto-reparar: agregar al índice los archivos que faltan (con descripción vací
|
|
|
32
32
|
### 2. Wikilinks rotos
|
|
33
33
|
|
|
34
34
|
Buscar en todas las páginas wiki referencias `[[ruta/nombre]]` y verificar que
|
|
35
|
-
el archivo `
|
|
35
|
+
el archivo `wiki/ruta/nombre.md` existe.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
grep -rn "\[\["
|
|
38
|
+
grep -rn "\[\[" wiki/ --include="*.md" | grep -v "raw/"
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Reportar: lista de links rotos con el archivo donde aparecen.
|
|
@@ -53,7 +53,7 @@ Reportar: lista de huérfanas. No auto-borrar — requiere decisión humana.
|
|
|
53
53
|
|
|
54
54
|
### 4. Integridad del log
|
|
55
55
|
|
|
56
|
-
Verificar que `
|
|
56
|
+
Verificar que `wiki/log.md` existe y tiene al menos una entrada.
|
|
57
57
|
El log es append-only — nunca modificar entradas pasadas.
|
|
58
58
|
|
|
59
59
|
Reportar si el log no ha sido actualizado en los últimos 30 días (wiki posiblemente abandonado).
|
|
@@ -22,9 +22,9 @@ sabemos de", "wiki:", "query:", "consultar wiki", "what does the wiki say about"
|
|
|
22
22
|
|
|
23
23
|
### Paso 1 — Leer el índice
|
|
24
24
|
|
|
25
|
-
Leer `
|
|
25
|
+
Leer `wiki/index.md` para identificar qué páginas son relevantes a la pregunta.
|
|
26
26
|
|
|
27
|
-
Si no hay wiki (`
|
|
27
|
+
Si no hay wiki (`wiki/` no existe o está vacío): indicar que el wiki está vacío
|
|
28
28
|
y sugerir usar `/wiki-ingest` para agregar conocimiento.
|
|
29
29
|
|
|
30
30
|
### Paso 2 — Leer páginas relevantes
|
|
@@ -60,7 +60,7 @@ qué fuentes ingestar para cubrir el gap.
|
|
|
60
60
|
Si la pregunta produjo una síntesis nueva (no trivial, reutilizable), archivarla:
|
|
61
61
|
|
|
62
62
|
```
|
|
63
|
-
|
|
63
|
+
wiki/synthesis/<tema>.md
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
Formato:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAwCA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAwCA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwL7D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -60,7 +60,8 @@ export async function doctor(_args) {
|
|
|
60
60
|
// Core assets
|
|
61
61
|
const coreOk = existsSync(join(root, 'core', 'agents'))
|
|
62
62
|
&& existsSync(join(root, 'core', 'schemas'))
|
|
63
|
-
&& existsSync(join(root, '
|
|
63
|
+
&& existsSync(join(root, 'profiles'))
|
|
64
|
+
&& existsSync(join(root, 'adapters'));
|
|
64
65
|
if (coreOk) {
|
|
65
66
|
const assetsLine = `${icons.ok} forge assets: completos`;
|
|
66
67
|
console.log(' ' + assetsLine);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQ7C;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAa;IACjC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAC3B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;YAC/B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,iEAAiE;YACjE,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;gBAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAe;IAC1C,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,GAAG,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,CAAC;IAE7E,kBAAkB;IAClB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,YAAY,WAAW,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,YAAY,WAAW,sBAAsB,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,aAAa;IACb,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,EAAE,wBAAwB,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAErB,cAAc;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;eAClD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;eACzC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -410,7 +410,7 @@ export async function init(args) {
|
|
|
410
410
|
...allAgents.map(a => `.claude/agents/${a}.md`),
|
|
411
411
|
];
|
|
412
412
|
const ts = new Date().toISOString();
|
|
413
|
-
saveManifest(projectRoot, buildManifest(runtime, installedFiles, projectRoot, '2.9.
|
|
413
|
+
saveManifest(projectRoot, buildManifest(runtime, installedFiles, projectRoot, '2.9.7', ts));
|
|
414
414
|
},
|
|
415
415
|
},
|
|
416
416
|
]);
|
package/dist/lib/paths.d.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Resolves the forge root directory in priority order:
|
|
3
3
|
* 1. FORGE_HOME env var
|
|
4
4
|
* 2. assets/ next to the compiled CLI (npm package mode)
|
|
5
|
-
* 3. Walk up from __dirname
|
|
5
|
+
* 3. Walk up from __dirname (dev mode)
|
|
6
6
|
* 4. .agentic/ or forge/ in cwd (consumer project with submodule)
|
|
7
7
|
*/
|
|
8
8
|
export declare function resolveForgeRoot(): string;
|
|
9
|
-
export declare function resolveScript(name: string): string;
|
|
10
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":"
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA6BzC"}
|
package/dist/lib/paths.js
CHANGED
|
@@ -2,48 +2,44 @@ import { existsSync } from 'fs';
|
|
|
2
2
|
import { join, dirname } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
// A directory is a forge root if it contains core/agents (the defining asset).
|
|
6
|
+
function isForgeRoot(dir) {
|
|
7
|
+
return existsSync(join(dir, 'core', 'agents'));
|
|
8
|
+
}
|
|
5
9
|
/**
|
|
6
10
|
* Resolves the forge root directory in priority order:
|
|
7
11
|
* 1. FORGE_HOME env var
|
|
8
12
|
* 2. assets/ next to the compiled CLI (npm package mode)
|
|
9
|
-
* 3. Walk up from __dirname
|
|
13
|
+
* 3. Walk up from __dirname (dev mode)
|
|
10
14
|
* 4. .agentic/ or forge/ in cwd (consumer project with submodule)
|
|
11
15
|
*/
|
|
12
16
|
export function resolveForgeRoot() {
|
|
13
17
|
if (process.env.FORGE_HOME) {
|
|
14
18
|
const p = process.env.FORGE_HOME;
|
|
15
|
-
if (
|
|
19
|
+
if (isForgeRoot(p))
|
|
16
20
|
return p;
|
|
17
|
-
throw new Error(`FORGE_HOME="${p}"
|
|
21
|
+
throw new Error(`FORGE_HOME="${p}" is not a forge root (missing core/agents)`);
|
|
18
22
|
}
|
|
19
23
|
// npm package mode: __dirname is dist/lib/, assets/ is at package root (two levels up)
|
|
20
24
|
const assetsPath = join(__dirname, '..', '..', 'assets');
|
|
21
|
-
if (
|
|
25
|
+
if (isForgeRoot(assetsPath))
|
|
22
26
|
return assetsPath;
|
|
23
|
-
// dev mode: walk up from __dirname to find
|
|
27
|
+
// dev mode: walk up from __dirname to find the repo root
|
|
24
28
|
let dir = __dirname;
|
|
25
29
|
for (let i = 0; i < 8; i++) {
|
|
26
|
-
if (
|
|
30
|
+
if (isForgeRoot(dir))
|
|
27
31
|
return dir;
|
|
28
32
|
const parent = dirname(dir);
|
|
29
33
|
if (parent === dir)
|
|
30
34
|
break;
|
|
31
35
|
dir = parent;
|
|
32
36
|
}
|
|
33
|
-
// consumer project: look for .agentic/ or forge/
|
|
37
|
+
// consumer project: look for a vendored forge under .agentic/ or forge/
|
|
34
38
|
for (const candidate of ['.agentic', 'forge']) {
|
|
35
39
|
const p = join(process.cwd(), candidate);
|
|
36
|
-
if (
|
|
40
|
+
if (isForgeRoot(p))
|
|
37
41
|
return p;
|
|
38
42
|
}
|
|
39
43
|
throw new Error('forge root not found. Set FORGE_HOME or install via: npx @cristiancorreau/forge');
|
|
40
44
|
}
|
|
41
|
-
export function resolveScript(name) {
|
|
42
|
-
const root = resolveForgeRoot();
|
|
43
|
-
const scriptPath = join(root, 'scripts', name);
|
|
44
|
-
if (!existsSync(scriptPath)) {
|
|
45
|
-
throw new Error(`Script not found: ${scriptPath}`);
|
|
46
|
-
}
|
|
47
|
-
return scriptPath;
|
|
48
|
-
}
|
|
49
45
|
//# 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;;;;;;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,
|
|
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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED