@dforce2055/dai 0.7.0 → 0.8.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.example CHANGED
@@ -3,7 +3,7 @@
3
3
  # Las variables ya exportadas en la shell/CI ganan sobre el .env.
4
4
 
5
5
  # ── Backend del tracker ──────────────────────────────────────────────────────
6
- # md | jira | clickup (por ahora solo md está implementado)
6
+ # md | jira | clickup
7
7
  DAI_PM=md
8
8
 
9
9
  # Plantilla del link al ticket (para `dai ls` / stamp). {id} se reemplaza.
@@ -17,8 +17,14 @@ DAI_MD_US_DIR=.dai/us
17
17
  # DAI_JIRA_BASE_URL=https://miempresa.atlassian.net
18
18
  # DAI_JIRA_EMAIL=usuario@miempresa.com
19
19
  # DAI_JIRA_TOKEN= # ← SECRETO. api_token de id.atlassian.com. Nunca commitear.
20
- # DAI_JIRA_PROJECT= # clave del proyecto (ej. PROJ) — solo para `dai publish` (crear issues)
21
- # DAI_JIRA_ISSUETYPE=Story # tipo de issue a crear (default Story) solo para `dai publish`
20
+ # DAI_JIRA_PROJECT= # clave del PROYECTO (ej. PROJ), NO la de un ticket (PROJ-123) — para `dai publish`
21
+ # DAI_JIRA_ISSUETYPE=Story # tipo de issue a crear (default Story). Se pisa con `dai publish --issuetype Epic`
22
+ # DAI_JIRA_FIELDS_FILE=.dai/jira-fields.json # campos propios que tu Jira exige al crear
23
+ # # (ADR-0015). Si el archivo no existe, se ignora. Molde en templates/.
24
+ #
25
+ # ¿El proxy de tu empresa intercepta TLS? Node no usa el trust store del sistema, así que
26
+ # falla donde el navegador anda. Declará la CA — NUNCA NODE_TLS_REJECT_UNAUTHORIZED=0:
27
+ # NODE_EXTRA_CA_CERTS=/ruta/ca-empresa.pem
22
28
 
23
29
  # ── Backend clickup (REST v2) — activar con DAI_PM=clickup ───────────────────
24
30
  # DAI_CLICKUP_TOKEN= # ← SECRETO. token personal scopeado.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,138 @@
