@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.
- package/{.env.example → .env.dai.example} +3 -3
- package/CHANGELOG.md +41 -0
- package/README.md +36 -25
- package/VERSION +1 -1
- package/cli/dai.mjs +97 -41
- package/cli/lib/bootstrap.mjs +39 -7
- package/cli/lib/env.mjs +12 -0
- package/cli/lib/pm-clickup.mjs +2 -2
- package/cli/lib/pm-jira.mjs +2 -2
- 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/0017-env-dai.md +64 -0
- package/docs/adr/README.md +1 -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/docs/detalle/04-tdd.md
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
# Paso 4 —
|
|
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
|
|
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 →
|
|
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 →
|
|
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
|
-
-
|
|
21
|
-
|
|
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
|
|
26
|
-
|
|
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).
|
|
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 (
|
|
15
|
-
|
|
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
|
|
20
|
-
MCP del forge o por `dai forge
|
|
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
|
|
package/docs/detalle/08-daily.md
CHANGED
|
@@ -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
|
|
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
|
package/docs/detalle/README.md
CHANGED
|
@@ -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) |
|
|
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:
|
|
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
|
|
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. **
|
|
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. **
|
|
26
|
-
|
|
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
|
|
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
|
|
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.
|
package/docs/guias/lead.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
## Tus decisiones clave
|
|
25
25
|
|
|
26
|
-
### 1. ¿En qué nivel
|
|
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,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
- `/
|
|
48
|
-
- `/grill-
|
|
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>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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.
|