@dforce2055/dai 0.9.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/{.env.example → .env.dai.example} +3 -3
- package/CHANGELOG.md +148 -0
- package/README.md +47 -26
- package/VERSION +1 -1
- package/cli/dai.mjs +528 -61
- package/cli/lib/bootstrap.mjs +44 -9
- package/cli/lib/branch-scope.mjs +144 -0
- package/cli/lib/env.mjs +12 -0
- package/cli/lib/forge-api.mjs +57 -0
- package/cli/lib/pm-adapter.mjs +16 -2
- package/cli/lib/pm-clickup.mjs +18 -3
- package/cli/lib/pm-jira.mjs +23 -3
- package/cli/lib/skills-source.mjs +8 -0
- package/cli/lib/us-format.mjs +147 -0
- package/docs/EJEMPLO-END-TO-END.md +78 -46
- package/docs/MANIFIESTO.md +2 -2
- package/docs/METODOLOGIA.md +25 -15
- package/docs/PROBAR.md +25 -15
- package/docs/SCRUM-CON-IA.md +11 -11
- 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/0018-alcance-de-stamp-y-gate-de-ci.md +183 -0
- package/docs/adr/README.md +2 -0
- package/docs/detalle/01-refinamiento.md +20 -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/07-merge-trazabilidad.md +13 -2
- package/docs/detalle/08-daily.md +1 -1
- package/docs/detalle/README.md +1 -1
- package/docs/glosario.md +3 -3
- package/docs/guias/dev.md +31 -7
- package/docs/guias/index.md +12 -0
- package/docs/guias/lead.md +1 -1
- package/docs/guias/po.md +53 -8
- 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/governance/ci-rules.md +47 -8
- package/package.json +9 -3
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# dai · configuración del adaptador de PM (copiar a .env y completar).
|
|
2
|
-
# El .env
|
|
3
|
-
#
|
|
1
|
+
# dai · configuración del adaptador de PM (copiar a .env.dai y completar).
|
|
2
|
+
# El .env.dai NO se versiona (evita filtrar secretos) y el .env del equipo no se toca
|
|
3
|
+
# (ADR-0017). Este .example SÍ se versiona. Precedencia: shell/CI > .env.dai > .env.
|
|
4
4
|
|
|
5
5
|
# ── Backend del tracker ──────────────────────────────────────────────────────
|
|
6
6
|
# md | jira | clickup
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,152 @@
|
|
|
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
|
+
|
|
112
|
+
## [0.10.0] — 2026-07-18
|
|
113
|
+
|
|
114
|
+
**La config de dai deja de vivir en el `.env` del equipo y pasa a un `.env.dai` propio (no
|
|
115
|
+
versionado). Resuelve el caso de las empresas que versionan el `.env` como política: dai no
|
|
116
|
+
toca ese archivo y guarda sus secretos donde git realmente los ignora. Y `dai init` estrena
|
|
117
|
+
una bienvenida con el Sol de Mayo en bloques.**
|
|
118
|
+
|
|
119
|
+
### Agregado
|
|
120
|
+
- **Banner de bienvenida en `dai init`**: el Sol de Mayo de dai en bloques (cuerpo y rayos
|
|
121
|
+
rectos en oro, rayos ondulados en celeste) junto al título, más un preview de lo que se va
|
|
122
|
+
a configurar. Cero dependencias (solo ANSI); degrada a ASCII sin color en no-TTY o con
|
|
123
|
+
`NO_COLOR`.
|
|
124
|
+
- **`dai skills install --from npm:@scope/pkg`** — nueva fuente para skills externas
|
|
125
|
+
([ADR-0013](docs/adr/0013-skills-externas-install-from.md)): además de git URL y path
|
|
126
|
+
local, ahora un **paquete npm**. dai hace `npm install` a un temp (respetando el `.npmrc`
|
|
127
|
+
del repo, así resuelve **registries privados con scope**; `npm pack` no sirve con los
|
|
128
|
+
registries de grupo de GitLab). Es común distribuir skills como paquete npm; antes había
|
|
129
|
+
que materializarlo a mano.
|
|
130
|
+
- **Descripciones en bloque YAML (`|` / `>`) en el frontmatter de las skills.** El parser
|
|
131
|
+
de frontmatter ahora lee bloques literales/plegados multilínea (antes tomaba solo la
|
|
132
|
+
primera línea `|` y el validador lo rechazaba). Es como se escriben las skills reales:
|
|
133
|
+
descripciones ricas con "USAR CUANDO / NO USAR CUANDO" que el agente usa para elegirlas.
|
|
134
|
+
|
|
135
|
+
### Cambiado
|
|
136
|
+
- **`dai init` escribe en `.env.dai` + `.env.dai.example`, no en `.env`/`.env.example`**
|
|
137
|
+
([ADR-0017](docs/adr/0017-env-dai.md)). El `.env` del equipo queda intacto (dai solo lo
|
|
138
|
+
lee). `.env.dai` (secretos) se gitignorea; `.env.dai.example` (plantilla) se versiona.
|
|
139
|
+
En un repo sin `.env`, dai ya no crea uno: es del equipo, no de dai.
|
|
140
|
+
- **El loader lee `.env.dai` y `.env`** con precedencia **shell/CI > `.env.dai` > `.env`**.
|
|
141
|
+
Seguir leyendo `.env` mantiene la compatibilidad: los repos que ya tenían los `DAI_*` ahí
|
|
142
|
+
no se rompen.
|
|
143
|
+
- **`.gitignore`**: dai ignora `.env.dai` (su archivo), no `.env`. Ya no fuerza un ignore
|
|
144
|
+
sobre un archivo que muchas orgs versionan a propósito.
|
|
145
|
+
- Se renombró el `.env.example` del paquete a `.env.dai.example`, y se actualizaron doctor,
|
|
146
|
+
mensajes de init/sync, tutoriales, constitución y README a la nueva convención.
|
|
147
|
+
|
|
148
|
+
### Interno
|
|
149
|
+
- **228 tests** (+4 desde 0.9.0): precedencia de `loadDaiEnv` (shell > `.env.dai` > `.env`),
|
|
150
|
+
compat con `.env`, y sin-archivos. Smokes de `dai init` con y sin `.env` preexistente.
|
|
151
|
+
|
|
6
152
|
## [0.9.0] — 2026-07-17
|
|
7
153
|
|
|
8
154
|
**El review de dai deja de ser un comentario al final del hilo y pasa a ser un review
|
|
@@ -405,6 +551,8 @@ ClickUp y Jira Cloud.
|
|
|
405
551
|
- Tests de las rutas de red (jira/clickup/forge) con `fetch` mockeado. Sin links rotos;
|
|
406
552
|
`files` de npm sin tests ni secretos.
|
|
407
553
|
|
|
554
|
+
[0.11.0]: https://github.com/dforce2055/dai/releases/tag/v0.11.0
|
|
555
|
+
[0.10.0]: https://github.com/dforce2055/dai/releases/tag/v0.10.0
|
|
408
556
|
[0.9.0]: https://github.com/dforce2055/dai/releases/tag/v0.9.0
|
|
409
557
|
[0.8.2]: https://github.com/dforce2055/dai/releases/tag/v0.8.2
|
|
410
558
|
[0.8.1]: https://github.com/dforce2055/dai/releases/tag/v0.8.1
|
package/README.md
CHANGED
|
@@ -63,10 +63,10 @@ Y después, en el chat del asistente, según lo que tengas:
|
|
|
63
63
|
|
|
64
64
|
> Las skills **te interrogan** hasta que la historia es testeable (nunca inventan
|
|
65
65
|
> requerimientos: los sacan a preguntas), y la **publican en el tracker** que configuraste
|
|
66
|
-
> (`DAI_PM` en el `.env`): por el **MCP** de Jira/ClickUp si está conectado, o con
|
|
66
|
+
> (`DAI_PM` en el `.env.dai`): por el **MCP** de Jira/ClickUp si está conectado, o con
|
|
67
67
|
> **`dai publish <us.md>`** si no (crea el issue vía token). Tú respondes y decides.
|
|
68
68
|
|
|
69
|
-
¿Sin MCP, o
|
|
69
|
+
¿Sin MCP, o quieres publicar a mano? `dai publish` sube el `.md` al tracker y te devuelve el key:
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
72
|
dai publish historia.md # crea la US → devuelve el key
|
|
@@ -87,7 +87,7 @@ Una vez, preparas el repo:
|
|
|
87
87
|
```bash
|
|
88
88
|
npm i -g @dforce2055/dai
|
|
89
89
|
cd mi-repo && dai init # bootstrap: skills + tracker + OpenSpec + PR template
|
|
90
|
-
# completa el token del tracker en .env (o DAI_PM=md para probar sin credenciales)
|
|
90
|
+
# completa el token del tracker en .env.dai (o DAI_PM=md para probar sin credenciales)
|
|
91
91
|
dai doctor # verifica que todo quedó en su lugar
|
|
92
92
|
```
|
|
93
93
|
|
|
@@ -112,12 +112,20 @@ 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
|
-
>
|
|
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
|
+
|
|
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`
|
|
118
126
|
> - **GitLab** → [`glab`](https://gitlab.com/gitlab-org/cli) · `glab auth login --hostname <tu-gitlab>`
|
|
119
127
|
> — en un GitLab self-hosted/corporativo el `--hostname` es **obligatorio**, y el token va con
|
|
120
|
-
> scope `api`. (En Windows, tras instalar `glab` con `winget`,
|
|
128
|
+
> scope `api`. (En Windows, tras instalar `glab` con `winget`, abre una terminal nueva para que
|
|
121
129
|
> tome el PATH.)
|
|
122
130
|
>
|
|
123
131
|
> Sin el CLI del forge, `dai pr` **igual pushea tu branch** y te dice qué instalar — después
|
|
@@ -159,20 +167,22 @@ 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
|
|
172
|
-
> token del tracker en `.env` (Jira además `DAI_JIRA_PROJECT`, ClickUp `DAI_CLICKUP_LIST_ID`).
|
|
182
|
+
> token del tracker en `.env.dai` (Jira además `DAI_JIRA_PROJECT`, ClickUp `DAI_CLICKUP_LIST_ID`).
|
|
173
183
|
>
|
|
174
184
|
> **Paso 7 (OpenSpec):** `dai init` te ofrece instalarlo **e inicializarlo** solo. Si los
|
|
175
|
-
> comandos `/opsx:*` no aparecen en el asistente, reinicia el IDE (se cargan al
|
|
185
|
+
> comandos `/opsx:*` no aparecen en el asistente, reinicia el IDE (se cargan al iniciar).
|
|
176
186
|
>
|
|
177
187
|
> **Paso 11 (PR):** necesita un remoto git (`origin`) y `gh`/`glab` autenticado. Sin remoto,
|
|
178
188
|
> dai no crea la PR (te deja el texto listo igual).
|
|
@@ -183,8 +193,8 @@ flowchart TD
|
|
|
183
193
|
|---|---|
|
|
184
194
|
| `dai init [<repo>]` | scaffolder interactivo del repo. Flags: `--for claude\|copilot\|both\|cursor\|all` (asistente, default `all`) · `--pm md\|jira\|clickup` (tracker) · `--openspec` |
|
|
185
195
|
| `dai skills install [--global \| --local <repo>] [--force] [--dry-run] [--for claude\|copilot\|cursor\|all]` | instala/actualiza las skills de dai en Claude, Copilot y/o Cursor (`--for all` por defecto; Copilot global → `~/.copilot/skills`, local → `.github/skills/`). `--force` re-copia. Alias: **`dai install`**. Ej: `dai skills install --local . --for cursor --force` |
|
|
186
|
-
| `dai skills install --from <git-url\|path>[#ref] [--for …]` | instala **skills externas** (por-stack: .NET, Java, …) desde un repo/dir
|
|
187
|
-
| `dai sync [--dry-run] [--for <asistentes>]` | **refresca** skills, constitución, templates y PR template a la versión del CLI — **aditivo** (no pisa tu `CLAUDE.md`), no toca el `.env` ni OpenSpec. Detecta los asistentes del repo o pasás `--for`. `--dry-run` muestra qué cambiaría ([ADR-0010](docs/adr/0010-versionado-y-upgrade.md)) |
|
|
196
|
+
| `dai skills install --from <git-url\|npm:pkg\|path>[#ref] [--for …]` | instala **skills externas** (por-stack: .NET, Java, …) desde un repo/dir/**paquete npm**, **convertidas para los 3 asistentes**. Self-service, one-off, sin registro; `dai sync` no las toca. Colisión con una skill de dai → salta ([ADR-0013](docs/adr/0013-skills-externas-install-from.md)). Ej: `dai skills install --from github.com/mi-org/net-skills` · `dai skills install --from npm:@mi-org/ui-skills` (usa el `.npmrc` del repo → registries privados OK) |
|
|
197
|
+
| `dai sync [--dry-run] [--for <asistentes>]` | **refresca** skills, constitución, templates y PR template a la versión del CLI — **aditivo** (no pisa tu `CLAUDE.md`), no toca el `.env.dai` ni OpenSpec. Detecta los asistentes del repo o pasás `--for`. `--dry-run` muestra qué cambiaría ([ADR-0010](docs/adr/0010-versionado-y-upgrade.md)) |
|
|
188
198
|
| `dai upgrade [--check] [--dry-run]` · alias `dai update` | **actualiza el CLI global** a la última publicada (`npm i -g …@latest`) — self-update. **No toca el repo**: reporta el drift del scaffold pero deja el `dai sync` al mantenedor. `--check` solo informa · `--dry-run` muestra el comando ([ADR-0012](docs/adr/0012-upgrade-self-update-del-cli.md)) |
|
|
189
199
|
| `dai publish <us.md> [--parent KEY] [--issuetype T] [--field alias=valor]` | crea la US en el tracker (Jira/ClickUp/md) desde un `.md` y devuelve el key — el fallback del MCP para publicar sin el asistente. `--parent PROJ-42` la cuelga de su épica · `--issuetype Epic` publica una épica (fallback CLI de `grill-epic`) · `--field clasificacion=Mejora` (repetible) manda los campos propios que exige tu Jira, declarados en `.dai/jira-fields.json` ([ADR-0015](docs/adr/0015-jira-corporativo.md)) |
|
|
190
200
|
| `dai link-us <ID> [--us <md>]` | crea branch + `implements.yaml`; sin `--us` trae la US del tracker |
|
|
@@ -203,20 +213,22 @@ flowchart TD
|
|
|
203
213
|
> **🆕 Mantené tu repo al día — `dai sync`.** Las skills, la constitución y los templates son un
|
|
204
214
|
> *caché derivable* del CLI. Cuando actualizás `dai` (`dai upgrade`), **`dai doctor` y
|
|
205
215
|
> `dai version` te avisan solos** si tu scaffold quedó atrás — con color y un `⬆️` —, y **`dai sync`**
|
|
206
|
-
> lo refresca: **aditivo** (conserva tu `CLAUDE.md` propio), sin tocar el `.env` ni OpenSpec.
|
|
216
|
+
> lo refresca: **aditivo** (conserva tu `CLAUDE.md` propio), sin tocar el `.env.dai` ni OpenSpec. Prueba sin
|
|
207
217
|
> riesgo con `dai sync --dry-run`. El versionado es semver: patch/minor no rompen nada; solo un major
|
|
208
218
|
> pediría migración. ([ADR-0010](docs/adr/0010-versionado-y-upgrade.md))
|
|
209
219
|
|
|
210
220
|
> **🧩 Skills de cualquier stack — `dai skills install --from`.** Además de las skills de
|
|
211
|
-
> dai, cada equipo suma las suyas (por-stack: .NET, Java, Rust…) desde su propio repo
|
|
212
|
-
> `dai skills install --from github.com/tu-org/net-skills
|
|
213
|
-
>
|
|
214
|
-
>
|
|
215
|
-
>
|
|
221
|
+
> dai, cada equipo suma las suyas (por-stack: .NET, Java, Rust…) desde su propio repo o
|
|
222
|
+
> **paquete npm**: `dai skills install --from github.com/tu-org/net-skills` · `dai skills
|
|
223
|
+
> install --from npm:@tu-org/ui-skills` (el paquete npm usa el `.npmrc` del repo, así
|
|
224
|
+
> resuelve registries privados con scope). dai las **convierte para los 3 asistentes**
|
|
225
|
+
> (Claude/Cursor/Copilot) e instala. **dai es el distribuidor de skills de cualquier stack,
|
|
226
|
+
> sin opinar sobre su contenido** — self-service, sin registro; `dai sync` sigue siendo solo
|
|
227
|
+
> de dai. ([ADR-0013](docs/adr/0013-skills-externas-install-from.md))
|
|
216
228
|
>
|
|
217
229
|
> La fuente puede ser **pública, privada (por SSH) o un path local**: dai no hace auth
|
|
218
|
-
> propia, delega en git — **si
|
|
219
|
-
> privados
|
|
230
|
+
> propia, delega en git — **si puedes `git clone` el repo, dai instala desde ahí**. Para
|
|
231
|
+
> privados usa la forma SSH (`git@github.com:tu-org/net-skills.git`), consistente con el
|
|
220
232
|
> modelo de auth de dai ([ADR-0007](docs/adr/0007-modelo-de-autenticacion.md)). Público =
|
|
221
233
|
> cero fricción entre equipos/máquinas.
|
|
222
234
|
>
|
|
@@ -229,8 +241,9 @@ flowchart TD
|
|
|
229
241
|
> en [`skills/`](skills/).
|
|
230
242
|
|
|
231
243
|
Skills (se invocan en el asistente): `/doc-to-backlog` · `/grill-intent` · `/grill-epic` · `/grill-user-story` · `/link-us` ·
|
|
232
|
-
`/tdd` · `/dai-review`. Config del tracker (`md`\|`jira`\|`clickup`) y tokens: en `.env`
|
|
233
|
-
|
|
244
|
+
`/tdd` · `/dai-review`. Config del tracker (`md`\|`jira`\|`clickup`) y tokens: en `.env.dai`
|
|
245
|
+
(no versionado; el `.env` del equipo no se toca — [ADR-0017](docs/adr/0017-env-dai.md)) —
|
|
246
|
+
ver [`.env.dai.example`](.env.dai.example). Auth (SSH + tokens): [ADR-0007](docs/adr/0007-modelo-de-autenticacion.md).
|
|
234
247
|
|
|
235
248
|
## El flag `--for` — ¿para qué asistente preparo el repo?
|
|
236
249
|
|
|
@@ -262,7 +275,7 @@ Después de `dai init` (con `--for all`):
|
|
|
262
275
|
```
|
|
263
276
|
mi-repo/
|
|
264
277
|
├── CLAUDE.md · Constitución del proyecto (auto-cargada por Claude)
|
|
265
|
-
├── .env
|
|
278
|
+
├── .env.dai · tu tracker (NO versionado, completa el token) + .env.dai.example (plantilla, sí versionada)
|
|
266
279
|
├── .claude/skills/ · Las skills, locales al repo (el equipo las hereda)
|
|
267
280
|
│ └── doc-to-backlog · grill-intent · grill-epic · grill-user-story · link-us · tdd · dai-review
|
|
268
281
|
├── .github/
|
|
@@ -334,7 +347,7 @@ dai/
|
|
|
334
347
|
├── skills/ 🤖 doc-to-backlog · grill-intent · grill-epic · grill-user-story · link-us · tdd · dai-review
|
|
335
348
|
├── governance/ 🛡️ branch-naming · ci-rules · commit-convention
|
|
336
349
|
├── index.html 📊 landing autocontenido (la historia); publicable por GitHub Pages
|
|
337
|
-
└── manifest.yaml · VERSION · install.sh (shim) · .env.example
|
|
350
|
+
└── manifest.yaml · VERSION · install.sh (shim) · .env.dai.example
|
|
338
351
|
```
|
|
339
352
|
|
|
340
353
|
## Licencia
|
|
@@ -351,9 +364,17 @@ Detalle en [ADR-0006](docs/adr/0006-distribucion-y-licencia.md).
|
|
|
351
364
|
|
|
352
365
|
## Agradecimientos
|
|
353
366
|
|
|
354
|
-
dai se apoya en ideas y
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
367
|
+
dai se apoya en ideas y herramientas de la comunidad.
|
|
368
|
+
|
|
369
|
+
Un agradecimiento especial a **[OpenSpec](https://github.com/Fission-AI/OpenSpec)** (de
|
|
370
|
+
[Fission AI](https://github.com/Fission-AI), `@fission-ai/openspec`): es la herramienta
|
|
371
|
+
sobre la que se construye todo el **CÓMO** de dai — explorar la solución, proponer el diseño
|
|
372
|
+
y las tareas, e implementar el change (`opsx:explore → propose → apply → archive`). dai no
|
|
373
|
+
la bundlea ni la reemplaza; se apoya en ella para convertir el QUÉ en un plan técnico
|
|
374
|
+
trazable. Sin OpenSpec, la mitad del método no existiría.
|
|
375
|
+
|
|
376
|
+
Y gracias a **[Matt Pocock](https://github.com/mattpocock)** por su aporte con las *skills*
|
|
377
|
+
y por su [canal de YouTube](https://www.youtube.com/@mattpocockuk) explicándolas — su
|
|
378
|
+
trabajo nos ayudó a construir esta herramienta.
|
|
358
379
|
|
|
359
380
|
Seguridad: [`SECURITY.md`](SECURITY.md) · Conducta: [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.11.0
|