@dforce2055/dai 0.9.0 → 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 (51) hide show
  1. package/{.env.example → .env.dai.example} +3 -3
  2. package/CHANGELOG.md +41 -0
  3. package/README.md +36 -25
  4. package/VERSION +1 -1
  5. package/cli/dai.mjs +97 -41
  6. package/cli/lib/bootstrap.mjs +39 -7
  7. package/cli/lib/env.mjs +12 -0
  8. package/cli/lib/pm-clickup.mjs +2 -2
  9. package/cli/lib/pm-jira.mjs +2 -2
  10. package/cli/lib/skills-source.mjs +8 -0
  11. package/docs/EJEMPLO-END-TO-END.md +52 -43
  12. package/docs/MANIFIESTO.md +2 -2
  13. package/docs/METODOLOGIA.md +20 -15
  14. package/docs/PROBAR.md +13 -14
  15. package/docs/SCRUM-CON-IA.md +10 -10
  16. package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +1 -1
  17. package/docs/adr/0006-distribucion-y-licencia.md +1 -1
  18. package/docs/adr/0013-skills-externas-install-from.md +11 -4
  19. package/docs/adr/0015-jira-corporativo.md +1 -1
  20. package/docs/adr/0017-env-dai.md +64 -0
  21. package/docs/adr/README.md +1 -0
  22. package/docs/detalle/01-refinamiento.md +6 -5
  23. package/docs/detalle/03-ramas.md +2 -2
  24. package/docs/detalle/04-tdd.md +15 -9
  25. package/docs/detalle/06-code-review.md +8 -5
  26. package/docs/detalle/08-daily.md +1 -1
  27. package/docs/detalle/README.md +1 -1
  28. package/docs/glosario.md +2 -2
  29. package/docs/guias/dev.md +10 -7
  30. package/docs/guias/index.md +12 -0
  31. package/docs/guias/lead.md +1 -1
  32. package/docs/guias/po.md +13 -7
  33. package/docs/index.md +35 -0
  34. package/docs/public/favicon.svg +12 -0
  35. package/docs/public/logo-link.svg +12 -0
  36. package/docs/public/logo.svg +12 -0
  37. package/docs/public/tutoriales/clickup-1-settings.png +0 -0
  38. package/docs/public/tutoriales/clickup-2-api.png +0 -0
  39. package/docs/public/tutoriales/clickup-3-generate-copy.png +0 -0
  40. package/docs/public/tutoriales/jira-1-avatar.png +0 -0
  41. package/docs/public/tutoriales/jira-2-seguridad-tokens.png +0 -0
  42. package/docs/public/tutoriales/jira-3-crear-token.png +0 -0
  43. package/docs/public/tutoriales/jira-4-nombre-vencimiento.png +0 -0
  44. package/docs/public/tutoriales/jira-5-copiar.png +0 -0
  45. package/docs/tutoriales/claves-ssh.md +93 -0
  46. package/docs/tutoriales/configurar-git.md +53 -0
  47. package/docs/tutoriales/index.md +18 -0
  48. package/docs/tutoriales/instalar-glab.md +74 -0
  49. package/docs/tutoriales/token-clickup.md +73 -0
  50. package/docs/tutoriales/token-jira.md +74 -0
  51. package/package.json +9 -3
@@ -1,32 +1,38 @@
1
- # Paso 4 — TDD: test primero, en vertical slices
1
+ # Paso 4 — Implementación: el agente construye con TDD (`/opsx:apply`)
2
2
 
3
3
  ← vuelve a [`SCRUM-CON-IA.md`](../SCRUM-CON-IA.md)
4
4
 
5
5
  ## En qué consiste en detalle
6
6
 
7
- El CÓMO se construye con **test primero**, un comportamiento a la vez:
7
+ El CÓMO **lo implementa el agente** con `/opsx:apply`: aplica las tareas que salieron de
8
+ `opsx:propose`, escribiendo **test primero**, un comportamiento a la vez:
8
9
 
