@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.
- package/{.env.example → .env.dai.example} +3 -3
- package/CHANGELOG.md +81 -0
- package/README.md +41 -29
- package/VERSION +1 -1
- package/cli/dai.mjs +175 -44
- package/cli/lib/bootstrap.mjs +42 -7
- package/cli/lib/env.mjs +12 -0
- package/cli/lib/forge-api.mjs +89 -2
- package/cli/lib/pm-clickup.mjs +2 -2
- package/cli/lib/pm-jira.mjs +2 -2
- package/cli/lib/review-findings.mjs +195 -0
- package/cli/lib/skills-source.mjs +8 -0
- package/docs/EJEMPLO-END-TO-END.md +52 -43
- package/docs/MANIFIESTO.md +2 -2
- package/docs/METODOLOGIA.md +20 -15
- package/docs/PROBAR.md +13 -14
- package/docs/SCRUM-CON-IA.md +10 -10
- package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +1 -1
- package/docs/adr/0006-distribucion-y-licencia.md +1 -1
- package/docs/adr/0013-skills-externas-install-from.md +11 -4
- package/docs/adr/0015-jira-corporativo.md +1 -1
- package/docs/adr/0016-review-inline.md +128 -0
- package/docs/adr/0017-env-dai.md +64 -0
- package/docs/adr/README.md +2 -0
- package/docs/detalle/01-refinamiento.md +6 -5
- package/docs/detalle/03-ramas.md +2 -2
- package/docs/detalle/04-tdd.md +15 -9
- package/docs/detalle/06-code-review.md +8 -5
- package/docs/detalle/08-daily.md +1 -1
- package/docs/detalle/README.md +1 -1
- package/docs/glosario.md +2 -2
- package/docs/guias/dev.md +10 -7
- package/docs/guias/index.md +12 -0
- package/docs/guias/lead.md +1 -1
- package/docs/guias/po.md +13 -7
- package/docs/index.md +35 -0
- package/docs/public/favicon.svg +12 -0
- package/docs/public/logo-link.svg +12 -0
- package/docs/public/logo.svg +12 -0
- package/docs/public/tutoriales/clickup-1-settings.png +0 -0
- package/docs/public/tutoriales/clickup-2-api.png +0 -0
- package/docs/public/tutoriales/clickup-3-generate-copy.png +0 -0
- package/docs/public/tutoriales/jira-1-avatar.png +0 -0
- package/docs/public/tutoriales/jira-2-seguridad-tokens.png +0 -0
- package/docs/public/tutoriales/jira-3-crear-token.png +0 -0
- package/docs/public/tutoriales/jira-4-nombre-vencimiento.png +0 -0
- package/docs/public/tutoriales/jira-5-copiar.png +0 -0
- package/docs/tutoriales/claves-ssh.md +93 -0
- package/docs/tutoriales/configurar-git.md +53 -0
- package/docs/tutoriales/index.md +18 -0
- package/docs/tutoriales/instalar-glab.md +74 -0
- package/docs/tutoriales/token-clickup.md +73 -0
- package/docs/tutoriales/token-jira.md +74 -0
- package/package.json +9 -3
- 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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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.
|
|
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
|
|
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
|
-
##
|
|
12
|
+
## El reparto: tú traes el criterio, el CLI hace lo mecánico
|
|
13
13
|
|
|
14
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
- 🔴 **
|
|
39
|
-
- 🟡 **
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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
|
-
|
|
62
|
-
- <sugerencia concreta>
|
|
104
|
+
## Modo desatendido
|
|
63
105
|
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
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.
|