@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.
Files changed (63) hide show
  1. package/{.env.example → .env.dai.example} +3 -3
  2. package/CHANGELOG.md +148 -0
  3. package/README.md +47 -26
  4. package/VERSION +1 -1
  5. package/cli/dai.mjs +528 -61
  6. package/cli/lib/bootstrap.mjs +44 -9
  7. package/cli/lib/branch-scope.mjs +144 -0
  8. package/cli/lib/env.mjs +12 -0
  9. package/cli/lib/forge-api.mjs +57 -0
  10. package/cli/lib/pm-adapter.mjs +16 -2
  11. package/cli/lib/pm-clickup.mjs +18 -3
  12. package/cli/lib/pm-jira.mjs +23 -3
  13. package/cli/lib/skills-source.mjs +8 -0
  14. package/cli/lib/us-format.mjs +147 -0
  15. package/docs/EJEMPLO-END-TO-END.md +78 -46
  16. package/docs/MANIFIESTO.md +2 -2
  17. package/docs/METODOLOGIA.md +25 -15
  18. package/docs/PROBAR.md +25 -15
  19. package/docs/SCRUM-CON-IA.md +11 -11
  20. package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +1 -1
  21. package/docs/adr/0006-distribucion-y-licencia.md +1 -1
  22. package/docs/adr/0013-skills-externas-install-from.md +11 -4
  23. package/docs/adr/0015-jira-corporativo.md +1 -1
  24. package/docs/adr/0017-env-dai.md +64 -0
  25. package/docs/adr/0018-alcance-de-stamp-y-gate-de-ci.md +183 -0
  26. package/docs/adr/README.md +2 -0
  27. package/docs/detalle/01-refinamiento.md +20 -5
  28. package/docs/detalle/03-ramas.md +2 -2
  29. package/docs/detalle/04-tdd.md +15 -9
  30. package/docs/detalle/06-code-review.md +8 -5
  31. package/docs/detalle/07-merge-trazabilidad.md +13 -2
  32. package/docs/detalle/08-daily.md +1 -1
  33. package/docs/detalle/README.md +1 -1
  34. package/docs/glosario.md +3 -3
  35. package/docs/guias/dev.md +31 -7
  36. package/docs/guias/index.md +12 -0
  37. package/docs/guias/lead.md +1 -1
  38. package/docs/guias/po.md +53 -8
  39. package/docs/index.md +35 -0
  40. package/docs/public/favicon.svg +12 -0
  41. package/docs/public/logo-link.svg +12 -0
  42. package/docs/public/logo.svg +12 -0
  43. package/docs/public/tutoriales/clickup-1-settings.png +0 -0
  44. package/docs/public/tutoriales/clickup-2-api.png +0 -0
  45. package/docs/public/tutoriales/clickup-3-generate-copy.png +0 -0
  46. package/docs/public/tutoriales/jira-1-avatar.png +0 -0
  47. package/docs/public/tutoriales/jira-2-seguridad-tokens.png +0 -0
  48. package/docs/public/tutoriales/jira-3-crear-token.png +0 -0
  49. package/docs/public/tutoriales/jira-4-nombre-vencimiento.png +0 -0
  50. package/docs/public/tutoriales/jira-5-copiar.png +0 -0
  51. package/docs/tutoriales/claves-ssh.md +93 -0
  52. package/docs/tutoriales/configurar-git.md +53 -0
  53. package/docs/tutoriales/index.md +18 -0
  54. package/docs/tutoriales/instalar-glab.md +74 -0
  55. package/docs/tutoriales/token-clickup.md +73 -0
  56. package/docs/tutoriales/token-jira.md +74 -0
  57. package/governance/ci-rules.md +47 -8
  58. package/package.json +9 -3
  59. package/skills/dai-review/SKILL.md +1 -1
  60. package/skills/grill-epic/SKILL.md +2 -2
  61. package/skills/grill-intent/SKILL.md +1 -1
  62. package/skills/grill-user-story/SKILL.md +58 -10
  63. 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 está gitignoreado para no filtrar secretos. Este .example se versiona.
3
- # Las variables ya exportadas en la shell/CI ganan sobre el .env.
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 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 querés publicar a mano? `dai publish` sube el `.md` al tracker y te devuelve el key:
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
- > **Para que `dai pr` cree la PR/MR** necesitás el CLI del forge instalado y autenticado, una
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`, abrí una terminal nueva para que
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 arrancar).
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, **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` |
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. Probá sin
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`. dai las **convierte para los 3
213
- > asistentes** (Claude/Cursor/Copilot) e instala. **dai es el distribuidor de skills de
214
- > cualquier stack, sin opinar sobre su contenido** self-service, sin registro; `dai sync`
215
- > sigue siendo solo de dai. ([ADR-0013](docs/adr/0013-skills-externas-install-from.md))
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 podés `git clone` el repo, dai instala desde ahí**. Para
219
- > privados usá la forma SSH (`git@github.com:tu-org/net-skills.git`), consistente con el
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
- ver [`.env.example`](.env.example). Auth (SSH + tokens): [ADR-0007](docs/adr/0007-modelo-de-autenticacion.md).
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 · configurado con tu tracker (gitignored, completa el token)
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 aprendizajes de la comunidad. En particular, gracias a
355
- **[Matt Pocock](https://github.com/mattpocock)** por su aporte con las *skills* y por su
356
- [canal de YouTube](https://www.youtube.com/@mattpocockuk) explicándolas — su trabajo nos ayudó
357
- a construir esta herramienta.
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.9.0
1
+ 0.11.0