9
10
  ```
10
- RED → escribes UN test que falla (un criterio de aceptación)
11
+ RED → el agente escribe UN test que falla (un criterio de aceptación)
11
12
  GREEN → el código mínimo para que pase
12
- REFACTOR → limpias, con los tests en verde
13
+ REFACTOR → limpia, con los tests en verde
13
14
  ```
14
15
 
15
16
  *Vertical slices* (un test → una implementación → repetir), **no** horizontal
16
- (todos los tests, después todo el código).
17
+ (todos los tests, después todo el código). Se verifica por la **interfaz pública**.
17
18
 
18
19
  ## Herramientas
19
20
 
20
- - Skill [`tdd`](../../skills/tdd/SKILL.md) — el loop red-green-refactor y qué es un
21
- buen test.
21
+ - **`/opsx:apply`** — el paso donde el agente implementa las tareas del change.
22
+ - Skill [`tdd`](../../skills/tdd/SKILL.md) — la disciplina que `/opsx:apply` sigue: el
23
+ loop red-green-refactor y qué es un buen test.
22
24
 
23
25
  ## Qué firma el humano
24
26
 
25
- El dev **decide qué comportamientos importa testear** (no se testea todo) y revisa
26
- cada slice. La IA escribe el test como spec ejecutable, el dev valida.
27
+ El agente escribe el test y el código; el **dev decide qué comportamientos importa
28
+ testear** (no se testea todo), valida cada slice, y **es responsable del resultado — no
29
+ la IA** ([Art. 7](../MANIFIESTO.md#art-7)). Ese es el antídoto del vibe coding: la
30
+ revisión minuciosa de lo que produjo el agente (paso 6, code review propio).
27
31
 
28
32
  ## Antipatrones
29
33
 
34
+ - **Aceptar lo que sale sin revisarlo** → vibe coding con otra cara. El agente propone;
35
+ el dev responde por el código.
30
36
  - **Horizontal slicing** (todos los tests juntos) → tests de la *forma imaginada*, no
31
37
  del comportamiento real.
32
38
  - **Testear lo interno** (mocks de colaboradores, métodos privados) → el test se rompe
@@ -8,16 +8,19 @@ Dos revisiones distintas:
8
8
 
9
9
  1. **El dev revisa su propia implementación** — la que produjo la IA, minucioso y con
10
10
  criterio (correctitud, casos borde, seguridad, calidad). Es responsable del código, no
11
- la IA (anti vibe-coding). Recién con eso en orden, y todo **commiteado**, crea la PR.
11
+ la IA (anti vibe-coding). Solo con eso en orden, y todo **commiteado**, crea la PR.
12
12
  2. **Un partner revisa la PR** y **firma** aprobación/rechazo. Se apoya en la skill
13
13
  `dai-review` para un primer pase consciente de la metodología: corre `dai check` (¿la US
14
- quedó atrasada?), valida el DoD, revisa el código (🔴 errores / 🟡 mejoras / bien) y
15
- deja un **comentario estándar** en la PR/MR le saca el ruido para que firme lo que importa.
14
+ quedó atrasada?), valida el DoD, revisa el código (severidad low/medium/high) y deja un
15
+ **review inline** — un resumen + **un comentario anclado a cada `archivo:línea`**. La
16
+ skill valida cada posición contra el diff (descarta lo que el modelo inventó), te muestra
17
+ el preview y **espera tu OK antes de postear** ([ADR-0016](../adr/0016-review-inline.md)).
16
18
 
17
19
  ## Herramientas
18
20
 
19
- - Skill [`dai-review`](../../skills/dai-review/SKILL.md) — GitHub y GitLab, postea por
20
- MCP del forge o por `dai forge comment` (token).
21
+ - Skill [`dai-review`](../../skills/dai-review/SKILL.md) — GitHub y GitLab. Postea el review
22
+ inline por el MCP del forge o por `dai forge review <ref> --from <review.json>` (token);
23
+ `dai forge comment` queda como fallback simple sin anclar.
21
24
  - `dai check` ([ADR-0003](../adr/0003-deteccion-y-estampado-son-comandos.md)).
22
25
  - Gate de cierre: [`definition-of-done.md`](../../templates/definition-of-done.md).
23
26
 
@@ -7,7 +7,7 @@
7
7
  15 minutos: qué hice, qué voy a hacer, qué me traba. Es **sincronización**, no
8
8
  reporte de estado. Se hace **a mano, sin IA, a propósito**.
9
9
 
10
- ## Por qué no metemos IA acá
10
+ ## Por qué no metemos IA aquí
11
11
 
12
12
  La IA *podría* auto-generar el "qué se hizo" desde git + el tracker. **No lo hacemos**:
13
13
  el daily es donde el equipo se **apropia** del proceso, lo entiende y se coordina de
@@ -9,7 +9,7 @@ los antipatrones a evitar.
9
9
  | [01](01-refinamiento.md) | Refinamiento (idea → US testeable) | ●●● |
10
10
  | [02](02-planning.md) | Planning (derivar el CÓMO) | ●● |
11
11
  | [03](03-ramas.md) | Rama ligada al QUÉ | ●●● |
12
- | [04](04-tdd.md) | TDD (test primero) | ●●● |
12
+ | [04](04-tdd.md) | Implementación (`/opsx:apply`, con TDD) | ●●● |
13
13
  | [05](05-smoke.md) | Smoke end-to-end | ●● |
14
14
  | [06](06-code-review.md) | Code review (IA + partner) | ●● |
15
15
  | [07](07-merge-trazabilidad.md) | Merge + trazabilidad | ●●● |
package/docs/glosario.md CHANGED
@@ -24,7 +24,7 @@
24
24
  | **`implements.yaml`** | El archivo, en el change del repo, que contiene ese link. Lo genera `link-us`. Ejemplo lleno + árbol de dónde vive entre los artefactos de OpenSpec: [ADR-0004](adr/0004-ubicacion-y-schema-implements.md). |
25
25
  | **Trazabilidad inversa / cobertura** | El mapa "quién implementó este QUÉ". **Se genera, nunca se escribe.** |
26
26
  | **Índice / router** | La tabla central que dice qué ID vive en qué repos. Es un router, **no un almacén**: no guarda el detalle. |
27
- | **Federación (dos niveles)** | Cómo se guarda la trazabilidad a escala: Nivel 1 = índice central chico; Nivel 2 = detalle en cada repo, resuelto on-demand. *(Es un eje distinto de los niveles de ceremonia N1/N2/N3: acá "nivel" es dónde vive el dato, no el tamaño del equipo.)* |
27
+ | **Federación (dos niveles)** | Cómo se guarda la trazabilidad a escala: Nivel 1 = índice central chico; Nivel 2 = detalle en cada repo, resuelto on-demand. *(Es un eje distinto de los niveles de ceremonia N1/N2/N3: aquí "nivel" es dónde vive el dato, no el tamaño del equipo.)* |
28
28
  | **Matriz de trazabilidad** | La vista "repo × versión × estado (al día / atrasado)". Derivada, no mantenida a mano. |
29
29
 
30
30
  ## El versionado
@@ -46,7 +46,7 @@
46
46
  | **PR / MR (Pull / Merge Request)** | La unidad revisable del CÓMO. En dai lleva **dos activos**, y el review cubre ambos: (1) la **implementación** (el código) y (2) el **spec trazable** (el `implements.yaml` con el link a la US y el `@version` verificado). Sin el segundo, el CI bloquea el PR. Template en `../templates/pull-request.md`. |
47
47
  | **Change** | La unidad de trabajo de OpenSpec (proposal + design + tasks + specs). |
48
48
  | **ADR (Architecture Decision Record)** | El registro de una decisión estructural: contexto, decisión, consecuencias. Chico e **inmutable** — si algo cambia, se escribe uno nuevo que supersede al viejo. Template en `../templates/adr.md`; los de dai, en [`adr/`](adr/). |
49
- | **TDD (Test-Driven Development)** | Escribir el test **antes** que el código: RED (test que falla) → GREEN (código mínimo) → REFACTOR. En dai cada AC se vuelve un test (skill `tdd`); es el antídoto del vibe coding. |
49
+ | **TDD (Test-Driven Development)** | Escribir el test **antes** que el código: RED (test que falla) → GREEN (código mínimo) → REFACTOR. En dai lo aplica el **agente** dentro de `/opsx:apply` (disciplina de la skill `tdd`): cada AC se vuelve un test. El dev valida y es responsable. Es el antídoto del vibe coding. |
50
50
  | **Vertical slice** | Un test → una implementación → repetir. Lo opuesto a "todos los tests, después todo el código". |
51
51
  | **Smoke** | Escenario end-to-end que verifica que el flujo grueso no se rompió. |
52
52
 
package/docs/guias/dev.md CHANGED
@@ -18,12 +18,14 @@
18
18
 
19
19
  ## Tu día a día
20
20
 
21
- 1. **Agarras una US** que cumple el [DoR](../../templates/definition-of-ready.md) → `/link-us ABC-###`. Crea la rama y el
21
+ 1. **Tomas una US** que cumple el [DoR](../../templates/definition-of-ready.md) → `/link-us ABC-###`. Crea la rama y el
22
22
  `implements.yaml` **desde el ID, sin que tipees el key a mano** (Art. 8, Art. 9).
23
23
  2. **Armas el CÓMO** → `opsx:explore` → `opsx:propose`. OpenSpec genera
24
24
  `design.md`/`tasks.md`; tú validas y ajustas. Las tareas nacen del cómo.
25
- 3. **Implementas con TDD** → `/tdd`. Un test a la vez, vertical slices: RED → GREEN
26
- refactor. Verificas por la **interfaz pública**, no espías lo interno (Art. 7).
25
+ 3. **El agente implementa el CÓMO** → `/opsx:apply`. Aplica las tareas escribiendo
26
+ test-primero (TDD, vertical slices: RED GREEN refactor), por la **interfaz
27
+ pública** (Art. 7). Tú decides qué comportamientos importa testear; el agente los
28
+ construye.
27
29
  4. **Smoke** → ejecutas el escenario end-to-end del flujo.
28
30
  5. **Revisas la implementación de la IA** (code review propio) → minucioso y con criterio:
29
31
  correctitud, casos borde, seguridad, calidad. **Eres responsable del código, no la IA**
@@ -33,7 +35,8 @@
33
35
  arma la PR **precargada** (US + estado del check + links; los **dos activos**: código +
34
36
  spec trazable) y la asignas a un partner.
35
37
  7. **Review de un partner** → un compañero revisa tu PR y **firma** aprobación/rechazo
36
- (Art. 5). Se apoya en la skill `/dai-review` para un primer pase con comentario estándar.
38
+ (Art. 5). Se apoya en la skill `/dai-review` para un primer pase: un **review inline**
39
+ (resumen + un comentario por línea), que le muestra el preview y espera su OK antes de postear.
37
40
  *(Tu PR la revisas tú en el paso 5; la de un compañero, lo ayudas con la skill.)*
38
41
  8. **Verificas el DoD** → [`definition-of-done.md`](../../templates/definition-of-done.md) antes de mergear.
39
42
  9. **Merge → se estampa la cobertura** con `dai stamp` (lo corres tú tras mergear, o el CI
@@ -45,7 +48,7 @@
45
48
  ## La trampa a evitar
46
49
 
47
50
  **Vibe coding.** Nada de codear sobre una idea vaga o "improvisar y después vemos".
48
- Si no hay US con criterios testeables, no arranques: falta el [DoR](../../templates/definition-of-ready.md). La disciplina
51
+ Si no hay US con criterios testeables, no empieces: falta el [DoR](../../templates/definition-of-ready.md). La disciplina
49
52
  —US clara → design → test → código— es lo que separa esto de pedirle cosas a un chat.
50
53
 
51
54
  ## Cuando el QUÉ cambia
@@ -59,8 +62,8 @@ te avisa: el link versionado lo hace [Art. 11](../MANIFIESTO.md#art-11).
59
62
  - `/link-us`
60
63
  - `/opsx:explore`
61
64
  - `/opsx:propose`
62
- - `/opsx:apply`
63
- - `/tdd`
65
+ - `/opsx:apply` — el agente implementa las tareas (con TDD)
66
+ - `/tdd` — la disciplina TDD que aplica el paso anterior
64
67
  - `/dai-review`
65
68
  - `dai check` · `dai pr` · `dai stamp` · `dai done` (limpieza, opcional)
66
69
  - `definition-of-done.md`
@@ -0,0 +1,12 @@
1
+ # Guías por rol
2
+
3
+ Un camino corto según quién eres. Cada guía te dice de qué eres **dueño**, qué **no tocas**,
4
+ y tu **día a día**.
5
+
6
+ - [**Guía del PO / funcional**](./po) — dueño del **QUÉ**: defines las User Stories y el
7
+ porqué, nunca el CÓMO. Entrás por `grill-user-story`, `grill-epic` o `doc-to-backlog`.
8
+ - [**Guía del dev / ingeniero**](./dev) — dueño del **CÓMO** y del **link**: el agente
9
+ implementa con `/opsx:apply`, tú revisas y autoras el `implements.yaml`.
10
+ - [**Guía del lead / SM / arquitecto**](./lead) — custodio de las **invariantes** y del
11
+ **nivel de ceremonia** (N1 / N2 / N3): haces que el método se cumpla y se aligere donde
12
+ corresponde.
@@ -23,7 +23,7 @@
23
23
 
24
24
  ## Tus decisiones clave
25
25
 
26
- ### 1. ¿En qué nivel arranca el equipo?
26
+ ### 1. ¿En qué nivel empieza el equipo?
27
27
  - **1 dev / 1 repo →** N1 (OpenSpec solo, cero herramientas externas).
28
28
  - **Equipo compacto →** N2 (US en el gestor + `implements.yaml`).
29
29
  - **Muchos repos + equipos separados →** N3 (Jira hub, CI estampa, matriz de ambientes).
package/docs/guias/po.md CHANGED
@@ -18,13 +18,17 @@
18
18
 
19
19
  ## Tu día a día
20
20
 
21
- 1. **Nace una idea** → creas el ticket en el gestor (nace con ID, aunque sea vago).
22
- 2. **Gate 0** ejecutas `/grill-intent`. La IA te desafía el *problema*: ¿es el
23
- correcto? ¿quién lo sufre? ¿qué pasa si no lo hacemos? Un veredicto válido es
24
- *"no lo construyas"* eso es el gate haciendo su trabajo (Art. 4).
25
- 3. **Pulir el QUÉ** → ejecutas `/grill-user-story`. La IA te **interroga** hasta que
21
+ 1. **Nace una idea — o llega un documento** → creas el ticket en el gestor (nace con ID,
22
+ aunque sea vago). Si en cambio partes de un **documento de análisis** (PDF, Word),
23
+ `/doc-to-backlog` lo convierte en un **backlog candidato** de épicas + US para que
24
+ priorices y valides. Y si algo es **demasiado grande** para una sola US,
25
+ `/grill-epic` lo parte en varias.
26
+ 2. **Pulir el QUÉ** → ejecutas `/grill-user-story`. La IA te **interroga** hasta que
26
27
  la US es testeable (INVEST + Gherkin) y la publica en el gestor. La IA no
27
28
  inventa requerimientos: te los saca a preguntas. Tú respondes y decides.
29
+ 3. **Gate 0** → ejecutas `/grill-intent` sobre la US ya formada. La IA te desafía el
30
+ *problema*: ¿es el correcto? ¿quién lo sufre? ¿qué pasa si no lo hacemos? Un veredicto
31
+ válido es *"no lo construyas"* — eso es el gate haciendo su trabajo (Art. 4).
28
32
  4. **Verificas el [DoR](../../templates/definition-of-ready.md)** → antes de que entre al sprint, la US cumple el
29
33
  [`definition-of-ready.md`](../../templates/definition-of-ready.md).
30
34
  5. **Demo** → aceptas o rechazas contra los mismos criterios que ya eran tests.
@@ -44,7 +48,9 @@ el CI (Art. 10).
44
48
 
45
49
  ## Tus herramientas
46
50
 
47
- - `/grill-intent`
48
- - `/grill-user-story`
51
+ - `/doc-to-backlog` — un documento (PDF/Word) → backlog candidato de épicas + US
52
+ - `/grill-epic` — algo grande → una épica partida en varias US
53
+ - `/grill-user-story` — una US funcional y testeable
54
+ - `/grill-intent` — Gate 0: desafía el problema de la US antes del spec
49
55
  - el gestor de proyectos
50
56
  - [`definition-of-ready.md`](../../templates/definition-of-ready.md)
package/docs/index.md ADDED
@@ -0,0 +1,35 @@
1
+ ---
2
+ layout: home
3
+
4
+ hero:
5
+ name: dai
6
+ text: Desarrollo Asistido por IA
7
+ tagline: La documentación del método — el manifiesto, las decisiones (ADRs) y las guías por rol. Todo buscable con ⌘K.
8
+ actions:
9
+ - theme: brand
10
+ text: Empezar
11
+ link: /PROBAR
12
+ - theme: alt
13
+ text: El manifiesto
14
+ link: /MANIFIESTO
15
+ - theme: alt
16
+ text: ↩ Volver a la landing
17
+ link: https://dforce2055.github.io/dai/
18
+
19
+ features:
20
+ - icon: 📐
21
+ title: El método
22
+ details: Manifiesto, metodología y el Scrum con IA en 10 pasos. El porqué antes que el cómo.
23
+ link: /MANIFIESTO
24
+ linkText: Leer el manifiesto
25
+ - icon: 🧭
26
+ title: Las decisiones (ADRs)
27
+ details: Cada decisión de diseño, registrada — del contrato del ac_hash al review inline. Por qué dai es como es.
28
+ link: /adr/
29
+ linkText: Ver los ADRs
30
+ - icon: 🧑‍💻
31
+ title: Guías por rol
32
+ details: Caminos cortos según quién sos — PO / analista, dev, o lead. Directo a lo que te toca.
33
+ link: /guias/dev
34
+ linkText: Ir a las guías
35
+ ---
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <defs><radialGradient id="favc" cx="0.5" cy="0.5" r="0.5">
3
+ <stop offset="0.35" stop-color="#F4B41A"/><stop offset="1" stop-color="#D98E04"/>
4
+ </radialGradient></defs>
5
+ <g fill="url(#favc)"><path d="M50.00 4.00 L52.00 29.00 L48.00 29.00 Z"/><path d="M67.60 7.50 L59.88 31.36 L56.19 29.83 Z"/><path d="M82.53 17.47 L66.26 36.56 L63.44 33.74 Z"/><path d="M92.50 32.40 L70.17 43.81 L68.64 40.12 Z"/><path d="M96.00 50.00 L71.00 52.00 L71.00 48.00 Z"/><path d="M92.50 67.60 L68.64 59.88 L70.17 56.19 Z"/><path d="M82.53 82.53 L63.44 66.26 L66.26 63.44 Z"/><path d="M67.60 92.50 L56.19 70.17 L59.88 68.64 Z"/><path d="M50.00 96.00 L48.00 71.00 L52.00 71.00 Z"/><path d="M32.40 92.50 L40.12 68.64 L43.81 70.17 Z"/><path d="M17.47 82.53 L33.74 63.44 L36.56 66.26 Z"/><path d="M7.50 67.60 L29.83 56.19 L31.36 59.88 Z"/><path d="M4.00 50.00 L29.00 48.00 L29.00 52.00 Z"/><path d="M7.50 32.40 L31.36 40.12 L29.83 43.81 Z"/><path d="M17.47 17.47 L36.56 33.74 L33.74 36.56 Z"/><path d="M32.40 7.50 L43.81 29.83 L40.12 31.36 Z"/></g>
6
+
7
+ <circle cx="50" cy="50" r="19" fill="none" stroke="#74ACDF" stroke-width="2.3"/>
8
+ <circle cx="50" cy="50" r="15" fill="#14305C"/><path d="M43.5 44.9 L39.5 50 L43.5 55.1
9
+ M56.5 44.9 L60.5 50 L56.5 55.1
10
+ M51.8 44.4 L48.2 55.6"
11
+ fill="none" stroke="#EAF4FB" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
12
+ </svg>
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <defs><radialGradient id="sol-link" cx="0.5" cy="0.5" r="0.5">
3
+ <stop offset="0.35" stop-color="#F4B41A"/><stop offset="1" stop-color="#D98E04"/>
4
+ </radialGradient></defs>
5
+ <g fill="url(#sol-link)"><path d="M50.00 6.00 L51.12 32.00 L48.88 32.00 Z"/><path d="M57.61 11.75 L54.61 32.56 L52.41 32.13 Z"/><path d="M66.84 9.35 L57.92 33.80 L55.85 32.94 Z"/><path d="M71.67 17.57 L60.93 35.66 L59.07 34.41 Z"/><path d="M81.11 18.89 L63.52 38.06 L61.94 36.48 Z"/><path d="M82.43 28.33 L65.59 40.93 L64.34 39.07 Z"/><path d="M90.65 33.16 L67.06 44.15 L66.20 42.08 Z"/><path d="M88.25 42.39 L67.87 47.59 L67.44 45.39 Z"/><path d="M94.00 50.00 L68.00 51.12 L68.00 48.88 Z"/><path d="M88.25 57.61 L67.44 54.61 L67.87 52.41 Z"/><path d="M90.65 66.84 L66.20 57.92 L67.06 55.85 Z"/><path d="M82.43 71.67 L64.34 60.93 L65.59 59.07 Z"/><path d="M81.11 81.11 L61.94 63.52 L63.52 61.94 Z"/><path d="M71.67 82.43 L59.07 65.59 L60.93 64.34 Z"/><path d="M66.84 90.65 L55.85 67.06 L57.92 66.20 Z"/><path d="M57.61 88.25 L52.41 67.87 L54.61 67.44 Z"/><path d="M50.00 94.00 L48.88 68.00 L51.12 68.00 Z"/><path d="M42.39 88.25 L45.39 67.44 L47.59 67.87 Z"/><path d="M33.16 90.65 L42.08 66.20 L44.15 67.06 Z"/><path d="M28.33 82.43 L39.07 64.34 L40.93 65.59 Z"/><path d="M18.89 81.11 L36.48 61.94 L38.06 63.52 Z"/><path d="M17.57 71.67 L34.41 59.07 L35.66 60.93 Z"/><path d="M9.35 66.84 L32.94 55.85 L33.80 57.92 Z"/><path d="M11.75 57.61 L32.13 52.41 L32.56 54.61 Z"/><path d="M6.00 50.00 L32.00 48.88 L32.00 51.12 Z"/><path d="M11.75 42.39 L32.56 45.39 L32.13 47.59 Z"/><path d="M9.35 33.16 L33.80 42.08 L32.94 44.15 Z"/><path d="M17.57 28.33 L35.66 39.07 L34.41 40.93 Z"/><path d="M18.89 18.89 L38.06 36.48 L36.48 38.06 Z"/><path d="M28.33 17.57 L40.93 34.41 L39.07 35.66 Z"/><path d="M33.16 9.35 L44.15 32.94 L42.08 33.80 Z"/><path d="M42.39 11.75 L47.59 32.13 L45.39 32.56 Z"/></g>
6
+
7
+ <circle cx="50" cy="50" r="15.5" fill="none" stroke="#74ACDF" stroke-width="2.3"/>
8
+ <circle cx="50" cy="50" r="12" fill="#14305C"/>
9
+ <line x1="45" y1="50" x2="55" y2="50" stroke="#EAF4FB" stroke-width="2.2" stroke-linecap="round"/>
10
+ <circle cx="45" cy="50" r="2.5" fill="#EAF4FB"/>
11
+ <circle cx="55" cy="50" r="2.5" fill="#EAF4FB"/>
12
+ </svg>
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <defs><radialGradient id="sol-code" cx="0.5" cy="0.5" r="0.5">
3
+ <stop offset="0.35" stop-color="#F4B41A"/><stop offset="1" stop-color="#D98E04"/>
4
+ </radialGradient></defs>
5
+ <g fill="url(#sol-code)"><path d="M50.00 6.00 L51.12 32.00 L48.88 32.00 Z"/><path d="M57.61 11.75 L54.61 32.56 L52.41 32.13 Z"/><path d="M66.84 9.35 L57.92 33.80 L55.85 32.94 Z"/><path d="M71.67 17.57 L60.93 35.66 L59.07 34.41 Z"/><path d="M81.11 18.89 L63.52 38.06 L61.94 36.48 Z"/><path d="M82.43 28.33 L65.59 40.93 L64.34 39.07 Z"/><path d="M90.65 33.16 L67.06 44.15 L66.20 42.08 Z"/><path d="M88.25 42.39 L67.87 47.59 L67.44 45.39 Z"/><path d="M94.00 50.00 L68.00 51.12 L68.00 48.88 Z"/><path d="M88.25 57.61 L67.44 54.61 L67.87 52.41 Z"/><path d="M90.65 66.84 L66.20 57.92 L67.06 55.85 Z"/><path d="M82.43 71.67 L64.34 60.93 L65.59 59.07 Z"/><path d="M81.11 81.11 L61.94 63.52 L63.52 61.94 Z"/><path d="M71.67 82.43 L59.07 65.59 L60.93 64.34 Z"/><path d="M66.84 90.65 L55.85 67.06 L57.92 66.20 Z"/><path d="M57.61 88.25 L52.41 67.87 L54.61 67.44 Z"/><path d="M50.00 94.00 L48.88 68.00 L51.12 68.00 Z"/><path d="M42.39 88.25 L45.39 67.44 L47.59 67.87 Z"/><path d="M33.16 90.65 L42.08 66.20 L44.15 67.06 Z"/><path d="M28.33 82.43 L39.07 64.34 L40.93 65.59 Z"/><path d="M18.89 81.11 L36.48 61.94 L38.06 63.52 Z"/><path d="M17.57 71.67 L34.41 59.07 L35.66 60.93 Z"/><path d="M9.35 66.84 L32.94 55.85 L33.80 57.92 Z"/><path d="M11.75 57.61 L32.13 52.41 L32.56 54.61 Z"/><path d="M6.00 50.00 L32.00 48.88 L32.00 51.12 Z"/><path d="M11.75 42.39 L32.56 45.39 L32.13 47.59 Z"/><path d="M9.35 33.16 L33.80 42.08 L32.94 44.15 Z"/><path d="M17.57 28.33 L35.66 39.07 L34.41 40.93 Z"/><path d="M18.89 18.89 L38.06 36.48 L36.48 38.06 Z"/><path d="M28.33 17.57 L40.93 34.41 L39.07 35.66 Z"/><path d="M33.16 9.35 L44.15 32.94 L42.08 33.80 Z"/><path d="M42.39 11.75 L47.59 32.13 L45.39 32.56 Z"/></g>
6
+
7
+ <circle cx="50" cy="50" r="16" fill="none" stroke="#74ACDF" stroke-width="2.3"/>
8
+ <circle cx="50" cy="50" r="12.8" fill="#14305C"/><path d="M44.5 46.43 L40.5 50 L44.5 53.57
9
+ M55.5 46.43 L59.5 50 L55.5 53.57
10
+ M51.8 45.93 L48.2 54.07"
11
+ fill="none" stroke="#EAF4FB" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"/>
12
+ </svg>
@@ -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.