3
3
  Formato basado en [Keep a Changelog](https://keepachangelog.com/). Versionado semver
4
4
  (ver `VERSION`).
5
5
 
6
+ ## [0.8.1] — 2026-07-16
7
+
8
+ **Primera prueba real en Windows con analistas y devs de una empresa: el ciclo completo
9
+ contra un Jira corporativo anduvo, y de paso destapó lo que faltaba pulir para que un
10
+ equipo Windows + Copilot + GitLab no se topara con muros.**
11
+
12
+ ### Arreglado
13
+ - **`dai sync` crasheaba en repos Copilot** con `ReferenceError: skillToPrompt is not
14
+ defined`. El pase a Agent Skills nativas (0.8.0, [ADR-0014](docs/adr/0014-copilot-agent-skills.md))
15
+ borró `skillToPrompt` y migró `dai init` a `.github/skills/`, pero dejó dos llamadas
16
+ colgadas en el path viejo `.github/prompts/`: `dai sync` y `dai skills install --from`
17
+ (rama Copilot). Ahora ambos copian la skill nativa (`.github/skills/<name>`, con
18
+ `templates/`) igual que `init`, y `sync` **migra** el repo: limpia los `.prompt.md`
19
+ viejos de dai. `dai sync` también detecta Copilot por `.github/skills` (antes solo por
20
+ `.github/prompts`, así que ni veía los repos nuevos). Cubierto por un test de
21
+ integración de `dai sync --for copilot` — el hueco que dejó pasar la regresión.
22
+ - **`dai upgrade` (y `dai init --openspec`) fallaban en Windows** con un genérico *"no
23
+ pude consultar el registry (¿sin red?)"* aunque npm anduviera perfecto. En Windows `npm`
24
+ y `openspec` son shims `.cmd`, y desde Node 18.20 / 20.12 / 21.7 (fix de CVE-2024-27980)
25
+ `execFileSync` **se niega a lanzar un `.cmd` sin `shell:true`** — tira `EINVAL`, que dai
26
+ confundía con falta de red. Ahora esos binarios se corren con `shell` en Windows.
27
+ - **`dai pr` fallaba el push la primera vez contra un remoto HTTPS corporativo.** El push
28
+ corría con stdin ignorado, así que Git Credential Manager no podía pedir la credencial y
29
+ el push moría en seco — mientras el error real de git quedaba oculto tras un genérico
30
+ *"Command failed"*. Ahora el push hereda stdin (con `GIT_TERMINAL_PROMPT=1`) para que el
31
+ login se pueda completar, **muestra el stderr real de git**, y si aún falla sugiere
32
+ pushear a mano una vez para cachear la credencial.
33
+
34
+ ### Agregado
35
+ - **`dai mr` como alias de `dai pr`.** En un shop de GitLab uno tipea "mr" (merge request);
36
+ ahora funciona. Es el mismo comando (detecta el forge y usa `gh`/`glab`), solo más natural.
37
+
38
+ ### Cambiado
39
+ - **El diagnóstico de un 400 de `dai publish` ahora coincide con lo que Jira dijo.** Antes
40
+ mandaba SIEMPRE a declarar un campo propio (`customfield_NNNNN` en `.dai/jira-fields.json`),
41
+ aunque el 400 fuera *"Por favor indicar épica…"* — confuso, porque el fix real es
42
+ `--parent`. Ahora la ayuda se elige según el cuerpo del error: regla de épica padre →
43
+ `--parent`, campo obligatorio → `jira-fields.json`, genérico → nombra las dos causas sin
44
+ empujar una sola.
45
+ - **`dai pr` explica por qué no pudo crear la PR/MR** en vez de un *"¿instalado y
46
+ autenticado?"*. Si `gh`/`glab` no está instalado (`ENOENT`) lo dice y enlaza la
47
+ instalación + `… auth login` (con `--hostname` para GitLab self-hosted); si falla por
48
+ otra cosa, **imprime el stderr real del forge** (auth vencida, host sin configurar, flag
49
+ desconocido). Era el caso ciego del equipo con GitLab corporativo.
50
+ - **El diagnóstico de TLS ofrece primero el camino más simple**: `NODE_OPTIONS=--use-system-ca`
51
+ (Node ≥ 22.15), que usa el trust store del sistema donde el navegador ya confía en la CA
52
+ de la empresa — validado contra el proxy real. `NODE_EXTRA_CA_CERTS` queda como
53
+ alternativa para cualquier versión de Node. (Sigue prohibido `NODE_TLS_REJECT_UNAUTHORIZED=0`.)
54
+
55
+ ### Docs
56
+ - **El prerequisito de `dai pr`: `gh`/`glab` instalado y autenticado.** Un callout en la
57
+ sección del dev con el setup one-time del CLI del forge (`gh auth login` /
58
+ `glab auth login --hostname <tu-gitlab>`, con la nota del PATH en Windows tras instalar con
59
+ winget). Era el paso que faltaba documentar — sin el CLI, `dai pr` pushea igual y avisa.
60
+ - **README consistente con Copilot nativo.** La tabla de superficies ya decía que Copilot
61
+ carga skills en app / CLI / IDE / cloud (solo el chat de github.com queda afuera), pero el
62
+ resto del README seguía en el modelo viejo: la tabla de `--for`, el árbol del repo y el
63
+ snippet de `dai skills install` hablaban de `.github/prompts/*.prompt.md` y de que "Copilot
64
+ no tiene skills instalables". Corregido a `.github/skills/` nativo — validado con un dev
65
+ corriendo dai en la app de GitHub Copilot desktop.
66
+
67
+ ### Interno
68
+ - **161 tests** (+3): integración de `dai sync --for copilot` (regresión + migración del
69
+ layout viejo).
70
+ - **Conocido, sin arreglar:** en Windows, tras un `dai publish` con red, puede aparecer al
71
+ salir `Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), src\win\async.c` — un
72
+ crash de *teardown* de libuv, posterior a toda la salida útil (cosmético). Se investiga.
73
+
74
+ ## [0.8.0] — 2026-07-15
75
+
76
+ **El primer analista funcional real usó dai contra un Jira corporativo, y encontró el
77
+ hueco entre "anda en mi Jira de juguete" y "anda en el de una empresa".**
78
+
79
+ ### Agregado
80
+ - **Campos propios de Jira**, declarados por issuetype en `.dai/jira-fields.json` (o
81
+ `DAI_JIRA_FIELDS_FILE`) con nombre humano, forma, default y opciones válidas. dai valida
82
+ **antes** de llamar a la red: un typo da `'Mejraa' no es opción de 'clasificacion' —
83
+ válidas: Mejora | Corrección`, no un 400 críptico. El valor se elige por US con
84
+ `dai publish us.md --field clasificacion=Corrección` (repetible), porque la clasificación
85
+ cambia según la historia y un default fijo publicaría todas iguales ([ADR-0015](docs/adr/0015-jira-corporativo.md)).
86
+ - `dai publish --parent <KEY>` — cuelga la US de su épica (antes `createUS` nunca mandaba
87
+ `parent`, así que las US quedaban sueltas).
88
+ - `dai publish --issuetype <T>` — **`grill-epic` gana su fallback por CLI**: hasta ahora, sin
89
+ MCP, una épica quedaba en un `.md` para pegar a mano.
90
+ - **Diagnóstico de TLS**: un fallo de certificado ahora enseña `NODE_EXTRA_CA_CERTS` (el caso
91
+ típico es el proxy corporativo: Node no usa el trust store del sistema) y explica por qué
92
+ `NODE_TLS_REJECT_UNAUTHORIZED=0` no es una alternativa — apaga la verificación entera y por
93
+ ahí viaja tu token.
94
+ - **Constitución**: dos reglas nuevas para todos los asistentes — no bajar la seguridad para
95
+ avanzar, y parar y avisar si el CLI no llega en vez de improvisar la llamada por fuera.
96
+
97
+ ### Cambiado
98
+ - **Copilot lee `SKILL.md` nativo** ([ADR-0014](docs/adr/0014-copilot-agent-skills.md)).
99
+ `dai init --for copilot` genera `.github/skills/` (copia cruda, **con los `templates/`**) en
100
+ vez de `.github/prompts/*.prompt.md`, y borra los prompts viejos de dai para que no dupliquen
101
+ cada `/comando`. Los prompt files propios del equipo no se tocan.
102
+ - **`dai skills install --for copilot` ya existe** → `~/.copilot/skills/`. Antes warneaba
103
+ *"Copilot no tiene skills instalables"*: era cierto hasta que GitHub adoptó Agent Skills, y
104
+ por eso una skill "instalada global" no le aparecía a nadie que usara la app o el CLI de
105
+ Copilot (`~/.claude/skills` solo lo mira VS Code).
106
+ - **`dai doctor` reporta solo los asistentes que el repo usa.** Antes listaba los tres siempre:
107
+ quien configuraba uno veía 14 warnings de los otros dos y leía "está todo roto". Ahora
108
+ también chequea Copilot, valida `DAI_JIRA_PROJECT` y que el archivo de campos parsee.
109
+ - **Un flag repetido acumula** (`--field a=1 --field b=2`) en vez de que gane el último en
110
+ silencio.
111
+
112
+ ### Arreglado
113
+ - **`doc-to-backlog` y `grill-epic` no cargaban en Copilot.** Sus descripciones tenían un `: `
114
+ suelto (*"…épicas finales: extrae…"*), que un parser YAML lee como el arranque de un mapa y
115
+ descarta la skill entera — justo las dos que más necesita un analista funcional. El defecto
116
+ siempre estuvo en la fuente: lo tapaban nuestro `parseFrontmatter` (que es un regex, no YAML)
117
+ y la conversión a `.prompt.md` (que citaba el valor al serializarlo). Ahora las 7
118
+ descripciones van citadas, **`validateSkill` valida que `name` y `description` sean escalares
119
+ YAML válidos**, y el molde de `templates/skill.md` cita por defecto.
120
+ - `DAI_JIRA_PROJECT=PROJ-42` (la clave de un **ticket**, el error de config más común) daba
121
+ un 400 de Jira que no lo explicaba. Ahora falla **antes de la red**, con los dos caminos:
122
+ `DAI_JIRA_PROJECT=PROJ`, o `--parent PROJ-42` si querías colgarla de esa épica.
123
+
124
+ ### Quitado
125
+ - `skillToPrompt()` y el adaptador `.github/prompts/` de Copilot. Cuando el formato de una
126
+ skill es un estándar abierto, el mejor adaptador es ninguno.
127
+
128
+ ### Interno
129
+ - **158 tests** (+39 desde 0.7.0): `jira-fields` ×19, `http`/TLS ×7, contrato YAML del
130
+ frontmatter ×7, `assertProjectKey` y el payload de `createUS` ×6.
131
+ - **Primera verificación en Windows.** Hasta ahora dai no se había instalado nunca en Windows
132
+ (no hay CI de esa plataforma): se probó el ciclo completo — install, `dai init --for copilot`,
133
+ skills globales en `~/.copilot/skills`, y Copilot cargando las 7. Los campos propios de Jira
134
+ y el diagnóstico de TLS están cubiertos por tests contra un Jira simulado, **todavía no
135
+ contra un Jira corporativo real**.
136
+ - `lib/jira-fields.mjs` y `lib/http.mjs` nuevos, cero dependencias (como el resto del CLI).
137
+
6
138
  ## [0.7.0] — 2026-07-14
7
139
 
8
140
  **dai es el distribuidor de skills de cualquier stack, sin opinar sobre su contenido.**
@@ -194,6 +326,7 @@ ClickUp y Jira Cloud.
194
326
  - Tests de las rutas de red (jira/clickup/forge) con `fetch` mockeado. Sin links rotos;
195
327
  `files` de npm sin tests ni secretos.
196
328
 
329
+ [0.8.0]: https://github.com/dforce2055/dai/releases/tag/v0.8.0
197
330
  [0.7.0]: https://github.com/dforce2055/dai/releases/tag/v0.7.0
198
331
  [0.6.0]: https://github.com/dforce2055/dai/releases/tag/v0.6.0
199
332
  [0.5.0]: https://github.com/dforce2055/dai/releases/tag/v0.5.0
package/README.md CHANGED
@@ -49,7 +49,7 @@ deja las skills disponibles:
49
49
 
50
50
  ```bash
51
51
  npm i -g @dforce2055/dai # el CLI
52
- dai skills install # skills de IA → Claude y Cursor (global por defecto)
52
+ dai skills install # skills de IA → Claude, Copilot y Cursor (global por defecto)
53
53
  ```
54
54
 
55
55
  Y después, en el chat del asistente, según lo que tengas:
@@ -66,6 +66,20 @@ Y después, en el chat del asistente, según lo que tengas:
66
66
  > (`DAI_PM` en el `.env`): 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:
70
+
71
+ ```bash
72
+ dai publish historia.md # crea la US → devuelve el key
73
+ dai publish historia.md --parent PROJ-42 # colgándola de su épica
74
+ dai publish historia.md --field clasificacion=Mejora # con un campo propio que tu Jira exige
75
+ dai publish epica.md --issuetype Epic # publicar una épica (no una US)
76
+ ```
77
+
78
+ > **Jira corporativo:** si tu proyecto exige campos propios (`customfield_…`), declaralos una
79
+ > vez en `.dai/jira-fields.json` (molde en `.dai/templates/`) y pasalos con `--field`. Si una
80
+ > historia tiene que colgar de una épica, `--parent PROJ-42`. dai valida antes de la red y, si
81
+ > Jira igual rechaza, el error te dice **qué** falta ([ADR-0015](docs/adr/0015-jira-corporativo.md)).
82
+
69
83
  ### 🔵 Como dev — tengo una US y voy a implementarla
70
84
 
71
85
  Una vez, preparas el repo:
@@ -98,6 +112,17 @@ dai pr --assignee <compañero> # crea la PR precargada y se la asigna a un com
98
112
  dai stamp # al mergear: estampa la cobertura en el tracker
99
113
  ```
100
114
 
115
+ > **Para que `dai pr` cree la PR/MR** necesitás el CLI del forge instalado y autenticado, una
116
+ > sola vez por máquina:
117
+ > - **GitHub** → [`gh`](https://cli.github.com) · `gh auth login`
118
+ > - **GitLab** → [`glab`](https://gitlab.com/gitlab-org/cli) · `glab auth login --hostname <tu-gitlab>`
119
+ > — 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
121
+ > tome el PATH.)
122
+ >
123
+ > Sin el CLI del forge, `dai pr` **igual pushea tu branch** y te dice qué instalar — después
124
+ > creás la PR/MR a mano desde la web. dai nunca te deja a medias sin decir por qué.
125
+
101
126
  ## Cómo usarlo — el flujo, paso a paso
102
127
 
103
128
  Guía completa con salidas reales en [`docs/PROBAR.md`](docs/PROBAR.md); un caso narrado en
@@ -157,16 +182,16 @@ flowchart TD
157
182
  | Comando | Qué hace |
158
183
  |---|---|
159
184
  | `dai init [<repo>]` | scaffolder interactivo del repo. Flags: `--for claude\|copilot\|both\|cursor\|all` (asistente, default `all`) · `--pm md\|jira\|clickup` (tracker) · `--openspec` |
160
- | `dai skills install [--global \| --local <repo>] [--force] [--dry-run] [--for claude\|cursor\|all]` | instala/actualiza las skills de dai en Claude y/o Cursor (`--for all` por defecto). `--force` re-copia. Alias: **`dai install`**. Ej: `dai skills install --local . --for cursor --force` |
185
+ | `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` |
161
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` |
162
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)) |
163
188
  | `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)) |
164
- | `dai publish <us.md>` | crea la US en el tracker (Jira/ClickUp/md) desde un `.md` y devuelve el key. Es el fallback del MCP para publicar sin el asistente |
189
+ | `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)) |
165
190
  | `dai link-us <ID> [--us <md>]` | crea branch + `implements.yaml`; sin `--us` trae la US del tracker |
