@trycore/spec-build-harness 0.4.0 → 0.6.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/.claude-plugin/plugin.json +1 -1
- package/GOVERNANCE.md +27 -2
- package/INSTALL.md +6 -4
- package/METODOLOGIA.md +68 -12
- package/README.md +11 -15
- package/VERSION +1 -1
- package/agents/build/build-orchestrator.md +39 -5
- package/agents/build/dor-dod-gatekeeper.md +28 -7
- package/agents/build/ux-fidelity-reviewer.md +68 -0
- package/agents/build/wiring-adversarial-verifier.md +59 -0
- package/commands/build/onboard.md +38 -4
- package/dist/lib/settings-merge.js +1 -1
- package/dist/lib/state-seed.js +1 -0
- package/docs/agents.md +26 -2
- package/docs/customization/mcp-extensions.md +16 -5
- package/docs/getting-started.md +64 -209
- package/docs/hooks.md +12 -6
- package/hooks/build/design-source-guard.sh +52 -0
- package/hooks/build/load-build-state.sh +17 -1
- package/hooks/build-harness.json +4 -0
- package/package.json +1 -1
- package/skills/building-a-slice/SKILL.md +57 -3
- package/skills/building-a-slice/references/dod.md +14 -0
- package/skills/building-a-slice/references/dor.md +9 -3
- package/skills/building-a-slice/references/integration-check.md +27 -0
- package/skills/building-a-slice/references/mcp-map.md +1 -0
- package/skills/building-a-slice/references/state-protocol.md +21 -4
- package/state/README.md +31 -2
- package/state/build-state.schema.json +66 -3
- package/state/build-state.template.json +8 -0
- package/templates/CLAUDE.md.template +8 -3
- package/templates/integration-check.sh.template +65 -0
- package/templates/settings-hooks.template.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "BUILD: Onboard"
|
|
3
|
-
description: Parametriza el dominio del build harness — capa de servicios externos/IA, lógica determinista, PII, secretos
|
|
3
|
+
description: Parametriza el dominio del build harness — capa de servicios externos/IA, lógica determinista, PII, secretos, decisiones de alto impacto y fuente de diseño (DESIGN_SOURCE). Rellena el bloque marcado de CLAUDE.md y escribe auto-memory. Complementa al CLI trycore-build init (que ya sembró los archivos y el stack mecánico).
|
|
4
4
|
category: Workflow
|
|
5
5
|
tags: [onboarding, parametrizacion, build-harness, trycore]
|
|
6
6
|
---
|
|
@@ -35,7 +35,7 @@ Stop aquí si no está instalado.
|
|
|
35
35
|
|
|
36
36
|
El CLI ya instaló agentes, comandos /opsx:*, hooks y el estado. Ahora voy a parametrizar el
|
|
37
37
|
DOMINIO del arnés (2-3 min) — los puntos de extensión que leen los agentes de calidad
|
|
38
|
-
(security-reviewer, stack-guardian, data-consistency-checker, ux-krug-reviewer, simple-design-reviewer).
|
|
38
|
+
(security-reviewer, stack-guardian, data-consistency-checker, ux-krug-reviewer, simple-design-reviewer, ux-fidelity-reviewer).
|
|
39
39
|
|
|
40
40
|
Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
|
|
41
41
|
1. Ruta#ancla del PRD técnico (fuente del stack)
|
|
@@ -44,6 +44,8 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
|
|
|
44
44
|
4. Categorías de datos sensibles / PII reguladas
|
|
45
45
|
5. Secretos server-side
|
|
46
46
|
6. Decisiones de alto impacto que exigen explicabilidad en UX
|
|
47
|
+
7. Fuente de diseño / referencia visual (prototipo/export) y pantallas — o "N/A" si no hay UI
|
|
48
|
+
8. Capa de cada épica del backlog: **fundacional** (cimiento) vs **negocio**
|
|
47
49
|
```
|
|
48
50
|
|
|
49
51
|
---
|
|
@@ -61,17 +63,37 @@ Voy a leer tu PRD/openspec para proponer valores y confirmar contigo:
|
|
|
61
63
|
- **Datos sensibles / PII** (`SENSITIVE_DATA_CATEGORIES`): categorías reguladas del dominio.
|
|
62
64
|
- **Secretos server-side** (`SERVER_SIDE_SECRETS`): claves/tokens que jamás van al cliente.
|
|
63
65
|
- **Decisiones de alto impacto** (`HIGH_STAKES_DECISIONS`): decisiones que exigen explicabilidad/justificación en la UI.
|
|
66
|
+
- **Fuente de diseño** (`DESIGN_SOURCE`): ¿el producto tiene UI? Si sí, ruta/URL de la fuente
|
|
67
|
+
visual de verdad (prototipo, export de diseño o mockups) y cómo localizar cada pantalla; si no,
|
|
68
|
+
"N/A". (La escritura del estado `design_source` en `build-state.json` se hace en la Fase 3c.)
|
|
64
69
|
3. Si un punto no aplica al proyecto, registra explícitamente "no aplica" (no lo dejes como `{{...}}`).
|
|
65
70
|
|
|
66
71
|
---
|
|
67
72
|
|
|
73
|
+
## Fase 2b: Clasificar la capa de las épicas (cimiento vs negocio)
|
|
74
|
+
|
|
75
|
+
El factor que más reduce el consumo de contexto por slice es que el **cimiento** ya esté construido y
|
|
76
|
+
abstraído antes de que el loop tome historias de negocio. Para habilitar el gate de DoR "Cimiento
|
|
77
|
+
construido":
|
|
78
|
+
1. Lee el backlog/Story Map del proyecto (`docs/03-backlog/epicas.md`, `docs/02-user-story-map/`).
|
|
79
|
+
2. Propón, vía **AskUserQuestion**, qué épicas son **`layer: foundational`** (autenticación, acceso a
|
|
80
|
+
datos, arquitectura base, design-system/componentes base del prototipo) y cuáles **`layer: business`**.
|
|
81
|
+
3. Escribe el tag en el **frontmatter de cada épica** en `docs/03-backlog/epicas.md` (artefacto de
|
|
82
|
+
discovery; coordina con `@trycore/spec-product-flow` si ese paquete ya lo gobierna — el build-harness
|
|
83
|
+
solo necesita poder **leer** `layer`). El DoR rechazará abrir una épica de negocio que arrastre
|
|
84
|
+
cimiento `foundational` aún no archivado.
|
|
85
|
+
|
|
86
|
+
No inventes la clasificación: derívala del PRD/Story Map y confírmala con el usuario.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
68
90
|
## Fase 3: Resolver el bloque de CLAUDE.md
|
|
69
91
|
|
|
70
92
|
Lee `CLAUDE.md`. Encuentra el bloque entre `<!-- BEGIN trycore-build-harness` y `<!-- END trycore-build-harness -->`.
|
|
71
93
|
|
|
72
94
|
Reemplaza dentro del bloque los placeholders `{{PRD_TECH_PATH}}`, `{{EXTERNAL_SERVICE_LAYER}}`,
|
|
73
95
|
`{{DETERMINISTIC_LAYER}}`, `{{SENSITIVE_DATA_CATEGORIES}}`, `{{SERVER_SIDE_SECRETS}}`,
|
|
74
|
-
`{{HIGH_STAKES_DECISIONS}}` por los valores confirmados.
|
|
96
|
+
`{{HIGH_STAKES_DECISIONS}}`, `{{DESIGN_SOURCE}}` por los valores confirmados.
|
|
75
97
|
|
|
76
98
|
**NO toques nada fuera de los markers.**
|
|
77
99
|
|
|
@@ -87,6 +109,16 @@ Si el usuario lo desea y existe `package.json` en el proyecto:
|
|
|
87
109
|
|
|
88
110
|
---
|
|
89
111
|
|
|
112
|
+
## Fase 3c: (Si hay UI) Confirmar la fuente de diseño en el estado
|
|
113
|
+
|
|
114
|
+
Espejo de la confirmación de scaffold, para `design_source` en `build-state.json`:
|
|
115
|
+
- Si el producto **tiene UI**: setea `design_source.applies=true`, `source` (el puntero confirmado) y
|
|
116
|
+
`confirmed=true` **solo si** el usuario confirma que la fuente de diseño existe (con `confirmed_by`,
|
|
117
|
+
`confirmed_at`). El arnés **no genera** el prototipo.
|
|
118
|
+
- Si **no hay UI**: setea `design_source.applies=false` (el mecanismo de fidelidad queda N/A).
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
90
122
|
## Fase 4: Guardar en auto-memory
|
|
91
123
|
|
|
92
124
|
Crear/actualizar memorias **tipo `project`** (los valores cambian por proyecto):
|
|
@@ -97,6 +129,7 @@ Crear/actualizar memorias **tipo `project`** (los valores cambian por proyecto):
|
|
|
97
129
|
- `build_sensitive_data.md` → categorías PII/datos regulados
|
|
98
130
|
- `build_server_side_secrets.md` → secretos server-side
|
|
99
131
|
- `build_high_stakes_decisions.md` → decisiones de alto impacto
|
|
132
|
+
- `build_design_source.md` → fuente de diseño / referencia visual
|
|
100
133
|
|
|
101
134
|
Cada memoria con frontmatter `type: project`. Agrega entradas a `MEMORY.md`.
|
|
102
135
|
|
|
@@ -113,6 +146,7 @@ Determinista: <...>
|
|
|
113
146
|
PII/datos: <...>
|
|
114
147
|
Secretos: <...>
|
|
115
148
|
Decisiones clave: <...>
|
|
149
|
+
Fuente diseño: <...>
|
|
116
150
|
|
|
117
151
|
CLAUDE.md actualizado. Auto-memory escrita. Los agentes de calidad ya leen tu dominio.
|
|
118
152
|
|
|
@@ -129,7 +163,7 @@ CLAUDE.md actualizado. Auto-memory escrita. Los agentes de calidad ya leen tu do
|
|
|
129
163
|
|
|
130
164
|
## Guardrails
|
|
131
165
|
|
|
132
|
-
- No avances sin confirmar los
|
|
166
|
+
- No avances sin confirmar los 7 puntos. Si el usuario omite alguno, repregunta o marca "no aplica".
|
|
133
167
|
- Si CLAUDE.md no tiene el bloque marcado (caso raro post-install), pide correr `trycore-build init` (o `update`) antes de seguir.
|
|
134
168
|
- No inventes valores de dominio que no estén en el PRD ni confirmados por el usuario.
|
|
135
169
|
- Si un valor ya existe en memory y cambió, sobrescríbelo (los proyectos evolucionan).
|
|
@@ -18,7 +18,7 @@ function cmd(script) {
|
|
|
18
18
|
const HOOK_SPECS = [
|
|
19
19
|
{ event: 'SessionStart', matcher: 'startup|clear|compact', scripts: ['load-build-state.sh'] },
|
|
20
20
|
{ event: 'PreToolUse', matcher: 'Bash', scripts: ['gitflow-guard.sh'] },
|
|
21
|
-
{ event: 'PreToolUse', matcher: 'Write|Edit|MultiEdit', scripts: ['stack-guard.sh', 'scaffold-guard.sh'] },
|
|
21
|
+
{ event: 'PreToolUse', matcher: 'Write|Edit|MultiEdit', scripts: ['stack-guard.sh', 'scaffold-guard.sh', 'design-source-guard.sh'] },
|
|
22
22
|
{ event: 'PostToolUse', matcher: 'Write|Edit|MultiEdit', scripts: ['lint-typecheck.sh', 'coherence-flag.sh'] },
|
|
23
23
|
{ event: 'Stop', matcher: '.*', scripts: ['build-gate-check.sh', 'reflect-nudge.sh'] },
|
|
24
24
|
];
|
package/dist/lib/state-seed.js
CHANGED
|
@@ -11,6 +11,7 @@ const EMPTY_STATE = {
|
|
|
11
11
|
version: '1.0',
|
|
12
12
|
harness_phase: 'authoring',
|
|
13
13
|
scaffold: { confirmed: false, confirmed_by: null, confirmed_at: null, notes: '' },
|
|
14
|
+
design_source: { applies: false, confirmed: false, confirmed_by: null, confirmed_at: null, source: '', notes: '' },
|
|
14
15
|
active_slice: null,
|
|
15
16
|
history: [],
|
|
16
17
|
releases: [],
|
package/docs/agents.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# Agentes de construcción (`agents/build/`)
|
|
2
2
|
|
|
3
|
-
Los **
|
|
3
|
+
Los **12 agentes** de `@trycore/spec-build-harness` ejecutan los *gates* del arnés de
|
|
4
4
|
construcción de dos loops. Ninguno edita código de producto: son read-only sobre el
|
|
5
5
|
repositorio (algunos ejecutan tests o levantan la app), diagnostican y **devuelven el
|
|
6
6
|
veredicto al `build-orchestrator`**, que es quien propone la escritura del estado
|
|
7
7
|
(`.claude/state/build-state.json`).
|
|
8
8
|
|
|
9
9
|
> **Cadencia.** El `build-orchestrator` y `dor-dod-gatekeeper`, junto con
|
|
10
|
-
> `change-epic-coherence`, `api-contract-tester
|
|
10
|
+
> `change-epic-coherence`, `api-contract-tester`, `data-consistency-checker`,
|
|
11
|
+
> `ux-fidelity-reviewer` y `wiring-adversarial-verifier`, corren en el
|
|
11
12
|
> **inner loop** (skill `building-a-slice`, por épica `EP-XXX`). Los 5 revisores pesados de
|
|
12
13
|
> release (`security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`,
|
|
13
14
|
> `coherence-three-way`, `stack-guardian`) corren **una vez por release** en el **outer loop**
|
|
@@ -27,6 +28,8 @@ veredicto al `build-orchestrator`**, que es quien propone la escritura del estad
|
|
|
27
28
|
| 8 | `api-contract-tester` | sonnet | Contrato / datos | Gate `api` — pruebas de contrato (Newman/Postman) |
|
|
28
29
|
| 9 | `data-consistency-checker` | sonnet | Contrato / datos | Gate `data` — invariantes y consistencia de datos |
|
|
29
30
|
| 10 | `change-epic-coherence` | sonnet | Trazabilidad | Gate `coherence_link` — enlace change↔épica↔HU |
|
|
31
|
+
| 11 | `ux-fidelity-reviewer` | sonnet | Inner loop · smoke | Gate `fidelity` — fidelidad visual a la fuente de diseño declarada (verificación visual real, MCP) |
|
|
32
|
+
| 12 | `wiring-adversarial-verifier` | **opus** | Inner loop · dod | Gate `wiring_verified` — verificación adversarial independiente del cableado (refuta antes de cerrar `dod`) |
|
|
30
33
|
|
|
31
34
|
---
|
|
32
35
|
|
|
@@ -131,3 +134,24 @@ exista en `docs/04-historias/` con `epica:` coincidente, la coherencia de alcanc
|
|
|
131
134
|
`openspec validate <name> --type change --strict` pase; sugiere back-references. COHERENTE →
|
|
132
135
|
`gates.coherence_link: true`. Complementa a `coherence-three-way` validando el **enlace**
|
|
133
136
|
(este último valida la implementación real).
|
|
137
|
+
|
|
138
|
+
## Inner loop · fidelidad y cableado
|
|
139
|
+
|
|
140
|
+
### `ux-fidelity-reviewer` · modelo `sonnet` · lee el dominio
|
|
141
|
+
**Revisor de fidelidad visual** (gate `fidelity`), en la fase `smoke`. Comprueba que la pantalla
|
|
142
|
+
construida reproduce **composición, layout, paleta y tipografía** de la fuente de diseño declarada
|
|
143
|
+
(`DESIGN_SOURCE`). **Verificación visual real, requerida para UI**: con la app corriendo usa un MCP de
|
|
144
|
+
devtools de navegador (chrome-devtools) — `take_screenshot` app vs prototipo + `take_snapshot` de
|
|
145
|
+
estructura. Sin MCP el veredicto es INCONCLUSO, que para UI mapea a `gates.fidelity: false` (bloquea el
|
|
146
|
+
`dod`): hay que correr el slice donde el MCP esté disponible. No juzga usabilidad (eso es
|
|
147
|
+
`ux-krug-reviewer`, en el outer loop).
|
|
148
|
+
|
|
149
|
+
### `wiring-adversarial-verifier` · modelo `opus` · contexto virgen
|
|
150
|
+
**Verificador adversarial del cableado** (gate `wiring_verified`), al inicio de la fase `dod`. Llega
|
|
151
|
+
con contexto virgen e **independiente** del que construyó: su sesgo por defecto es "está incompleto" y
|
|
152
|
+
su trabajo es **refutar** el slice — cazar stubs, rutas sin cablear (endpoint sin invocar, cola sin
|
|
153
|
+
consumidor, componente sin enrutar), AC sin test real, puntos de integración entre capas no recorridos,
|
|
154
|
+
e items de `wiring_checklist[]` aún `failing` o marcados `passing` sin `evidence`. CABLEADO COMPLETO →
|
|
155
|
+
`gates.wiring_verified: true` (habilita `dod`); HUECOS → `false` (retrocede `phase`). Rompe la
|
|
156
|
+
auto-confirmación del cierre prematuro: el DoD declarativo del `dor-dod-gatekeeper` es un piso, este
|
|
157
|
+
agente es el arreglo.
|
|
@@ -2,16 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
> Guía de personalización para **consumidores** de `@trycore/spec-build-harness`. Explica cómo
|
|
4
4
|
> conectar servidores **MCP** (Model Context Protocol) y **LSP** (Language Server Protocol) para
|
|
5
|
-
> apoyar los gates del arnés. **
|
|
6
|
-
> gate
|
|
7
|
-
>
|
|
5
|
+
> apoyar los gates del arnés. **Casi todo lo de aquí es opcional** y el core es agnóstico: ningún
|
|
6
|
+
> gate **depende de un MCP concreto** (cualquier equivalente sirve). **Única excepción:** el gate
|
|
7
|
+
> `fidelity` en slices con UI **requiere** un MCP de devtools de navegador (verificación visual real),
|
|
8
|
+
> porque la fidelidad no puede acreditarse sin observar la salida real. Para todo lo demás, si tu
|
|
9
|
+
> entorno no expone ningún MCP, el arnés funciona igual cubriendo cada fase con sus alternativas CLI/test.
|
|
8
10
|
|
|
9
11
|
> **LSP tiene guía dedicada.** Este documento cubre sobre todo **MCP**. Para **LSP** (precisión de
|
|
10
12
|
> símbolo en stacks tipados: por qué, cuándo y cómo), ver **`lsp-extensions.md`**.
|
|
11
13
|
|
|
12
14
|
## TL;DR
|
|
13
15
|
|
|
14
|
-
- Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura
|
|
16
|
+
- Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura — con
|
|
17
|
+
la **única excepción** del gate `fidelity` en slices con UI, que sí exige un MCP de navegador.
|
|
15
18
|
- **Tú** declaras qué MCP habilitas en **tu** `settings` (el arnés no instala ninguno).
|
|
16
19
|
- La skill `building-a-slice` consulta un mapa por gate en
|
|
17
20
|
`skills/building-a-slice/references/mcp-map.md`: ahí está la lista de **ejemplos representativos**.
|
|
@@ -32,7 +35,8 @@ disponible:
|
|
|
32
35
|
| El agente/skill lo usa bajo demanda para obtener evidencia más rica (UI corriendo, BD, carga). | El mismo gate se cierra con la alternativa CLI/test indicada en `mcp-map.md`. |
|
|
33
36
|
|
|
34
37
|
Por eso ningún `command` de hook, ningún agente y ninguna skill **exigen** un MCP: lo **sugieren**
|
|
35
|
-
cuando aplica. El consumidor decide.
|
|
38
|
+
cuando aplica. El consumidor decide. **Salvedad documentada:** el gate `fidelity` de UI sí requiere un
|
|
39
|
+
MCP de navegador (categoría, no un proveedor concreto) — ver la fila `fidelity` y su nota más abajo.
|
|
36
40
|
|
|
37
41
|
## Cómo lo declara el consumidor (en TU settings)
|
|
38
42
|
|
|
@@ -70,6 +74,7 @@ cada uno por el que aplique a **tu** stack declarado en el PRD; ninguno es oblig
|
|
|
70
74
|
| Fase / gate | Agente | Ejemplo de MCP/LSP (opt-in) | Para qué | Alternativa sin MCP |
|
|
71
75
|
|---|---|---|---|---|
|
|
72
76
|
| `journey_smoke` (inner) / `integration` (release) | skill `verify` / `run` | Navegador headless vía MCP (p. ej. un MCP de devtools de navegador) | Recorrer el journey con la UI **corriendo**: snapshot del árbol accesible, screenshot, consola. | Smoke por test e2e/CLI del propio proyecto. |
|
|
77
|
+
| `fidelity` (inner, **slices con UI**) | `ux-fidelity-reviewer` | **MCP de devtools de navegador REQUERIDO** (p. ej. chrome-devtools): `take_screenshot` + `take_snapshot` | Acreditar fidelidad visual observando la **salida real** (app vs prototipo). | **No hay alternativa para UI**: sin verificación visual real el gate queda `false` (corre el slice donde el MCP esté disponible). El estático solo complementa. |
|
|
73
78
|
| `ux` (release) | `ux-krug-reviewer` | Navegador headless con auditoría tipo Lighthouse | Accesibilidad / Best-Practices y snapshots de la UI ensamblada de la release. | Revisión heurística Krug sobre el código + capturas manuales. |
|
|
74
79
|
| `api` (inner) | `api-contract-tester` | **Newman corre por CLI, no es MCP** | Contratos de endpoints sobre una colección de pruebas. | Es la vía por defecto: se ejecuta vía Bash, sin MCP. |
|
|
75
80
|
| `data` (inner) | `data-consistency-checker` | MCP de base de datos (solo si tu slice usa esa BD) | Consultas de lectura / describe de tablas para validar invariantes y consistencia. | Validación por tests contra un almacén embebido o cliente del stack. |
|
|
@@ -83,6 +88,12 @@ Notas de coherencia con el arnés:
|
|
|
83
88
|
release** en `releasing-a-version`. Habilita los MCP de esas fases pensando en el outer loop.
|
|
84
89
|
- El gate `api` usa **Newman por CLI**: es un ejemplo de que la herramienta de un gate **no tiene por
|
|
85
90
|
qué ser un MCP**. Lo importante es la evidencia (los contratos responden), no el canal.
|
|
91
|
+
- **Excepción única — `fidelity` en slices con UI.** Es el **único** gate donde un MCP es **requerido**,
|
|
92
|
+
no opt-in: la fidelidad visual no puede acreditarse sin **observar la salida real** (cargar la página,
|
|
93
|
+
comparar contra el prototipo, leer la consola). Se mantiene la agnosticidad a nivel de **categoría**
|
|
94
|
+
(cualquier MCP de devtools de navegador sirve; chrome-devtools es el ejemplo), pero **alguno** debe
|
|
95
|
+
estar disponible: sin él, `fidelity` queda `false` y el `dod` no cierra. La evidencia aquí **es** la
|
|
96
|
+
observación de la UI corriendo; no hay alternativa CLI que la sustituya.
|
|
86
97
|
|
|
87
98
|
## Reglas de uso (no negociables)
|
|
88
99
|
|
package/docs/getting-started.md
CHANGED
|
@@ -1,269 +1,124 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Quickstart — de 0 a tu primer slice
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
(una épica `EP-XXX`) con el arnés de construcción de Trycore (`@trycore/spec-build-harness`).
|
|
3
|
+
Guía pragmática para empezar a construir con `@trycore/spec-build-harness` (el compañero de construcción de `@trycore/spec-product-flow`). Instalación detallada y troubleshooting → [`INSTALL.md`](../INSTALL.md). Metodología (fuente de verdad) → [`METODOLOGIA.md`](../METODOLOGIA.md).
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
discovery produce los artefactos (`PRD → User Story Map → Backlog → Historias → Priorización →
|
|
8
|
-
Flows`); este arnés los lleva al **código** mediante un pipeline de **dos loops**.
|
|
5
|
+
## TL;DR
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
| **Outer** (pesado) | `releasing-a-version` | por release (línea del Story Map) | gates de seguridad, diseño, UX, coherencia triple, arquitectura e integración con deps reales — **una sola vez** |
|
|
14
|
-
|
|
15
|
-
Ambas verticales coexisten en el mismo `.claude/` sin colisión (namespaces disjuntos:
|
|
16
|
-
`trycore/` para discovery vs. `opsx/` + `build/` para construcción).
|
|
7
|
+
```bash
|
|
8
|
+
# 1) Requisitos + CLI — una vez por máquina
|
|
9
|
+
npm i -g @fission-ai/openspec @trycore/spec-build-harness
|
|
17
10
|
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
# 2) En la raíz de tu proyecto
|
|
12
|
+
trycore-build init # siembra el arnés (idempotente)
|
|
13
|
+
trycore-build doctor # verifica requisitos y hooks
|
|
14
|
+
```
|
|
20
15
|
|
|
21
|
-
|
|
16
|
+
```text
|
|
17
|
+
# 3) En Claude Code (lo corre Claude, no la terminal)
|
|
18
|
+
/build:onboard # parametriza el dominio: lee tu PRD, resuelve los {{placeholders}}
|
|
19
|
+
skill building-a-slice # construye una épica: DoR → change → TDD → smoke → DoD → PR
|
|
20
|
+
/build:reflect # (opcional) captura aprendizajes del slice recién archivado
|
|
21
|
+
skill releasing-a-version # al cerrar una línea de release del Story Map
|
|
22
|
+
```
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
| Min | Paso | Quién lo corre |
|
|
26
|
-
|---|---|---|
|
|
27
|
-
| 0–2 | 1. Instalar el CLI + requisitos duros | terminal |
|
|
28
|
-
| 2–5 | 2. `trycore-build init` en tu proyecto | terminal |
|
|
29
|
-
| 5–6 | 3. `trycore-build doctor` (verificar) | terminal |
|
|
30
|
-
| 6–9 | 4. `/build:onboard` (parametrizar dominio) | Claude Code |
|
|
31
|
-
| 9–14 | 5. Abrir un slice con la skill `building-a-slice` | Claude Code |
|
|
32
|
-
| 14+ | 6. ¿Cuándo correr `releasing-a-version`? | Claude Code |
|
|
24
|
+
Eso es el ciclo completo. Lo de abajo explica cada paso.
|
|
33
25
|
|
|
34
26
|
---
|
|
35
27
|
|
|
36
|
-
##
|
|
28
|
+
## Requisitos duros
|
|
37
29
|
|
|
38
|
-
|
|
39
|
-
externos** que el CLI **no puede instalar por ti**. `init` y `doctor` **fallan (exit 1)** si falta
|
|
40
|
-
alguno:
|
|
30
|
+
`init` y `doctor` **fallan (exit 1)** si falta alguno:
|
|
41
31
|
|
|
42
|
-
| Requisito | Para qué |
|
|
32
|
+
| Requisito | Para qué | Instalación |
|
|
43
33
|
|---|---|---|
|
|
44
|
-
| `openspec` |
|
|
45
|
-
| `python3` | los hooks
|
|
46
|
-
| `git` |
|
|
47
|
-
|
|
48
|
-
Instala el CLI y OpenSpec:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
npm install -g @trycore/spec-build-harness # CLI: bin `trycore-build`
|
|
52
|
-
npm install -g @fission-ai/openspec # requisito duro
|
|
53
|
-
```
|
|
34
|
+
| `openspec` | base de `/opsx:*` y las skills `openspec-*` | `npm i -g @fission-ai/openspec` |
|
|
35
|
+
| `python3` | los hooks leen `build-state.json` | gestor del sistema (brew/apt) |
|
|
36
|
+
| `git` | ramas, PRs, archivado de changes | gestor del sistema |
|
|
54
37
|
|
|
55
|
-
|
|
56
|
-
> proyecto: instala los comandos en `.claude/commands/{opsx,build}/`, namespaceados por subcarpeta
|
|
57
|
-
> (`/opsx:*`, `/build:onboard`), y referencia los agentes por su nombre. El canal **plugin nativo**
|
|
58
|
-
> (`/plugin marketplace add <repo> ; /plugin install trycore-spec-build-harness@trycore-build`) se
|
|
59
|
-
> ofrece como conveniencia a nivel usuario, pero Claude Code namespacea sus componentes bajo el
|
|
60
|
-
> nombre del plugin (`/trycore-spec-build-harness:*`); las cross-references internas (skills que
|
|
61
|
-
> invocan `/opsx:*`, agentes por nombre) están escritas para el canal CLI. **Para construir en un
|
|
62
|
-
> proyecto, usa el CLI.**
|
|
38
|
+
Runtime Node ≥18. **Usa el canal CLI** (npm), no el plugin, para operar dentro de un proyecto (ver el caveat de canales en [`INSTALL.md`](../INSTALL.md)).
|
|
63
39
|
|
|
64
40
|
---
|
|
65
41
|
|
|
66
|
-
##
|
|
67
|
-
|
|
68
|
-
Sitúate en la raíz de tu proyecto y ejecuta:
|
|
42
|
+
## 1 · Instalar (terminal)
|
|
69
43
|
|
|
70
44
|
```bash
|
|
71
|
-
trycore-build
|
|
45
|
+
npm i -g @fission-ai/openspec @trycore/spec-build-harness
|
|
72
46
|
```
|
|
73
47
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- **10 agentes** en `.claude/agents/build/` (build-orchestrator, dor-dod-gatekeeper,
|
|
77
|
-
security-reviewer, simple-design-reviewer, ux-krug-reviewer, coherence-three-way, stack-guardian,
|
|
78
|
-
api-contract-tester, data-consistency-checker, change-epic-coherence).
|
|
79
|
-
- **Comandos** `/opsx:*` (10) en `.claude/commands/opsx/` + `/build:onboard` y `/build:reflect` en `.claude/commands/build/`.
|
|
80
|
-
- **12 skills** en `.claude/skills/` (`building-a-slice`, `releasing-a-version`, 10 `openspec-*`).
|
|
81
|
-
- **8 hooks** bash en `.claude/hooks/build/` + permisos mínimos en `settings.json`.
|
|
82
|
-
- **Estado**: `.claude/state/build-state.json` (sembrado **vacío** y **nunca** sobreescrito; va al
|
|
83
|
-
`.gitignore`), más el schema y el README versionados.
|
|
84
|
-
- **Config**: `.claude/config/stack-allowlist.json` (artefacto del consumidor; lo siembra el CLI y
|
|
85
|
-
lo puebla `/build:onboard`).
|
|
86
|
-
- **Bloque marcado en `CLAUDE.md`** entre `<!-- BEGIN trycore-build-harness ... -->` y
|
|
87
|
-
`<!-- END trycore-build-harness -->`, con `{{placeholders}}` **sin resolver** (los resuelve
|
|
88
|
-
`/build:onboard`).
|
|
89
|
-
|
|
90
|
-
### Onboarding en dos capas
|
|
91
|
-
|
|
92
|
-
El onboarding tiene **dos capas** por una razón técnica: un binario Node **no puede escribir la
|
|
93
|
-
auto-memory de Claude**.
|
|
94
|
-
|
|
95
|
-
1. **Capa mecánica (este CLI)** — captura el stack: lenguaje/deps, package manager, runtime y ruta
|
|
96
|
-
del PRD. Por **prompt TTY** interactivo, o **CI-safe** con flags y `--yes`.
|
|
97
|
-
2. **Capa semántica (`/build:onboard`, lo corre Claude)** — lee el PRD, pregunta por PII, capa de
|
|
98
|
-
servicios externos/IA, capa determinista, secretos y decisiones de alto impacto, resuelve los
|
|
99
|
-
`{{placeholders}}` y escribe la auto-memory. (Paso 4.)
|
|
48
|
+
## 2 · `trycore-build init` (terminal)
|
|
100
49
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| Flag | Para qué |
|
|
104
|
-
|---|---|
|
|
105
|
-
| `--yes` | no interactivo: usa defaults para el stack |
|
|
106
|
-
| `--stack <deps>` | dependencias permitidas, coma-separadas |
|
|
107
|
-
| `--pkg-manager <pm>` | package manager (`npm` \| `pnpm` \| `yarn`) |
|
|
108
|
-
| `--runtime <semver>` | semver del runtime (ej. `">=18.18"`) |
|
|
109
|
-
| `--prd-path <path>` | ruta#ancla del PRD técnico (fuente del allowlist) |
|
|
110
|
-
| `--copy` | copiar archivos en vez de symlinkear (Windows sin admin, sandboxes) |
|
|
111
|
-
| `--force-init` | fuerza modo init aunque exista instalación previa |
|
|
112
|
-
| `--skip-doctor` | omite la verificación de requisitos (no recomendado) |
|
|
113
|
-
|
|
114
|
-
Ejemplo CI-safe:
|
|
50
|
+
Desde la raíz de tu proyecto. Es **idempotente** (re-correrlo es seguro) y siembra: **12 agentes**, **12 skills**, **10 comandos `/opsx:*`** + `/build:onboard` + `/build:reflect`, **9 hooks**, el estado vacío `.claude/state/build-state.json` (gitignored, nunca se sobreescribe) y el bloque `<!-- BEGIN trycore-build-harness -->` en tu `CLAUDE.md` con `{{placeholders}}` sin resolver.
|
|
115
51
|
|
|
116
52
|
```bash
|
|
117
|
-
trycore-build init
|
|
118
|
-
--stack "express,zod,pg" --pkg-manager pnpm \
|
|
119
|
-
--runtime ">=18.18" --prd-path "docs/01-prd/prd.md#requisitos-tecnicos"
|
|
53
|
+
trycore-build init
|
|
120
54
|
```
|
|
121
55
|
|
|
122
|
-
|
|
123
|
-
> `trycore-build update` (refresca assets/schema tras actualizar el paquete; **no** pisa estado ni
|
|
124
|
-
> allowlist), `trycore-build uninstall` (quita el arnés **preservando** `state/` y `config/`).
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## Paso 3 · `trycore-build doctor` (~1 min)
|
|
129
|
-
|
|
130
|
-
Verifica que el entorno esté listo **antes** de construir:
|
|
56
|
+
CI / no interactivo:
|
|
131
57
|
|
|
132
58
|
```bash
|
|
133
|
-
trycore-build
|
|
59
|
+
trycore-build init --yes \
|
|
60
|
+
--stack "express,zod,pg" --pkg-manager pnpm \
|
|
61
|
+
--prd-path "docs/01-prd/prd.md#requisitos-tecnicos"
|
|
134
62
|
```
|
|
135
63
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
- Los **3 requisitos duros** (`git`, `python3`, `openspec`) — **falla con exit 1** si falta alguno.
|
|
139
|
-
- Que los **8 hooks** tengan bit ejecutable (si no, sugiere `trycore-build init --copy` o `chmod +x`).
|
|
140
|
-
- **Doble canal**: si detecta hooks del arnés en `settings.json` (canal CLI) y además instalaste el
|
|
141
|
-
plugin, te recuerda que la cadena de comando es idéntica en ambos canales y Claude Code
|
|
142
|
-
**deduplica** → el hook dispara **una sola vez**. No requiere acción.
|
|
143
|
-
- **Reflexión y LSP (informativo, no falla):** reporta cuántos slices archivados están **sin
|
|
144
|
-
reflexionar** (sugiere `/build:reflect`) y, si detecta un stack tipado (`pom.xml`,
|
|
145
|
-
`build.gradle`, `*.csproj`, `tsconfig.json`…), sugiere activar **LSP**
|
|
146
|
-
(ver `docs/customization/lsp-extensions.md`).
|
|
147
|
-
|
|
148
|
-
Si ves `✓ Requisitos satisfechos.`, continúa.
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Paso 4 · `/build:onboard` en Claude Code (~3 min)
|
|
153
|
-
|
|
154
|
-
Abre Claude Code en el proyecto y ejecuta:
|
|
64
|
+
Otros: `trycore-build status` · `update` (refresca assets, no toca tu estado) · `uninstall` (preserva `state/` y `config/`). Flags completos en [`INSTALL.md`](../INSTALL.md).
|
|
155
65
|
|
|
156
|
-
|
|
157
|
-
/build:onboard
|
|
158
|
-
```
|
|
66
|
+
## 3 · `/build:onboard` (Claude Code)
|
|
159
67
|
|
|
160
|
-
|
|
161
|
-
`openspec/project.md` y confirma contigo, vía `AskUserQuestion`, **6 puntos** que luego leen los
|
|
162
|
-
agentes de calidad:
|
|
68
|
+
Abre Claude Code en el proyecto y corre `/build:onboard`. Lee tu PRD y confirma contigo, vía `AskUserQuestion`, **7 puntos de dominio** que luego leen los agentes de calidad; al terminar resuelve los `{{placeholders}}` del `CLAUDE.md` y escribe la auto-memory.
|
|
163
69
|
|
|
164
70
|
| Placeholder | Qué define |
|
|
165
71
|
|---|---|
|
|
166
72
|
| `PRD_TECH_PATH` | ruta#ancla del PRD técnico (fuente del stack) |
|
|
167
|
-
| `EXTERNAL_SERVICE_LAYER` | capa de servicios externos / IA y su frontera
|
|
73
|
+
| `EXTERNAL_SERVICE_LAYER` | capa de servicios externos / IA y su frontera |
|
|
168
74
|
| `DETERMINISTIC_LAYER` | lógica que **no** puede delegarse a un servicio no determinista |
|
|
169
|
-
| `SENSITIVE_DATA_CATEGORIES` |
|
|
170
|
-
| `SERVER_SIDE_SECRETS` |
|
|
171
|
-
| `HIGH_STAKES_DECISIONS` | decisiones que exigen explicabilidad
|
|
172
|
-
|
|
173
|
-
Al terminar, `/build:onboard` resuelve los `{{placeholders}}` del bloque marcado en `CLAUDE.md`,
|
|
174
|
-
opcionalmente puebla el `stack-allowlist.json`, y escribe la auto-memory (memorias tipo `project`).
|
|
175
|
-
Si un punto no aplica, se registra explícitamente como "no aplica" (no se deja como `{{...}}`).
|
|
75
|
+
| `SENSITIVE_DATA_CATEGORIES` | datos / PII regulados del dominio |
|
|
76
|
+
| `SERVER_SIDE_SECRETS` | secretos que **jamás** van al cliente |
|
|
77
|
+
| `HIGH_STAKES_DECISIONS` | decisiones que exigen explicabilidad en la UI |
|
|
78
|
+
| `DESIGN_SOURCE` | fuente de diseño / referencia visual (prototipo/export), o `N/A` si no hay UI |
|
|
176
79
|
|
|
177
|
-
|
|
80
|
+
Si un punto no aplica, se registra como "no aplica" (no se deja como `{{...}}`).
|
|
178
81
|
|
|
179
|
-
##
|
|
82
|
+
## 4 · Construir un slice (Claude Code)
|
|
180
83
|
|
|
181
|
-
|
|
182
|
-
rama = un PR**. Las HU de la épica (las que tienen `epica: EP-XXX` en `docs/04-historias/`) son el
|
|
183
|
-
**alcance interno** del change.
|
|
184
|
-
|
|
185
|
-
En Claude Code, invoca la skill (o pídelo en lenguaje natural: *"construye la épica EP-001"*):
|
|
84
|
+
**Un slice = una épica `EP-XXX` = un OpenSpec change = una rama = un PR.** Las HU de la épica son su alcance interno. Invoca `skill building-a-slice` (o pídelo en lenguaje natural: *"construye EP-001"*). Pipeline del **inner loop**:
|
|
186
85
|
|
|
187
86
|
```
|
|
188
|
-
|
|
87
|
+
DoR → change (+ trazabilidad) → TDD → journey-smoke (+ fidelidad si hay UI) → api/data → DoD reducido → PR + archive
|
|
189
88
|
```
|
|
190
89
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
| Fase | Acción | Delega en | Gate |
|
|
194
|
-
|---|---|---|---|
|
|
195
|
-
| 1 · dor | Validar Definition of Ready | `dor-dod-gatekeeper` | `dor` |
|
|
196
|
-
| 2 · change | `/opsx:new` + bloque `## Trazabilidad` que enlaza el change a la épica | `/opsx:new`, `change-epic-coherence` | `coherence_link` |
|
|
197
|
-
| 3 · tdd | red → green → refactor | `superpowers:test-driven-development` | `tdd` |
|
|
198
|
-
| 4 · smoke | recorrer el journey-hasta-aquí end-to-end | skill `verify`/`run` (+ MCP) | `journey_smoke` |
|
|
199
|
-
| 5 · api/data | contratos + consistencia (si aplican) | `api-contract-tester`, `data-consistency-checker` | `api`, `data` |
|
|
200
|
-
| 6 · dod | Definition of Done reducido por slice | `dor-dod-gatekeeper` | `dod` |
|
|
201
|
-
| 7 · pr | abrir PR + archivar el change en el mismo PR | `/opsx:archive`, `/opsx:sync` | — |
|
|
202
|
-
| 8 · release? | preguntar si correr el Release Gate ahora | usuario (default computado) | — |
|
|
203
|
-
|
|
204
|
-
Notas clave del inner loop:
|
|
205
|
-
|
|
206
|
-
- **Esqueleto que camina.** El **primer** slice de una release construye el journey completo más
|
|
207
|
-
delgado posible (aunque cada paso sea un stub). Cada épica posterior **engorda** un paso y mantiene
|
|
208
|
-
el `journey_smoke` verde. Nunca se construyen capas horizontales aisladas que "se juntan al final".
|
|
209
|
-
- **Estado = una sola fuente de verdad.** Todo se sincroniza en `.claude/state/build-state.json`
|
|
210
|
-
(schema y protocolo en `.claude/state/README.md`). Lee antes de actuar; escribe una vez por
|
|
211
|
-
transición. Un slice activo a la vez; un gate no se salta.
|
|
212
|
-
- **Gates pesados NO se cierran aquí.** `stack`, `security`, `smell`, `ux` y la coherencia triple
|
|
213
|
-
completa pertenecen al Release Gate. Lo que sí corre en tiempo real son los **hooks**:
|
|
214
|
-
`stack-guard.sh` (vigila deps fuera del allowlist), `lint-typecheck.sh`, `gitflow-guard.sh`
|
|
215
|
-
(bloquea commits/push directos a `main` — integras solo por **PR**).
|
|
216
|
-
- **El enlace change↔épica** va en el bloque `## Trazabilidad` del `proposal.md`, **nunca** en
|
|
217
|
-
frontmatter YAML (rompe `openspec validate`).
|
|
218
|
-
- **Reflexión (ciclo autocorrectivo).** Tras archivar el slice, `/build:reflect` puede capturar las
|
|
219
|
-
convenciones aprendidas / errores recurrentes en el bloque `trycore-build-learnings` de
|
|
220
|
-
`CLAUDE.md` (con tu aprobación). Lo **sugiere** el hook `reflect-nudge.sh` al cerrar la sesión;
|
|
221
|
-
es opcional y no bloquea.
|
|
222
|
-
- Objetivo: **≤ ~20 min por épica**, y producto que **camina end-to-end en todo momento**.
|
|
223
|
-
|
|
224
|
-
---
|
|
90
|
+
Lo que importa:
|
|
225
91
|
|
|
226
|
-
|
|
92
|
+
- **Esqueleto que camina.** El **primer** slice arma el journey completo más delgado posible; cada épica posterior engorda un paso y mantiene el `journey_smoke` verde. Nunca capas horizontales que "se juntan al final".
|
|
93
|
+
- **Precondiciones duras (el arnés las exige, no las genera):** un *scaffold runnable* confirmado y —si el slice tiene UI— una *fuente de diseño declarada* (`design_source`). Los hooks `scaffold-guard` y `design-source-guard` las respaldan.
|
|
94
|
+
- **Los gates pesados NO se cierran aquí** (seguridad, diseño, UX/Krug, coherencia triple, arquitectura): van al Release Gate. En el inner loop solo corre lo barato + los hooks en tiempo real (`gitflow-guard` bloquea commits/push directos a `main` → integras solo por **PR**; `stack-guard`, `lint-typecheck`).
|
|
95
|
+
- **El enlace change↔épica** va en el bloque `## Trazabilidad` del `proposal.md`, nunca en frontmatter YAML.
|
|
96
|
+
- **Una sola fuente de verdad:** `.claude/state/build-state.json`. Un slice activo a la vez; un gate no se salta. Objetivo: **≤ ~20 min por épica**.
|
|
227
97
|
|
|
228
|
-
|
|
229
|
-
**default computado** desde las líneas de release del Story Map (`docs/02-user-story-map/`):
|
|
98
|
+
> ¿Mantenimiento que no es producto nuevo (typo, bump de dep ya permitida, copy/config)? Usa `skill building-a-micro-change` (carril ligero `fix/*`/`chore/*`), no una épica.
|
|
230
99
|
|
|
231
|
-
|
|
232
|
-
**"Sí, correr `releasing-a-version`"**.
|
|
233
|
-
- Si no la cierra → default **"Continuar a la siguiente épica"**. Excepción (*nudge*): si hay
|
|
234
|
-
**≥ 2 épicas** archivadas desde el último Release Gate, lo recomienda igual.
|
|
100
|
+
## 5 · Release Gate (Claude Code, por release)
|
|
235
101
|
|
|
236
|
-
|
|
237
|
-
**diff acumulado** de toda la release:
|
|
102
|
+
Al archivar una épica, la skill te **pregunta** si correr el Release Gate (default computado desde las líneas de release del Story Map). `skill releasing-a-version` corre las **revisiones pesadas una sola vez** sobre el diff acumulado:
|
|
238
103
|
|
|
239
104
|
| Gate | Delega en |
|
|
240
105
|
|---|---|
|
|
241
106
|
| `security` | `security-reviewer` |
|
|
242
|
-
| `smell` (
|
|
107
|
+
| `smell` (Beck + code smells) | `simple-design-reviewer` |
|
|
243
108
|
| `ux` (Krug + lighthouse; `null` si sin UI) | `ux-krug-reviewer` |
|
|
244
109
|
| `coherence` (trazabilidad triple AC↔change↔código) | `coherence-three-way` |
|
|
245
110
|
| `stack_arch` (arquitectura del PRD) | `stack-guardian` |
|
|
246
|
-
| `integration` (journey completo con **deps reales
|
|
111
|
+
| `integration` (journey completo con **deps reales**) | skill `verify`/`run` |
|
|
247
112
|
|
|
248
|
-
|
|
249
|
-
obligatoria** para `status: passed`: es el gate que garantiza que el producto realmente funciona al
|
|
250
|
-
terminar. Si algo falla, lo corriges como un slice normal en `building-a-slice` y re-corres el gate.
|
|
113
|
+
`integration` con deps reales es obligatoria para `status: passed`. Se registra en `build-state.json → releases[]`. Si algo falla, lo corriges como un slice normal y re-corres el gate.
|
|
251
114
|
|
|
252
115
|
---
|
|
253
116
|
|
|
254
|
-
##
|
|
117
|
+
## Siguiente
|
|
255
118
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
# en Claude Code:
|
|
261
|
-
/build:onboard # paso 4
|
|
262
|
-
skill building-a-slice # EP-XXX: DoR → /opsx:new → TDD → smoke → DoD → PR # paso 5
|
|
263
|
-
/build:reflect # opcional: captura aprendizajes del slice recién archivado
|
|
264
|
-
# y cuando cierres una línea de release del Story Map:
|
|
265
|
-
skill releasing-a-version # paso 6
|
|
266
|
-
```
|
|
119
|
+
- **Instalación detallada / flags / plugin / troubleshooting** → [`INSTALL.md`](../INSTALL.md)
|
|
120
|
+
- **Agentes** → [`docs/agents.md`](agents.md) · **Hooks** → [`docs/hooks.md`](hooks.md) · **Comandos** → [`docs/commands.md`](commands.md)
|
|
121
|
+
- **Metodología** (manda ante cualquier skill) → [`METODOLOGIA.md`](../METODOLOGIA.md)
|
|
122
|
+
- **Extender con MCP/LSP** (opt-in) → [`docs/customization/`](customization/)
|
|
267
123
|
|
|
268
|
-
> El core
|
|
269
|
-
> aparte, en `docs/examples/reference/` (no forma parte del core).
|
|
124
|
+
> El core es **100% agnóstico** al proyecto. El ejemplo de referencia completo vive aparte en `docs/examples/reference/` (no forma parte del core).
|