@dforce2055/dai 0.10.0 → 0.11.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 CHANGED
@@ -3,6 +3,112 @@
3
3
  Formato basado en [Keep a Changelog](https://keepachangelog.com/). Versionado semver
4
4
  (ver `VERSION`).
5
5
 
6
+ ## [0.11.0] — 2026-07-22
7
+
8
+ **Ronda de fixes reportados usándola, más el eslabón que faltaba: editar el QUÉ. `dai stamp`
9
+ deja de estampar de más, el gate de governance pasa de regla escrita a comando ejecutable,
10
+ `dai edit-us` trae la US del tracker y valida el formato antes de devolverla, y los mensajes
11
+ de error dejan de mandar el diagnóstico para el lado equivocado.**
12
+
13
+ ### Agregado
14
+ - **`dai check --ci`** — el gate de [`governance/ci-rules.md`](governance/ci-rules.md),
15
+ ejecutable ([ADR-0018](docs/adr/0018-alcance-de-stamp-y-gate-de-ci.md), issue #26). El
16
+ documento prometía "sin `implements.yaml` el CI bloquea" y no existía el comando que lo
17
+ hiciera: era una regla escrita que nadie aplicaba. Ahora lee el nombre de la rama y
18
+ aplica `branch-naming.md` — `feature/` siempre exige US, `chore/`/`docs/`/`ci/`/`release/`
19
+ y compañía quedan **exentas**, `fix/` exige solo si el nombre trae un ID. Salidas:
20
+ `0` pasa · `1` falta el link · `2` el QUÉ cambió. Detecta sola la rama en CI
21
+ (`GITHUB_HEAD_REF` y equivalentes: en una PR, `HEAD` es un merge commit detached).
22
+ Con `--no-network` valida el link sin pegarle al tracker.
23
+ - **`templates/ci-dai-gate.yml`** — workflow listo para copiar a `.github/workflows/`.
24
+ Fuera de GitHub Actions el contrato es el mismo: un comando y su código de salida.
25
+ - **`dai edit-us <ID>` y `dai update-us <ID>`** — editar el QUÉ deja de ser copiar y pegar
26
+ (issue #23, [ADR-0018](docs/adr/0018-alcance-de-stamp-y-gate-de-ci.md)). Dos puertas a un
27
+ solo camino: `edit-us` **baja la US del tracker**, te la abre en tu `$EDITOR` y la sube
28
+ (para el PO); `update-us` empuja un `.md` que ya escribiste (para el dev que refinó la US
29
+ implementándola). Las dos dan el mismo preview y la misma confirmación, porque comparten
30
+ el mismo tramo de escritura.
31
+ - **Valida el formato antes de guardar** contra el molde canónico
32
+ (`templates/formato-us.md`): frenan las tres cosas sin las cuales no hay `ac_hash`
33
+ —sin título, sin sección de criterios, sección vacía— y **avisan** las demás (un
34
+ criterio que no es Gherkin completo, uno que se mete en el CÓMO, un título
35
+ kilométrico). `--strict` sube los avisos a errores.
36
+ - **Un formato inválido no tira lo escrito**: te devuelve al editor con los errores a la
37
+ vista, las veces que haga falta.
38
+ - **Propone subir el `spec_version`** cuando el `ac_hash` se movió, y espera un sí o un
39
+ no: `s` = cambio material (los repos con la versión vieja se marcan **atrasados**),
40
+ `n` = cambio editorial (no se marca nadie). dai sabe *que* cambió, no *si importa* —
41
+ eso lo sabe el PO. `--bump` / `--no-bump` para el modo no interactivo.
42
+ - **Re-estampa el `ac_hash`** del `implements.yaml`, que si no `dai check` te marcaría
43
+ atrasado por tu propia edición. `--dry-run` muestra todo el preview sin escribir.
44
+
45
+ ### Arreglado
46
+ - **`dai stamp` estampaba TODAS las US del repo, archivadas incluidas** (issue #22). Cerrar
47
+ una historia dejaba un comentario de cobertura en los tickets de las otras tres del
48
+ sprint — y un comentario en un tracker no se deshace. Ahora el alcance sale de la rama
49
+ ([ADR-0018](docs/adr/0018-alcance-de-stamp-y-gate-de-ci.md)): si la rama nombra la US,
50
+ esa; si hay una sola viva, esa; si hay varias y no puede saber cuál, **pregunta** en vez
51
+ de estampar de más (y sin TTY falla pidiendo el ID, en vez de decidir por vos). Los
52
+ changes archivados salen del default. `dai stamp <ID>` es explícito y `dai stamp --all`
53
+ recupera el comportamiento anterior.
54
+ - **El error del forge decía `¿token? ¿ref correcta?` para todo** (issue #24). Sin token,
55
+ token vencido, token sin scope y PR inexistente caían en la misma frase, y eso costó una
56
+ sesión entera de diagnóstico equivocado. Ahora se nombran por separado: **no hay
57
+ `GITHUB_TOKEN`/`GITLAB_TOKEN`** (se detecta antes de salir a la red, y no se afirma que
58
+ esté vencido algo que no existe) · **401** el token existe pero no sirve, con el `curl`
59
+ para verificarlo · **403** válido pero sin permiso, o rate limit · **404** nombra las
60
+ **dos** causas, porque en un repo privado GitHub devuelve 404 y no 403 a propósito. El
61
+ diagnóstico ahora cubre `forge pr`, `forge comment` y `forge review`, que antes se
62
+ tragaban el error real.
63
+ - **`.dai/reviews/` en el `.gitignore` de los repos ya inicializados** (issue #25). La
64
+ regla estaba desde 0.10.0, pero solo la aplicaban `dai init`/`dai sync`, y el
65
+ `review.json` lo escribe la skill: un repo scaffoldeado con una dai vieja se comía
66
+ borradores a medio editar en un commit. Ahora `dai forge review` lo agrega al consumir
67
+ un borrador que está bajo `.dai/reviews/`. Además la reconciliación compara **normalizado**
68
+ (`.dai/reviews`, `/.dai/reviews/` y `.dai/reviews/` son la misma regla), así no duplica
69
+ la línea a quien ya la había puesto a mano.
70
+ - Un `Ctrl+D` en un prompt de confirmación se trata como **cancelar** en vez de crashear
71
+ con `Aborted with Ctrl+D`.
72
+
73
+ ### Interno
74
+ - **`cli/test/package-hygiene.test.mjs`** — chequea lo que hasta ahora era un `git grep` a
75
+ mano antes de pushear: que ningún fuente versionado tenga bytes NUL (uno se coló y git
76
+ pasó a tratar el archivo como binario, con el diff dejando de ser revisable), que todo
77
+ sea UTF-8 válido, que no viajen identificadores de repos de terceros —la convención de
78
+ los ejemplos es ACME— y que `files[]` no publique el sitio.
79
+
80
+ ### Versionado
81
+
82
+ **Minor → 0.11.0.** `dai stamp` sin argumentos **cambia de comportamiento**: antes estampaba
83
+ todas las US del repo, ahora una. En el papel es incompatible; en la práctica el
84
+ comportamiento viejo era el bug que reporta el issue #22, y quien lo quiera tiene `--all`.
85
+ El contrato del modelo (`ac_hash`, schema de `implements.yaml`) queda intacto, y todo lo
86
+ demás es aditivo.
87
+
88
+ ### Cambiado
89
+ - `governance/ci-rules.md` describe lo que la máquina realmente hace: el comando que
90
+ ejecuta cada regla, la tabla de ramas exentas, y por qué el gate no bloquea sin
91
+ credenciales del tracker.
92
+ - **Los adaptadores de PM devuelven `raw`** (el markdown completo de la US) además del
93
+ parseo. Es lo que `edit-us` abre; antes solo salían título + hash, que alcanza para
94
+ detectar drift pero no para editar.
95
+ - **`/grill-user-story` distingue crear de refinar.** Si la US es nueva la crea como
96
+ siempre (MCP o `dai publish`); si **ya tiene key**, ahora la actualiza con
97
+ `dai edit-us <ID> --us <md> --no-editor` en vez de pisar el ticket por MCP. Así el
98
+ camino de la skill pasa por los mismos controles que el manual: validación de formato
99
+ antes de escribir, preview, y la pregunta del `spec_version` — que la skill tiene
100
+ instrucción explícita de trasladarle al PO, no de responder con `--yes`.
101
+ - **Las skills dicen bien dónde está la config: `.env.dai` *o* `.env`.** Varias mandaban a
102
+ leer solo uno de los dos, y quien tenía todo en el `.env` del equipo veía a la skill
103
+ concluir que no había tracker configurado. dai **carga los dos** —`.env.dai` gana si una
104
+ clave está en ambos, y un repo que nunca creó `.env.dai` sigue funcionando igual
105
+ (ADR-0017)—; ahora las skills lo dicen así. Sin cambios de comportamiento en el CLI:
106
+ el loader ya hacía esto.
107
+ - Documentación al día con los comandos nuevos: la [guía del PO](docs/guias/po.md) estrena
108
+ una sección "Cuando el QUÉ cambia", más `docs/guias/dev.md`, `docs/PROBAR.md`,
109
+ `docs/EJEMPLO-END-TO-END.md`, `docs/SCRUM-CON-IA.md`, `docs/METODOLOGIA.md`,
110
+ `docs/glosario.md`, `docs/detalle/01-refinamiento.md` y `docs/detalle/07-merge-trazabilidad.md`.
111
+
6
112
  ## [0.10.0] — 2026-07-18
7
113
 
8
114
  **La config de dai deja de vivir en el `.env` del equipo y pasa a un `.env.dai` propio (no
@@ -445,6 +551,7 @@ ClickUp y Jira Cloud.
445
551
  - Tests de las rutas de red (jira/clickup/forge) con `fetch` mockeado. Sin links rotos;
446
552
  `files` de npm sin tests ni secretos.
447
553
 
554
+ [0.11.0]: https://github.com/dforce2055/dai/releases/tag/v0.11.0
448
555
  [0.10.0]: https://github.com/dforce2055/dai/releases/tag/v0.10.0
449
556
  [0.9.0]: https://github.com/dforce2055/dai/releases/tag/v0.9.0
450
557
  [0.8.2]: https://github.com/dforce2055/dai/releases/tag/v0.8.2
package/README.md CHANGED
@@ -112,6 +112,14 @@ dai pr --assignee <compañero> # crea la PR precargada y se la asigna a un com
112
112
  dai stamp # al mergear: estampa la cobertura en el tracker
113
113
  ```
114
114
 
115
+ > ¿Cambió el QUÉ? `dai edit-us <ID>` baja la US del tracker, te la abre en tu editor, valida
116
+ > el formato y te pregunta si el cambio es material (sube `spec_version`) o editorial. Si
117
+ > ya tenés el `.md` escrito —lo refinaste implementando— `dai update-us <ID>` lo empuja y
118
+ > re-estampa tu `ac_hash`, que si no `dai check` te marca atrasado por tu propia edición.
119
+ > Y si quieres que el link deje de depender de la memoria del equipo, `dai check --ci` es
120
+ > el gate ejecutable de [`governance/ci-rules.md`](governance/ci-rules.md): copia
121
+ > [`templates/ci-dai-gate.yml`](templates/ci-dai-gate.yml) a `.github/workflows/`.
122
+
115
123
  > **Para que `dai pr` cree la PR/MR** necesitas el CLI del forge instalado y autenticado, una
116
124
  > sola vez por máquina:
117
125
  > - **GitHub** → [`gh`](https://cli.github.com) · `gh auth login`
@@ -159,13 +167,15 @@ flowchart TD
159
167
  | 4 | **Linkear la US** | `dai link-us <ID>` → branch + `openspec/changes/<id>/implements.yaml` | dev |
160
168
  | 5 | **Verificar / listar** | `dai check` (¿al día?) · `dai ls` (qué implementa el repo) | dev |
161
169
  | 6 | **Resincronizar** *(si el PO editó la US)* | `dai link-us <ID> --resync` | dev |
170
+ | 6b | **Editar la US** | `dai edit-us <ID>` la baja del tracker, la abrís en tu editor, valida el formato y la devuelve · `dai update-us <ID>` empuja un `.md` que ya escribiste. Las dos preguntan si subir el `spec_version` | PO / dev |
162
171
  | 7 | **Diseñar el CÓMO** | en el asistente: `/opsx:explore` → `/opsx:propose` → design + tasks | dev + IA |
163
172
  | 8 | **Implementar** | `/opsx:apply` → implementa la US con TDD y genera los commits | dev + IA |
164
173
  | 9 | **Code review propio** | revisas tu implementación (correctitud + calidad) antes de la PR | dev |
165
174
  | 10 | **Smoke test** | pides al agente un smoke local del flujo | dev + IA |
166
175
  | 11 | **Crear la PR** | `dai pr` → pregunta la branch base, arma el texto, lo muestra, confirma, pushea y crea la PR/MR | dev |
167
176
  | 12 | **Review de un partner** | skill `/dai-review <PR>` deja un **review inline** (resumen + un comentario por línea, low/medium/high); te muestra el preview y **espera tu OK** antes de postear; un humano aprueba | partner |
168
- | 13 | **Merge + estampar** | al mergear: `dai stamp` → cobertura inversa en el tracker | dev / CI |
177
+ | 13 | **Merge + estampar** | al mergear: `dai stamp` → cobertura inversa en el tracker (deduce la US de la rama; en CI pasa el ID) | dev / CI |
178
+ | 13b | **Gate de trazabilidad** *(opcional)* | `dai check --ci` en el CI → bloquea una rama de producto sin link; `chore/`/`docs/` quedan exentas ([template](templates/ci-dai-gate.yml)) | CI |
169
179
  | 14 | **Cerrar la US** | `dai done` → vuelve a la base, actualiza y borra la branch local (si está mergeada) | dev |
170
180
 
171
181
  > **Paso 3b (publicar):** el MCP crea el issue interactivamente; `dai publish` necesita el
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.10.0
1
+ 0.11.0