@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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: grill-user-story
3
- description: Interroga a un PO o analista funcional para producir una User Story funcional y testeable siguiendo el formato del modelo de trazabilidad — o pule una US vaga existente. Se queda a nivel funcional/usuario y se niega a derivar en diseño técnico o a emitir una US con criterios no testeables. Al terminar, PUBLICA la US en el tracker configurado del repo (Jira o ClickUp, según DAI_PM del .env) usando su MCP; si no hay MCP/token, deja un .md con el mismo formato para copiar y pegar. Invocar como /grill-user-story, opcionalmente con un título, un ID/URL del tracker, y/o una US rústica existente. Usar antes de opsx:propose, o cuando alguien dice "necesito una US", "convierte esto en una US como corresponde", o "esta historia está muy vaga".
3
+ description: "Interroga a un PO o analista funcional para producir una User Story funcional y testeable siguiendo el formato del modelo de trazabilidad — o pule una US vaga existente. Se queda a nivel funcional/usuario y se niega a derivar en diseño técnico o a emitir una US con criterios no testeables. Al terminar, PUBLICA la US en el tracker configurado del repo (Jira o ClickUp, según DAI_PM del .env) usando su MCP; si no hay MCP/token, deja un .md con el mismo formato para copiar y pegar. Invocar como /grill-user-story, opcionalmente con un título, un ID/URL del tracker, y/o una US rústica existente. Usar antes de opsx:propose, o cuando alguien dice \"necesito una US\", \"convierte esto en una US como corresponde\", o \"esta historia está muy vaga\"."
4
4
  ---
5
5
 
6
6
  # grill-user-story
@@ -65,11 +65,24 @@ La US se produce UNA vez con el formato de `../../templates/formato-us.md`. Lo q
65
65
  - Si NO hay MCP del tracker conectado (pero sí `DAI_PM=jira|clickup` + token en `.env`):
66
66
  escribe la US como `.md` (formato `formato-us.md`) y publícala con el comando:
67
67
  **`dai publish <ruta-del-md>`** → crea el issue/tarea vía REST y devuelve el key.
68
- (Jira necesita además `DAI_JIRA_PROJECT` en el `.env`.)
68
+ (Jira necesita además `DAI_JIRA_PROJECT` en el `.env` — la clave del **proyecto**,
69
+ `PROJ`, no la de un ticket.)
70
+ - **Si la US pertenece a una épica:** `dai publish <us.md> --parent <KEY-de-la-épica>`.
71
+ - **Si el proyecto exige campos propios** (típico en Jira corporativo): van con
72
+ `--field alias=valor`, repetible. Los alias son los de `.dai/jira-fields.json`, y
73
+ `dai doctor` te dice cuáles hay. Si el valor cambia según la US (p. ej. una
74
+ clasificación Mejora/Corrección), **pregúntaselo a la persona** durante el
75
+ interrogatorio — no lo elijas tú, es una decisión de negocio.
76
+ Ej.: `dai publish us.md --parent PROJ-42 --field clasificacion=Corrección`
69
77
  - Si tampoco hay token (o `DAI_PM=md`): deja solo el `.md` para que la persona lo
70
78
  pegue a mano en el tracker. Avisa el motivo.
71
79
  - El contenido es **idéntico** en los tres caminos (MCP / `dai publish` / manual).
72
- 4. **Estado.** Dejar la US en `pulida`. Ofrecer que el dev siga con `dai link-us <ID>` → `opsx:propose` (lado técnico).
80
+ 4. **Si `dai publish` falla, para y reporta el error tal cual.** No improvises una llamada
81
+ a la API del tracker por fuera, ni bajes la verificación TLS para pasar un proxy: el
82
+ atajo publica igual, pero el `## Criterios de aceptación` puede quedar mal formado y
83
+ **el link QUÉ↔CÓMO se rompe en silencio**. Si el error nombra un campo obligatorio que
84
+ falta, decláralo en `.dai/jira-fields.json` (molde en `.dai/templates/`) y reintenta.
85
+ 5. **Estado.** Dejar la US en `pulida`. Ofrecer que el dev siga con `dai link-us <ID>` → `opsx:propose` (lado técnico).
73
86
 
74
87
  ## Hand-off
75
88
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: link-us
3
- description: Del lado del dev — crea la branch desde el link de la User Story en Jira SIN margen de error y genera el archivo implements.yaml con el link a la US (id + version + ac_hash). Es la que hace que el link QUÉ↔CÓMO sea correcto por construcción, sin que el dev tipee el key a mano. Invocar como /link-us ABC-### (o con la URL del ticket de Jira). Usar al arrancar la implementación de una US, antes o junto con opsx:explore / opsx:propose.
3
+ description: "Del lado del dev — crea la branch desde el link de la User Story en Jira SIN margen de error y genera el archivo implements.yaml con el link a la US (id + version + ac_hash). Es la que hace que el link QUÉ↔CÓMO sea correcto por construcción, sin que el dev tipee el key a mano. Invocar como /link-us ABC-### (o con la URL del ticket de Jira). Usar al arrancar la implementación de una US, antes o junto con opsx:explore / opsx:propose."
4
4
  ---
5
5
 
