@dforce2055/dai 0.11.0 → 0.12.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/CHANGELOG.md +61 -0
- package/README.md +1 -1
- package/VERSION +1 -1
- package/cli/dai.mjs +62 -17
- package/cli/lib/branch-scope.mjs +61 -5
- package/cli/lib/pr.mjs +21 -1
- package/docs/public/tutoriales/funcional-1-skills-usuario.png +0 -0
- package/docs/public/tutoriales/funcional-2-copilot-signin.png +0 -0
- package/docs/public/tutoriales/funcional-3-carpeta-configurada.png +0 -0
- package/docs/public/tutoriales/funcional-4-doctor.png +0 -0
- package/docs/public/tutoriales/funcional-5-publish-parent.png +0 -0
- package/docs/tutoriales/index.md +9 -0
- package/docs/tutoriales/setup-dev.md +516 -0
- package/docs/tutoriales/setup-funcional.md +480 -0
- package/package.json +1 -1
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
# Setup para desarrolladores (Windows)
|
|
2
|
+
|
|
3
|
+
Guía paso a paso para dejar tu entorno listo y **tomar una User Story de Jira, implementarla
|
|
4
|
+
y abrir la Merge Request en GitLab** con las skills de `dai` desde **GitHub Copilot**, con la
|
|
5
|
+
trazabilidad QUÉ↔CÓMO armada desde el primer commit.
|
|
6
|
+
|
|
7
|
+
Es el otro lado del [setup del funcional](./setup-funcional.md): ahí la US **nace**, aquí se
|
|
8
|
+
**implementa**. Tú no discutes el QUÉ; lo tomas ya definido y eres dueño del CÓMO.
|
|
9
|
+
|
|
10
|
+
> **¿Qué son las skills?** Son los comandos que ejecuta el **agente** en el chat de Copilot:
|
|
11
|
+
> `/link-us` (abre el CÓMO atado a la US, sin que tipees el key a mano), `/tdd` (test primero)
|
|
12
|
+
> y `/dai-review` (review inline de la MR de un compañero). El CLI `dai` es lo mecánico:
|
|
13
|
+
> `dai check`, `dai mr`, `dai stamp`. Más abajo está la tabla de qué va dónde.
|
|
14
|
+
|
|
15
|
+
**Atajo:** si tu proyecto **ya tiene dai** (existe la carpeta `.dai\`), lo único que te falta
|
|
16
|
+
es tu `.env.dai` con tus credenciales → salta al [**Paso 6**](#paso-6-conecta-jira).
|
|
17
|
+
|
|
18
|
+
Los ejemplos usan `acme.atlassian.net`, el proyecto `PROJ`, un GitLab en `gitlab.acme.com` y
|
|
19
|
+
un repositorio `tienda`: reemplázalos por los de tu empresa.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Lo que vas a tener al terminar
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Jira PROJ-125 → /link-us → feature/PROJ-125-… → dai mr
|
|
27
|
+
(la US que ya existe) (rama + + implements.yaml (MR precargada
|
|
28
|
+
el link) + tu código con la US)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Y un `dai check` que te avisa **solo** si el PO cambió los criterios mientras implementabas.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Paso 1 — Instala Node
|
|
36
|
+
|
|
37
|
+
Descarga el instalador **LTS** desde 👉 **https://nodejs.org** y ejecútalo.
|
|
38
|
+
Siguiente → Siguiente → Instalar.
|
|
39
|
+
|
|
40
|
+
Para comprobar que quedó, abre **PowerShell** (tecla Windows → escribe `powershell` → Enter):
|
|
41
|
+
|
|
42
|
+
```powershell
|
|
43
|
+
node --version
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Tiene que responder algo como `v20.11.0`. Cualquier número **18 o mayor** sirve.
|
|
47
|
+
|
|
48
|
+
> **Si dice que no reconoce el comando:** cierra PowerShell, ábrelo de nuevo y reintenta. El
|
|
49
|
+
> instalador no refresca las ventanas que ya estaban abiertas.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Paso 2 — Instala dai
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
npm i -g @dforce2055/dai
|
|
57
|
+
dai --version
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`dai --help` te lista todos los comandos. Para actualizarlo más adelante: `dai upgrade`.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Paso 3 — Prepárate para trabajar con el repositorio
|
|
65
|
+
|
|
66
|
+
Tres cosas, una sola vez por máquina. Si ya trabajas con este repositorio, probablemente las
|
|
67
|
+
tengas:
|
|
68
|
+
|
|
69
|
+
| Qué | Para qué | Tutorial |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| **git configurado** (nombre + correo) | que los commits te atribuyan a ti, y que `dai link-us` sepa quién autora el link | [Configurar git](./configurar-git.md) |
|
|
72
|
+
| **Clave SSH** en GitLab | que `dai mr` pueda subir la rama sin pedirte credenciales | [Claves SSH](./claves-ssh.md) |
|
|
73
|
+
| **`glab`** instalado y autenticado | que `dai mr` **cree** la MR, no solo suba la rama | [Instalar gh / glab](./instalar-glab.md) |
|
|
74
|
+
|
|
75
|
+
En GitLab corporativo, el `--hostname` es obligatorio al autenticar:
|
|
76
|
+
|
|
77
|
+
```powershell
|
|
78
|
+
glab auth login --hostname gitlab.acme.com
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> **Si tu equipo clona por HTTPS** en vez de SSH (habitual en Windows corporativo), no pasa
|
|
82
|
+
> nada: `dai mr` te deja completar el login del *Git Credential Manager* la primera vez que
|
|
83
|
+
> sube la rama. Hazlo con la ventana a la vista, porque ahí te lo pide.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Paso 4 — Instala las skills en Copilot
|
|
88
|
+
|
|
89
|
+
**Este es el comando que te habilita los `/comandos`:**
|
|
90
|
+
|
|
91
|
+
```powershell
|
|
92
|
+
dai skills install --for copilot --global
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Comprueba que llegaron:
|
|
96
|
+
|
|
97
|
+
```powershell
|
|
98
|
+
dir $env:USERPROFILE\.copilot\skills
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Tienes que ver 7 carpetas: `dai-review`, `doc-to-backlog`, `grill-epic`, `grill-intent`,
|
|
102
|
+
`grill-user-story`, `link-us`, `tdd`. Las tuyas son **`link-us`**, **`tdd`**, **`dai-review`** y
|
|
103
|
+
**`grill-intent`**; las tres `grill-*` restantes son del funcional, y no molestan.
|
|
104
|
+
|
|
105
|
+
Reinicia Copilot (cierra y abre la sesión) y escribe `/` en el chat, en modo **Agent**. Tienen
|
|
106
|
+
que aparecer marcadas **`User Data`** — esa etiqueta confirma que salen de tu usuario.
|
|
107
|
+
|
|
108
|
+
> **Si no aparecen:** ejecuta `/skills` dentro de Copilot para refrescar el listado. Si sigue
|
|
109
|
+
> sin verlas, recarga la ventana: `Ctrl+Shift+P` → **Developer: Reload Window**.
|
|
110
|
+
|
|
111
|
+
> **¿Por qué `--global`?** Porque te sirven en **cualquier repositorio**, sin preparar nada. El
|
|
112
|
+
> repositorio igual va a tener su propia copia versionada (Paso 5), que es la que ve todo el
|
|
113
|
+
> equipo — y esa gana si difieren ([ADR-0014](../adr/0014-copilot-agent-skills.md)).
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Paso 5 — Inicializa dai en tu proyecto
|
|
118
|
+
|
|
119
|
+
Párate en el repositorio en el que vas a trabajar — el que ya tienes clonado — y comprueba si
|
|
120
|
+
dai ya está instalado ahí:
|
|
121
|
+
|
|
122
|
+
```powershell
|
|
123
|
+
cd $HOME\proyectos\tienda
|
|
124
|
+
dir .dai
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> **Si la carpeta `.dai\` ya existe**, tu proyecto ya tiene dai: **no ejecutes `dai init`**, el
|
|
128
|
+
> scaffold es del equipo y está versionado. Lo único que te falta es tu configuración personal
|
|
129
|
+
> → salta al [Paso 6](#paso-6-conecta-jira).
|
|
130
|
+
|
|
131
|
+
Si no existe, inicializa dai en el repositorio:
|
|
132
|
+
|
|
133
|
+
```powershell
|
|
134
|
+
dai init --for copilot --pm jira
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Te va a preguntar si quieres instalar **OpenSpec**: responde **`s`**. Es el motor del CÓMO —
|
|
138
|
+
convierte la US en `design.md` + `tasks.md` con los comandos `/opsx:*`. Un dev sí lo usa.
|
|
139
|
+
|
|
140
|
+
Lo que deja:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
✓ .dai/ moldes (templates) + reglas (governance) del método
|
|
144
|
+
✓ .env.dai.example creado (plantilla versionada)
|
|
145
|
+
✓ .env.dai creado (no versionado), DAI_PM=jira (completa el token)
|
|
146
|
+
✓ .gitignore ajustado (skills/constitución versionadas; .env.dai y settings.local.json fuera)
|
|
147
|
+
✓ .github/ pull_request_template.md — molde de PR atado al link
|
|
148
|
+
✓ Copilot: .github/skills/ (7) + copilot-instructions.md
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Todo eso se **commitea** —menos el `.env.dai`, que ya quedó ignorado— en una rama `chore/`, y
|
|
152
|
+
va por MR como cualquier otro cambio: es el scaffold que va a usar todo el equipo.
|
|
153
|
+
|
|
154
|
+
> **Si OpenSpec falló** (proxy, permisos de npm), súmalo después:
|
|
155
|
+
> ```powershell
|
|
156
|
+
> npm i -g @fission-ai/openspec@latest
|
|
157
|
+
> openspec init --tools github-copilot
|
|
158
|
+
> ```
|
|
159
|
+
|
|
160
|
+
> **Si algún comando te avisa que el scaffold quedó viejo** respecto de tu CLI, se actualiza
|
|
161
|
+
> con `dai sync` y se commitea. No lo hagas en medio de una historia: es un cambio del equipo,
|
|
162
|
+
> no tuyo.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Paso 6 — Conecta Jira {#paso-6-conecta-jira}
|
|
167
|
+
|
|
168
|
+
El `.env.dai` es **tuyo**, lleva tus credenciales y **no se versiona**
|
|
169
|
+
([ADR-0017](../adr/0017-env-dai.md)). Es lo único que edita cada dev: el resto del scaffold es
|
|
170
|
+
del equipo.
|
|
171
|
+
|
|
172
|
+
Necesitas un **token de API de Atlassian**: si no tienes, sigue 👉 [Cómo obtener el token de
|
|
173
|
+
API de Jira](./token-jira.md) y vuelve con el token copiado.
|
|
174
|
+
|
|
175
|
+
Si el proyecto ya tenía dai, el archivo todavía no existe en tu copia — créalo desde la
|
|
176
|
+
plantilla versionada:
|
|
177
|
+
|
|
178
|
+
```powershell
|
|
179
|
+
copy .env.dai.example .env.dai
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
(Si lo acabas de crear con `dai init`, ya está: solo hay que completarlo.)
|
|
183
|
+
|
|
184
|
+
Abre el repositorio en el editor y completa el `.env.dai`:
|
|
185
|
+
|
|
186
|
+
```powershell
|
|
187
|
+
code .
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
DAI_PM=jira
|
|
192
|
+
DAI_JIRA_BASE_URL=https://acme.atlassian.net
|
|
193
|
+
DAI_JIRA_EMAIL=tu.correo@acme.com
|
|
194
|
+
DAI_JIRA_TOKEN=el-token-que-copiaste
|
|
195
|
+
DAI_JIRA_PROJECT=PROJ
|
|
196
|
+
DAI_JIRA_ISSUETYPE=Story
|
|
197
|
+
DAI_JIRA_FIELDS_FILE=.dai/jira-fields.json
|
|
198
|
+
|
|
199
|
+
# Solo si vas a usar /dai-review sobre la MR de un compañero (token con scope `api`):
|
|
200
|
+
GITLAB_TOKEN=
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Guarda con `Ctrl+S`.
|
|
204
|
+
|
|
205
|
+
| Variable | Qué va | El error típico |
|
|
206
|
+
|---|---|---|
|
|
207
|
+
| `DAI_JIRA_PROJECT` | La clave del **proyecto**: las letras antes del guion. Si tus tickets son `PROJ-123`, va **`PROJ`**. | Pegar la clave de un **ticket**. dai te lo dice y te da el comando correcto. |
|
|
208
|
+
| `GITLAB_TOKEN` | Un *Personal Access Token* de GitLab con scope **`api`**. Es **otro** token, distinto del de `glab` y del de Jira. | Confundirlo con el de Jira. Cada servicio, el suyo ([ADR-0007](../adr/0007-modelo-de-autenticacion.md)). |
|
|
209
|
+
|
|
210
|
+
> **La URL de la US en Jira sale sola** de `DAI_JIRA_BASE_URL` (`…/browse/PROJ-125`). Solo si
|
|
211
|
+
> tu Jira usa otro esquema de URLs agregas `DAI_TRACKER_URL_TEMPLATE=https://…/{id}` — el
|
|
212
|
+
> `{id}` se deja tal cual: es el marcador que dai reemplaza.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Paso 7 — Verifica
|
|
217
|
+
|
|
218
|
+
```powershell
|
|
219
|
+
dai doctor
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Lo que te importa ver:
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
✓ Copilot: 7 skills
|
|
226
|
+
✓ constitución Copilot (.github/copilot-instructions.md)
|
|
227
|
+
› adaptador de PM:
|
|
228
|
+
✓ DAI_PM=jira
|
|
229
|
+
✓ token de Jira presente (no verificado: eso lo dice `dai publish`)
|
|
230
|
+
✓ proyecto=PROJ (para dai publish)
|
|
231
|
+
✓ .dai/ al día con el CLI (v0.11.0)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
> **Ojo:** `dai doctor` solo comprueba que el token **esté escrito**, no que funcione. La
|
|
235
|
+
> prueba de verdad es el paso siguiente.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Paso 8 — La prueba de fuego: toma una US de verdad
|
|
240
|
+
|
|
241
|
+
Vas a recorrer el ciclo completo con una US real del sprint. **No se publica nada hasta el
|
|
242
|
+
final** — y ahí te pregunta antes.
|
|
243
|
+
|
|
244
|
+
### 1. Abre el CÓMO desde el ID de la US
|
|
245
|
+
|
|
246
|
+
En el chat de Copilot, en modo *Agent*:
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
/link-us PROJ-125
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
O directo con el CLI, que es lo que la skill termina ejecutando:
|
|
253
|
+
|
|
254
|
+
```powershell
|
|
255
|
+
dai link-us PROJ-125
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Trae la US de Jira, calcula el `ac_hash` de sus criterios y deja dos cosas:
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
✓ branch: feature/PROJ-125-finalizar-la-compra-del-carrito
|
|
262
|
+
✓ archivo: openspec/changes/finalizar-la-compra-del-carrito/implements.yaml (ac_hash 380d814b)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Ese `implements.yaml` es **el único archivo que se autora a mano** en todo el método
|
|
266
|
+
([ADR-0004](../adr/0004-ubicacion-y-schema-implements.md)):
|
|
267
|
+
|
|
268
|
+
```yaml
|
|
269
|
+
change: finalizar-la-compra-del-carrito
|
|
270
|
+
repo: tienda
|
|
271
|
+
|
|
272
|
+
implements:
|
|
273
|
+
- id: PROJ-125
|
|
274
|
+
version: v1
|
|
275
|
+
ac_hash: 380d814b
|
|
276
|
+
|
|
277
|
+
introduces:
|
|
278
|
+
- <capacidad-tecnica> # completar: specs técnicas nuevas de este change
|
|
279
|
+
|
|
280
|
+
autor: tu.nombre
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Completa `introduces` con las capacidades técnicas nuevas del change (o bórralo si no hay).
|
|
284
|
+
|
|
285
|
+
> **El key no se tipea nunca a mano.** La rama y el `implements.yaml` salen los dos del mismo
|
|
286
|
+
> ID validado: por eso el link no puede quedar mal escrito.
|
|
287
|
+
|
|
288
|
+
> **Si te dice que la US no tiene criterios de aceptación**, frena: no es un problema de tu
|
|
289
|
+
> setup. Esa US no cumple el [DoR](../../templates/definition-of-ready.md) y vuelve al PO.
|
|
290
|
+
|
|
291
|
+
### 2. Arma el CÓMO y programa
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
/opsx:explore → entender el terreno
|
|
295
|
+
/opsx:propose → design.md + tasks.md sobre la rama ya linkeada
|
|
296
|
+
/opsx:apply → el agente implementa las tareas con test primero (/tdd)
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Tú validas el diseño, decides qué comportamientos importa testear y **revisas lo que escribió
|
|
300
|
+
el agente**: eres responsable del código, no la IA.
|
|
301
|
+
|
|
302
|
+
### 3. Commitea y comprueba el link
|
|
303
|
+
|
|
304
|
+
```powershell
|
|
305
|
+
git add -A
|
|
306
|
+
git commit -m "feat(carrito): rechazar la compra con carrito vacío"
|
|
307
|
+
dai check
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
✅ PROJ-125 al día (v1)
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Si el PO tocó los criterios mientras implementabas, en vez de eso vas a ver:
|
|
315
|
+
|
|
316
|
+
```
|
|
317
|
+
⚠️ PROJ-125 ATRASADO: implementaste 380d814b, la US viva es 9f2c1a04 (v2)
|
|
318
|
+
|
|
319
|
+
El QUÉ cambió desde que lo implementaste. Para resincronizar:
|
|
320
|
+
dai link-us PROJ-125 --resync # re-estampa el ac_hash contra la US viva
|
|
321
|
+
Después, revisa si tu implementación cubre el criterio nuevo.
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Eso es exactamente lo que dai viene a resolver: **no te avisa una persona, te avisa el link**.
|
|
325
|
+
Lee qué cambió en Jira, cúbrelo, y recién entonces resincroniza.
|
|
326
|
+
|
|
327
|
+
### 4. La MR
|
|
328
|
+
|
|
329
|
+
```powershell
|
|
330
|
+
dai mr --base develop
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
(`dai mr` y `dai pr` son el mismo comando; `mr` es el nombre natural en GitLab.)
|
|
334
|
+
|
|
335
|
+
Te muestra **todo** antes de tocar nada:
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
── Pull Request a crear ──────────────────────────────
|
|
339
|
+
título: PROJ-125: Finalizar la compra del carrito
|
|
340
|
+
de: feature/PROJ-125-finalizar-la-compra-del-carrito
|
|
341
|
+
a: develop
|
|
342
|
+
US: PROJ-125 — la branch 'feature/PROJ-125-…' nombra PROJ-125
|
|
343
|
+
forge: gitlab (glab)
|
|
344
|
+
─────────────────────────────────────────────────────
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Debajo va el cuerpo completo de la MR, precargado con la US, el estado del `dai check`, tus
|
|
348
|
+
commits y los enlaces. Recién ahí pregunta:
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
¿Publico la branch y creo el PR con glab? (s/N)
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
Responde **`n`** para este ensayo si no quieres publicar todavía: te guarda el cuerpo en un
|
|
355
|
+
archivo temporal y no hace nada. Cuando sea de verdad, `s` sube la rama y crea la MR.
|
|
356
|
+
|
|
357
|
+
> **La línea `US:` dice de dónde salió la historia.** Si ahí aparece una US que no es la tuya,
|
|
358
|
+
> frena y revisa la rama: el título es lo único que se ve en la lista de MRs, y una MR
|
|
359
|
+
> rotulada con la historia de otro rompe justo lo que dai garantiza.
|
|
360
|
+
|
|
361
|
+
### 5. Después del merge
|
|
362
|
+
|
|
363
|
+
```powershell
|
|
364
|
+
dai stamp # estampa en Jira: implementado por <repo>, con rama y commit ancla
|
|
365
|
+
dai done --base develop # vuelve a la base, actualiza y borra la rama local si está mergeada
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
`dai stamp` deduce **qué US** estampar del nombre de tu rama. Si el repositorio tiene varias
|
|
369
|
+
vivas y no puede saberlo, te pregunta antes de escribir en Jira: un comentario en el tracker no
|
|
370
|
+
se deshace.
|
|
371
|
+
|
|
372
|
+
Si las cinco partes te salieron, tu entorno funciona de punta a punta.
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## Qué va dónde
|
|
377
|
+
|
|
378
|
+
⚠️ **Las skills no se ejecutan en PowerShell.** Son acciones que le pides a un **agente**, en el
|
|
379
|
+
chat de Copilot en modo *Agent*, escribiendo `/` adelante.
|
|
380
|
+
|
|
381
|
+
| Qué | Dónde se escribe | Ejemplos |
|
|
382
|
+
|---|---|---|
|
|
383
|
+
| Los comandos de **dai** | **PowerShell**, parado en el repositorio | `dai link-us` · `dai check` · `dai mr` · `dai stamp` · `dai done` |
|
|
384
|
+
| Las **skills** (empiezan con `/`) | El **chat de Copilot**, modo *Agent* | `/link-us` · `/tdd` · `/dai-review` · `/grill-intent` |
|
|
385
|
+
| Los comandos de **OpenSpec** | El **chat de Copilot** | `/opsx:explore` · `/opsx:propose` · `/opsx:apply` |
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Cuando algo falla
|
|
390
|
+
|
|
391
|
+
### `dai link-us` dice que no encontró la US en jira
|
|
392
|
+
|
|
393
|
+
Por orden de frecuencia:
|
|
394
|
+
|
|
395
|
+
1. **El key está mal** o es de otro proyecto. Cópialo de la URL del ticket
|
|
396
|
+
(`…/browse/PROJ-125` → `PROJ-125`).
|
|
397
|
+
2. **No estás parado en el repositorio** que tiene el `.env.dai`. dai lee la configuración del
|
|
398
|
+
directorio actual: `cd` al repositorio y reintenta.
|
|
399
|
+
3. **El token venció.** Ver el `jira 401` de abajo.
|
|
400
|
+
|
|
401
|
+
### `dai check` o `dai publish` dicen `jira 401`
|
|
402
|
+
|
|
403
|
+
El token no es válido o venció. Genera uno nuevo ([tutorial](./token-jira.md)) y pégalo de
|
|
404
|
+
nuevo en el `.env.dai`. Comprueba también que `DAI_JIRA_EMAIL` sea **exactamente** el correo de
|
|
405
|
+
tu cuenta de Atlassian.
|
|
406
|
+
|
|
407
|
+
### `dai mr` dice `hay N US vivas y la branch … no dice cuál`
|
|
408
|
+
|
|
409
|
+
Pasa cuando el repositorio tiene varios changes vivos y tu rama no nombra ninguno (una rama que
|
|
410
|
+
no creó `dai link-us`). No elige por ti: te lista las candidatas y te pregunta. Sin terminal
|
|
411
|
+
interactiva (en un pipeline) falla, y se lo dices explícito:
|
|
412
|
+
|
|
413
|
+
```powershell
|
|
414
|
+
dai mr --us PROJ-125
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### `dai mr` dice `no hay una US linkeada (implements.yaml)`
|
|
418
|
+
|
|
419
|
+
Tu rama no tiene link y **sí** debería tenerlo (`feature/…` es trabajo de producto). Ejecuta
|
|
420
|
+
`dai link-us <ID>` primero.
|
|
421
|
+
|
|
422
|
+
Si en cambio es un cambio sin historia (tooling, limpieza, documentación), nombra la rama
|
|
423
|
+
`chore/…` o `docs/…`: esas están exentas de US
|
|
424
|
+
([`governance/branch-naming.md`](https://github.com/dforce2055/dai/blob/main/governance/branch-naming.md)),
|
|
425
|
+
y `dai mr` arma la MR **sin** US, con el título de tu último commit — en vez de colgarle la
|
|
426
|
+
historia de un compañero.
|
|
427
|
+
|
|
428
|
+
### `dai mr` no pudo subir la rama
|
|
429
|
+
|
|
430
|
+
Te muestra el error real de git debajo. Lo más común la primera vez contra un remoto HTTPS
|
|
431
|
+
corporativo es que git necesite abrir el login y no lo hayas completado. Autentica subiendo la
|
|
432
|
+
rama a mano una vez y vuelve:
|
|
433
|
+
|
|
434
|
+
```powershell
|
|
435
|
+
git push -u origin feature/PROJ-125-finalizar-la-compra-del-carrito
|
|
436
|
+
dai mr
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### `dai mr` dice que `glab` no está instalado
|
|
440
|
+
|
|
441
|
+
La rama **ya se subió**; solo faltó crear la MR. dai te deja el cuerpo en un archivo y el
|
|
442
|
+
comando listo para ejecutar a mano. Instala `glab` ([tutorial](./instalar-glab.md)) o crea la
|
|
443
|
+
MR desde la web pegando ese cuerpo.
|
|
444
|
+
|
|
445
|
+
### Al salir a la red dice que no puede verificar el certificado
|
|
446
|
+
|
|
447
|
+
Es el **proxy de tu empresa**, que intercepta las conexiones con su propio certificado. Pide a
|
|
448
|
+
Sistemas el archivo `.pem` de la CA y decláralo:
|
|
449
|
+
|
|
450
|
+
```powershell
|
|
451
|
+
$env:NODE_EXTRA_CA_CERTS="C:\ruta\ca-empresa.pem"
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
> ⛔ **Nunca uses `NODE_TLS_REJECT_UNAUTHORIZED=0`**, aunque lo veas sugerido en internet o te
|
|
455
|
+
> lo proponga un asistente. Eso no arregla nada: **apaga la verificación entera**, y por esa
|
|
456
|
+
> conexión viaja tu token de Jira.
|
|
457
|
+
|
|
458
|
+
### El CI falla con "falta el link"
|
|
459
|
+
|
|
460
|
+
Es el gate de [`governance/ci-rules.md`](https://github.com/dforce2055/dai/blob/main/governance/ci-rules.md),
|
|
461
|
+
ejecutable con `dai check --ci`. Córrelo local para ver lo mismo que ve el CI:
|
|
462
|
+
|
|
463
|
+
```powershell
|
|
464
|
+
dai check --ci
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Te dice qué exige tu rama y por qué: `feature/` siempre requiere US, `chore/`/`docs/`/`ci/` y
|
|
468
|
+
compañía están exentas, `fix/` solo si el nombre trae un ID.
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Reglas de seguridad
|
|
473
|
+
|
|
474
|
+
- 🔒 **El `.env.dai` tiene tus tokens: son contraseñas.** Nunca lo pegues en un chat, en un
|
|
475
|
+
ticket ni en una MR. Ya está fuera del control de versiones — déjalo así.
|
|
476
|
+
- 🔑 **Un token por servicio**: Jira, GitLab y `glab` son tres cosas distintas. No los reutilices
|
|
477
|
+
ni los compartas.
|
|
478
|
+
- 🙅 **No aceptes atajos que bajen la seguridad.** Si algo falla por un certificado, se declara
|
|
479
|
+
la CA; no se apaga la verificación.
|
|
480
|
+
- ♻️ **Rota los tokens** periódicamente y revoca los que no uses. Si se filtra uno, revócalo de
|
|
481
|
+
inmediato.
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Lo que nunca tienes que hacer
|
|
486
|
+
|
|
487
|
+
- **No cambies el contenido funcional de la US ni sus criterios.** Si te parece que el QUÉ está
|
|
488
|
+
mal, devuelves la US al PO: no se decide negocio desde el código. ¿Apareció un criterio nuevo
|
|
489
|
+
mientras implementabas? Se empuja al tracker con `dai update-us PROJ-125`, para que el PO
|
|
490
|
+
**se entere** de que la historia creció.
|
|
491
|
+
- **No empieces sin una US con criterios testeables.** Sin
|
|
492
|
+
[DoR](../../templates/definition-of-ready.md) no hay dónde anclar el link, y eso es vibe
|
|
493
|
+
coding con más pasos.
|
|
494
|
+
- **No edites el `ac_hash` a mano** para que `dai check` deje de quejarse. El ⚠️ es información,
|
|
495
|
+
no un obstáculo: se resuelve con `--resync` **después** de cubrir el criterio nuevo.
|
|
496
|
+
- **No apruebes tu propia MR.** Tú haces tu propio review (paso 5 de la guía del dev); la firma
|
|
497
|
+
es de un compañero.
|
|
498
|
+
- **No commitees el `.env.dai`** ni pegues tokens en la descripción de una MR.
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## ¿Qué sigue?
|
|
503
|
+
|
|
504
|
+
El entorno ya está listo y probado. Lo que viene es tu día a día:
|
|
505
|
+
|
|
506
|
+
- 👉 [**Guía del dev / ingeniero**](../guias/dev.md) — **empieza aquí.** Tu rol de punta a
|
|
507
|
+
punta: de qué eres dueño, qué no tocas, y los 10 pasos del día a día.
|
|
508
|
+
- [**Ejemplo end-to-end**](../EJEMPLO-END-TO-END.md) — el ciclo completo narrado sobre una US
|
|
509
|
+
real, del `link-us` al `stamp`.
|
|
510
|
+
- [**Scrum con IA**](../SCRUM-CON-IA.md) — los 10 pasos del equipo, para ubicar dónde entra tu
|
|
511
|
+
parte y dónde termina.
|
|
512
|
+
- [**Glosario**](../glosario.md) — el vocabulario del método: el QUÉ y el CÓMO, `ac_hash`,
|
|
513
|
+
*atrasado*, el link.
|
|
514
|
+
|
|
515
|
+
> Eres dueño del CÓMO y autor del link. El QUÉ te llega definido, y el `ac_hash` es lo que hace
|
|
516
|
+
> que te enteres si cambia — sin reuniones y sin leer Jira todos los días.
|