@trycore/spec-build-harness 0.1.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/marketplace.json +21 -0
- package/.claude-plugin/plugin.json +28 -0
- package/GOVERNANCE.md +48 -0
- package/INSTALL.md +295 -0
- package/METODOLOGIA.md +360 -0
- package/README.md +130 -0
- package/VERSION +1 -0
- package/agents/build/api-contract-tester.md +32 -0
- package/agents/build/build-orchestrator.md +50 -0
- package/agents/build/change-epic-coherence.md +41 -0
- package/agents/build/coherence-three-way.md +35 -0
- package/agents/build/data-consistency-checker.md +48 -0
- package/agents/build/dor-dod-gatekeeper.md +46 -0
- package/agents/build/security-reviewer.md +46 -0
- package/agents/build/simple-design-reviewer.md +33 -0
- package/agents/build/stack-guardian.md +41 -0
- package/agents/build/ux-krug-reviewer.md +33 -0
- package/commands/build/onboard.md +136 -0
- package/commands/opsx/apply.md +152 -0
- package/commands/opsx/archive.md +157 -0
- package/commands/opsx/bulk-archive.md +242 -0
- package/commands/opsx/continue.md +114 -0
- package/commands/opsx/explore.md +174 -0
- package/commands/opsx/ff.md +94 -0
- package/commands/opsx/new.md +69 -0
- package/commands/opsx/onboard.md +525 -0
- package/commands/opsx/sync.md +134 -0
- package/commands/opsx/verify.md +164 -0
- package/config/stack-allowlist.template.json +12 -0
- package/dist/cli.js +105 -0
- package/dist/commands/doctor.js +77 -0
- package/dist/commands/init.js +129 -0
- package/dist/commands/status.js +59 -0
- package/dist/commands/uninstall.js +52 -0
- package/dist/commands/update.js +11 -0
- package/dist/lib/install-engine.js +99 -0
- package/dist/lib/markers.js +81 -0
- package/dist/lib/paths.js +65 -0
- package/dist/lib/settings-merge.js +125 -0
- package/dist/lib/stack-prompt.js +69 -0
- package/dist/lib/state-seed.js +59 -0
- package/docs/agents.md +133 -0
- package/docs/commands.md +128 -0
- package/docs/customization/mcp-extensions.md +117 -0
- package/docs/examples/reference/data-consistency.example.md +61 -0
- package/docs/examples/reference/security-foco.example.md +39 -0
- package/docs/examples/reference/stack-allowlist.example.json +61 -0
- package/docs/getting-started.md +260 -0
- package/docs/hooks.md +143 -0
- package/hooks/build/build-gate-check.sh +24 -0
- package/hooks/build/coherence-flag.sh +23 -0
- package/hooks/build/gitflow-guard.sh +65 -0
- package/hooks/build/lint-typecheck.sh +33 -0
- package/hooks/build/load-build-state.sh +46 -0
- package/hooks/build/stack-guard.sh +63 -0
- package/hooks/build-harness.json +61 -0
- package/internal/skills/auditar-arnes/SKILL.md +29 -0
- package/package.json +67 -0
- package/scripts/check-agnostic.sh +81 -0
- package/scripts/check-state-clean.sh +48 -0
- package/scripts/check-version-sync.sh +51 -0
- package/scripts/denylist.txt +30 -0
- package/skills/building-a-slice/SKILL.md +82 -0
- package/skills/building-a-slice/references/data-consistency.md +34 -0
- package/skills/building-a-slice/references/dod.md +25 -0
- package/skills/building-a-slice/references/dor.md +17 -0
- package/skills/building-a-slice/references/gitflow.md +30 -0
- package/skills/building-a-slice/references/krug-ux.md +27 -0
- package/skills/building-a-slice/references/link-change-epic.md +34 -0
- package/skills/building-a-slice/references/mcp-map.md +29 -0
- package/skills/building-a-slice/references/newman-tests.md +47 -0
- package/skills/building-a-slice/references/simple-design.md +33 -0
- package/skills/building-a-slice/references/state-protocol.md +48 -0
- package/skills/openspec-apply-change/SKILL.md +156 -0
- package/skills/openspec-archive-change/SKILL.md +114 -0
- package/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/skills/openspec-continue-change/SKILL.md +118 -0
- package/skills/openspec-explore/SKILL.md +290 -0
- package/skills/openspec-ff-change/SKILL.md +101 -0
- package/skills/openspec-new-change/SKILL.md +74 -0
- package/skills/openspec-onboard/SKILL.md +529 -0
- package/skills/openspec-sync-specs/SKILL.md +138 -0
- package/skills/openspec-verify-change/SKILL.md +168 -0
- package/skills/releasing-a-version/SKILL.md +56 -0
- package/skills/releasing-a-version/references/release-dod.md +20 -0
- package/state/README.md +56 -0
- package/state/build-state.schema.json +111 -0
- package/state/build-state.template.json +7 -0
- package/templates/CLAUDE.md.template +57 -0
- package/templates/newman.collection.template.json +28 -0
- package/templates/settings-hooks.template.json +25 -0
- package/templates/waivers/WAIVER.template.md +27 -0
package/docs/agents.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Agentes de construcción (`agents/build/`)
|
|
2
|
+
|
|
3
|
+
Los **10 agentes** de `@trycore/spec-build-harness` ejecutan los *gates* del arnés de
|
|
4
|
+
construcción de dos loops. Ninguno edita código de producto: son read-only sobre el
|
|
5
|
+
repositorio (algunos ejecutan tests o levantan la app), diagnostican y **devuelven el
|
|
6
|
+
veredicto al `build-orchestrator`**, que es quien propone la escritura del estado
|
|
7
|
+
(`.claude/state/build-state.json`).
|
|
8
|
+
|
|
9
|
+
> **Cadencia.** El `build-orchestrator` y `dor-dod-gatekeeper`, junto con
|
|
10
|
+
> `change-epic-coherence`, `api-contract-tester` y `data-consistency-checker`, corren en el
|
|
11
|
+
> **inner loop** (skill `building-a-slice`, por épica `EP-XXX`). Los 5 revisores pesados de
|
|
12
|
+
> release (`security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`,
|
|
13
|
+
> `coherence-three-way`, `stack-guardian`) corren **una vez por release** en el **outer loop**
|
|
14
|
+
> (skill `releasing-a-version`).
|
|
15
|
+
|
|
16
|
+
## Tabla resumen
|
|
17
|
+
|
|
18
|
+
| # | Agente | Modelo | Grupo | Gate / propósito |
|
|
19
|
+
|---|---|---|---|---|
|
|
20
|
+
| 1 | `build-orchestrator` | sonnet | Orquestación | Dirige el pipeline secuencial del slice; mantiene el estado y delega |
|
|
21
|
+
| 2 | `dor-dod-gatekeeper` | sonnet | Gatekeeping | Valida DoR (entrada) y DoD reducido (salida, gate `dod`) |
|
|
22
|
+
| 3 | `security-reviewer` | sonnet | Revisores de release | Gate `security` — seguridad enfocada al dominio |
|
|
23
|
+
| 4 | `simple-design-reviewer` | sonnet | Revisores de release | Gate `smell` — 4 reglas de Beck + code smells |
|
|
24
|
+
| 5 | `ux-krug-reviewer` | sonnet | Revisores de release | Gate `ux` — usabilidad (Steve Krug) |
|
|
25
|
+
| 6 | `coherence-three-way` | **opus** | Revisores de release | Gate `coherence` — coherencia triple AC↔change↔código |
|
|
26
|
+
| 7 | `stack-guardian` | sonnet | Revisores de release | Gate `stack` — stack y arquitectura vs. allowlist |
|
|
27
|
+
| 8 | `api-contract-tester` | sonnet | Contrato / datos | Gate `api` — pruebas de contrato (Newman/Postman) |
|
|
28
|
+
| 9 | `data-consistency-checker` | sonnet | Contrato / datos | Gate `data` — invariantes y consistencia de datos |
|
|
29
|
+
| 10 | `change-epic-coherence` | sonnet | Trazabilidad | Gate `coherence_link` — enlace change↔épica↔HU |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Orquestación
|
|
34
|
+
|
|
35
|
+
### `build-orchestrator` · modelo `sonnet`
|
|
36
|
+
Es el **orquestador de construcción**. No escribe código de producto: dirige el pipeline
|
|
37
|
+
secuencial del *inner loop* por épica (`dor → change → tdd → smoke → api/data → dod → pr →
|
|
38
|
+
release?`), mantiene `.claude/state/build-state.json` (un solo slice activo a la vez) y
|
|
39
|
+
delega en los demás agentes, en los skills `opsx:*` (motor de changes) y en
|
|
40
|
+
`superpowers:test-driven-development` (motor TDD). No salta gates, hace una escritura por
|
|
41
|
+
transición y, tras archivar, calcula el default del Release Gate para pasarlo a la skill
|
|
42
|
+
`building-a-slice`.
|
|
43
|
+
|
|
44
|
+
## Gatekeeping
|
|
45
|
+
|
|
46
|
+
### `dor-dod-gatekeeper` · modelo `sonnet`
|
|
47
|
+
**Gatekeeper DoR/DoD**, read-only sobre código. A la entrada valida la **Definition of
|
|
48
|
+
Ready** de la épica (existe en `epicas.md` con trazabilidad al PRD; tiene ≥1 HU; cada HU con
|
|
49
|
+
frontmatter completo y `estado: lista`; AC en Given/When/Then con happy/error/edge; INVEST;
|
|
50
|
+
dependencias declaradas; alcance dentro de la allowlist) y abre el `active_slice` si pasa. A
|
|
51
|
+
la salida valida la **Definition of Done reducida por slice** (gate `dod`): `tdd`,
|
|
52
|
+
`journey_smoke`, `coherence_link`, `data`, `api`, documentación con back-refs y hooks verdes.
|
|
53
|
+
**No valida aquí** `security`, `smell`, `ux`, `coherence` ni `stack`: esos son del Release Gate.
|
|
54
|
+
|
|
55
|
+
## Revisores de release
|
|
56
|
+
|
|
57
|
+
> Estos 5 corren una vez por release (skill `releasing-a-version`). Los **5 de valor de
|
|
58
|
+
> dominio** marcados abajo leen los activos concretos (qué es PII regulada, qué servicios
|
|
59
|
+
> externos/IA hay, qué es la capa determinista, qué decisiones son de alto impacto) del
|
|
60
|
+
> **bloque de dominio del `CLAUDE.md` del consumidor** o de su PRD.
|
|
61
|
+
|
|
62
|
+
### `security-reviewer` · modelo `sonnet` · lee el dominio
|
|
63
|
+
**Revisor de seguridad** (gate `security`). Aplica vectores generales (inyección, XSS,
|
|
64
|
+
deserialización, AuthN/AuthZ, secretos hardcodeados, deps vulnerables, SSRF/path traversal) y
|
|
65
|
+
los **especializa al dominio declarado por el consumidor**: secretos de servicios externos
|
|
66
|
+
solo server-side, datos sensibles/PII regulados no persistidos crudos, validación de archivos
|
|
67
|
+
y entrada, salida de servicios externos/IA tratada como input no confiable, logs sin PII y
|
|
68
|
+
decisiones auditables sin sobre-exposición. Veredicto por severidad
|
|
69
|
+
(CRÍTICO/ALTO/MEDIO/BAJO); sin CRÍTICO/ALTO → `gates.security: true`.
|
|
70
|
+
|
|
71
|
+
### `simple-design-reviewer` · modelo `sonnet`
|
|
72
|
+
**Revisor de diseño simple y code smells** (gate `smell`), sobre código ya en verde. Aplica
|
|
73
|
+
las 4 reglas de Kent Beck (pasa los tests → revela la intención → sin duplicación → mínimos
|
|
74
|
+
elementos) y caza un catálogo de smells (funciones largas, clases "Dios", números mágicos,
|
|
75
|
+
duplicación de validación, props drilling, código muerto, `any`, acoplamiento a servicios
|
|
76
|
+
externos). Hallazgos BLOQUEANTE/RECOMENDADO/NIT; sin bloqueantes → `gates.smell: true`.
|
|
77
|
+
|
|
78
|
+
### `ux-krug-reviewer` · modelo `sonnet` · lee el dominio
|
|
79
|
+
**Revisor de usabilidad** según Steve Krug (gate `ux`); aplica solo a slices con UI (sin UI →
|
|
80
|
+
`gates.ux: null`). Verifica "don't make me think", jerarquía visual, convenciones,
|
|
81
|
+
escaneabilidad, affordances, tolerancia al error (claridad de las decisiones de alto impacto y
|
|
82
|
+
su justificación según el dominio) y accesibilidad básica. Revisión estática y, si la app
|
|
83
|
+
corre, dinámica vía MCP `chrome-devtools` (`take_snapshot`, `lighthouse_audit`). Sin
|
|
84
|
+
bloqueantes → `gates.ux: true`.
|
|
85
|
+
|
|
86
|
+
### `coherence-three-way` · modelo `opus` · lee el dominio
|
|
87
|
+
**Auditor de coherencia triple** (gate `coherence`). Usa el modelo más capaz porque razona a
|
|
88
|
+
la vez sobre tres documentos: los **AC (G/W/T)** de las HU de la épica ↔ el **OpenSpec change**
|
|
89
|
+
(`specs/` + `tasks.md`) ↔ el **código y tests** implementados. Hace comprobaciones top-down
|
|
90
|
+
(cada requisito tiene implementación) y bottom-up (nada huérfano: ni tests sin propósito ni
|
|
91
|
+
código fuera del alcance de `hus[]`). Produce una matriz de trazabilidad; COHERENTE →
|
|
92
|
+
`gates.coherence: true`. Complementa a `change-epic-coherence` verificando la implementación real.
|
|
93
|
+
|
|
94
|
+
### `stack-guardian` · modelo `sonnet` · lee el dominio
|
|
95
|
+
**Guardián del stack** (gate `stack`, arquitectura). Defiende la sección de requisitos
|
|
96
|
+
técnicos del PRD del consumidor (ruta en `stack-allowlist.json#source`), operacionalizada en
|
|
97
|
+
`.claude/config/stack-allowlist.json`. Verifica que las **dependencias** matcheen la
|
|
98
|
+
allowlist y que la **arquitectura** respete el stack declarado (frontend/runtime del
|
|
99
|
+
consumidor; servicio externo/IA usado solo en su frontera server-side; capa de decisión del
|
|
100
|
+
dominio determinista sin servicio no determinista cuando el PRD lo exige; persistencia sin PII
|
|
101
|
+
regulada cruda) y señala anti-patrones. STACK-OK → `gates.stack: true`. El hook
|
|
102
|
+
`stack-guard.sh` bloquea deps fuera de lista en tiempo real; este agente razona sobre
|
|
103
|
+
arquitectura y uso.
|
|
104
|
+
|
|
105
|
+
## Contrato / datos
|
|
106
|
+
|
|
107
|
+
### `api-contract-tester` · modelo `sonnet` · lee el dominio
|
|
108
|
+
**Tester de contratos de API** (gate `api`); aplica solo a slices con endpoints (sin
|
|
109
|
+
endpoints → `gates.api: null`). Identifica Route Handlers/Server Actions, localiza o crea la
|
|
110
|
+
colección Postman (`tests/postman/<slice>.postman_collection.json` + `environment.json`) con
|
|
111
|
+
casos happy/error/edge alineados a los AC, levanta la app si hace falta y ejecuta **Newman**;
|
|
112
|
+
las aserciones validan status, esquema y campos clave. 100% verde → `gates.api: true`.
|
|
113
|
+
|
|
114
|
+
### `data-consistency-checker` · modelo `sonnet` · lee el dominio
|
|
115
|
+
**Verificador de consistencia de datos** (gate `data`); read-only sobre código pero ejecuta
|
|
116
|
+
tests. Comprueba **patrones de invariante** (no valores de un dominio específico): la salida
|
|
117
|
+
del servicio externo/IA validada contra esquema antes de alimentar la capa de decisión, tipos
|
|
118
|
+
y unidades consistentes, campos faltantes modelados explícitamente; y en la capa de decisión
|
|
119
|
+
determinista: determinismo, rango y constantes versionadas, explicabilidad (los drivers
|
|
120
|
+
reconstruyen el total), consistencia cruzada y sin PII regulada cruda persistida. Todas las
|
|
121
|
+
invariantes ✓ → `gates.data: true`.
|
|
122
|
+
|
|
123
|
+
## Trazabilidad
|
|
124
|
+
|
|
125
|
+
### `change-epic-coherence` · modelo `sonnet`
|
|
126
|
+
**Auditor de coherencia change↔épica** (gate `coherence_link`); impide OpenSpec changes
|
|
127
|
+
"huérfanos". Valida el bloque `## Trazabilidad` del `proposal.md` (líneas `Épica:` e
|
|
128
|
+
`Historias:`, fuera del frontmatter), que la EP exista en `epicas.md`, que cada HU listada
|
|
129
|
+
exista en `docs/04-historias/` con `epica:` coincidente, la coherencia de alcance
|
|
130
|
+
(`Why`/`What Changes` dentro de la unión de AC de las HU cubiertas) y que
|
|
131
|
+
`openspec validate <name> --type change --strict` pase; sugiere back-references. COHERENTE →
|
|
132
|
+
`gates.coherence_link: true`. Complementa a `coherence-three-way` validando el **enlace**
|
|
133
|
+
(este último valida la implementación real).
|
package/docs/commands.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Referencia de comandos — `@trycore/spec-build-harness`
|
|
2
|
+
|
|
3
|
+
Esta referencia cubre los **dos planos de operación** del arnés de construcción:
|
|
4
|
+
|
|
5
|
+
1. El **CLI `trycore-build`** (binario Node, paquete `@trycore/spec-build-harness` v0.1.0) — instala, actualiza, diagnostica y desinstala el arnés en el proyecto consumidor. Captura el **stack mecánico**.
|
|
6
|
+
2. Los **slash commands de Claude Code** (`/opsx:*` + `/build:onboard`) — operan el pipeline de dos loops y resuelven la parametrización **semántica** del dominio.
|
|
7
|
+
|
|
8
|
+
> **División de responsabilidades del onboarding (dos capas).** Un binario Node **no puede** escribir la auto-memory de Claude. Por eso `trycore-build init` siembra archivos y captura el stack mecánico (lenguaje/deps, package manager, runtime, ruta del PRD), y el slash command `/build:onboard` —ejecutado por Claude— lee el PRD, pregunta por PII / capa de servicios externos-IA / capa determinista / secretos / decisiones de alto impacto, resuelve los `{{placeholders}}` del bloque marcado de `CLAUDE.md` y escribe la auto-memory.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. CLI `trycore-build`
|
|
13
|
+
|
|
14
|
+
Comandos: `init` · `update` · `status` · `uninstall` · `doctor`. Todos aceptan un argumento posicional opcional `[directory]` (por defecto `.`, el directorio actual).
|
|
15
|
+
|
|
16
|
+
| Comando | Propósito |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `init [directory]` | Instala el arnés en el proyecto (idempotente: re-correrlo es seguro). Siembra agentes, comandos, skills y hooks; captura el stack mecánico; inserta el bloque marcado en `CLAUDE.md` y `.gitignore`; mergea hooks + permisos mínimos en `settings.json`. **Falla (exit 1)** si faltan requisitos externos duros (`openspec`, `python3`, `git`), salvo `--skip-doctor`. |
|
|
19
|
+
| `update [directory]` | Refresca assets y schema tras actualizar el paquete npm. Alias no interactivo de `init` en modo `update`. **Nunca** pisa `build-state.json` ni `stack-allowlist.json` (estado y allowlist son del consumidor). |
|
|
20
|
+
| `status [directory]` | Muestra estado de la instalación (versión instalada vs. paquete, drift), conteo de componentes, requisitos externos y la fase actual del arnés leída de `build-state.json` (slice activo, gates abiertos, historial, releases). |
|
|
21
|
+
| `uninstall [directory]` | Quita **solo** lo que `init` puso (agentes, comandos, skills del arnés, hooks, bloques marcados, permisos en `settings.json`). **Preserva** `.claude/state/` y `.claude/config/` (estado vivo y allowlist del equipo). |
|
|
22
|
+
| `doctor [directory]` | Verifica requisitos externos (`openspec`/`python3`/`git`), bit ejecutable de los hooks y la detección de doble canal en `settings.json`. **Falla (exit 1)** si falta un requisito duro. |
|
|
23
|
+
|
|
24
|
+
### Flags
|
|
25
|
+
|
|
26
|
+
Solo `init` y `update` aceptan flags. `status`, `uninstall` y `doctor` toman únicamente `[directory]`.
|
|
27
|
+
|
|
28
|
+
| Flag | Comandos | Propósito |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `--copy` | `init`, `update` | Copia los archivos en vez de symlinkearlos (Windows sin admin, sandboxes). En modo copia se preserva el bit ejecutable de los hooks. |
|
|
31
|
+
| `--yes` | `init` | No interactivo: usa los defaults del stack sin abrir prompt TTY (CI-safe). |
|
|
32
|
+
| `--skip-doctor` | `init`, `update` | Omite la verificación de `openspec`/`python3`/`git`. No recomendado: los hooks y `/opsx:*` fallarán en runtime si faltan. |
|
|
33
|
+
| `--force-init` | `init` | Fuerza modo `init` aunque ya exista una instalación previa (en vez de auto-detectar `update`). |
|
|
34
|
+
| `--stack <deps>` | `init` | Dependencias/paquetes permitidos, coma-separados, para poblar `stack-allowlist.json` (no interactivo). |
|
|
35
|
+
| `--pkg-manager <pm>` | `init` | Package manager: `npm` \| `pnpm` \| `yarn` (default `npm`). |
|
|
36
|
+
| `--runtime <semver>` | `init` | Semver del runtime, p. ej. `">=18.18"` (default `>=18.18`). |
|
|
37
|
+
| `--prd-path <path>` | `init` | Ruta#ancla del PRD técnico, fuente del allowlist (p. ej. `docs/01-prd/<tu-prd>.md#requisitos-tecnicos`). |
|
|
38
|
+
|
|
39
|
+
> Si pasas todos los datos del stack por flags (o usas `--yes`, o no hay TTY), `init` **no** abre prompt interactivo y usa flags/defaults; deja un aviso para ajustar `.claude/config/stack-allowlist.json` o correr `/build:onboard` después.
|
|
40
|
+
|
|
41
|
+
### Requisitos externos duros
|
|
42
|
+
|
|
43
|
+
`init` y `doctor` **fallan (exit 1)** si falta alguno. El CLI no puede instalarlos por ti:
|
|
44
|
+
|
|
45
|
+
| Requisito | Por qué | Instalación |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `openspec` | Columna vertebral de `/opsx:*` y las skills `openspec-*`. | `npm i -g @fission-ai/openspec` |
|
|
48
|
+
| `python3` | Los hooks bash parsean JSON con `python3`. | Vía el gestor de tu sistema. |
|
|
49
|
+
| `git` | Los hooks y `gitflow-guard` resuelven la raíz con `git rev-parse`. | Vía el gestor de tu sistema. |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 2. Slash commands de Claude Code
|
|
54
|
+
|
|
55
|
+
El canal CLI namespacea por subcarpeta: `.claude/commands/opsx/` → `/opsx:*` y `.claude/commands/build/` → `/build:onboard`.
|
|
56
|
+
|
|
57
|
+
### `/opsx:*` — pipeline OpenSpec
|
|
58
|
+
|
|
59
|
+
| Slash command | Propósito |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `/opsx:explore` | Entra en modo exploración: pensar ideas, investigar problemas, clarificar requisitos antes de comprometer un cambio. |
|
|
62
|
+
| `/opsx:new` | Inicia un nuevo cambio OpenSpec (crea el artefacto inicial del change). |
|
|
63
|
+
| `/opsx:continue` | Continúa un cambio en curso: genera el siguiente artefacto del workflow. |
|
|
64
|
+
| `/opsx:apply` | Implementa las tareas declaradas en un cambio OpenSpec. |
|
|
65
|
+
| `/opsx:verify` | Verifica que la implementación coincide con los artefactos del cambio **antes** de archivar. |
|
|
66
|
+
| `/opsx:archive` | Archiva un cambio completado en el workflow. |
|
|
67
|
+
| `/opsx:bulk-archive` | Archiva varios cambios completados de una sola vez. |
|
|
68
|
+
| `/opsx:ff` | Fast-forward: crea un cambio y genera **todos** los artefactos necesarios para implementar en un solo paso. |
|
|
69
|
+
| `/opsx:onboard` | Onboarding guiado: recorre un ciclo completo del workflow OpenSpec con narración (tutorial de aprendizaje). |
|
|
70
|
+
| `/opsx:sync` | Sincroniza los delta specs de un cambio hacia los specs principales. |
|
|
71
|
+
|
|
72
|
+
### `/build:onboard` — parametrización del dominio
|
|
73
|
+
|
|
74
|
+
| Slash command | Propósito |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `/build:onboard` | Parametriza el dominio del arnés: capa de servicios externos/IA, lógica determinista, PII, secretos y decisiones de alto impacto. Lee el PRD, pregunta vía AskUserQuestion, rellena el bloque marcado de `CLAUDE.md` y escribe la auto-memory. **Complementa** a `trycore-build init` (que ya sembró archivos y el stack mecánico). |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 3. Caveat de canales (CLI vs. plugin)
|
|
81
|
+
|
|
82
|
+
El arnés se distribuye por **dos canales** que coexisten, pero **namespacean distinto** los componentes. Esto es importante porque las cross-references internas (skills que invocan comandos, agentes referenciados por nombre) están escritas para el canal CLI.
|
|
83
|
+
|
|
84
|
+
| Aspecto | Canal **CLI** (canónico) | Canal **Plugin** nativo |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| Instalación | `npm i -g @trycore/spec-build-harness` → `trycore-build init` | `/plugin marketplace add <repo-github>` → `/plugin install trycore-spec-build-harness@trycore-build` |
|
|
87
|
+
| Namespace de comandos | Por subcarpeta: `/opsx:*` y `/build:onboard` | Por nombre del plugin: `/trycore-spec-build-harness:*` (por diseño de Claude Code) |
|
|
88
|
+
| Referencia a agentes | Por su nombre (p. ej. `build-orchestrator`) | Bajo el nombre del plugin |
|
|
89
|
+
| Cross-references internas | ✔ Escritas para este canal (skills invocan `/opsx:*`, agentes por nombre) | Pueden no resolver según están escritas |
|
|
90
|
+
| Recomendación | **Usar este canal para operar un proyecto** | Conveniencia a nivel usuario |
|
|
91
|
+
|
|
92
|
+
> **Recomendación:** opera tus proyectos con el **canal CLI**. El plugin nativo se ofrece como conveniencia, pero el prefijo `/trycore-spec-build-harness:*` y el namespacing por nombre de plugin pueden romper las cross-references internas escritas para `/opsx:*` y los agentes por nombre.
|
|
93
|
+
|
|
94
|
+
### Hooks: una sola cadena en ambos canales
|
|
95
|
+
|
|
96
|
+
Los hooks usan una **única cadena autorresolutiva idéntica** en los dos canales:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/<script>.sh"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Si instalas **ambos** canales, Claude Code deduplica la cadena y el hook **dispara una sola vez**. `doctor` lo detecta y lo informa; no requiere acción.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 4. Flujo de instalación de extremo a extremo
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 1. Requisitos externos (una vez por máquina)
|
|
110
|
+
npm i -g @fission-ai/openspec # openspec
|
|
111
|
+
# python3 y git: vía el gestor de tu sistema
|
|
112
|
+
|
|
113
|
+
# 2. Instala el CLI del arnés
|
|
114
|
+
npm i -g @trycore/spec-build-harness
|
|
115
|
+
|
|
116
|
+
# 3. En la raíz del proyecto: siembra archivos + captura el stack mecánico
|
|
117
|
+
cd <tu-proyecto>
|
|
118
|
+
trycore-build init # o init --yes / --stack ... / --prd-path ...
|
|
119
|
+
|
|
120
|
+
# 4. En Claude Code: parametriza el dominio y escribe la auto-memory
|
|
121
|
+
/build:onboard
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Verifica en cualquier momento con `trycore-build status` y `trycore-build doctor`.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
**Fuente de verdad.** La metodología canónica vive en `METODOLOGIA.md`. Si una skill contradice la metodología, **gana la metodología**.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Extensiones MCP / LSP del arnés (opt-in, agnóstico)
|
|
2
|
+
|
|
3
|
+
> Guía de personalización para **consumidores** de `@trycore/spec-build-harness`. Explica cómo
|
|
4
|
+
> conectar servidores **MCP** (Model Context Protocol) y **LSP** (Language Server Protocol) para
|
|
5
|
+
> apoyar los gates del arnés. **Todo lo de aquí es opcional.** El core es 100 % agnóstico: ningún
|
|
6
|
+
> gate, skill ni agente **depende** de un MCP concreto. Si tu entorno no expone ningún MCP, el arnés
|
|
7
|
+
> funciona igual cubriendo cada fase con sus alternativas CLI/test.
|
|
8
|
+
|
|
9
|
+
## TL;DR
|
|
10
|
+
|
|
11
|
+
- Los gates **pueden apoyarse** en MCP/LSP como **aceleradores**, nunca como dependencia dura.
|
|
12
|
+
- **Tú** declaras qué MCP habilitas en **tu** `settings` (el arnés no instala ninguno).
|
|
13
|
+
- La skill `building-a-slice` consulta un mapa por gate en
|
|
14
|
+
`skills/building-a-slice/references/mcp-map.md`: ahí está la lista de **ejemplos representativos**.
|
|
15
|
+
- Regla de oro: **opt-in + just-in-time + datos sintéticos**. Habilita solo lo que tu stack use,
|
|
16
|
+
invócalo solo en su fase, y nunca pases datos sensibles reales ni secretos a un MCP.
|
|
17
|
+
|
|
18
|
+
## Por qué opt-in y no dependencia
|
|
19
|
+
|
|
20
|
+
El arnés es el compañero de construcción de `@trycore/spec-product-flow`: del PRD/backlog al código,
|
|
21
|
+
épica a épica (inner loop `building-a-slice`) y release a release (outer loop `releasing-a-version`).
|
|
22
|
+
Para mantenerlo **portable a cualquier stack**, el contrato de cada gate se define por su **resultado
|
|
23
|
+
verificable** (un test que pasa, un journey que camina, un contrato que responde), no por la
|
|
24
|
+
herramienta que lo produce. Un MCP es solo una forma cómoda de obtener esa evidencia cuando está
|
|
25
|
+
disponible:
|
|
26
|
+
|
|
27
|
+
| Si tienes el MCP habilitado | Si NO lo tienes |
|
|
28
|
+
|---|---|
|
|
29
|
+
| 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`. |
|
|
30
|
+
|
|
31
|
+
Por eso ningún `command` de hook, ningún agente y ninguna skill **exigen** un MCP: lo **sugieren**
|
|
32
|
+
cuando aplica. El consumidor decide.
|
|
33
|
+
|
|
34
|
+
## Cómo lo declara el consumidor (en TU settings)
|
|
35
|
+
|
|
36
|
+
Los MCP **no** se versionan en el arnés ni los siembra `trycore-build init`. Se declaran en tu
|
|
37
|
+
configuración de Claude Code (a nivel proyecto o usuario), por ejemplo en
|
|
38
|
+
`.claude/settings.local.json` de tu proyecto, en la sección de servidores MCP que use tu instalación
|
|
39
|
+
de Claude Code. El patrón general es:
|
|
40
|
+
|
|
41
|
+
1. Declaras el servidor MCP en tu `settings` (binario/transporte, según el proveedor que elijas).
|
|
42
|
+
2. Lo habilitas solo en los entornos donde aplique (típicamente local/dev, no CI sin TTY).
|
|
43
|
+
3. La skill `building-a-slice` y los agentes lo detectan a través de las herramientas `mcp__*`
|
|
44
|
+
expuestas y lo invocan **solo en la fase correspondiente**.
|
|
45
|
+
|
|
46
|
+
> El arnés nunca escribe tus credenciales ni levanta el servidor por ti. La frontera de confianza
|
|
47
|
+
> (qué se conecta, con qué permisos) es **tuya**.
|
|
48
|
+
|
|
49
|
+
## El contrato: `mcp-map.md`
|
|
50
|
+
|
|
51
|
+
La skill del inner loop referencia un único archivo que mapea **fase/agente → MCP de ejemplo → para
|
|
52
|
+
qué**:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
skills/building-a-slice/references/mcp-map.md
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Trátalo como el **punto de extensión documentado**. Si en tu proyecto adoptas un MCP para un gate,
|
|
59
|
+
ese mapa es donde dejas constancia de la convención (qué MCP, en qué fase, con qué alternativa CLI si
|
|
60
|
+
no está disponible). Mantén la tabla en el mismo formato agnóstico: ejemplos, nunca obligaciones.
|
|
61
|
+
|
|
62
|
+
## Ejemplos de extensión por gate
|
|
63
|
+
|
|
64
|
+
Los siguientes son **ejemplos representativos** de cómo un MCP/LSP puede apoyar un gate. Sustituye
|
|
65
|
+
cada uno por el que aplique a **tu** stack declarado en el PRD; ninguno es obligatorio.
|
|
66
|
+
|
|
67
|
+
| Fase / gate | Agente | Ejemplo de MCP/LSP (opt-in) | Para qué | Alternativa sin MCP |
|
|
68
|
+
|---|---|---|---|---|
|
|
69
|
+
| `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. |
|
|
70
|
+
| `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. |
|
|
71
|
+
| `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. |
|
|
72
|
+
| `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. |
|
|
73
|
+
| `coherence` / diseño | `coherence-three-way`, `simple-design-reviewer`, `stack-guardian` | **LSP del lenguaje** (p. ej. LSP de TypeScript en stacks TS tipados) | Seguir definiciones/referencias con precisión de compilador: trazar símbolo→test, detectar duplicación y uso real. Mejor ROI que `grep` en código tipado. | Navegación con `grep`/`glob` + lectura dirigida. |
|
|
74
|
+
| perf (opcional, **fuera del DoD**) | — | MCP de pruebas de carga (p. ej. un MCP de k6) | Carga/latencia si una HU de la épica lo exige explícitamente. | Omitir; no es un gate del arnés. |
|
|
75
|
+
|
|
76
|
+
Notas de coherencia con el arnés:
|
|
77
|
+
|
|
78
|
+
- En el **inner loop** los gates pesados (`security`, `smell`, `ux`, coherencia triple completa,
|
|
79
|
+
arquitectura, integración con deps reales) **no** se cierran por épica: corren **una vez por
|
|
80
|
+
release** en `releasing-a-version`. Habilita los MCP de esas fases pensando en el outer loop.
|
|
81
|
+
- El gate `api` usa **Newman por CLI**: es un ejemplo de que la herramienta de un gate **no tiene por
|
|
82
|
+
qué ser un MCP**. Lo importante es la evidencia (los contratos responden), no el canal.
|
|
83
|
+
|
|
84
|
+
## Reglas de uso (no negociables)
|
|
85
|
+
|
|
86
|
+
1. **Opt-in y just-in-time.** Habilita un MCP solo si tu entorno lo expone, e invócalo **solo en su
|
|
87
|
+
fase**. No lo cargues "por si acaso": protege el contexto.
|
|
88
|
+
2. **El MCP de navegador requiere la app levantada.** Úsalo en la fase con la app corriendo
|
|
89
|
+
(`journey_smoke` en el inner loop, `integration`/`ux` en el release gate).
|
|
90
|
+
3. **Datos sintéticos siempre.** Ningún MCP debe recibir datos sensibles / PII regulados reales —los
|
|
91
|
+
que el consumidor declara en el bloque de dominio de su `CLAUDE.md` o su PRD— ni secretos. Los MCP
|
|
92
|
+
de BD apuntan a entornos de prueba con datos sintéticos.
|
|
93
|
+
4. **No conviertas un acelerador en dependencia.** Si introduces un MCP, deja siempre documentada la
|
|
94
|
+
alternativa CLI/test en `mcp-map.md` para que el gate siga cerrándose sin él.
|
|
95
|
+
5. **CI-safe.** Los MCP que requieren TTY o sesión interactiva van deshabilitados en CI; los gates
|
|
96
|
+
relevantes en CI se cubren por la alternativa de test/CLI.
|
|
97
|
+
|
|
98
|
+
## Cómo adoptar un MCP en tu proyecto (checklist)
|
|
99
|
+
|
|
100
|
+
1. Identifica el gate que quieres acelerar y comprueba que el MCP aplica a tu stack declarado.
|
|
101
|
+
2. Declara el servidor MCP en **tu** `settings` (no en el arnés) y habilítalo en el entorno correcto.
|
|
102
|
+
3. Anota la convención en `skills/building-a-slice/references/mcp-map.md`: fase, MCP, para qué, y la
|
|
103
|
+
alternativa sin MCP.
|
|
104
|
+
4. Verifica que el gate **sigue pasando con y sin** el MCP (portabilidad).
|
|
105
|
+
5. Confirma que no fluyen datos sensibles reales ni secretos hacia el MCP.
|
|
106
|
+
|
|
107
|
+
## Diagramas y diseño (extensión opcional aparte)
|
|
108
|
+
|
|
109
|
+
Para diagramas de arquitectura/flujo del slice, un ecosistema de diseño (p. ej. un MCP de Figma) es
|
|
110
|
+
**otro ejemplo opt-in**: si está habilitado puede ayudar a documentar, pero es totalmente opcional y
|
|
111
|
+
**no forma parte de ningún gate** del arnés.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
**Fuente de verdad.** El mapa operativo por gate vive en
|
|
116
|
+
`skills/building-a-slice/references/mcp-map.md`. Si algo aquí contradice la metodología Trycore
|
|
117
|
+
(`METODOLOGIA.md`), **gana la metodología**.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Ejemplo de dominio: consistencia de datos en KYC
|
|
2
|
+
|
|
3
|
+
> Este archivo es un **ejemplo concreto** de cómo un consumidor del arnés (en este caso, un proyecto
|
|
4
|
+
> KYC) instancia los invariantes-patrón definidos en `agents/build/data-consistency-checker.md`.
|
|
5
|
+
> El agente es agnóstico; los valores concretos de abajo viven en el dominio del consumidor
|
|
6
|
+
> (su PRD / su bloque de dominio en CLAUDE.md).
|
|
7
|
+
|
|
8
|
+
## Mapeo invariante-patrón → instancia KYC
|
|
9
|
+
|
|
10
|
+
| Invariante-patrón (agente) | Instancia concreta KYC |
|
|
11
|
+
|---|---|
|
|
12
|
+
| Servicio externo/IA de la frontera | Capa de extracción Gemini (Gemini 3.5 Flash, modo extract-only, vía `google-genai`) |
|
|
13
|
+
| Salida del servicio = input no confiable, validar contra esquema | El JSON que devuelve Gemini se valida con **zod** antes de alimentar el motor |
|
|
14
|
+
| Capa de decisión determinista del dominio | Motor de scoring determinista (sin IA) |
|
|
15
|
+
| Decisiones de alto impacto del dominio | Banda ∈ {Aprobar, Escalar, Rechazar} |
|
|
16
|
+
| Constantes desde config versionada | Pesos por factor y umbrales de banda versionados (no literales dispersos) |
|
|
17
|
+
| Datos regulados/PII crudos | Cédula, nombre, extracto bancario |
|
|
18
|
+
|
|
19
|
+
## Esquema de extracción (Gemini → JSON fijo), validado con zod
|
|
20
|
+
|
|
21
|
+
Campos típicos del esquema fijo de extracción:
|
|
22
|
+
|
|
23
|
+
- **Identidad**: nombre completo, número de cédula (documento normalizado), fecha de nacimiento.
|
|
24
|
+
- **Ingresos declarados**: monto numérico.
|
|
25
|
+
- **Movimientos/saldos**: lista de movimientos del extracto bancario, saldos por periodo.
|
|
26
|
+
|
|
27
|
+
Reglas de validación concretas:
|
|
28
|
+
|
|
29
|
+
1. La salida de Gemini valida contra el esquema zod (identidad, ingresos declarados,
|
|
30
|
+
movimientos/saldos). Si Gemini devuelve algo malformado, se **rechaza**, no se propaga al scoring.
|
|
31
|
+
2. Tipos y unidades consistentes: montos numéricos, fechas en ISO, número de cédula normalizado.
|
|
32
|
+
3. Campos faltantes se modelan como `null`/opcional, nunca con valores fantasma (p. ej. ingreso `0`
|
|
33
|
+
por defecto cuando en realidad falta el dato).
|
|
34
|
+
|
|
35
|
+
## Motor de scoring determinista (sin IA)
|
|
36
|
+
|
|
37
|
+
4. **Determinismo**: el mismo extracto + misma identidad → mismo score y misma banda, siempre.
|
|
38
|
+
Sin aleatoriedad ni llamada a IA dentro del motor.
|
|
39
|
+
5. **Rango**: score acotado con base 100; banda ∈ {Aprobar, Escalar, Rechazar} según umbrales
|
|
40
|
+
versionados. Pesos y umbrales se leen de config versionada.
|
|
41
|
+
6. **Explicabilidad**: la suma de los descuentos (drivers) por factor reconstruye el descuento total;
|
|
42
|
+
el score final cuadra con la base menos los drivers.
|
|
43
|
+
7. **Identidad cruzada**: nombre, número de cédula y fecha de nacimiento se comparan entre documentos
|
|
44
|
+
(p. ej. cédula vs. extracto). Las discrepancias se atribuyen al documento correcto.
|
|
45
|
+
8. **Sin PII cruda persistida** (cédula, nombre, extracto) como efecto colateral de los cálculos.
|
|
46
|
+
|
|
47
|
+
## Casos borde / fixtures concretos del dominio KYC
|
|
48
|
+
|
|
49
|
+
Los fixtures de test deben cubrir al menos:
|
|
50
|
+
|
|
51
|
+
- **Extracto vacío**: el extracto bancario no trae movimientos.
|
|
52
|
+
- **Saldos negativos**: saldos por debajo de cero en uno o más periodos.
|
|
53
|
+
- **Nombres con tildes / typos**: variaciones ortográficas entre identidad declarada y documento.
|
|
54
|
+
- **Ingresos en cero**: ingreso declarado `0` (distinguir de ingreso faltante = `null`).
|
|
55
|
+
- **Discrepancia de identidad**: número de cédula que no coincide entre dos documentos.
|
|
56
|
+
|
|
57
|
+
## Referencia de requisitos técnicos
|
|
58
|
+
|
|
59
|
+
Los detalles de esquema, umbrales y stack concreto provienen de la sección de requisitos técnicos
|
|
60
|
+
del PRD del consumidor (en este proyecto KYC: la sección §7 del PRD de validación documental, cuya
|
|
61
|
+
ruta canónica se declara en `stack-allowlist.json#source`).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Ejemplo concreto: Foco de seguridad para un dominio KYC
|
|
2
|
+
|
|
3
|
+
> Este archivo es un **ejemplo de dominio** (no forma parte del core agnóstico). Muestra cómo un
|
|
4
|
+
> consumidor del arnés instancia las categorías genéricas del `security-reviewer` con los activos
|
|
5
|
+
> concretos de su dominio. Un consumidor de KYC declararía esto en el bloque de dominio de su
|
|
6
|
+
> `CLAUDE.md` o en la sección de requisitos técnicos de su PRD.
|
|
7
|
+
|
|
8
|
+
## Mapeo de categorías genéricas → activos concretos del dominio KYC
|
|
9
|
+
|
|
10
|
+
1. **Secretos de servicios externos server-side → `GEMINI_API_KEY`.**
|
|
11
|
+
La `GEMINI_API_KEY` debe vivir solo server-side. Jamás en cliente, en bundles, ni en logs.
|
|
12
|
+
Las llamadas a Gemini (Gemini 3.5 Flash, vía `google-genai`) ocurren en el servidor. Marca
|
|
13
|
+
cualquier fuga al browser.
|
|
14
|
+
|
|
15
|
+
2. **Datos sensibles / PII regulados no persistidos crudos → cédula, nombre, extracto bancario.**
|
|
16
|
+
El prototipo NO debe guardar cédula/nombre/extracto crudos más allá de la demo
|
|
17
|
+
(ver `docs/01-prd/validacion-documental-kyc.md#7`). Verifica que no se escriben a
|
|
18
|
+
better-sqlite3/localStorage/logs sin necesidad.
|
|
19
|
+
|
|
20
|
+
3. **Archivos / entrada cargada → documentos de identidad y extractos.**
|
|
21
|
+
Validar tipo/tamaño; no ejecutar ni renderizar contenido no confiable.
|
|
22
|
+
|
|
23
|
+
4. **Salida de servicios externos/IA como input no confiable → JSON de Gemini.**
|
|
24
|
+
Tratar el JSON de Gemini (capa de extracción extract-only) como entrada no confiable →
|
|
25
|
+
validar con zod antes de alimentar el motor de scoring determinista.
|
|
26
|
+
|
|
27
|
+
5. **Logs/telemetría → sin PII KYC.**
|
|
28
|
+
Sin cédula/nombre/extracto ni el contenido de documentos; redacción de campos sensibles.
|
|
29
|
+
|
|
30
|
+
6. **Decisiones auditables sin sobre-exposición → Aprobar/Escalar/Rechazar.**
|
|
31
|
+
La evidencia mostrada al analista de KYC para soportar la decisión (Aprobar / Escalar /
|
|
32
|
+
Rechazar) no debe filtrar más PII de la necesaria.
|
|
33
|
+
|
|
34
|
+
## Stack de referencia del ejemplo
|
|
35
|
+
|
|
36
|
+
- Next.js / Tailwind / shadcn en el front.
|
|
37
|
+
- better-sqlite3 como almacenamiento de la demo.
|
|
38
|
+
- Gemini 3.5 Flash (`google-genai`) como capa de extracción extract-only.
|
|
39
|
+
- Motor de scoring determinista para la tripleta Aprobar/Escalar/Rechazar.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Allowlist de dependencias derivada del PRD §7 (docs/01-prd/validacion-documental-kyc.md). Toda dependencia en package.json fuera de esta lista exige revisión manual de stack-guardian. Patrones soportan comodín de sufijo '*' para scopes. Editar SOLO si el PRD §7 cambia, y dejar nota en GOVERNANCE.md.",
|
|
3
|
+
"source": "docs/01-prd/validacion-documental-kyc.md#7-requisitos-tecnicos",
|
|
4
|
+
"version": "1.0",
|
|
5
|
+
"runtime": {
|
|
6
|
+
"node": ">=18.18",
|
|
7
|
+
"packageManager": "npm|pnpm"
|
|
8
|
+
},
|
|
9
|
+
"allow": [
|
|
10
|
+
"next",
|
|
11
|
+
"react",
|
|
12
|
+
"react-dom",
|
|
13
|
+
"typescript",
|
|
14
|
+
"tailwindcss",
|
|
15
|
+
"postcss",
|
|
16
|
+
"autoprefixer",
|
|
17
|
+
"@radix-ui/*",
|
|
18
|
+
"class-variance-authority",
|
|
19
|
+
"clsx",
|
|
20
|
+
"tailwind-merge",
|
|
21
|
+
"tailwindcss-animate",
|
|
22
|
+
"lucide-react",
|
|
23
|
+
"framer-motion",
|
|
24
|
+
"google-genai",
|
|
25
|
+
"@google/genai",
|
|
26
|
+
"@google/generative-ai",
|
|
27
|
+
"zod",
|
|
28
|
+
"better-sqlite3",
|
|
29
|
+
"@types/*",
|
|
30
|
+
"eslint",
|
|
31
|
+
"eslint-config-next",
|
|
32
|
+
"prettier",
|
|
33
|
+
"prettier-plugin-tailwindcss",
|
|
34
|
+
"vitest",
|
|
35
|
+
"@vitejs/plugin-react",
|
|
36
|
+
"jest",
|
|
37
|
+
"ts-jest",
|
|
38
|
+
"@testing-library/react",
|
|
39
|
+
"@testing-library/jest-dom",
|
|
40
|
+
"@testing-library/user-event",
|
|
41
|
+
"jsdom",
|
|
42
|
+
"newman",
|
|
43
|
+
"newman-reporter-htmlextra"
|
|
44
|
+
],
|
|
45
|
+
"deny_examples": [
|
|
46
|
+
"express",
|
|
47
|
+
"axios",
|
|
48
|
+
"lodash",
|
|
49
|
+
"moment",
|
|
50
|
+
"openai",
|
|
51
|
+
"@anthropic-ai/sdk"
|
|
52
|
+
],
|
|
53
|
+
"rationale": {
|
|
54
|
+
"frontend": "Next.js 14+ App Router + TypeScript + Tailwind + shadcn/ui (Radix + cva + lucide) + Framer Motion.",
|
|
55
|
+
"ai": "Extracción documental con Gemini 3.5 Flash vía google-genai. NO otros proveedores de IA (el scoring es determinista en TS, sin IA).",
|
|
56
|
+
"validation": "zod para validar el JSON de esquema fijo.",
|
|
57
|
+
"persistence": "Prototipo: better-sqlite3 o localStorage; sin PII cruda persistida.",
|
|
58
|
+
"testing": "vitest/jest + Testing Library (TDD); newman para contratos de endpoints.",
|
|
59
|
+
"deny_examples_reason": "Backend propio (express/axios), utilidades pesadas (lodash/moment) y otros SDK de IA contradicen el PRD §7."
|
|
60
|
+
}
|
|
61
|
+
}
|