@dforce2055/dai 0.1.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 (81) hide show
  1. package/.env.example +30 -0
  2. package/CHANGELOG.md +46 -0
  3. package/CODE_OF_CONDUCT.md +37 -0
  4. package/CONTRIBUTING.md +66 -0
  5. package/LICENSE +674 -0
  6. package/README.md +288 -0
  7. package/SECURITY.md +37 -0
  8. package/VERSION +1 -0
  9. package/cli/dai.mjs +692 -0
  10. package/cli/lib/ac-hash.mjs +74 -0
  11. package/cli/lib/args.mjs +23 -0
  12. package/cli/lib/bootstrap.mjs +74 -0
  13. package/cli/lib/env.mjs +23 -0
  14. package/cli/lib/forge-api.mjs +96 -0
  15. package/cli/lib/forge-url.mjs +61 -0
  16. package/cli/lib/fsutil.mjs +24 -0
  17. package/cli/lib/implements.mjs +94 -0
  18. package/cli/lib/link-us.mjs +59 -0
  19. package/cli/lib/pm-adapter.mjs +59 -0
  20. package/cli/lib/pm-clickup.mjs +54 -0
  21. package/cli/lib/pm-jira.mjs +123 -0
  22. package/cli/lib/pr.mjs +53 -0
  23. package/cli/lib/us.mjs +36 -0
  24. package/docs/EJEMPLO-END-TO-END.md +330 -0
  25. package/docs/MANIFIESTO.md +114 -0
  26. package/docs/METODOLOGIA.md +254 -0
  27. package/docs/PROBAR.md +91 -0
  28. package/docs/SCRUM-CON-IA.md +190 -0
  29. package/docs/adr/0001-contrato-ac-hash.md +86 -0
  30. package/docs/adr/0002-agnostico-del-asistente.md +87 -0
  31. package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +73 -0
  32. package/docs/adr/0004-ubicacion-y-schema-implements.md +94 -0
  33. package/docs/adr/0005-superficie-comandos-y-stamp.md +65 -0
  34. package/docs/adr/0006-distribucion-y-licencia.md +59 -0
  35. package/docs/adr/0007-modelo-de-autenticacion.md +63 -0
  36. package/docs/adr/README.md +19 -0
  37. package/docs/detalle/01-refinamiento.md +33 -0
  38. package/docs/detalle/02-planning.md +27 -0
  39. package/docs/detalle/03-ramas.md +32 -0
  40. package/docs/detalle/04-tdd.md +35 -0
  41. package/docs/detalle/05-smoke.md +32 -0
  42. package/docs/detalle/06-code-review.md +34 -0
  43. package/docs/detalle/07-merge-trazabilidad.md +33 -0
  44. package/docs/detalle/08-daily.md +29 -0
  45. package/docs/detalle/09-review.md +25 -0
  46. package/docs/detalle/10-retro.md +27 -0
  47. package/docs/detalle/README.md +20 -0
  48. package/docs/glosario.md +79 -0
  49. package/docs/guias/dev.md +66 -0
  50. package/docs/guias/lead.md +53 -0
  51. package/docs/guias/po.md +50 -0
  52. package/governance/branch-naming.md +36 -0
  53. package/governance/ci-rules.md +57 -0
  54. package/governance/commit-convention.md +76 -0
  55. package/index.html +479 -0
  56. package/install.sh +19 -0
  57. package/manifest.yaml +76 -0
  58. package/package.json +55 -0
  59. package/skills/dai-review/SKILL.md +78 -0
  60. package/skills/doc-to-backlog/SKILL.md +70 -0
  61. package/skills/doc-to-backlog/templates/backlog-candidato.md +49 -0
  62. package/skills/grill-epic/SKILL.md +76 -0
  63. package/skills/grill-intent/SKILL.md +43 -0
  64. package/skills/grill-intent/templates/intent.md +36 -0
  65. package/skills/grill-user-story/SKILL.md +76 -0
  66. package/skills/grill-user-story/templates/user-story.md +61 -0
  67. package/skills/link-us/SKILL.md +42 -0
  68. package/skills/link-us/templates/implements.yaml +16 -0
  69. package/skills/tdd/SKILL.md +109 -0
  70. package/skills/tdd/deep-modules.md +33 -0
  71. package/skills/tdd/interface-design.md +31 -0
  72. package/skills/tdd/mocking.md +59 -0
  73. package/skills/tdd/refactoring.md +10 -0
  74. package/skills/tdd/tests.md +61 -0
  75. package/templates/adr.md +43 -0
  76. package/templates/commit-msg +48 -0
  77. package/templates/definition-of-done.md +50 -0
  78. package/templates/definition-of-ready.md +51 -0
  79. package/templates/epica.md +62 -0
  80. package/templates/formato-us.md +129 -0
  81. package/templates/pull-request.md +62 -0
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: dai-review
3
+ description: Revisa una Pull/Merge Request de un repo remoto (GitHub o GitLab) de forma consciente de la metodología dai, y deja un comentario estándar en español con errores y mejoras. Corre `dai check` (¿la US está atrasada?), valida el Definition of Done, hace el review de código (correctitud + calidad), compone el comentario estándar y lo postea — vía el MCP del forge si está disponible, o vía `dai forge comment` (token) si no. Invocar como /dai-review <URL-de-la-PR o número>. Usar en el paso 6 de SCRUM-CON-IA (code review), antes de que un partner humano firme.
4
+ ---
5
+
6
+ # dai-review — review de PR consciente de la metodología
7
+
8
+ Es el **primer pase** del paso 6 (code review). No reemplaza al partner humano: le
9
+ saca el ruido para que firme lo que importa ([Art. 5](../../docs/MANIFIESTO.md#art-5) del manifiesto). Funciona igual
10
+ en **GitHub y GitLab**.
11
+
12
+ ## Las dos caras (cómo postea el comentario)
13
+
14
+ Mismo comentario estándar, dos formas de dejarlo (elige la disponible, en este orden):
15
+
16
+ 1. **MCP del forge** — si hay un MCP de GitHub/GitLab conectado, postea por ahí.
17
+ 2. **CLI con token** — si no, `dai forge comment <ref> --body-file <archivo>`. Usa
18
+ `GITHUB_TOKEN`/`GITLAB_TOKEN` del `.env` (token scopeado, **nunca** contraseña).
19
+
20
+ > **Auth:** git (traer la branch) usa **SSH**; comentar la PR usa **token del forge**
21
+ > (comentar no se puede por SSH). Cero contraseñas.
22
+
23
+ ## Input
24
+
25
+ - **Ref de la PR/MR:** URL completa o solo el número (con el remoto git configurado).
26
+ - Si no viene, intenta inferirla de la branch actual; si no, pedila.
27
+
28
+ ## Proceso
29
+
30
+ 1. **Resolver la PR** — `dai forge pr <ref>` (o el MCP) para título, descripción, branch.
31
+ 2. **Traer el diff** — `git fetch` + `git diff <base>...<branch>` (local, por SSH). No
32
+ dependas de la API para el diff.
33
+ 3. **Chequeos de metodología (mecánicos, deterministas):**
34
+ - `dai check` → ¿la US quedó **atrasada** (ac_hash) respecto de la viva?
35
+ - ¿existe `implements.yaml`? (si es un PR de producto, es obligatorio)
36
+ - **Definition of Done** (`templates/definition-of-done.md`): cuenta cuántos ítems cumple.
37
+ 4. **Review de código (criterio, no mecánico):** busca
38
+ - 🔴 **Errores** de correctitud (bugs, casos borde, seguridad).
39
+ - 🟡 **Mejoras** de calidad (reuso, simplicidad, eficiencia).
40
+ - ✅ Lo que está **bien** (refuerza lo bueno).
41
+ 5. **Componer el comentario estándar** (ver formato abajo).
42
+ 6. **Postear** por MCP o `dai forge comment`. Confirmar el link al comentario.
43
+
44
+ ## El comentario estándar
45
+
46
+ Es el mismo que emite `renderReviewComment` del CLI — respeta esta forma:
47
+
48
+ ```markdown
49
+ ## 🤖 dai-review
50
+
51
+ **US:** `ABC-482` @ v1 · `dai check`: ✅ al día
52
+ **Definition of Done:** 4/5
53
+
54
+ ### 🔴 Errores (correctitud)
55
+ - <hallazgo concreto con archivo:línea>
56
+
57
+ ### 🟡 Mejoras (calidad, reuso, simplicidad)
58
+ - <sugerencia concreta>
59
+
60
+ ### ✅ Lo que está bien
61
+ - <algo real y específico>
62
+
63
+ ---
64
+ _Revisión asistida por dai. La aprobación la firma un humano (Art. 5 del manifiesto)._
65
+ ```
66
+
67
+ ## Dos cortes duros
68
+
69
+ 1. **No aprobar.** La skill **comenta**, no firma la aprobación. Eso es de un humano.
70
+ 2. **Hallazgos concretos.** Nada de "mejorar la calidad" en abstracto: archivo, línea,
71
+ y el porqué. Si no es accionable, no va.
72
+
73
+ ## Relación con el modelo
74
+
75
+ - Es el paso 6 de [`SCRUM-CON-IA.md`](../../docs/SCRUM-CON-IA.md).
76
+ - Se apoya en `dai check` (ADR-0003) y en el forge adapter (`dai forge`, ADR-0002:
77
+ lo mecánico en el CLI, la inteligencia en la skill).
78
+ - El comentario estándar hace que todos los reviews del equipo se lean igual.
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: doc-to-backlog
3
+ description: Toma un documento de análisis (PDF, Word, o un archivo en Drive/SharePoint/ClickUp vía MCP) y produce un BACKLOG CANDIDATO — un mapa de épicas y User Stories propuestas — para que el funcional lo priorice y lo valide. NO emite US ni épicas finales: extrae candidatos marcados "sin validar" y hace handoff de cada sobreviviente a grill-epic / grill-user-story (modo refinar). Es la puerta de entrada del caso "llegué con un documento y quiero sacar el backlog". Invocar como /doc-to-backlog con el path o el link del documento. Usar antes de grill-epic / grill-user-story cuando el input es un doc grande.
4
+ ---
5
+
6
+ # doc-to-backlog
7
+
8
+ Convierte un **documento de análisis** en un **backlog candidato** (épicas + US), para
9
+ arrancar el trabajo funcional cuando el input no es una idea suelta sino un PDF/Word con
10
+ todo el proyecto adentro.
11
+
12
+ Llena [templates/backlog-candidato.md](templates/backlog-candidato.md) — es la única
13
+ fuente de verdad de la forma del mapa. Nunca lo reescribas inline.
14
+
15
+ ## El principio que NO se negocia
16
+
17
+ **El documento SIEMBRA el grilling, no lo reemplaza.** Un doc tienta a "genera 40 US de
18
+ una" — eso es vibe coding de requerimientos: salen US que nadie validó, de features que
19
+ quizás nadie necesita. Por eso esta skill **no publica nada final**: produce **candidatos**,
20
+ el humano prioriza, y recién ahí cada ítem pasa por su grill ([Art. 4](../../docs/MANIFIESTO.md#art-4) y Art. 5).
21
+
22
+ ## Input
23
+
24
+ - **El documento:** path a un PDF/Word local, o un link a Drive/SharePoint/ClickUp
25
+ (traelo por **MCP** si está conectado). Claude lee PDFs de forma nativa.
26
+ - Si no viene, pedirlo.
27
+
28
+ ## Proceso — 3 fases
29
+
30
+ ### ① Extraer (la IA lee)
31
+
32
+ 1. Leer el documento entero.
33
+ 2. Armar el **mapa de candidatos**: las **épicas** que el doc sugiere, y bajo cada una,
34
+ las **US candidatas**. Cada ítem con un título corto y una línea de qué cubre.
35
+ 3. **Anotar la procedencia:** de qué sección/página del doc salió cada candidato (para
36
+ poder trazar de vuelta al análisis).
37
+ 4. Marcar TODO como **`sin validar`**. Es una hipótesis, no un backlog final.
38
+
39
+ ### ② Triage (el humano decide)
40
+
41
+ 5. Presentar el mapa y **frenar**: el doc es un **menú, no un mandato**. Pedir al
42
+ funcional que **priorice y corte** — qué entra, qué queda para después, qué se
43
+ descarta. No todo lo que está en el doc hay que construirlo.
44
+ 6. Para lo dudoso, sugerir pasar por `/grill-intent` (Gate 0): ¿este ítem resuelve un
45
+ problema real, o está en el doc "por las dudas"?
46
+
47
+ ### ③ Routear (cada sobreviviente a su grill)
48
+
49
+ 7. **No grillar todo de golpe.** Empezar por la **rebanada priorizada** (las 1–3 épicas o
50
+ US más importantes), no las 40 (Art. 14).
51
+ 8. Handoff, en modo **refinar** (el doc pre-llena, el grill cubre solo los huecos):
52
+ - épica candidata → `/grill-epic` (con el fragmento del doc como fuente)
53
+ - US candidata (suelta) → `/grill-user-story`
54
+ 9. Recién en ese paso se publica en el tracker, testeable y linkeable (`dai link-us`).
55
+
56
+ ## Dos cortes duros
57
+
58
+ 1. **No emitir US/épicas finales desde el doc.** Solo candidatos. Lo final sale del grill,
59
+ con el humano respondiendo. Si te descubres "completando" criterios que el doc no dice,
60
+ detente: eso lo define el funcional en el grill.
61
+ 2. **No ahogar.** Un doc de 60 páginas puede sugerir 50 ítems. Prioriza y entrega la
62
+ rebanada de arriba; el resto queda en el mapa candidato, listo para más tarde.
63
+
64
+ ## Relación con el modelo
65
+
66
+ - **Es la puerta de entrada** del caso bulk. Reemplaza "idea suelta" por "doc" como fuente.
67
+ - **Abajo:** `grill-epic` (épicas) y `grill-user-story` (US) toman cada candidato y lo
68
+ vuelven artefacto válido. `grill-intent` desafía el problema de los dudosos.
69
+ - **No toca el link:** el `implements.yaml` y el `ac_hash` viven a nivel US, mucho después
70
+ (`dai link-us`). Esta skill solo prepara el QUÉ.
@@ -0,0 +1,49 @@
1
+ <!--
2
+ BACKLOG CANDIDATO · lo produce la skill doc-to-backlog
3
+ ─────────────────────────────────────────────────────────────────
4
+ Es un BORRADOR para triage, NO un backlog final. Nada de acá se publica
5
+ en el tracker hasta que pase por grill-epic / grill-user-story.
6
+ Todo arranca en estado "sin validar".
7
+ -->
8
+
9
+ # Backlog candidato — <nombre del proyecto>
10
+
11
+ > **Fuente:** <documento.pdf / link de Drive> · Extraído por `doc-to-backlog`
12
+ > **Estado:** 🟡 candidato, sin validar — pendiente de triage y grilling.
13
+
14
+ ## Resumen
15
+
16
+ 2–3 líneas de qué es el proyecto según el documento. Sin interpretar de más.
17
+
18
+ ## Épicas candidatas
19
+
20
+ ### E1 · <título de la épica> 🟡 sin validar
21
+ - **Qué cubre:** <una línea>
22
+ - **Procedencia:** <sección / página del doc>
23
+ - **Prioridad:** _(la pone el funcional en el triage)_
24
+ - **US candidatas:**
25
+ - [ ] <título US> — <una línea> · _proc: <ref>_
26
+ - [ ] <título US> — <una línea> · _proc: <ref>_
27
+
28
+ ### E2 · <título de la épica> 🟡 sin validar
29
+ - **Qué cubre:** …
30
+ - **US candidatas:** …
31
+
32
+ ## US sueltas candidatas (sin épica)
33
+
34
+ - [ ] <título US> — <una línea> · _proc: <ref>_
35
+
36
+ ## Dudas para el triage
37
+
38
+ Ítems que quizás NO haya que construir (candidatos a `/grill-intent` — Gate 0):
39
+
40
+ - <ítem> — <por qué es dudoso / qué habría que confirmar>
41
+
42
+ ---
43
+
44
+ <!--
45
+ PRÓXIMO PASO (no lo hace esta skill sola):
46
+ 1. El funcional prioriza y corta este mapa (menú, no mandato).
47
+ 2. La rebanada de arriba se rutea: épicas → /grill-epic, US → /grill-user-story.
48
+ 3. Recién ahí se publica en el tracker, testeable y linkeable.
49
+ -->
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: grill-epic
3
+ description: Interroga a un PO o analista funcional para producir una ÉPICA bien formada — un bloque grande de valor de negocio que se parte en varias User Stories — siguiendo el template del método. O toma una US que resultó demasiado grande y la promueve a épica. Se queda a nivel funcional/alcance: define el objetivo de negocio y la partición en US, NUNCA criterios de aceptación (esos viven en cada US) ni diseño técnico. Al terminar, publica la épica en Jira/ClickUp (o deja un .md) y hace handoff de cada US hija a grill-user-story. Invocar como /grill-epic, opcionalmente con un título, un ID/URL del tracker, o una US grande a promover. Usar cuando algo es demasiado grande para una sola US.
4
+ ---
5
+
6
+ # grill-epic
7
+
8
+ Producir una **épica** por interrogación, no por generación. Una épica es un **bloque
9
+ grande de valor de negocio** que se parte en varias User Stories. Es el nivel de
10
+ arriba de la US: define el **alcance**, no el detalle.
11
+
12
+ Llena [templates/epica.md](../../templates/epica.md) — es la única fuente de verdad de
13
+ la forma. Nunca reescribas el formato inline.
14
+
15
+ ## Qué es (y qué NO es) una épica
16
+
17
+ - **Es** un contenedor: agrupa US que juntas entregan una capacidad grande.
18
+ - **No se implementa directamente** — las US que la componen son las que viajan por el
19
+ flujo (`grill-user-story` → `dai link-us` → …). El link QUÉ↔CÓMO vive a nivel US.
20
+ - **No tiene criterios de aceptación** — esos son de cada US. La épica tiene objetivo
21
+ de negocio, alcance y métricas de éxito.
22
+
23
+ ## Inputs (cualquier combinación)
24
+
25
+ - **Título** — nombre corto de la épica.
26
+ - **ID / URL del tracker** — si ya existe el ticket.
27
+ - **Fuente:**
28
+ - *Desde cero* — solo una idea grande. Grillar desde 0.
29
+ - *Promover una US* — una US que resultó demasiado grande (viene de `grill-user-story`).
30
+ Leerla, y usar su contenido como material para la partición.
31
+
32
+ ## Dos cortes duros (no negociables)
33
+
34
+ 1. **Cortar en los criterios de aceptación.** Si la charla deriva a definir ACs
35
+ testeables, frenar: "eso es de cada US, no de la épica". La épica define *qué
36
+ capacidades* entran, no *cómo se verifica cada una*.
37
+ 2. **Cortar en lo técnico.** Endpoints, tablas, arquitectura → es diseño, va mucho
38
+ después. La épica es puro negocio de alto nivel.
39
+
40
+ ## Proceso
41
+
42
+ 1. **Resolver inputs.** Título e ID del tracker. Si se promueve una US, leerla.
43
+ 2. **Grillar, un eje por vez.** Preguntar, escuchar, profundizar. Cubrir en orden:
44
+ - **Objetivo de negocio** — qué resultado grande persigue, y *por qué ahora*.
45
+ - **Alcance** — qué entra y qué **no** entra (el límite grueso que las US respetan).
46
+ - **Partición en US** — el eje central: partir la épica en **User Stories
47
+ independientes**, cada una con valor propio y que quepa en un sprint (INVEST).
48
+ Nombrar cada una con un título corto. No detallar los criterios acá.
49
+ - **Métricas de éxito** — indicadores de negocio de la épica entera.
50
+ - **Dependencias y riesgos** — qué tiene que existir antes o en paralelo.
51
+ 3. **Chequeo de tamaño (al revés que en la US).**
52
+ - Si la "épica" **no se puede partir** en US independientes, probablemente sea **una
53
+ sola US grande** — devolverla a `grill-user-story`, no forzar una épica.
54
+ - Si una US hija sigue siendo enorme, puede ser una **sub-épica** — raro; primero
55
+ revisar si el corte está bien.
56
+ 4. **Emitir + publicar** (ver abajo).
57
+
58
+ ## Salida — publicar + handoff a las US
59
+
60
+ 1. **Armar la épica** con el formato de `templates/epica.md`: metadata (`ID`, autor,
61
+ estado, US que la componen) + objetivo + alcance (in/out) + lista de US + métricas +
62
+ dependencias.
63
+ 2. **Publicar en el tracker** (según `DAI_PM` del `.env`: `jira` → MCP de Atlassian ·
64
+ `clickup` → MCP de ClickUp · `md`/sin token → `.md` para pegar a mano). **No asumas
65
+ el tracker: lee `DAI_PM` primero.** Crear el ticket de épica; las US hijas se crean
66
+ como tickets vinculados (o quedan listadas para crearse).
67
+ 3. **Handoff.** Ofrecer pasar **cada US hija** por `/grill-user-story` para convertirla
68
+ de "título en la lista" a US testeable con criterios. Ese es el paso que las hace
69
+ linkeables (`dai link-us`).
70
+
71
+ ## Relación con el modelo
72
+
73
+ - **Arriba:** `grill-intent` puede desafiar el *problema* de la épica antes de armarla.
74
+ - **Abajo:** cada US de la partición pasa por `grill-user-story` → `dai link-us`.
75
+ - El link QUÉ↔CÓMO y el `ac_hash` viven **a nivel US**, nunca de épica (la épica agrupa,
76
+ no se implementa).
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: grill-intent
3
+ description: Gate 0 of the SDD workflow — challenge the *problem* behind a clean user story before any spec is generated. Interrogates whether this is the right problem, for the right user, within constraints, and whether the story's implied solution is a premature jump. Produces intent.md and a verdict that can be "go to spec", "reframe", or "don't build". In the spirit of grill-me, specialized for problem-challenge. Invoke as /grill-intent on a user story (the output of grill-user-story). Use after grill-user-story and before openspec propose.
4
+ ---
5
+
6
+ # grill-intent — Gate 0, challenge the problem
7
+
8
+ The highest-ROI gate in the cycle: catch the wrong feature *before* a single spec artifact is written. This challenges the problem behind a user story — it does not construct the story (`grill-user-story` did that) and does not design the solution (`openspec propose` / `design.md` does that).
9
+
10
+ A valid outcome is "don't build this" or "the real problem is different". That is the point of Gate 0, not a failure of it.
11
+
12
+ Fill [templates/intent.md](templates/intent.md). That template is the single source of truth for the shape — never restate it inline.
13
+
14
+ ## Input
15
+
16
+ - The clean user story (output of `grill-user-story`).
17
+ - The constitution: `openspec/project.md`, `CLAUDE.md`, and the team's AI-native manifesto — the immutable constraints the problem must live within.
18
+
19
+ ## The challenge (five axes)
20
+
21
+ Pull *up* from the story's "I want Y" to the problem underneath, and pressure-test it:
22
+
23
+ 1. **Right problem** — what actually hurts today, in the user's terms? Is the story solving that, or a symptom?
24
+ 2. **Right user** — who genuinely has this pain? Reject a generic actor; name the one who feels it.
25
+ 3. **Why now / cost of inaction** — what happens if we don't do this? If "nothing much", that's a signal to stop.
26
+ 4. **Constraints** — does the problem collide with anything in the constitution (security, stack, roles, performance, branding, hard limits)?
27
+ 5. **Solution-lock** — the story says "I want Y". Is Y a premature jump? Is there a cheaper or different way to solve the *same* problem? Could we solve it by *not building*?
28
+
29
+ ## Two hard cuts (non-negotiable)
30
+
31
+ 1. **Cut on solutioning.** If the conversation slides into how to build it, or even into shaping the feature's behaviour, stop it: "we're testing the problem, not designing the solution." Design is later.
32
+ 2. **Cut on rubber-stamping.** Do not emit the intent until the problem has actually survived a challenge — at minimum axes 1, 3 and 5 answered with something real. Approving the story's implicit problem unexamined is the exact failure this gate exists to prevent.
33
+
34
+ ## Process
35
+
36
+ 1. **Read** the user story and the constitution.
37
+ 2. **Challenge, one axis at a time.** grill-me discipline: ask, listen, push, move on. Don't dump the five questions at once.
38
+ 3. **Reach a verdict** — `a-spec` (problem survived, go to propose), `reframe` (the real problem is different, back to `grill-user-story`), or `descartar` (not worth solving now, stop and record why).
39
+ 4. **Emit** the filled `intent.md` (default location `openspec/intents/<YYYYMMDD-slug>/intent.md`; adjust to where the manifesto puts intents). Embed the tracker ID (the issue/task key — Jira or ClickUp, per `DAI_PM` in the repo's `.env`) and the source story.
40
+
41
+ ## Hand-off
42
+
43
+ If the verdict is `a-spec`, the validated `intent.md` plus the user story together are the description you hand to `/openspec:proposal` — propose explores the specs and codebase itself and generates `proposal.md`, `design.md`, `tasks.md` and the `specs/` deltas. If `reframe`, return to the story. If `descartar`, stop — that is the gate doing its highest-value work.
@@ -0,0 +1,36 @@
1
+ <!-- Plantilla canónica de intent (Gate 0). Define y DESAFÍA el problema, antes de la solución.
2
+ La llena grill-intent. No describe el cómo ni la solución — eso es openspec propose / design.md. -->
3
+
4
+ # Intent: <slug del problema>
5
+
6
+ > US de origen: <link o título> · ClickUp: <id> · Veredicto: pendiente | a-spec | reframe | descartar
7
+
8
+ ## Problema
9
+
10
+ <Qué duele hoy, en términos del usuario. No la solución. Un párrafo.>
11
+
12
+ ## Usuario / actor
13
+
14
+ <Quién tiene realmente este problema. Concreto, nunca "el usuario".>
15
+
16
+ ## Por qué ahora / costo de no hacerlo
17
+
18
+ <Qué pasa si no lo resolvemos. Si la respuesta honesta es "nada grave", eso es una señal.>
19
+
20
+ ## Restricciones
21
+
22
+ <Lo que la constitution / el contexto impone: seguridad, stack, performance, roles, branding, límites absolutos.>
23
+
24
+ ## No-goals
25
+
26
+ <Lo que este intent explícitamente NO abarca. Corta el scope creep desde la raíz.>
27
+
28
+ ## Alternativas consideradas
29
+
30
+ <Otras formas de resolver el MISMO problema — incluidas "no hacer nada" y "una solución más barata". Por qué la dirección elegida.>
31
+
32
+ ## Veredicto
33
+
34
+ <a-spec: el problema sobrevivió el desafío → pasa a openspec propose.
35
+ reframe: el problema real es otro → volver a grill-user-story.
36
+ descartar: no vale la pena resolverlo ahora → motivo.>
@@ -0,0 +1,76 @@
1
+ ---
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".
4
+ ---
5
+
6
+ # grill-user-story
7
+
8
+ Producir una buena User Story **por interrogación, no por generación**. Es la puerta de entrada funcional del pipeline de specs (el QUÉ): su salida alimenta `opsx:propose` del lado técnico. Trabaja **solo a nivel usuario/solución** — el grill técnico ocurre después, en el `design.md` del dev.
9
+
10
+ Llena [templates/user-story.md](templates/user-story.md). El formato completo y su racional viven en [../../templates/formato-us.md](../../templates/formato-us.md) — es la única fuente de verdad de la forma. Nunca reescribas el formato inline.
11
+
12
+ ## Por qué el formato importa (modelo de trazabilidad)
13
+
14
+ Esta US es el **QUÉ linkeable**. El `implements.yaml` del repo la va a referenciar por su **ID del tracker**, y `dai stamp` la usa para estampar cobertura. Por eso la salida DEBE tener:
15
+ - **ID** = el ticket del tracker (`ABC-###` en Jira, `86xxxx` en ClickUp) — identidad estable.
16
+ - **spec_version** = `v1` al nacer.
17
+ - **Criterios de aceptación en Gherkin** — es el bloque que se hashea (`ac_hash`); tienen que ser estables y testeables.
18
+ - **Autor** = quién la definió.
19
+
20
+ ## Inputs (cualquier combinación, por argumento o preguntando)
21
+
22
+ - **Título** — nombre corto de la historia.
23
+ - **ID / URL de Jira** — si ya existe el ticket, para preservar el seam con el PM.
24
+ - **Fuente**:
25
+ - *Desde cero* — solo un título o idea. Grillar desde 0.
26
+ - *Refinar existente* — una US vaga ya escrita (texto pegado o path de archivo). Leerla primero, diagnosticar qué falta contra el formato, y grillar solo los huecos — no re-preguntar lo que ya está claro.
27
+
28
+ Si no viene nada, pedir título y si hay un borrador existente.
29
+
30
+ ## Tres cortes duros (no negociables)
31
+
32
+ 1. **Cortar en lo técnico.** Si la charla deriva a tablas, endpoints, migraciones o elección de framework, frenar: "eso es diseño, no ahora". La US nombra *qué necesita el usuario*, nunca *cómo se construye*.
33
+ 2. **Cortar en lo no testeable.** Nunca emitir un criterio que no pueda volverse un test. "El usuario tiene una buena experiencia" se rechaza. "Un carrito vacío no se puede finalizar" se acepta — funcional y verificable. Empujar cada AC hasta que sea observable.
34
+ 3. **Publicar, no pedir.** Si el tracker está configurado (`DAI_PM=jira|clickup` con token en `.env`), **CREA el ticket tú** (por MCP o con `dai publish`). **Nunca** cierres pidiéndole al usuario que te "pase el ID/URL del ticket" como si ya existiera — el ticket lo creas tú en este paso. Solo pides un ID existente si el usuario dijo explícitamente que está refinando una US ya creada.
35
+
36
+ ## Proceso
37
+
38
+ 0. **Detectar el tracker (SIEMPRE, antes de nada).** Lee el archivo `.env` del repo y observa `DAI_PM`:
39
+ - `DAI_PM=jira` → publicas en **Jira** (base: `DAI_JIRA_BASE_URL`), vía el MCP de Atlassian/Jira.
40
+ - `DAI_PM=clickup` → publicas en **ClickUp**, vía el MCP de ClickUp.
41
+ - `DAI_PM=md` (o sin `.env`) → no hay tracker: dejas la US como `.md`.
42
+ **No asumas el tracker** — depende del `.env`. Si no hay `.env`, pregunta cuál usa el equipo.
43
+ 1. **Resolver inputs.** Obtener título e ID del tracker (si existe). Si se refina, leer la US y anotar — para uno mismo — qué secciones del formato faltan o están flojas: rol genérico ("el usuario"), falta el "para", sin flujo de excepción, solución prefijada, ACs vagos.
44
+ 2. **Grillar, un eje por vez.** No tirar un cuestionario — preguntar, escuchar, profundizar, y seguir. Cubrir en orden:
45
+ - **Título** — corto, **3 a 6 palabras**, nombra la capacidad (de ahí sale la branch). Si el título es una frase larga, acórtalo: el detalle va en la descripción, no en el título. Ej: "Confirmar acciones con consecuencias", no "Confirmación deliberada antes de ejecutar acciones con consecuencias".
46
+ - **Quién** — el usuario/rol real. Rechazar "el usuario"; conseguir el actor concreto.
47
+ - **Job-to-be-done** — qué intenta lograr de verdad, y el *por qué* (el "para").
48
+ - **Flujos** — happy path primero, después alternativos, después excepciones: "¿qué pasa cuando no es válido / no está permitido / está vacío?"
49
+ - **Criterios de aceptación** — convertir cada flujo en una condición funcional y testeable, en Gherkin. Aplicar el corte #2 acá, fuerte.
50
+ - **Fuera de scope** — qué NO hace esta historia (mata el scope creep más adelante).
51
+ 3. **Chequeo de tamaño (INVEST).** Si los flujos y ACs desbordan y la historia se dispersa, es demasiado grande para una sola US. No seguir empujando: **promoverla a una épica** con `/grill-epic` (que la parte en varias US independientes) y después volver acá para grillar cada US hija. Una US que no entra en un sprint es la señal de que hay una épica adentro.
52
+ 4. **Publicar la US en el tracker (PASO OBLIGATORIO, ver abajo).** No termines con "¿la guardo y/o disparo el siguiente paso?": el trabajo de esta skill **incluye dejar la US publicada** en el tracker (con su key), no solo redactarla.
53
+
54
+ ## Salida — publicar en el tracker (según `DAI_PM`), con fallback a .md
55
+
56
+ La US se produce UNA vez con el formato de `../../templates/formato-us.md`. Lo que cambia es **dónde se publica** — lo definió el paso 0:
57
+
58
+ 1. **Armar la US** completa: metadata de trazabilidad (`ID`, `spec_version: v1`, autor, repos esperados) + historia + contexto + casos de uso + criterios Gherkin + fuera de scope + reglas + dependencias + métricas.
59
+ 2. **Publicar en el tracker que dice `DAI_PM`:**
60
+ - **Jira** (`DAI_PM=jira`): vía el MCP de Atlassian, crear/actualizar el issue en `DAI_JIRA_BASE_URL` — título (summary), descripción, y los **criterios bajo un heading `## Criterios de aceptación`** (es lo que `dai` hashea). El issue devuelve el key (`ABC-###`).
61
+ - **ClickUp** (`DAI_PM=clickup`): vía el MCP de ClickUp, crear/actualizar la tarea con los criterios en la descripción, bajo el mismo heading. Devuelve el task ID.
62
+ - Confirmar al usuario con el link al ticket publicado.
63
+ - **Importante:** los criterios SIEMPRE van bajo `## Criterios de aceptación` en la descripción — así `dai link-us`/`check` los encuentran, sin importar el tracker.
64
+ 3. **Fallback SIN MCP → publicar con el CLI (`dai publish`):**
65
+ - Si NO hay MCP del tracker conectado (pero sí `DAI_PM=jira|clickup` + token en `.env`):
66
+ escribe la US como `.md` (formato `formato-us.md`) y publícala con el comando:
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`.)
69
+ - Si tampoco hay token (o `DAI_PM=md`): deja solo el `.md` para que la persona lo
70
+ pegue a mano en el tracker. Avisa el motivo.
71
+ - 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).
73
+
74
+ ## Hand-off
75
+
76
+ La US terminada es el input de `opsx:propose`, que produce las capas técnicas (`design.md`, `specs/`, `tasks.md`) y donde el dev declara el link con la skill `link-us`. El grill técnico —modelo de datos, roles, migraciones— ocurre ahí, con un dev o arquitecto, no acá.
@@ -0,0 +1,61 @@
1
+ <!-- Plantilla canónica de historia de usuario · Modelo de Trazabilidad QUÉ↔CÓMO.
2
+ Funcional y de alto nivel: sin tecnología. La llena la skill grill-user-story.
3
+ Formato completo y su racional en ../../formato-us.md (fuente de verdad de la forma). -->
4
+
5
+ # 🔗 Metadata de trazabilidad
6
+
7
+ | Campo | Valor |
8
+ |-------|-------|
9
+ | **ID** | `ABC-###` |
10
+ | **spec_version** | `v1` |
11
+ | **Autor** | `<PO / analista>` |
12
+ | **Estado** | `borrador` |
13
+ | **Repos esperados** | `<frontend, bff, backend — opcional>` |
14
+
15
+ # <título de la historia>
16
+
17
+ ## Historia
18
+
19
+ Como <rol / tipo de usuario concreto, nunca "el usuario">
20
+ quiero <capacidad o resultado>
21
+ para <valor / por qué>.
22
+
23
+ ## Contexto / Problema
24
+
25
+ Por qué esto importa ahora. Qué duele hoy sin esta funcionalidad.
26
+
27
+ ## Casos de uso
28
+
29
+ Flujos a nivel usuario — qué hace la persona y qué responde el sistema. Sin tecnología.
30
+
31
+ - **Happy path** — <el usuario hace X, obtiene Y>
32
+ - **Alternativo** — <variación esperada del flujo>
33
+ - **Excepción** — <qué pasa cuando algo no es válido, no está permitido, o está vacío>
34
+
35
+ ## Criterios de aceptación
36
+
37
+ Gherkin (Dado / Cuando / Entonces). Cada uno tiene que poder convertirse en un test.
38
+ Este bloque es lo que se hashea (ac_hash) — orden estable, sin tecnología.
39
+
40
+ - [ ] **AC-1** — Dado <precondición>, cuando <acción>, entonces <resultado observable>
41
+ - [ ] **AC-2** — Dado <...>, cuando <...>, entonces <...>
42
+
43
+ ## Reglas de negocio
44
+
45
+ - <invariante / límite / restricción de dominio>
46
+
47
+ ## Fuera de scope
48
+
49
+ - <lo que esta historia explícitamente NO hace>
50
+
51
+ ## Dependencias
52
+
53
+ - <ABC-### / sistema / decisión previa>
54
+
55
+ ## Métricas de éxito
56
+
57
+ - <indicador de negocio observable>
58
+
59
+ ## Preguntas abiertas
60
+
61
+ - <lo que necesita una decisión antes de implementar>
@@ -0,0 +1,42 @@
1
+ ---
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.
4
+ ---
5
+
6
+ # link-us
7
+
8
+ Arranca la implementación de una User Story **atándola al QUÉ desde el primer commit**. El dev no escribe el key de Jira a mano en ningún lado: la branch y el `implements.yaml` salen los dos del mismo ID, así el link no puede quedar mal tipeado.
9
+
10
+ Es la contraparte técnica de `grill-user-story`: donde esa produce el QUÉ (en Jira), esta abre el CÓMO (en el repo) ya linkeado.
11
+
12
+ ## Input
13
+
14
+ - **ID o URL de la US en Jira** — `ABC-###` o el link completo. Es lo único obligatorio.
15
+ - Si no viene, pedirlo. Validar el formato del key antes de seguir; si no matchea `ABC-\d+`, frenar y avisar.
16
+
17
+ ## Proceso
18
+
19
+ 1. **Resolver el key.** Extraer `ABC-###` del argumento (acepta key crudo o URL). Este key es la **única fuente** de todo lo que sigue — no re-tipearlo.
20
+ 2. **Traer la US (si se puede).**
21
+ - Si hay **MCP de Jira/Atlassian** o **token** (`JIRA_BASE_URL` + `JIRA_TOKEN`): traer título, `spec_version` y el bloque de **criterios de aceptación**.
22
+ - Calcular `ac_hash` = hash del bloque de criterios normalizado (whitespace colapsado, orden estable).
23
+ - Si no hay acceso a Jira: pedir al dev el título y la `spec_version`, o leer un `.md` local de la US; dejar `ac_hash` como `pendiente` con un aviso de que el CI lo completará.
24
+ 3. **Crear la branch, sin margen de error.**
25
+ - Nombre: `feature/ABC-###-<slug>` donde `<slug>` sale del título (minúsculas, sin acentos, `-` como separador).
26
+ - Base según convención del repo (`main` o `develop`). Verificar que la branch no exista ya.
27
+ - No permitir crear la branch si el key no fue validado en el paso 1.
28
+ 4. **Generar el link.** Crear `openspec/changes/<change-id>/implements.yaml` a partir de [templates/implements.yaml](templates/implements.yaml), completando `id`, `version`, `ac_hash`, `repo` y `autor`. Dejar `introduces` para que el dev liste las capacidades técnicas nuevas.
29
+ 5. **Hand-off.** Ofrecer seguir con `opsx:explore` → `opsx:propose` para armar el change (proposal/design/tasks) sobre la branch ya creada y linkeada.
30
+
31
+ ## Guardrails (por qué esta skill existe)
32
+
33
+ - **El key nunca se tipea a mano** en la branch ni en el `implements.yaml`: ambos derivan del argumento validado. Elimina el error de tipeo que rompe la trazabilidad.
34
+ - **Sin `implements.yaml`, no hay link** — y el CI del repo falla el PR si falta. Esta skill garantiza que exista desde el arranque.
35
+ - **El link apunta del CÓMO al QUÉ** (`implements: ABC-###`), nunca al revés. La cobertura inversa la genera el CI, no esta skill.
36
+
37
+ ## Relación con el modelo
38
+
39
+ - `grill-user-story` → produce el QUÉ en Jira (`ABC-###`).
40
+ - **`link-us`** → abre el CÓMO en el repo, ya atado a ese `ABC-###`.
41
+ - El CI → al mergear, estampa en Jira "implementado por &lt;repo&gt; @&lt;version&gt; ✓".
42
+ - El CD → al desplegar, reporta en qué ambiente (dev/test/pre/prod) quedó viva esa versión.
@@ -0,0 +1,16 @@
1
+ # Link QUÉ↔CÓMO · lo genera link-us / `dai link-us`, lo versiona git junto al código.
2
+ # Es el ÚNICO link autorado a mano. La cobertura inversa la deriva `dai stamp`.
3
+ # Schema: docs/adr/0004-ubicacion-y-schema-implements.md
4
+
5
+ change: <change-id> # ← identidad del CÓMO (nombre local del change/spec). Auto-contenido.
6
+ repo: <nombre-del-repo> # ← p. ej. frontend
7
+
8
+ implements: # FORWARD: qué QUÉ del negocio cumple este change
9
+ - id: ABC-### # ← ticket de Jira/ClickUp (identidad del QUÉ). NO tipear a mano: lo pone link-us.
10
+ version: v1 # ← spec_version de la US al momento de implementar (nº legible)
11
+ ac_hash: <autogenerado> # ← lo calcula `dai ac-hash`. Dispara el ⚠️ si el QUÉ cambia.
12
+
13
+ introduces: # capacidades TÉCNICAS nuevas que agrega este change (opcional)
14
+ - <capacidad-tecnica> # p. ej. guard-carrito-vacio
15
+
16
+ autor: <dev> # quién implementa