@dforce2055/dai 0.14.0 → 0.15.1
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.dai.example +16 -0
- package/CHANGELOG.md +127 -0
- package/CONTRIBUTING.md +22 -0
- package/README.md +3 -2
- package/VERSION +1 -1
- package/cli/dai.mjs +571 -17
- package/cli/lib/bootstrap.mjs +4 -4
- package/cli/lib/branch-flow.mjs +6 -6
- package/cli/lib/branch-scope.mjs +24 -9
- package/cli/lib/help.mjs +76 -0
- package/cli/lib/notify.mjs +205 -0
- package/cli/lib/pm-adapter.mjs +16 -0
- package/cli/lib/pm-clickup.mjs +17 -0
- package/cli/lib/pm-jira.mjs +92 -8
- package/cli/lib/pr-remote.mjs +14 -0
- package/cli/lib/release-files.mjs +119 -0
- package/cli/lib/release-plan.mjs +221 -0
- package/cli/lib/release-stamp.mjs +87 -0
- package/cli/lib/review-findings.mjs +2 -2
- package/cli/lib/us-format.mjs +2 -2
- package/cli/lib/us.mjs +6 -6
- package/docs/adr/0008-estrategia-de-i18n.md +58 -0
- package/docs/adr/0019-ciclo-de-version-y-aviso-de-release.md +190 -0
- package/docs/adr/README.md +1 -0
- package/docs/guias/index.md +3 -0
- package/docs/guias/releases.md +156 -0
- package/docs/tutoriales/ciclo-de-release.md +266 -0
- package/docs/tutoriales/index.md +6 -0
- package/package.json +1 -1
- package/skills/dai-release/SKILL.md +167 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dai-release
|
|
3
|
+
description: "Conduce el ciclo de versión de un repo con dai, paso a paso y confirmando cada uno: el manifiesto de qué entra (qué User Stories, cuáles atrasadas, qué se coló sin US), la versión que corresponde, el corte de la release, la redacción del CHANGELOG, el cierre con tag + release note + back-merge, y —opcional— el aviso a cada US de en qué versión y ambiente salió más la notificación al canal del equipo. Se apoya en `dai release plan/cut/done/stamp/status`: NO recalcula nada por su cuenta, narra lo que el CLI dice. Frena en las dos firmas humanas (aprobar la versión; mergear y publicar) y nunca las salta. Invocar como /dai-release, opcionalmente con la versión. Usar cuando alguien dice 'cortemos una versión', 'hay que sacar release', 'promover a producción' o 'qué entra en la próxima'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# dai-release — conducir el ciclo de versión
|
|
7
|
+
|
|
8
|
+
Un release tiene doce pasos, dos de ellos son firmas humanas, y los dos que más se olvidan
|
|
9
|
+
están **después** de la firma — el release note y el back-merge. Nadie los recuerda todos, y
|
|
10
|
+
por eso se hacen mal. Esta skill los conduce.
|
|
11
|
+
|
|
12
|
+
## El reparto: el CLI sabe, tú contás
|
|
13
|
+
|
|
14
|
+
No calculás el manifiesto ni derivás la versión. Los comandos ya lo hacen, igual con
|
|
15
|
+
Claude, con Copilot o sin ningún asistente ([ADR-0002](../../docs/adr/0002-agnostico-del-asistente.md)):
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
dai release plan --json → vos → la persona decide
|
|
19
|
+
qué entró, en qué estado lo contás firma o corrige
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Nunca inventes el contenido del manifiesto.** Si `dai release plan` no lista una US, esa
|
|
23
|
+
US no entró — aunque la recuerdes del chat. Si el CLI y tu memoria no coinciden, gana el CLI
|
|
24
|
+
y lo decís en voz alta.
|
|
25
|
+
|
|
26
|
+
Lo que sí es tuyo, porque ningún comando puede hacerlo:
|
|
27
|
+
|
|
28
|
+
1. **Proponer el bump mirando el comportamiento.** El CLI lo deriva de los tipos de commit
|
|
29
|
+
y lo dice: es un piso, no un veredicto. Vos leés el diff. Si algo mueve un default,
|
|
30
|
+
agrega un flag o cambia lo que ve quien no configura nada, **es minor aunque todo sea
|
|
31
|
+
`fix:`** — le pasó a este mismo repo en la 0.14.0, cuatro commits `fix:` que eran minor.
|
|
32
|
+
2. **Escribir el CHANGELOG.** El CLI deja el material (las US) y las secciones vacías. La
|
|
33
|
+
prosa la escribís vos: dai sabe *qué* entró, no *por qué importa*.
|
|
34
|
+
3. **Ver lo que falta.** Una US atrasada en el manifiesto, una branch que entró sin link,
|
|
35
|
+
el back-merge de la release anterior que nunca se hizo.
|
|
36
|
+
4. **Frenar en las firmas.** Y saber que después de la firma quedan pasos pendientes.
|
|
37
|
+
|
|
38
|
+
## Antes de empezar
|
|
39
|
+
|
|
40
|
+
Corré `dai release status`. Te dice dónde está el repo en el ciclo y evita el error más
|
|
41
|
+
común: cortar una versión cuando la anterior quedó a medio cerrar.
|
|
42
|
+
|
|
43
|
+
## El ciclo
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
plan ──▶ [FIRMA 1: la versión] ──▶ cut ──▶ CHANGELOG ──▶ dai pr
|
|
47
|
+
│
|
|
48
|
+
[FIRMA 2: merge + publicar] ◀──┘
|
|
49
|
+
│
|
|
50
|
+
▼
|
|
51
|
+
done ──▶ stamp (opcional) ──▶ aviso (opcional)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 1 · El manifiesto — `dai release plan`
|
|
55
|
+
|
|
56
|
+
Corré `dai release plan` y **contá lo que dice**, no lo que esperabas que dijera:
|
|
57
|
+
|
|
58
|
+
- cuántas US entran y cuáles;
|
|
59
|
+
- **cuáles están ATRASADAS** — el QUÉ cambió después de implementarlas, así que esta
|
|
60
|
+
versión las llevaría sin cubrir el criterio nuevo. Nombralas una por una;
|
|
61
|
+
- **qué branches entraron sin US y sin prefijo exento** — es la última pantalla donde eso
|
|
62
|
+
se puede ver antes de que quede adentro de una versión;
|
|
63
|
+
- el bump propuesto y su justificación.
|
|
64
|
+
|
|
65
|
+
Si hay US atrasadas o branches huérfanas, **preguntá antes de seguir**: *"¿cortamos igual,
|
|
66
|
+
o querés resolver esto primero?"* No decidas vos. Cortar con una US atrasada es legítimo
|
|
67
|
+
—a veces el criterio nuevo va en la próxima— pero tiene que ser una decisión, no un
|
|
68
|
+
descuido.
|
|
69
|
+
|
|
70
|
+
### 2 · La versión — FIRMA HUMANA
|
|
71
|
+
|
|
72
|
+
Proponé la versión **con tu propio análisis del comportamiento**, no repitiendo el bump del
|
|
73
|
+
CLI. Decí explícitamente si coincidís con él o no, y por qué:
|
|
74
|
+
|
|
75
|
+
> El CLI propone `patch` (solo hay commits `fix:`). Yo propongo **minor**: el default de
|
|
76
|
+
> `dai pr` cambió, y quien actualice sin leer el changelog lo va a notar. ¿Vamos con 0.15.0?
|
|
77
|
+
|
|
78
|
+
**Esperá el sí.** Sin confirmación explícita en este turno, no sigas. Un "dale" de un
|
|
79
|
+
release anterior no cuenta.
|
|
80
|
+
|
|
81
|
+
### 3 · Cortar — `dai release cut <X.Y.Z>`
|
|
82
|
+
|
|
83
|
+
Mostrá el preview del comando y confirmá antes de correrlo con `--yes` (o dejá que pregunte
|
|
84
|
+
él). Crea la branch de release, sube el número en los archivos que el repo espeja, escribe
|
|
85
|
+
la entrada del CHANGELOG y commitea. **No habla hacia afuera:** ni push, ni tag, ni PR.
|
|
86
|
+
|
|
87
|
+
Si el repo trabaja sin branch de release (todo sale de la rama de integración), es
|
|
88
|
+
`--no-branch`. Preguntá cuál es el flujo si no está claro; no lo asumas.
|
|
89
|
+
|
|
90
|
+
### 4 · El CHANGELOG — tu parte
|
|
91
|
+
|
|
92
|
+
`cut` deja la entrada con el material en un comentario y las secciones vacías. **Escribila.**
|
|
93
|
+
Mirá cómo están escritas las entradas anteriores del repo y seguí esa voz. Si el repo no
|
|
94
|
+
tiene ninguna, el estándar es:
|
|
95
|
+
|
|
96
|
+
- abrí con **qué estaba mal o qué cambia**, en una o dos frases, para alguien que no siguió
|
|
97
|
+
el desarrollo;
|
|
98
|
+
- cada ítem explica **por qué importaba**, no qué archivos se tocaron;
|
|
99
|
+
- repartí las US del comentario en las secciones que correspondan y **borrá el comentario**.
|
|
100
|
+
|
|
101
|
+
Un changelog que solo lista commits no lo lee nadie. Si no sabés por qué un cambio importa,
|
|
102
|
+
**preguntá** — es exactamente la información que solo tiene una persona.
|
|
103
|
+
|
|
104
|
+
Después, commiteá el CHANGELOG y abrí la PR con `dai pr`. La base sale sola del mapa de
|
|
105
|
+
ramas: una branch `release/` va contra la rama de producción y pide confirmación explícita.
|
|
106
|
+
|
|
107
|
+
### 5 · Merge y publicación — FIRMA HUMANA
|
|
108
|
+
|
|
109
|
+
**Acá parás.** Mergear la PR y publicar (npm, un deploy, lo que este repo use) lo hace una
|
|
110
|
+
persona. Si el repo tiene un `RELEASING.md`, leelo y decí los pasos exactos que le tocan.
|
|
111
|
+
|
|
112
|
+
Decí claramente que **el ciclo no terminó**: falta el tag, el release note y el back-merge.
|
|
113
|
+
Es justo acá donde se abandonan los releases hechos a mano.
|
|
114
|
+
|
|
115
|
+
### 6 · Cerrar — `dai release done <X.Y.Z>`
|
|
116
|
+
|
|
117
|
+
Después del merge. Tag anotado, release note en el forge, back-merge a integración y aviso
|
|
118
|
+
al canal. Cada paso reporta por separado: **si falla la release note, el tag ya existe** —
|
|
119
|
+
decilo, no lo tapes.
|
|
120
|
+
|
|
121
|
+
También **borra la rama de release** que cerró: ya está mergeada, etiquetada y con el
|
|
122
|
+
back-merge hecho. Si git se niega, es porque tiene commits que no llegaron a producción —
|
|
123
|
+
decilo, no lo tapes con `--keep-branch`.
|
|
124
|
+
|
|
125
|
+
### 7 · Estampar — `dai release stamp <X.Y.Z> --env <ambiente>` · OPCIONAL
|
|
126
|
+
|
|
127
|
+
Cuando la versión llega a un ambiente. Le deja a **cada US del release** un comentario
|
|
128
|
+
diciendo en qué versión y ambiente salió, y con eso el funcional lee el ticket en vez de
|
|
129
|
+
preguntar.
|
|
130
|
+
|
|
131
|
+
**Antes de correrlo, avisá el alcance en voz alta**: *"esto va a escribir N comentarios en
|
|
132
|
+
N tickets, que puede tocar a varias personas del equipo, y no se deshace"*. El comando
|
|
133
|
+
muestra el detalle y confirma; tu trabajo es que nadie llegue a esa pantalla sin saber qué
|
|
134
|
+
va a pasar.
|
|
135
|
+
|
|
136
|
+
**Si dicen que no, seguí adelante.** No es un error ni hay que insistir: la versión ya está
|
|
137
|
+
hecha. Decí una vez qué se pierde (el ticket no va a registrar en qué versión salió) y
|
|
138
|
+
ofrecé la alternativa: *"¿preferís que solo avise al canal?"*. Muchos equipos no quieren
|
|
139
|
+
hacer ruido en veinte tickets, y es una decisión legítima.
|
|
140
|
+
|
|
141
|
+
### 8 · El aviso al canal · OPCIONAL
|
|
142
|
+
|
|
143
|
+
Sale solo con `done` y con `stamp` si el repo declaró `DAI_NOTIFY`. Mostrá el mensaje
|
|
144
|
+
exacto antes de mandarlo. Si el repo no lo declaró y el equipo quiere avisar, `dai release
|
|
145
|
+
notify --test` prueba el canal antes de depender de él.
|
|
146
|
+
|
|
147
|
+
## Reglas que no se negocian
|
|
148
|
+
|
|
149
|
+
- **No mergeás, no publicás, no desplegás.** Esas son firmas humanas
|
|
150
|
+
([Art. 5](../../docs/MANIFIESTO.md#art-5) del manifiesto).
|
|
151
|
+
- **No inventás el manifiesto ni la versión.** El manifiesto sale del CLI; la versión la
|
|
152
|
+
firma una persona.
|
|
153
|
+
- **No escribís un CHANGELOG que no entendés.** Preguntá.
|
|
154
|
+
- **No estampás sin avisar el alcance**, y un "no" se acepta sin insistir.
|
|
155
|
+
- **No cierres el ciclo sin el release note y el back-merge.** Son los dos que se olvidan.
|
|
156
|
+
- **Nada de datos de terceros** en el CHANGELOG, el release note ni el aviso: ni nombres de
|
|
157
|
+
empresas, ni de personas ajenas al repo, ni URLs corporativas. Si el material que tenés a
|
|
158
|
+
mano los trae, traducilos.
|
|
159
|
+
|
|
160
|
+
## Cuando algo no cierra
|
|
161
|
+
|
|
162
|
+
- **El tracker no responde** → el manifiesto sale igual con `--no-network`, diciendo que no
|
|
163
|
+
pudo verificar. Es preferible a no tener manifiesto; decilo al contarlo.
|
|
164
|
+
- **`done` falla a mitad de camino** → mirá qué reportó cada paso. Si el tag salió, la
|
|
165
|
+
versión existe: lo que falta es la nota o el back-merge, y se completan a mano.
|
|
166
|
+
- **El repo no tiene VERSION ni package.json** → normal. El tag es la versión; `cut` lo dice.
|
|
167
|
+
- **No hay tags todavía** → el manifiesto arranca desde el principio del repo. Es correcto.
|