@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 +9 -3
- package/CHANGELOG.md +133 -0
- package/README.md +45 -14
- package/VERSION +1 -1
- package/cli/dai.mjs +180 -72
- package/cli/lib/args.mjs +13 -2
- package/cli/lib/bootstrap.mjs +69 -19
- package/cli/lib/http.mjs +67 -0
- package/cli/lib/jira-fields.mjs +143 -0
- package/cli/lib/pm-jira.mjs +71 -12
- package/docs/adr/0014-copilot-agent-skills.md +99 -0
- package/docs/adr/0015-jira-corporativo.md +104 -0
- package/docs/adr/README.md +4 -0
- package/package.json +1 -1
- package/skills/dai-review/SKILL.md +1 -1
- package/skills/doc-to-backlog/SKILL.md +1 -1
- package/skills/grill-epic/SKILL.md +13 -5
- package/skills/grill-intent/SKILL.md +1 -1
- package/skills/grill-user-story/SKILL.md +16 -3
- package/skills/link-us/SKILL.md +1 -1
- package/skills/tdd/SKILL.md +1 -1
- package/templates/jira-fields.example.json +49 -0
- package/templates/skill.md +8 -4
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
|
|
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
|
|
21
|
-
# DAI_JIRA_ISSUETYPE=Story # tipo de issue a crear (default Story)
|
|
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
|
|
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/
|
|
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
|
-
|
|
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
|
-
│ ├──
|
|
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
|
|
270
|
-
| **Copilot
|
|
271
|
-
| **Copilot
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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.
|
|
1
|
+
0.8.1
|