166
191
  | `dai link-us <ID> --resync` | re-estampa el `ac_hash` contra la US viva (tras un ⚠️ de check) |
167
192
  | `dai check` | compara tu código vs la US viva → ✅ al día / ⚠️ atrasado (exit code = gate de PR) |
168
193
  | `dai ls [--json]` | lista las US que implementa el repo + su link al tracker |
169
- | `dai pr [--assignee u] [--base b] [--draft] [--yes]` | crea TU PR/MR precargada: pregunta la branch base (default `main`), muestra el texto y confirma antes de publicar |
194
+ | `dai pr [--assignee u] [--base b] [--draft] [--yes]` · alias **`dai mr`** | crea TU PR/MR precargada: pregunta la branch base (default `main`), muestra el texto y confirma antes de publicar. Detecta el forge (GitHub→PR con `gh` · GitLab→MR con `glab`); `mr` es el mismo comando, más natural en GitLab |
170
195
  | `dai stamp` | estampa la cobertura inversa en el tracker (branch + commit-ancla) |
171
196
  | `dai done [--base main] [--force]` | cierra la US: vuelve a la base, `fetch --prune` + `pull`, y borra la branch local **si está mergeada** (chequeo estricto; `--force` la borra igual). Redes: no estar en la base, sin cambios sueltos, sin commits sin pushear |
