@dforce2055/dai 0.8.2 → 0.10.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.
Files changed (55) hide show
  1. package/{.env.example → .env.dai.example} +3 -3
  2. package/CHANGELOG.md +81 -0
  3. package/README.md +41 -29
  4. package/VERSION +1 -1
  5. package/cli/dai.mjs +175 -44
  6. package/cli/lib/bootstrap.mjs +42 -7
  7. package/cli/lib/env.mjs +12 -0
  8. package/cli/lib/forge-api.mjs +89 -2
  9. package/cli/lib/pm-clickup.mjs +2 -2
  10. package/cli/lib/pm-jira.mjs +2 -2
  11. package/cli/lib/review-findings.mjs +195 -0
  12. package/cli/lib/skills-source.mjs +8 -0
  13. package/docs/EJEMPLO-END-TO-END.md +52 -43
  14. package/docs/MANIFIESTO.md +2 -2
  15. package/docs/METODOLOGIA.md +20 -15
  16. package/docs/PROBAR.md +13 -14
  17. package/docs/SCRUM-CON-IA.md +10 -10
  18. package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +1 -1
  19. package/docs/adr/0006-distribucion-y-licencia.md +1 -1
  20. package/docs/adr/0013-skills-externas-install-from.md +11 -4
  21. package/docs/adr/0015-jira-corporativo.md +1 -1
  22. package/docs/adr/0016-review-inline.md +128 -0
  23. package/docs/adr/0017-env-dai.md +64 -0
  24. package/docs/adr/README.md +2 -0
  25. package/docs/detalle/01-refinamiento.md +6 -5
  26. package/docs/detalle/03-ramas.md +2 -2
  27. package/docs/detalle/04-tdd.md +15 -9
  28. package/docs/detalle/06-code-review.md +8 -5
  29. package/docs/detalle/08-daily.md +1 -1
  30. package/docs/detalle/README.md +1 -1
  31. package/docs/glosario.md +2 -2
  32. package/docs/guias/dev.md +10 -7
  33. package/docs/guias/index.md +12 -0
  34. package/docs/guias/lead.md +1 -1
  35. package/docs/guias/po.md +13 -7
  36. package/docs/index.md +35 -0
  37. package/docs/public/favicon.svg +12 -0
  38. package/docs/public/logo-link.svg +12 -0
  39. package/docs/public/logo.svg +12 -0
  40. package/docs/public/tutoriales/clickup-1-settings.png +0 -0
  41. package/docs/public/tutoriales/clickup-2-api.png +0 -0
  42. package/docs/public/tutoriales/clickup-3-generate-copy.png +0 -0
  43. package/docs/public/tutoriales/jira-1-avatar.png +0 -0
  44. package/docs/public/tutoriales/jira-2-seguridad-tokens.png +0 -0
  45. package/docs/public/tutoriales/jira-3-crear-token.png +0 -0
  46. package/docs/public/tutoriales/jira-4-nombre-vencimiento.png +0 -0
  47. package/docs/public/tutoriales/jira-5-copiar.png +0 -0
  48. package/docs/tutoriales/claves-ssh.md +93 -0
  49. package/docs/tutoriales/configurar-git.md +53 -0
  50. package/docs/tutoriales/index.md +18 -0
  51. package/docs/tutoriales/instalar-glab.md +74 -0
  52. package/docs/tutoriales/token-clickup.md +73 -0
  53. package/docs/tutoriales/token-jira.md +74 -0
  54. package/package.json +9 -3
  55. package/skills/dai-review/SKILL.md +96 -42
