@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 +107 -0
- package/README.md +11 -1
- package/VERSION +1 -1
- package/cli/dai.mjs +431 -20
- package/cli/lib/bootstrap.mjs +5 -2
- package/cli/lib/branch-scope.mjs +144 -0
- package/cli/lib/forge-api.mjs +57 -0
- package/cli/lib/pm-adapter.mjs +16 -2
- package/cli/lib/pm-clickup.mjs +16 -1
- package/cli/lib/pm-jira.mjs +21 -1
- package/cli/lib/us-format.mjs +147 -0
- package/docs/EJEMPLO-END-TO-END.md +26 -3
- package/docs/METODOLOGIA.md +5 -0
- package/docs/PROBAR.md +12 -1
- package/docs/SCRUM-CON-IA.md +2 -2
- package/docs/adr/0018-alcance-de-stamp-y-gate-de-ci.md +183 -0
- package/docs/adr/README.md +1 -0
- package/docs/detalle/01-refinamiento.md +14 -0
- package/docs/detalle/07-merge-trazabilidad.md +13 -2
- package/docs/glosario.md +1 -1
- package/docs/guias/dev.md +21 -0
- package/docs/guias/po.md +40 -1
- package/governance/ci-rules.md +47 -8
- package/package.json +1 -1
- package/skills/dai-review/SKILL.md +1 -1
- package/skills/grill-epic/SKILL.md +2 -2
- package/skills/grill-intent/SKILL.md +1 -1
- package/skills/grill-user-story/SKILL.md +58 -10
- package/templates/ci-dai-gate.yml +50 -0
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.
|
|
1
|
+
0.11.0
|