172
197
  | `dai archive [<change>] [--skip-specs]` | **funde los delta specs del change en las specs canónicas** (`openspec/specs/`) y lo archiva. Lo corre el **aprobador** de la PR (gate de aprobación, [ADR-0011](docs/adr/0011-archive-gate-de-aprobacion.md)); detecta el change activo o le pasás el nombre. Envuelve `openspec archive` |
@@ -214,14 +239,14 @@ ver [`.env.example`](.env.example). Auth (SSH + tokens): [ADR-0007](docs/adr/000
214
239
  | Valor | Genera | Elígelo si… |
215
240
  |---|---|---|
216
241
  | `--for claude` | `.claude/skills/` + `CLAUDE.md` | tu equipo usa **Claude** (Code / Desktop) |
217
- | `--for copilot` | `.github/prompts/*.prompt.md` + `.github/copilot-instructions.md` | tu equipo usa **GitHub Copilot** (en VS Code / JetBrains) |
242
+ | `--for copilot` | `.github/skills/` + `.github/copilot-instructions.md` | tu equipo usa **GitHub Copilot** (app, CLI, VS Code / JetBrains o cloud agent) |
218
243
  | `--for cursor` | `.cursor/skills/` + `.cursor/rules/dai-constitution.mdc` | tu equipo usa **Cursor Agent** |
219
244
  | `--for both` | Claude + Copilot | equipo mixto sin Cursor |
220
245
  | `--for all` *(default)* | Claude + Copilot + Cursor | quieres dejar el repo listo para cualquier asistente |
221
246
 
222
247
  - **Combinables:** pasá un subconjunto separado por coma — `--for claude,cursor` o
223
- `--for copilot`. `all` = los tres · `both` = Claude+Copilot. (Igual en `dai install`,
224
- aunque ahí Copilot no aplica: no tiene skills instalables.)
248
+ `--for copilot`. `all` = los tres · `both` = Claude+Copilot. (Igual en `dai install`:
249
+ Copilot lee `SKILL.md` nativo, así que sus skills se instalan como las de Claude/Cursor.)
225
250
  - Es **aditivo, no destructivo**: los conjuntos conviven sin pisarse (viven en
226
251
  carpetas distintas). La **misma** skill se transforma al formato de cada asistente.
227
252
  - Si ejecutas `dai init` sin flag, te lo pregunta de forma interactiva.
@@ -241,7 +266,7 @@ mi-repo/
241
266
  │ └── doc-to-backlog · grill-intent · grill-epic · grill-user-story · link-us · tdd · dai-review
242
267
  ├── .github/
243
268
  │ ├── copilot-instructions.md · La constitución, auto-inyectada en cada chat de Copilot
244
- │ ├── prompts/*.prompt.md · Las mismas skills, generadas en formato Copilot
269
+ │ ├── skills/ · Las mismas skills, en formato Copilot nativo (SKILL.md)
245
270
  │ └── pull_request_template.md · Molde de PR/MR atado al link
246
271
  ├── .cursor/
247
272
  │ ├── skills/ · Las mismas skills, en formato Cursor
@@ -266,12 +291,18 @@ Las skills se invocan en el asistente — **no en todas sus superficies** (lími
266
291
  | **Claude Desktop** | ✅ | `~/.claude/skills/` (global) — sin IDE ni consola |
267
292
  | **Claude Code** | ✅ | `~/.claude/skills/` + `.claude/skills/` del repo |
268
293
  | **Cursor Agent (IDE)** | ✅ | `.cursor/skills/*/SKILL.md` + `.cursor/rules/*.mdc` |
269
- | **Copilot en VS Code / JetBrains** | ✅ | los `.github/prompts/*.prompt.md` |
270
- | **Copilot CLI** | ✅ | custom agents |
271
- | **Copilot app standalone / github.com chat** | | los prompt files son solo-IDE |
272
-
273
- El analista sin IDE cierra con **Claude Desktop**; con Copilot necesita **VS Code o el Copilot
274
- CLI**. El CLI `dai` corre en cualquier terminal, con cualquier asistente o ninguno.
294
+ | **Copilot app / CLI** | ✅ | `~/.copilot/skills/` (global) + `.github/skills/` del repo |
295
+ | **Copilot en VS Code / JetBrains** | ✅ | ídem (modo agente) |
296
+ | **Copilot code review · cloud agent** | | `.github/skills/` del repo |
297
+ | **Chat de github.com** | ❌ | no carga skills |
298
+
299
+ **El analista no necesita IDE**: cierra el ciclo con **Claude Desktop** o con la **app / CLI de
300
+ Copilot**. El CLI `dai` corre en cualquier terminal, con cualquier asistente o ninguno.
301
+
302
+ > Copilot lee el `SKILL.md` **tal cual**, sin conversión ([ADR-0014](docs/adr/0014-copilot-agent-skills.md)).
303
+ > Si vienes de dai ≤ 0.7, corre `dai init --for copilot` una vez: cambia los
304
+ > `.github/prompts/*.prompt.md` por `.github/skills/` (con los `templates/`, que antes se
305
+ > perdían) y limpia los viejos para que no te dupliquen cada `/comando`.
275
306
 
276
307
  ## Se adapta a cualquier escala
277
308
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.1