@@ -0,0 +1,93 @@
1
+ # Claves SSH para GitHub y GitLab
2
+
3
+ Guía para generar tu **clave SSH** y registrarla en GitHub y/o GitLab. En dai, **git usa
4
+ SSH** (clonar, `push`, `pull`); los tokens son solo para el forge y el tracker, y **nunca**
5
+ se usa la contraseña ([ADR-0007](../adr/0007-modelo-de-autenticacion.md)). Con la clave
6
+ configurada, `dai pr` puede pushear la rama sin pedirte credenciales.
7
+
8
+ > **Una vez por máquina.** La misma clave sirve para GitHub y GitLab (y para todos tus
9
+ > repos). No necesitas una por proyecto.
10
+
11
+ ---
12
+
13
+ ## Paso 1 — ¿Ya tienes una clave?
14
+
15
+ ```bash
16
+ ls ~/.ssh/id_ed25519.pub
17
+ ```
18
+
19
+ Si el archivo existe, ya tienes clave: salta al **Paso 4**. Si dice *"No such file"*, sigue
20
+ con el paso 2.
21
+
22
+ ---
23
+
24
+ ## Paso 2 — Genera la clave
25
+
26
+ ```bash
27
+ ssh-keygen -t ed25519 -C "tu-correo@ejemplo.com"
28
+ ```
29
+
30
+ - Usa el correo de tu cuenta de GitHub/GitLab.
31
+ - Cuando pregunte la ubicación, acepta la default (Enter).
32
+ - La *passphrase* es opcional pero recomendada (una contraseña que protege la clave).
33
+
34
+ > Si tu sistema es viejo y no soporta `ed25519`, usa `-t rsa -b 4096`.
35
+
36
+ ---
37
+
38
+ ## Paso 3 — Carga la clave en el agente SSH
39
+
40
+ ```bash
41
+ eval "$(ssh-agent -s)" # inicia el agente
42
+ ssh-add ~/.ssh/id_ed25519 # carga tu clave (pide la passphrase si pusiste una)
43
+ ```
44
+
45
+ > **Windows:** usa **Git Bash** para estos comandos, o habilita el servicio *OpenSSH
46
+ > Authentication Agent* de Windows.
47
+
48
+ ---
49
+
50
+ ## Paso 4 — Copia la clave **pública**
51
+
52
+ Nunca compartas la privada (`id_ed25519`). Copia solo la **pública** (`.pub`):
53
+
54
+ ```bash
55
+ cat ~/.ssh/id_ed25519.pub # muestra la clave; copiala entera (empieza con "ssh-ed25519")
56
+ # atajos: macOS → | pbcopy · Windows (Git Bash) → | clip · Linux → | xclip -sel clip
57
+ ```
58
+
59
+ ---
60
+
61
+ ## Paso 5 — Pégala en GitHub y/o GitLab
62
+
63
+ - **GitHub:** *Settings → SSH and GPG keys → New SSH key*. Pega la clave, ponle un título
64
+ (ej. `laptop-trabajo`) y guarda.
65
+ Acceso directo: **https://github.com/settings/ssh/new**
66
+ - **GitLab:** *Preferences → SSH Keys → Add new key*. Pega la clave y guarda. En un GitLab
67
+ **self-hosted/corporativo** entra por la URL de tu instancia
68
+ (`https://gitlab.tu-empresa.com/-/user_settings/ssh_keys`).
69
+
70
+ ---
71
+
72
+ ## Paso 6 — Prueba la conexión
73
+
74
+ ```bash
75
+ ssh -T git@github.com
76
+ # → "Hi <usuario>! You've successfully authenticated..."
77
+
78
+ ssh -T git@gitlab.com
79
+ # (self-hosted: ssh -T git@gitlab.tu-empresa.com)
80
+ ```
81
+
82
+ La primera vez te pregunta si confías en el host: escribí `yes`. Si ves el saludo con tu
83
+ usuario, quedó lista.
84
+
85
+ ---
86
+
87
+ ## Reglas de seguridad
88
+
89
+ - 🔒 **La clave privada nunca sale de tu máquina.** No la pegues en ningún lado, no la
90
+ commitees, no la mandes por chat. Solo se registra la **pública** (`.pub`).
91
+ - 🧯 **Si se compromete tu máquina**, borra la clave pública de GitHub/GitLab (misma
92
+ pantalla del paso 5) y generá una nueva.
93
+ - 👤 Es **por máquina y por persona**: cada dev tiene la suya.
@@ -0,0 +1,53 @@
1
+ # Configurar tu identidad de git
2
+
3
+ Antes de tu primer commit, git necesita saber **quién sos**: cada commit lleva un nombre y
4
+ un correo de autor. Sin configurarlo, los commits salen con un autor vacío o incorrecto, y
5
+ en dai la **autoría siempre es de una persona** — nunca de un bot.
6
+
7
+ > **Una vez por máquina.** Con `--global` queda para todos tus repos.
8
+
9
+ ---
10
+
11
+ ## Paso 1 — Nombre y correo
12
+
13
+ ```bash
14
+ git config --global user.name "Nombre Completo"
15
+ git config --global user.email "tu-correo@ejemplo.com"
16
+ ```
17
+
18
+ > **Usa el mismo correo que tu cuenta de GitHub/GitLab.** Así el forge te **atribuye** los
19
+ > commits (aparecen con tu avatar y cuentan en tu actividad). Si el correo no coincide, los
20
+ > commits quedan "huérfanos", sin vincularse a tu cuenta.
21
+
22
+ ---
23
+
24
+ ## Paso 2 — Verifica
25
+
26
+ ```bash
27
+ git config --global user.name # → Nombre Completo
28
+ git config --global user.email # → tu-correo@ejemplo.com
29
+ git config --global --list # ve toda la config global
30
+ ```
31
+
32
+ ---
33
+
34
+ ## Un correo distinto para un repo puntual
35
+
36
+ Si en un repo específico quieres usar otra identidad (ej. trabajo vs. personal), configúralo
37
+ **sin** `--global`, dentro de ese repo:
38
+
39
+ ```bash
40
+ cd mi-repo
41
+ git config user.email "correo-de-este-repo@ejemplo.com"
42
+ ```
43
+
44
+ La config del repo **gana** sobre la global, solo ahí.
45
+
46
+ ---
47
+
48
+ ## Por qué importa en dai
49
+
50
+ - **Trazabilidad de autoría:** dai ata el QUÉ al CÓMO, y el CÓMO lo firma una persona. Un
51
+ commit con autor mal seteado rompe esa cadena.
52
+ - **El review sale a tu nombre:** cuando `dai-review` postea con tu token, el forge lo
53
+ atribuye a **ti** — tener bien tu identidad es parte de responder por lo que firmas.
@@ -0,0 +1,18 @@
1
+ # Tutoriales
2
+
3
+ Guías de **setup operativo** — lo que haces una vez por máquina para trabajar con dai.
4
+
5
+ ## Preparar el entorno
6
+
7
+ - [**Configurar git**](./configurar-git) — tu identidad (nombre + correo) para que los
8
+ commits te atribuyan.
9
+ - [**Claves SSH**](./claves-ssh) — generar y registrar tu clave en GitHub / GitLab. En dai,
10
+ git usa SSH ([ADR-0007](../adr/0007-modelo-de-autenticacion.md)).
11
+ - [**Instalar gh / glab**](./instalar-glab) — el CLI del forge, para que `dai pr` cree la
12
+ PR/MR.
13
+
14
+ ## Conectar el tracker
15
+
16
+ - [**Token de Jira**](./token-jira) — generar tu token de API de Atlassian (`DAI_PM=jira`).
17
+ - [**Token de ClickUp**](./token-clickup) — generar tu token personal de ClickUp
18
+ (`DAI_PM=clickup`).
@@ -0,0 +1,74 @@
1
+ # Instalar el CLI del forge (`gh` / `glab`) para `dai pr`
2
+
3
+ `dai pr` crea la Pull/Merge Request usando el **CLI del forge**: `gh` para GitHub, `glab`
4
+ para GitLab. dai pushea la rama por **SSH** igual (necesitas las [claves SSH](claves-ssh)),
5
+ pero para **crear la PR/MR** hace falta el CLI autenticado.
6
+
7
+ > **Una vez por máquina.** Instalás el que use tu equipo (o los dos, si trabajás con ambos
8
+ > forges). Sin el CLI, `dai pr` **igual pushea la rama** y te dice qué instalar — después
9
+ > creás la PR a mano desde la web.
10
+
11
+ ---
12
+
13
+ ## GitHub → `gh`
14
+
15
+ ### Instalar
16
+
17
+ ```bash
18
+ brew install gh # macOS
19
+ winget install GitHub.cli # Windows
20
+ sudo apt install gh # Debian/Ubuntu (o ver cli.github.com para tu distro)
21
+ ```
22
+
23
+ ### Autenticar
24
+
25
+ ```bash
26
+ gh auth login
27
+ ```
28
+
29
+ Elige **GitHub.com**, protocolo **SSH** (o HTTPS), y sigue los pasos. Verifica:
30
+
31
+ ```bash
32
+ gh --version
33
+ ```
34
+
35
+ ---
36
+
37
+ ## GitLab → `glab`
38
+
39
+ ### Instalar
40
+
41
+ ```bash
42
+ brew install glab # macOS · o Linux con Homebrew
43
+ winget install GitLab.GLab # Windows (alternativa: scoop install glab)
44
+ sudo pacman -S glab # Arch / Manjaro
45
+ # Debian/Ubuntu y otras distros: el .deb o el binario de https://gitlab.com/gitlab-org/cli/-/releases
46
+ ```
47
+
48
+ ### Autenticar
49
+
50
+ ```bash
51
+ # GitLab.com:
52
+ glab auth login
53
+
54
+ # GitLab self-hosted / corporativo (el --hostname es OBLIGATORIO):
55
+ glab auth login --hostname gitlab.tu-empresa.com
56
+ ```
57
+
58
+ Te va a pedir un **token con scope `api`** (lo generás en *GitLab → Preferences → Access
59
+ Tokens*). Verifica:
60
+
61
+ ```bash
62
+ glab --version
63
+ ```
64
+
65
+ ---
66
+
67
+ ## Notas
68
+
69
+ - 🪟 **Windows:** después de instalar con `winget`/`scoop`, **abre una terminal nueva** para
70
+ que tome el PATH; si no, `glab`/`gh` "no se encuentra".
71
+ - 🔑 **El CLI usa un token del forge** (no la contraseña, no la clave SSH). Git sigue usando
72
+ SSH; el CLI, token — cada uno lo suyo ([ADR-0007](../adr/0007-modelo-de-autenticacion.md)).
73
+ - Con el CLI instalado y autenticado, `dai pr` (o `dai mr` en GitLab) crea la PR/MR
74
+ precargada con la US, el estado de `dai check` y los enlaces.
@@ -0,0 +1,73 @@
1
+ # Cómo obtener el token de API de ClickUp
2
+
3
+ Guía paso a paso para generar tu **token de API personal de ClickUp**, necesario para que
4
+ `dai` (o cualquier script) se autentique contra la REST API de **ClickUp** cuando el tracker
5
+ del repo es ClickUp (`DAI_PM=clickup`).
6
+
7
+ > **¿Por qué un token y no la contraseña?** ClickUp no permite autenticar la API con la
8
+ > contraseña de la cuenta (menos aún con SSO / verificación en dos pasos). El **token
9
+ > personal** cumple ese rol: es una credencial que representa a tu usuario y que tratas
10
+ > **igual que una contraseña**. Empieza siempre con `pk_`.
11
+
12
+ **Atajo:** si quieres saltar los pasos 1 y 2, entra directo a
13
+ 👉 **https://app.clickup.com/settings/apps** (te lleva al paso 3).
14
+
15
+ ---
16
+
17
+ ## Paso 1 — Abre la configuración de tu cuenta
18
+
19
+ En ClickUp, haz clic en tu **avatar** (arriba a la derecha) y elige **Settings**
20
+ (Configuración).
21
+
22
+ ![Menú del avatar → Settings](/tutoriales/clickup-1-settings.png)
23
+
24
+ ---
25
+
26
+ ## Paso 2 — Ve a "API de ClickUp"
27
+
28
+ En la barra lateral de configuración, bajo tu cuenta, entra a la sección **API de ClickUp**.
29
+ Ahí, arriba de todo, verás el bloque **API Token**.
30
+
31
+ ![Barra lateral de Settings → Apps](/tutoriales/clickup-2-api.png)
32
+
33
+ ---
34
+
35
+ ## Paso 3 — Genera o copia el token
36
+
37
+ En **API Token**:
38
+
39
+ - Si es la primera vez, haz clic en **Generate** para crearlo.
40
+ - Si ya tenías uno, aparece oculto con un botón **Copy** (y un **Regenerate** al lado).
41
+
42
+ El token empieza con `pk_` (ej. `pk_1234567_ABCDEFG…`). Haz clic en **Copy** para copiarlo.
43
+
44
+ ![Bloque API Token → Generate / Copy](/tutoriales/clickup-3-generate-copy.png)
45
+
46
+ ---
47
+
48
+ ## Paso 4 — Guárdalo en tu `.env.dai`
49
+
50
+ Pega el token en el `.env.dai` del repo (que **no se versiona**; el `.env` del equipo no se
51
+ toca — [ADR-0017](../adr/0017-env-dai.md)), en la variable que espera dai:
52
+
53
+ ```bash
54
+ DAI_PM=clickup
55
+ DAI_CLICKUP_TOKEN=pk_... # ← tu token, solo el token (sin comillas ni comentarios al lado)
56
+ # DAI_CLICKUP_LIST_ID= # solo hace falta para `dai publish` (crear tareas)
57
+ ```
58
+
59
+ Verifica con `dai doctor` → debería decir **"token de ClickUp presente"**.
60
+
61
+ ---
62
+
63
+ ## Reglas de seguridad (importante)
64
+
65
+ - 🔒 **Trátalo como una contraseña.** Nunca lo pegues en el código, en un commit, en un chat
66
+ ni en el `implements.yaml`. Solo va en `.env.dai` (no versionado).
67
+ - ♻️ **No vence por sí solo** (a diferencia de Jira): queda válido hasta que lo **regeneres**.
68
+ Regenerar crea uno nuevo e **invalida el anterior al instante** — así lo rotas y así cortas
69
+ el acceso de uno filtrado.
70
+ - 👤 **Es personal:** representa a tu usuario, con tus permisos. Cada dev usa el suyo, nunca
71
+ uno compartido.
72
+ - 🧯 **Si se filtra**, entra a la misma pantalla (paso 3) y haz **Regenerate** de inmediato;
73
+ el viejo deja de funcionar y actualizas el `.env.dai` con el nuevo.
@@ -0,0 +1,74 @@
1
+ # Cómo obtener el token de API de Jira (Atlassian)
2
+
3
+ Guía paso a paso para generar un **token de API de Atlassian**, necesario para que `dai`
4
+ (o cualquier script) se autentique contra la REST API de **Jira Cloud** cuando el tracker
5
+ del repo es Jira (`DAI_PM=jira`).
6
+
7
+ > **¿Por qué un token y no la contraseña?** Jira Cloud no permite autenticar la API con la
8
+ > contraseña de la cuenta (menos aún con SSO / verificación en dos pasos). El token cumple
9
+ > ese rol: es una credencial revocable, con vencimiento, que tratas **igual que una
10
+ > contraseña**.
11
+
12
+ **Atajo:** si quieres saltar los pasos 1 y 2, entra directo a
13
+ 👉 **https://id.atlassian.com/manage-profile/security/api-tokens** (te lleva al paso 3).
14
+
15
+ ---
16
+
17
+ ## Paso 1 — Abre la configuración de tu cuenta
18
+
19
+ En Jira, haz clic en tu **avatar** (arriba a la derecha) y elige **Configuración de la cuenta**.
20
+
21
+ ![Menú del avatar → Configuración de la cuenta](/tutoriales/jira-1-avatar.png)
22
+
23
+ ---
24
+
25
+ ## Paso 2 — Ve a Seguridad → Tokens de API
26
+
27
+ En la barra superior, entra a la pestaña **Seguridad**. Baja hasta la sección
28
+ **Tokens de API** y haz clic en **Crear y gestionar tokens de API**.
29
+
30
+ ![Pestaña Seguridad → Crear y gestionar tokens de API](/tutoriales/jira-2-seguridad-tokens.png)
31
+
32
+ ---
33
+
34
+ ## Paso 3 — Crea el token
35
+
36
+ Haz clic en **Crear token de API** (el botón simple, no el de "con alcances").
37
+ Acceso directo => https://id.atlassian.com/manage-profile/security/api-tokens
38
+
39
+ ![Botón Crear token de API](/tutoriales/jira-3-crear-token.png)
40
+
41
+ ---
42
+
43
+ ## Paso 4 — Nombre y vencimiento
44
+
45
+ - **Name:** un nombre que describa para qué es (ej. `dai-frontend`, `dai-backend`).
46
+ - **Caduca el:** una fecha de vencimiento. Por seguridad, Atlassian **no permite más de un
47
+ año**. Pon la fecha máxima si no quieres renovarlo seguido, o una más corta para rotarlo
48
+ antes.
49
+
50
+ Haz clic en **Crear**.
51
+
52
+ ![Formulario: Name + fecha de caducidad](/tutoriales/jira-4-nombre-vencimiento.png)
53
+
54
+ ---
55
+
56
+ ## Paso 5 — Cópialo AHORA (no se recupera después)
57
+
58
+ Atlassian te muestra el token **una sola vez**. Haz clic en **Copiar** y guárdalo en un
59
+ lugar seguro. **Si cierras esta ventana sin copiarlo, no hay forma de recuperarlo** —
60
+ tendrías que crear uno nuevo.
61
+
62
+ ![Ventana Copia tu token de API](/tutoriales/jira-5-copiar.png)
63
+
64
+ ---
65
+
66
+ ## Reglas de seguridad (importante)
67
+
68
+ - 🔒 **Trátalo como una contraseña.** Nunca lo pegues en el código, en un commit, en un chat
69
+ ni en el `implements.yaml`. Solo va en `.env.dai`, que **no se versiona** (el `.env` del
70
+ equipo no se toca; ver [ADR-0017](../adr/0017-env-dai.md)).
71
+ - ♻️ **Rótalo** periódicamente y **revoca** los que no uses (misma pantalla del paso 3, columna
72
+ *Acción → Revocar*).
73
+ - ⏱️ **Vencimiento:** el token deja de funcionar en la fecha que pusiste; anota cuándo renovarlo.
74
+ - 🧯 **Si se filtra**, revócalo de inmediato y crea uno nuevo.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dforce2055/dai",
3
- "version": "0.8.2",
3
+ "version": "0.10.0",
4
4
  "description": "Metodología de desarrollo asistido por IA — CLI de acciones deterministas (trazabilidad QUÉ↔CÓMO).",