6
6
  # link-us
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: tdd
3
- description: Test-driven development with red-green-refactor loop. Use when user wants to build features or fix bugs using TDD, mentions "red-green-refactor", wants integration tests, or asks for test-first development.
3
+ description: "Test-driven development with red-green-refactor loop. Use when user wants to build features or fix bugs using TDD, mentions \"red-green-refactor\", wants integration tests, or asks for test-first development."
4
4
  ---
5
5
 
6
6
  # Test-Driven Development
@@ -0,0 +1,49 @@
1
+ {
2
+ "_comentario": [
3
+ "Molde de .dai/jira-fields.json — los campos PROPIOS que tu Jira exige al crear un issue.",
4
+ "Copialo a .dai/jira-fields.json y ajustalo. Si tu Jira no exige campos propios, no lo",
5
+ "necesitás: sin archivo, dai publica igual que siempre (ADR-0015).",
6
+ "",
7
+ "Se declara por issuetype porque los campos obligatorios de una Story y de una Epic casi",
8
+ "nunca son los mismos. Un campo declarado TIENE que resolver a un valor (por 'default' o",
9
+ "por --field): se declara porque Jira lo exige. Si es opcional, no lo declares.",
10
+ "",
11
+ " field el id de Jira (requerido). Lo ves en la URL al editar el campo, o te lo dice",
12
+ " el error 400 de Jira cuando falta.",
13
+ " shape cómo se envuelve el valor para la API:",
14
+ " select → {\"value\": X} un desplegable (el caso típico)",
15
+ " text → X texto plano",
16
+ " multi → [{\"value\": X}] lista (el valor se parte por comas)",
17
+ " raw → JSON tal cual escape hatch para cualquier forma rara",
18
+ " Si lo omitís: con 'options' es select; sin 'options', text.",
19
+ " default el valor si no pasás --field. Omitilo cuando el valor cambia SIEMPRE según",
20
+ " la US: así dai te lo pide en vez de inventar uno.",
21
+ " options los valores válidos. dai los valida ANTES de llamar a Jira: un typo da un",
22
+ " error local con la lista, no un 400 críptico.",
23
+ "",
24
+ "Uso:",
25
+ " dai publish us.md (usa los defaults)",
26
+ " dai publish us.md --field clasificacion=Corrección",
27
+ " dai publish us.md --parent PROJ-42 (la cuelga de su épica)",
28
+ " dai publish epica.md --issuetype Epic --field clasificacion=Mejora",
29
+ "",
30
+ "Verificá que parsee con: dai doctor"
31
+ ],
32
+
33
+ "Story": {
34
+ "clasificacion": {
35
+ "field": "customfield_10042",
36
+ "shape": "select",
37
+ "default": "Mejora",
38
+ "options": ["Mejora", "Corrección"]
39
+ }
40
+ },
41
+
42
+ "Epic": {
43
+ "clasificacion": {
44
+ "field": "customfield_10042",
45
+ "shape": "select",
46
+ "options": ["Mejora", "Corrección"]
47
+ }
48
+ }
49
+ }
@@ -1,9 +1,9 @@
1
1
  <!--
2
2
  MOLDE DE SKILL · dai
3
3
  ─────────────────────────────────────────────────────────────────
4
- Formato: Agent Skills de Claude (SKILL.md). dai lo INGIERE y lo convierte a los 3
5
- asistentes (Claude copia · Cursor `skillToCursor` · Copilot `.prompt.md`), con
6
- `dai skills install --from <repo|path>` (ADR-0013).
4
+ Formato: Agent Skills (SKILL.md) un estándar abierto que leen Claude, Copilot y
5
+ Cursor. dai lo INGIERE y lo distribuye a los 3 (Claude y Copilot copia cruda · Cursor
6
+ `skillToCursor`), con `dai skills install --from <repo|path>` (ADR-0013 · ADR-0014).
7
7
 
8
8
  Estructura del repo/dir fuente:
9
9
  skills/
@@ -15,13 +15,17 @@
15
15
  - frontmatter con `name` y `description` (ambos obligatorios, en una línea).
16
16
  - `name`: slug en kebab-case, IGUAL al nombre del directorio.
17
17
  - `description`: una frase — con esto el agente decide CUÁNDO usar la skill.
18
+ - ambos, YAML VÁLIDO. Ojo: los asistentes parsean el frontmatter con YAML de
19
+ verdad, y un `: ` (dos puntos + espacio) suelto en la descripción hace que YAML
20
+ la lea como un mapa y DESCARTE LA SKILL ENTERA. Por eso la descripción va
21
+ SIEMPRE entre comillas dobles: te deja escribir la frase que quieras.
18
22
 
19
23
  dai NO valida el CONTENIDO (qué dice la skill, qué hacen sus scripts): eso es
20
24
  criterio del equipo. Las instalás bajo tu propio riesgo.
21
25
  -->
22
26
  ---
23
27
  name: mi-skill
24
- description: Qué hace la skill y cuándo conviene invocarla concreto y orientado al disparador.
28
+ description: "Qué hace la skill y cuándo conviene invocarla: concreto y orientado al disparador. Las comillas dobles no son decorativas — sin ellas, un ': ' rompe el YAML."
25
29
  ---
26
30
 
27
31
  # <Título de la skill>