5
5
  "repository": { "type": "git", "url": "git+https://github.com/dforce2055/dai.git" },
6
6
  "homepage": "https://dforce2055.github.io/dai/",
@@ -32,7 +32,7 @@
32
32
  "skills",
33
33
  "manifest.yaml",
34
34
  "install.sh",
35
- ".env.example",
35
+ ".env.dai.example",
36
36
  "VERSION",
37
37
  "LICENSE",
38
38
  "README.md",
@@ -43,7 +43,13 @@
43
43
  ],
44
44
  "scripts": {
45
45
  "test": "node --test cli/test/*.test.mjs",
46
- "prepublishOnly": "npm test"
46
+ "prepublishOnly": "npm test",
47
+ "docs:dev": "vitepress dev",
48
+ "docs:build": "vitepress build",
49
+ "docs:preview": "vitepress preview"
50
+ },
51
+ "devDependencies": {
52
+ "vitepress": "^1.6.3"
47
53
  },
48
54
  "engines": {
49
55
  "node": ">=18"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dai-review
3
- description: "Revisa una Pull/Merge Request de un repo remoto (GitHub o GitLab) de forma consciente de la metodología dai, y deja un comentario estándar en español con errores y mejoras. Corre `dai check` (¿la US está atrasada?), valida el Definition of Done, hace el review de código (correctitud + calidad), compone el comentario estándar, TE LO MUESTRA Y ESPERA TU OK, y recién entonces lo postea vía el MCP del forge si está disponible, o vía `dai forge comment` (token) si no. Nunca postea sin aprobación explícita: sale con tu nombre y tu token. Invocar como /dai-review <URL-de-la-PR o número>. Usar en el paso 6 de SCRUM-CON-IA (code review), antes de que un partner humano firme."
3
+ description: "Revisa una Pull/Merge Request de un repo remoto (GitHub o GitLab) de forma consciente de la metodología dai y deja un REVIEW INLINE en español: un comentario de resumen más un comentario anclado a cada archivo:línea, clasificado low/medium/high. Corre `dai check` (¿la US está atrasada?), valida el Definition of Done, hace el review de código (correctitud + calidad), escribe un review.json, lo valida contra el diff con `dai forge review --dry-run` (descarta las líneas que el modelo inventó), TE MUESTRA EL PREVIEW Y ESPERA TU OK, y recién entonces postea con `dai forge review --yes`. Nunca postea sin aprobación explícita: sale con tu nombre y tu token, sin badge de bot. Hay modo desatendido para reviews simples (--yes --min-severity --min-confidence), pero se pide, no es el default. Invocar como /dai-review <URL-de-la-PR o número>. Usar en el paso 6 de SCRUM-CON-IA (code review), antes de que un partner humano firme."
4
4
  ---
5
5
 
6
6
  # dai-review — review de PR consciente de la metodología
@@ -9,16 +9,33 @@ Es el **primer pase** del paso 6 (code review). No reemplaza al partner humano:
9
9
  saca el ruido para que firme lo que importa ([Art. 5](../../docs/MANIFIESTO.md#art-5) del manifiesto). Funciona igual
10
10
  en **GitHub y GitLab**.
11
11
 
12
- ## Las dos caras (cómo postea el comentario)
12
+ ## El reparto: traes el criterio, el CLI hace lo mecánico
13
13
 
14
- Mismo comentario estándar, dos formas de dejarlo (elige la disponible, en este orden):
14
+ No compones markdown y lo posteas. Escribes un **`review.json`** y el CLI lo valida y lo
15
+ postea (ADR-0002 / [ADR-0016](../../docs/adr/0016-review-inline.md)):
15
16
 
16
- 1. **MCP del forge** — si hay un MCP de GitHub/GitLab conectado, postea por ahí.
17
- 2. **CLI con token** — si no, `dai forge comment <ref> --body-file <archivo>`. Usa
18
- `GITHUB_TOKEN`/`GITLAB_TOKEN` del `.env` (token scopeado, **nunca** contraseña).
17
+ ```
18
+ tú (criterio) → .dai/reviews/<n>.json → dai forge review (mecánico)
19
+ hallazgos + severidad el humano lo edita valida vs. el diff, filtra, postea
20
+ ```
21
+
22
+ Ese archivo **es la puerta humana**: es diff-eable, editable a mano y auditable, y no ata
23
+ el flujo a ningún asistente. No hay TUI que aprender.
24
+
25
+ **Por qué el CLI y no tú directamente:** `dai forge review` verifica que cada `path:line`
26
+ **exista de verdad en el diff** antes de salir a la red. Inventar números de línea es el
27
+ error más común de un LLM revisando código, y el forge responde `422` sin decir cuál
28
+ falló. El CLI lo caza antes.
19
29
 
20
- > **Auth:** git (traer la branch) usa **SSH**; comentar la PR usa **token del forge**
21
- > (comentar no se puede por SSH). Cero contraseñas.
30
+ ### Cómo postear (elige la primera disponible)
31
+
32
+ 1. **`dai forge review <ref> --from <archivo> --yes`** — la forma. Review inline:
33
+ resumen + un comentario por línea. Usa `GITHUB_TOKEN`/`GITLAB_TOKEN` del `.env`.
34
+ 2. **MCP del forge / `dai forge comment`** — fallback si no hay token, o si necesitas
35
+ dejar un comentario suelto sin anclar. Pierdes el inline y la validación.
36
+
37
+ > **Auth:** git (traer el diff) usa **SSH**; postear usa **token del forge** (postear no
38
+ > se puede por SSH). Cero contraseñas.
22
39
 
23
40
  ## Input
24
41
 
@@ -35,47 +52,83 @@ Mismo comentario estándar, dos formas de dejarlo (elige la disponible, en este
35
52
  - ¿existe `implements.yaml`? (si es un PR de producto, es obligatorio)
36
53
  - **Definition of Done** (`templates/definition-of-done.md`): cuenta cuántos ítems cumple.
37
54
  4. **Review de código (criterio, no mecánico):** busca
38
- - 🔴 **Errores** de correctitud (bugs, casos borde, seguridad).
39
- - 🟡 **Mejoras** de calidad (reuso, simplicidad, eficiencia).
40
- - Lo que está **bien** (refuerza lo bueno).
41
- 5. **Componer el comentario estándar** (ver formato abajo).
42
- 6. **Mostrarlo y esperar el OK.** Imprimí el comentario **entero**, tal cual va a salir,
43
- y preguntá: _"¿lo posteo así, lo edito, o lo descarto?"_ **Frená ahí.** Si te piden
44
- cambios, aplicalos y volvé a mostrarlo. No hay atajo: sin un "sí" explícito en este
45
- turno, no se postea. Un "sí" de una PR anterior no cuenta para esta.
46
- 7. **Postear** por MCP o `dai forge comment`. Confirmar el link al comentario.
47
-
48
- ## El comentario estándar
49
-
50
- Es el mismo que emite `renderReviewComment` del CLI respeta esta forma:
51
-
52
- ```markdown
53
- ## 🤖 dai-review
54
-
55
- **US:** `ABC-482` @ v1 · `dai check`: ✅ al día
56
- **Definition of Done:** 4/5
55
+ - 🔴 **high** — errores de correctitud: bugs, casos borde, seguridad.
56
+ - 🟡 **medium** riesgo real pero no roto: contratos que mienten, races, deuda que muerde.
57
+ - 🔵 **low** calidad: reuso, simplicidad, nombres.
58
+ - Lo que está **bien** (refuerza lo bueno) → va en `good`.
59
+ 5. **Escribir el `review.json`** en `.dai/reviews/<número-de-PR>.json` (ver el schema abajo).
60
+ Cada hallazgo va anclado a `path` + `line` **del diff que trajiste en el paso 2** —
61
+ no de tu memoria del archivo.
62
+ 6. **Validar sin postear** `dai forge review <ref> --from .dai/reviews/<n>.json --dry-run`.
63
+ Te dice qué se postea, qué se filtra y qué se **descarta por no apuntar al diff**. Si
64
+ hay descartados, corregí el `path`/`line` y repetí. **No pases al paso 7 con descartados
65
+ que puedas arreglar.**
66
+ 7. **Mostrarlo y esperar el OK.** Mostrá el preview **entero** y preguntá: _"¿lo posteo
67
+ así, lo edito, o lo descarto?"_ **Frená ahí.** Si te piden cambios (bajar una severidad,
68
+ borrar un hallazgo, reescribir un texto), editás el JSON y volvés a mostrarlo. Sin un
69
+ "sí" explícito **en este turno**, no se postea. Un "sí" de una PR anterior no cuenta.
70
+ 8. **Postear** — `dai forge review <ref> --from .dai/reviews/<n>.json --yes`. Confirmá el link.
71
+
72
+ ## El `review.json`
73
+
74
+ ```json
75
+ {
76
+ "us": "ABC-482",
77
+ "version": "v1",
78
+ "checkStatus": "✅ al día",
79
+ "dod": "4/5",
80
+ "summary": "Prosa breve: el juicio general del PR. Es el cuerpo del review.",
81
+ "good": ["Algo real y específico que está bien."],
82
+ "findings": [
83
+ {
84
+ "path": "src/checkout.ts",
85
+ "line": 42,
86
+ "side": "RIGHT",
87
+ "severity": "high",
88
+ "confidence": 0.9,
89
+ "body": "El hallazgo, en prosa. Qué está mal, por qué, y qué harías."
90
+ }
91
+ ]
92
+ }
93
+ ```
57
94
 
58
- ### 🔴 Errores (correctitud)
59
- - <hallazgo concreto con archivo:línea>
95
+ | campo | obligatorio | qué |
96
+ |---|---|---|
97
+ | `path` | sí | ruta **relativa a la raíz del repo**, tal cual sale en el diff |
98
+ | `line` | sí | línea **del lado que declares**; tiene que ser parte del diff |
99
+ | `side` | no (`RIGHT`) | `RIGHT` = archivo nuevo · `LEFT` = línea borrada |
100
+ | `severity` | sí | `low` \| `medium` \| `high` |
101
+ | `confidence` | no (`1`) | 0–1. **Sé honesto**: por debajo de `--min-confidence` el hallazgo no se postea y queda listado como suprimido. Es lo que hace usable el modo desatendido. |
102
+ | `body` | sí | el hallazgo, en prosa. Sin `**High**` ni emoji: lo pone el CLI. |
60
103
 
61
- ### 🟡 Mejoras (calidad, reuso, simplicidad)
62
- - <sugerencia concreta>
104
+ ## Modo desatendido
63
105
 
64
- ### Lo que está bien
65
- - <algo real y específico>
106
+ Para reviews simples que no necesitan supervisión, el humano puede pedirlo explícito:
66
107
 
67
- ---
68
- _Revisión asistida por dai. La aprobación la firma un humano (Art. 5 del manifiesto)._
108
+ ```bash
109
+ dai forge review <ref> --from <archivo> --yes --min-severity medium --min-confidence 0.8 --max-comments 10
69
110
  ```
70
111
 
71
- ## Tres cortes duros
112
+ Es una **excepción que se pide**, no el default. Sin `--yes` no se postea nada, nunca.
113
+ Y el `--yes` lo tipea el humano: la skill no lo agrega por su cuenta.
114
+
115
+ ## Cuatro cortes duros
72
116
 
73
117
  1. **No aprobar.** La skill **comenta**, no firma la aprobación. Eso es de un humano.
74
- 2. **No postear sin OK.** El comentario sale **con el token del humano y con su nombre**
75
- (`GITHUB_TOKEN`/`GITLAB_TOKEN` son suyos): en la PR de un compañero figura como si lo
76
- hubiera escrito él. Publicar un juicio sobre el código de otro, firmado por alguien
77
- que no lo leyó, es tan grave como aprobar sin mirar. El paso 6 no es opcional.
78
- 3. **Hallazgos concretos.** Nada de "mejorar la calidad" en abstracto: archivo, línea,
118
+ `dai forge review` postea siempre con `event: COMMENT`, nunca `APPROVE` ni siquiera
119
+ en desatendido. No es configurable.
120
+ 2. **No postear sin OK.** El review sale **con el token del humano y con su nombre**
121
+ (`GITHUB_TOKEN`/`GITLAB_TOKEN` son suyos): el forge lo atribuye a él como usuario, sin
122
+ badge de bot, así que en la PR de un compañero es indistinguible de haberlo escrito a
123
+ mano. Publicar un juicio sobre el código de otro, firmado por alguien que no lo leyó,
124
+ es tan grave como aprobar sin mirar. **El paso 7 no es opcional**, y pesa más que
125
+ antes: un review con 6 comentarios inline firmados por alguien es mucho más que un
126
+ comentario suelto.
127
+ 3. **Las líneas se sacan del diff, no de la memoria.** Inventar un `path:line` es el
128
+ error más común de un LLM revisando código. El CLI lo caza y lo descarta, pero un
129
+ hallazgo descartado es un hallazgo perdido: si el paso 6 marca descartes, **arreglalos**
130
+ en vez de postear igual.
131
+ 4. **Hallazgos concretos.** Nada de "mejorar la calidad" en abstracto: archivo, línea,
79
132
  y el porqué. Si no es accionable, no va.
80
133
 
81
134
  > **Por qué el corte 2 existe:** esta skill posteaba directo. El Art. 5 estaba bien
@@ -87,4 +140,5 @@ _Revisión asistida por dai. La aprobación la firma un humano (Art. 5 del manif
87
140
  - Es el paso 6 de [`SCRUM-CON-IA.md`](../../docs/SCRUM-CON-IA.md).
88
141
  - Se apoya en `dai check` (ADR-0003) y en el forge adapter (`dai forge`, ADR-0002:
89
142
  lo mecánico en el CLI, la inteligencia en la skill).
90
- - El comentario estándar hace que todos los reviews del equipo se lean igual.
143
+ - El review inline y el contrato del `review.json`: [ADR-0016](../../docs/adr/0016-review-inline.md).
144
+ - El formato estándar hace que todos los reviews del equipo se lean igual.