@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
package/index.html ADDED
@@ -0,0 +1,479 @@
1
+ <!doctype html>
2
+ <html lang="es">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>dai — Desarrollo Asistido por IA con trazabilidad</title>
7
+ <meta name="description" content="Un método y un CLI para que la IA programe con trazabilidad y sin vibe coding. Separa el QUÉ del CÓMO, linkéalos una vez, y que la máquina avise sola cuando se desincronizan. Se adapta a cualquier tamaño de equipo." />
8
+ <!-- Favicon SVG inline (sin CDN, nítido en cualquier resolución) -->
9
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%236366f1'/%3E%3Cstop offset='1' stop-color='%230ea5e9'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='64' height='64' rx='14' fill='url(%23g)'/%3E%3Ctext x='32' y='48' font-family='ui-sans-serif,system-ui,Arial' font-size='44' font-weight='800' fill='white' text-anchor='middle'%3Ed%3C/text%3E%3C/svg%3E" />
10
+ <meta name="theme-color" content="#6366f1" />
11
+ <style>
12
+ /* Autocontenido: fuentes del sistema + diagramas en CSS. Sin CDN → anda offline. */
13
+ :root{
14
+ --bg:#0b1120; --card:#131c2e; --ink:#eef2f8; --mut:#94a3b8; --line:#263247;
15
+ --brand:#6366f1; --brand-dark:#4f46e5;
16
+ --func:#f59e0b; --func-soft:#3a2f12; --func-ink:#fbbf24; /* el QUÉ */
17
+ --tech:#0ea5e9; --tech-soft:#10273b; --tech-ink:#7dd3fc; /* el CÓMO */
18
+ --ci:#10b981; --ci-soft:#0f2c22; --ci-ink:#6ee7b7; /* la máquina */
19
+ --danger:#ef4444;
20
+ --mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
21
+ --sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
22
+ }
23
+ :root[data-theme="light"]{
24
+ --bg:#f8fafc; --card:#ffffff; --ink:#0f172a; --mut:#475569; --line:#e2e8f0;
25
+ --func-soft:#fef3c7; --func-ink:#92400e; --tech-soft:#e0f2fe; --tech-ink:#075985;
26
+ --ci-soft:#d1fae5; --ci-ink:#065f46;
27
+ }
28
+ @media (prefers-color-scheme: light){
29
+ :root:not([data-theme="dark"]){
30
+ --bg:#f8fafc; --card:#ffffff; --ink:#0f172a; --mut:#475569; --line:#e2e8f0;
31
+ --func-soft:#fef3c7; --func-ink:#92400e; --tech-soft:#e0f2fe; --tech-ink:#075985;
32
+ --ci-soft:#d1fae5; --ci-ink:#065f46;
33
+ }
34
+ }
35
+ *{box-sizing:border-box}
36
+ html{scroll-behavior:smooth}
37
+ body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);
38
+ line-height:1.6;-webkit-font-smoothing:antialiased}
39
+ .wrap{max-width:960px;margin:0 auto;padding:0 20px}
40
+ a{color:var(--brand);text-decoration:none}
41
+ a:hover{text-decoration:underline}
42
+ code,kbd{font-family:var(--mono);font-size:.9em}
43
+ h1,h2,h3{line-height:1.2;letter-spacing:-.02em}
44
+ section{padding:64px 0;border-top:1px solid var(--line)}
45
+ .eyebrow{font-family:var(--mono);font-size:.8rem;letter-spacing:.08em;
46
+ text-transform:uppercase;color:var(--mut);margin:0 0 8px}
47
+ h2{font-size:clamp(1.5rem,4vw,2rem);margin:0 0 8px}
48
+ .lede{color:var(--mut);font-size:1.05rem;max-width:62ch;margin:0 0 28px}
49
+
50
+ /* ---------- nav ---------- */
51
+ nav{position:sticky;top:0;z-index:10;backdrop-filter:blur(10px);
52
+ background:color-mix(in srgb,var(--bg) 82%,transparent);border-bottom:1px solid var(--line)}
53
+ nav .wrap{display:flex;align-items:center;gap:16px;height:56px}
54
+ nav .logo{font-weight:800;letter-spacing:-.03em}
55
+ nav .logo b{color:var(--brand)}
56
+ nav .sp{flex:1}
57
+ nav a.nl{color:var(--mut);font-size:.9rem}
58
+ nav a.nl:hover{color:var(--ink);text-decoration:none}
59
+ .toggle{cursor:pointer;border:1px solid var(--line);background:var(--card);
60
+ color:var(--ink);border-radius:8px;padding:5px 9px;font-size:.85rem}
61
+ @media(max-width:640px){nav a.nl{display:none}}
62
+
63
+ /* ---------- hero ---------- */
64
+ .hero{padding:80px 0 64px;text-align:center}
65
+ .hero h1{font-size:clamp(2.2rem,7vw,3.6rem);margin:0 0 16px;font-weight:900}
66
+ .hero h1 .g{background:linear-gradient(120deg,var(--brand),var(--tech));
67
+ -webkit-background-clip:text;background-clip:text;color:transparent}
68
+ .hero p{color:var(--mut);font-size:1.2rem;max-width:60ch;margin:0 auto 28px}
69
+ .cta{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
70
+ .btn{display:inline-block;padding:11px 20px;border-radius:10px;font-weight:600;font-size:.95rem}
71
+ .btn.p{background:var(--brand);color:#fff}
72
+ .btn.p:hover{background:var(--brand-dark);text-decoration:none}
73
+ .btn.s{border:1px solid var(--line);color:var(--ink)}
74
+ .btn.s:hover{text-decoration:none;border-color:var(--brand)}
75
+ .install{margin:26px auto 0;max-width:520px;background:var(--card);border:1px solid var(--line);
76
+ border-radius:12px;padding:14px 16px;font-family:var(--mono);font-size:.9rem;text-align:left;
77
+ color:var(--ink);overflow-x:auto}
78
+ .install .c{color:var(--ci-ink)}
79
+ .install .m{color:var(--mut)}
80
+
81
+ /* ---------- pills / cards ---------- */
82
+ .grid{display:grid;gap:16px}
83
+ .g3{grid-template-columns:repeat(3,1fr)}
84
+ .g2{grid-template-columns:repeat(2,1fr)}
85
+ @media(max-width:720px){.g3,.g2{grid-template-columns:1fr}}
86
+ .card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:20px;
87
+ transition:transform .25s ease,border-color .25s ease,box-shadow .25s ease}
88
+ .card:hover{transform:translateY(-4px);border-color:color-mix(in srgb,var(--brand) 55%,var(--line));
89
+ box-shadow:0 12px 30px -12px color-mix(in srgb,var(--brand) 45%,transparent)}
90
+ .card h3{margin:0 0 6px;font-size:1.05rem}
91
+ .card p{margin:0;color:var(--mut);font-size:.95rem}
92
+
93
+ /* ---------- animaciones (reveal al scroll + hover) ---------- */
94
+ .reveal{transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.2,1)}
95
+ html.anim .reveal{opacity:0;transform:translateY(20px)}
96
+ html.anim .reveal.in{opacity:1;transform:none}
97
+ .lvl,.step .body,.side{transition:transform .25s ease}
98
+ .lvl:hover{transform:translateY(-4px)}
99
+ .install{transition:border-color .25s ease}
100
+ .install:hover{border-color:color-mix(in srgb,var(--ci) 50%,var(--line))}
101
+ @media (prefers-reduced-motion: reduce){
102
+ html.anim .reveal{opacity:1 !important;transform:none !important}
103
+ .card:hover,.lvl:hover{transform:none}
104
+ }
105
+ .ic{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;
106
+ font-size:1.1rem;margin-bottom:12px}
107
+ .ic{transition:transform .25s ease}
108
+ .ic.d{background:linear-gradient(135deg,color-mix(in srgb,var(--brand) 28%,transparent),color-mix(in srgb,var(--tech) 28%,transparent));
109
+ box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 24%,transparent)}
110
+ .ic.b{background:linear-gradient(135deg,color-mix(in srgb,var(--brand) 26%,transparent),color-mix(in srgb,var(--tech) 26%,transparent))}
111
+ .card:hover .ic{transform:scale(1.08) rotate(-3deg)}
112
+
113
+ .tag{display:inline-block;font-family:var(--mono);font-size:.72rem;font-weight:600;
114
+ padding:2px 8px;border-radius:999px;letter-spacing:.02em}
115
+ .tag.q{background:var(--func-soft);color:var(--func-ink)}
116
+ .tag.c{background:var(--tech-soft);color:var(--tech-ink)}
117
+ .tag.m{background:var(--ci-soft);color:var(--ci-ink)}
118
+
119
+ /* ---------- QUÉ vs CÓMO ---------- */
120
+ .split{display:grid;grid-template-columns:1fr auto 1fr;gap:0;align-items:stretch;
121
+ background:var(--card);border:1px solid var(--line);border-radius:16px;overflow:hidden}
122
+ @media(max-width:720px){.split{grid-template-columns:1fr}}
123
+ .side{padding:24px}
124
+ .side.q{border-right:1px solid var(--line)}
125
+ @media(max-width:720px){.side.q{border-right:0;border-bottom:1px solid var(--line)}}
126
+ .side h4{margin:0 0 4px;font-size:1.1rem}
127
+ .side .who{color:var(--mut);font-size:.85rem;margin:0 0 14px}
128
+ .side ul{margin:0;padding-left:18px;color:var(--mut);font-size:.92rem}
129
+ .link{display:grid;place-items:center;padding:0 8px;background:
130
+ color-mix(in srgb,var(--brand) 10%,transparent)}
131
+ .link .b{font-family:var(--mono);font-size:.72rem;color:var(--brand);
132
+ writing-mode:vertical-rl;transform:rotate(180deg);letter-spacing:.1em;font-weight:700}
133
+ @media(max-width:720px){.link{padding:10px}.link .b{writing-mode:horizontal-tb;transform:none}}
134
+
135
+ /* ---------- steps / journey ---------- */
136
+ .steps{position:relative;margin-top:8px}
137
+ .step{display:grid;grid-template-columns:44px 1fr;gap:18px;padding:14px 0;position:relative}
138
+ .step:not(:last-child)::before{content:"";position:absolute;left:21px;top:44px;bottom:-14px;
139
+ width:2px;background:var(--line)}
140
+ .num{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;
141
+ font-weight:800;font-family:var(--mono);background:var(--card);border:1px solid var(--line);z-index:1}
142
+ .step.q .num{border-color:var(--func);color:var(--func-ink)}
143
+ .step.c .num{border-color:var(--tech);color:var(--tech-ink)}
144
+ .step.m .num{border-color:var(--ci);color:var(--ci-ink)}
145
+ .step .body h3{margin:0 0 3px;font-size:1.08rem}
146
+ .step .body p{margin:0 0 8px;color:var(--mut);font-size:.95rem}
147
+ .step .tool{font-family:var(--mono);font-size:.82rem;background:var(--bg);
148
+ border:1px solid var(--line);border-radius:8px;padding:3px 9px;display:inline-block;color:var(--ink)}
149
+
150
+ /* ---------- traceability demo ---------- */
151
+ .demo{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:8px}
152
+ .term{font-family:var(--mono);font-size:.86rem;background:#0a0f1e;border-radius:12px;
153
+ padding:18px 18px;color:#cbd5e1;overflow-x:auto}
154
+ :root[data-theme="light"] .term{background:#0f172a;color:#e2e8f0}
155
+ @media(prefers-color-scheme:light){:root:not([data-theme="dark"]) .term{background:#0f172a;color:#e2e8f0}}
156
+ .term .p{color:#64748b}
157
+ .term .ok{color:#6ee7b7}
158
+ .term .warn{color:#fca5a5}
159
+ .term .cmd{color:#e2e8f0}
160
+ .term .dim{color:#64748b}
161
+ .term b{color:#fff;font-weight:600}
162
+
163
+ /* ---------- dial ---------- */
164
+ .dial{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
165
+ @media(max-width:720px){.dial{grid-template-columns:1fr}}
166
+ .lvl{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:18px}
167
+ .lvl .n{font-family:var(--mono);font-size:.78rem;color:var(--brand);font-weight:700}
168
+ .lvl h4{margin:6px 0 4px;font-size:1.05rem}
169
+ .lvl p{margin:0;color:var(--mut);font-size:.9rem}
170
+
171
+ /* ---------- start ---------- */
172
+ ol.start{counter-reset:s;list-style:none;padding:0;margin:0}
173
+ ol.start li{position:relative;padding:0 0 18px 40px}
174
+ ol.start li::before{counter-increment:s;content:counter(s);position:absolute;left:0;top:0;
175
+ width:26px;height:26px;border-radius:8px;background:var(--brand);color:#fff;
176
+ display:grid;place-items:center;font-weight:700;font-size:.85rem}
177
+ ol.start code{background:var(--card);border:1px solid var(--line);border-radius:7px;
178
+ padding:2px 7px;display:inline-block}
179
+ ol.start .d{color:var(--mut);font-size:.9rem}
180
+
181
+ footer{border-top:1px solid var(--line);padding:40px 0 60px;color:var(--mut);font-size:.9rem}
182
+ footer .wrap{display:flex;gap:20px;flex-wrap:wrap;align-items:center}
183
+ footer .sp{flex:1}
184
+ </style>
185
+ </head>
186
+ <body>
187
+
188
+ <nav>
189
+ <div class="wrap">
190
+ <span class="logo"><b>dai</b> · Desarrollo Asistido por IA</span>
191
+ <span class="sp"></span>
192
+ <a class="nl" href="#problema">Problema</a>
193
+ <a class="nl" href="#flujo">El flujo</a>
194
+ <a class="nl" href="#traza">Trazabilidad</a>
195
+ <a class="nl" href="#empezar">Empezar</a>
196
+ <button class="toggle" id="tg" aria-label="Cambiar tema">◐</button>
197
+ </div>
198
+ </nav>
199
+
200
+ <!-- ══════════ HERO ══════════ -->
201
+ <header class="hero wrap">
202
+ <h1>La IA programa. <span class="g">@dai te da la trazabilidad.</span></h1>
203
+ <p>Un método —y un CLI— para desarrollo asistido por IA <b>sin vibe coding</b> y con
204
+ trazabilidad real: separa el <span class="tag q">QUÉ</span> del
205
+ <span class="tag c">CÓMO</span>, linkéalos una sola vez, y deja que la máquina
206
+ avise sola cuando se desincronizan. De un dev solo a una organización entera —
207
+ el mismo método.</p>
208
+ <div class="cta">
209
+ <a class="btn p" href="#empezar">Empezar ahora</a>
210
+ <a class="btn s" href="https://github.com/dforce2055/dai">Ver en GitHub</a>
211
+ </div>
212
+ <div class="install">
213
+ <span class="m"># instala el CLI (Node ≥18, cero dependencias)</span><br>
214
+ <span class="c">npm i -g @dforce2055/dai</span><br>
215
+ <span class="c">dai init</span> <span class="m"># configura tu repo: Claude/Copilot + OpenSpec + el link</span>
216
+ </div>
217
+ </header>
218
+
219
+ <!-- ══════════ PROBLEMA ══════════ -->
220
+ <section id="problema">
221
+ <div class="wrap">
222
+ <p class="eyebrow">El problema</p>
223
+ <h2>La IA acelera el código. Y también acelera el caos.</h2>
224
+ <p class="lede">Tres dolores que la IA no resuelve sola — al contrario, los amplifica
225
+ si no hay método.</p>
226
+ <div class="grid g3">
227
+ <div class="card">
228
+ <div class="ic d">🔌</div>
229
+ <h3>Desincronización silenciosa</h3>
230
+ <p>El requerimiento cambia, el código sigue con la versión vieja, y se descubre
231
+ recién en la demo. Nadie se enteró a tiempo.</p>
232
+ </div>
233
+ <div class="card">
234
+ <div class="ic d">🎲</div>
235
+ <h3>Vibe coding</h3>
236
+ <p>La IA construye sobre una idea vaga y sale cualquier cosa. Rápido, sí — pero
237
+ sin garantía de que sea lo que se pedía.</p>
238
+ </div>
239
+ <div class="card">
240
+ <div class="ic d">🔀</div>
241
+ <h3>QUÉ y CÓMO mezclados</h3>
242
+ <p>El funcional se mete en la implementación; el dev redefine el negocio. Se pierde
243
+ quién es dueño de qué.</p>
244
+ </div>
245
+ </div>
246
+ </div>
247
+ </section>
248
+
249
+ <!-- ══════════ LA IDEA ══════════ -->
250
+ <section id="idea">
251
+ <div class="wrap">
252
+ <p class="eyebrow">La idea</p>
253
+ <h2>Separa el QUÉ del CÓMO. Linkéalos una sola vez.</h2>
254
+ <p class="lede">El requerimiento (el QUÉ) y la implementación (el CÓMO) son cosas
255
+ distintas, con dueños distintos. dai las mantiene atadas — y la dirección inversa
256
+ se <b>deriva</b>, nunca se escribe a mano.</p>
257
+
258
+ <div class="split">
259
+ <div class="side q">
260
+ <span class="tag q">EL QUÉ · funcional</span>
261
+ <h4 style="margin-top:12px">La User Story</h4>
262
+ <p class="who">dueño: PO / analista · vive en Jira o ClickUp</p>
263
+ <ul>
264
+ <li>Criterios de aceptación testeables</li>
265
+ <li>Lo produce una skill de IA por interrogación</li>
266
+ <li>Identidad estable: el ticket del tracker</li>
267
+ </ul>
268
+ </div>
269
+ <div class="link"><span class="b">implements →</span></div>
270
+ <div class="side">
271
+ <span class="tag c">EL CÓMO · técnico</span>
272
+ <h4 style="margin-top:12px">El código + su spec</h4>
273
+ <p class="who">dueño: dev / ingeniero · vive en el repo</p>
274
+ <ul>
275
+ <li>Declara <code>implements: US@versión</code> — una vez</li>
276
+ <li>Diseño y tareas generados con OpenSpec</li>
277
+ <li>Se construye con tests primero (TDD)</li>
278
+ </ul>
279
+ </div>
280
+ </div>
281
+
282
+ <div class="grid g3" style="margin-top:16px">
283
+ <div class="card"><span class="tag q">1</span><h3 style="margin-top:10px">Identidad estable</h3>
284
+ <p>El QUÉ nace con un ID único (el ticket). Es lo único que lo hace linkeable.</p></div>
285
+ <div class="card"><span class="tag c">2</span><h3 style="margin-top:10px">Un solo link, a mano</h3>
286
+ <p>El código apunta al QUÉ. La cobertura inversa (quién implementó qué) la genera la máquina.</p></div>
287
+ <div class="card"><span class="tag m">3</span><h3 style="margin-top:10px">@version que grita</h3>
288
+ <p>Número legible + hash de criterios. Si el QUÉ cambia, los CÓMO atrasados se marcan solos.</p></div>
289
+ </div>
290
+ </div>
291
+ </section>
292
+
293
+ <!-- ══════════ EL FLUJO GUIADO ══════════ -->
294
+ <section id="flujo">
295
+ <div class="wrap">
296
+ <p class="eyebrow">El flujo</p>
297
+ <h2>Tu Scrum de siempre — con IA en cada paso</h2>
298
+ <p class="lede">dai no reemplaza tu proceso: lo potencia. En cada etapa hay una skill
299
+ de IA o un comando que hace el trabajo pesado. <span class="tag q">QUÉ</span>
300
+ <span class="tag c">CÓMO</span> <span class="tag m">máquina</span></p>
301
+
302
+ <div class="steps">
303
+ <div class="step q"><div class="num">1</div><div class="body">
304
+ <h3>Define el QUÉ</h3>
305
+ <p>El analista describe la idea. Una skill de IA lo <b>interroga</b> hasta que la
306
+ User Story es testeable, y la publica en el tracker. La IA no inventa: pregunta.</p>
307
+ <span class="tool">/grill-intent → /grill-user-story → ClickUp / Jira</span>
308
+ </div></div>
309
+
310
+ <div class="step c"><div class="num">2</div><div class="body">
311
+ <h3>Abre el CÓMO, atado al QUÉ</h3>
312
+ <p>El dev arranca la implementación. dai trae la US del tracker, crea la branch y
313
+ siembra el link — <b>correcto por construcción</b>, sin tipear el ID a mano.</p>
314
+ <span class="tool">dai link-us &lt;ID&gt; → branch + implements.yaml</span>
315
+ </div></div>
316
+
317
+ <div class="step c"><div class="num">3</div><div class="body">
318
+ <h3>Diseña con OpenSpec</h3>
319
+ <p>OpenSpec toma la US y genera la propuesta, el diseño y las tareas — co-localizados
320
+ con el link, en la misma branch. El QUÉ se convierte en un plan técnico.</p>
321
+ <span class="tool">/opsx:propose → proposal · design · tasks</span>
322
+ </div></div>
323
+
324
+ <div class="step c"><div class="num">4</div><div class="body">
325
+ <h3>Implementa con tests primero</h3>
326
+ <p>TDD en rebanadas verticales: un test, el código mínimo, repetir. La IA escribe el
327
+ test como spec ejecutable. Anti vibe-coding de verdad.</p>
328
+ <span class="tool">/tdd · red → green → refactor</span>
329
+ </div></div>
330
+
331
+ <div class="step m"><div class="num">5</div><div class="body">
332
+ <h3>Verifica la trazabilidad</h3>
333
+ <p>¿Tu código sigue al día con la US? dai re-deriva el hash de la US viva y compara.
334
+ Si el QUÉ cambió, te avisa <b>y te dice cómo resincronizar</b>.</p>
335
+ <span class="tool">dai check → ✅ al día / ⚠️ atrasado</span>
336
+ </div></div>
337
+
338
+ <div class="step c"><div class="num">6</div><div class="body">
339
+ <h3>Crea y revisa la PR</h3>
340
+ <p>dai arma el texto de la PR desde el template, precargado con la US, el estado del
341
+ check y los enlaces. Tu PR la revisas tú; la de un compañero, con la skill de review.</p>
342
+ <span class="tool">dai pr · /dai-review (la PR de otro)</span>
343
+ </div></div>
344
+
345
+ <div class="step m"><div class="num">7</div><div class="body">
346
+ <h3>Mergea y estampa la cobertura</h3>
347
+ <p>Al mergear, dai escribe en el tracker <b>quién implementó qué</b>, contra qué
348
+ versión, con branch y commit. La trazabilidad inversa — nadie la mantiene a mano.</p>
349
+ <span class="tool">dai stamp → cobertura en el tracker</span>
350
+ </div></div>
351
+ </div>
352
+ </div>
353
+ </section>
354
+
355
+ <!-- ══════════ TRAZABILIDAD (demo) ══════════ -->
356
+ <section id="traza">
357
+ <div class="wrap">
358
+ <p class="eyebrow">La pieza que lo cambia todo</p>
359
+ <h2>Cuando el QUÉ cambia, el desajuste se hace visible solo</h2>
360
+ <p class="lede">El PO edita un criterio en el tracker. Tú no tocaste una línea de código.
361
+ Y aun así, dai lo detecta — porque compara el hash de la US viva contra el que dejaste
362
+ estampado.</p>
363
+
364
+ <div class="demo">
365
+ <div class="term">
366
+ <span class="p">$</span> <span class="cmd">dai check</span>
367
+ <span class="ok">✅ 86ajcjwzk al día (v1)</span>
368
+
369
+ <span class="dim"># … el PO agrega un criterio de aceptación en el tracker …</span>
370
+
371
+ <span class="p">$</span> <span class="cmd">dai check</span>
372
+ <span class="warn">⚠️ 86ajcjwzk ATRASADO: implementaste 2124e94f, la US viva es 51abbfa0</span>
373
+
374
+ <span class="dim">El QUÉ cambió desde que lo implementaste. Para resincronizar:</span>
375
+ <b>dai link-us 86ajcjwzk --resync</b> <span class="dim"># re-estampa contra la US viva</span>
376
+ </div>
377
+ </div>
378
+ <p class="lede" style="margin-top:22px">Nadie le avisó al dev. El link versionado lo
379
+ avisó solo. Esa es la diferencia entre <i>esperar que alguien se dé cuenta</i> y
380
+ <i>que el sistema te lo diga</i>.</p>
381
+ </div>
382
+ </section>
383
+
384
+ <!-- ══════════ SE ADAPTA ══════════ -->
385
+ <section id="escala">
386
+ <div class="wrap">
387
+ <p class="eyebrow">Un solo método</p>
388
+ <h2>Se adapta a cualquier tamaño de equipo</h2>
389
+ <p class="lede">No hay una versión para equipos chicos y otra para grandes. Hay
390
+ <b>un protocolo invariante</b> y un dial de ceremonia que sube o baja según la escala.
391
+ Cada capa se agrega cuando duele, no antes.</p>
392
+ <div class="dial">
393
+ <div class="lvl"><span class="n">NIVEL 1</span><h4>Un dev solo</h4>
394
+ <p>OpenSpec y el CLI, todo local. La US puede vivir como un <code>.md</code>. Cero
395
+ infraestructura. El link y el check funcionan igual.</p></div>
396
+ <div class="lvl"><span class="n">NIVEL 2</span><h4>Equipo compacto</h4>
397
+ <p>Aparece el tracker (ClickUp/Jira) para coordinar. El link referencia la US; el
398
+ check y el stamp corren a mano o en un hook.</p></div>
399
+ <div class="lvl"><span class="n">NIVEL 3</span><h4>Organización grande</h4>
400
+ <p>Muchos repos, equipos separados, CI que estampa cobertura y matriz de ambientes.
401
+ El mismo protocolo, con más plomería.</p></div>
402
+ </div>
403
+ <p class="lede" style="margin-top:20px">El dev que aprende el nivel chico ya sabe el
404
+ grande. Nadie mantiene dos metodologías.</p>
405
+ </div>
406
+ </section>
407
+
408
+ <!-- ══════════ EMPEZAR ══════════ -->
409
+ <section id="empezar">
410
+ <div class="wrap">
411
+ <p class="eyebrow">Empezar</p>
412
+ <h2>De cero a tu primera US trazada</h2>
413
+ <p class="lede">Requiere Node ≥ 18. El CLI no tiene dependencias — anda incluso en redes
414
+ corporativas cerradas.</p>
415
+ <ol class="start">
416
+ <li><code>npm i -g @dforce2055/dai</code>
417
+ <div class="d">Instala el CLI. El comando queda <code>dai</code>.</div></li>
418
+ <li><code>dai init</code>
419
+ <div class="d">Scaffolder interactivo: eliges asistente (Claude/Copilot), tracker
420
+ (md/ClickUp/Jira) y si sumas OpenSpec. Deja el repo listo.</div></li>
421
+ <li><code>dai link-us &lt;ID&gt;</code>
422
+ <div class="d">Trae la US del tracker, crea la branch y el link. Implementas con TDD.</div></li>
423
+ <li><code>dai check</code> → <code>dai pr</code> → <code>dai stamp</code>
424
+ <div class="d">Verificas que sigues al día, creas la PR precargada, y al mergear
425
+ estampas la cobertura. El círculo cerrado.</div></li>
426
+ </ol>
427
+ <div class="cta" style="justify-content:flex-start;margin-top:8px">
428
+ <a class="btn p" href="https://github.com/dforce2055/dai">Documentación completa</a>
429
+ <a class="btn s" href="https://github.com/dforce2055/dai/blob/main/docs/EJEMPLO-END-TO-END.md">Ver un ejemplo real</a>
430
+ </div>
431
+ </div>
432
+ </section>
433
+
434
+ <footer>
435
+ <div class="wrap">
436
+ <span><b style="color:var(--brand)">dai</b> — Desarrollo Asistido por IA</span>
437
+ <span class="sp"></span>
438
+ <a href="https://github.com/dforce2055/dai">GitHub</a>
439
+ <a href="https://github.com/dforce2055/dai/blob/main/docs/MANIFIESTO.md">Manifiesto</a>
440
+ <a href="https://github.com/dforce2055/dai/blob/main/LICENSE">GPLv3</a>
441
+ </div>
442
+ </footer>
443
+
444
+ <script>
445
+ // JS mínimo: toggle de tema + animaciones de reveal. Nada externo.
446
+ (function(){
447
+ var r=document.documentElement, t=document.getElementById('tg');
448
+ try{var s=localStorage.getItem('dai-theme'); if(s) r.setAttribute('data-theme',s);}catch(e){}
449
+ t.addEventListener('click',function(){
450
+ var cur=r.getAttribute('data-theme');
451
+ var m=window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light';
452
+ var next=(cur||m)==='dark'?'light':'dark';
453
+ r.setAttribute('data-theme',next);
454
+ try{localStorage.setItem('dai-theme',next);}catch(e){}
455
+ });
456
+
457
+ // Reveal al hacer scroll (fade + slide up), con stagger por grupo.
458
+ var reduce=window.matchMedia('(prefers-reduced-motion: reduce)').matches;
459
+ var els=document.querySelectorAll(
460
+ 'section h2, section .lede, .card, .step, .lvl, .split, .demo, .install, ol.start li, .cta');
461
+ if(reduce || !('IntersectionObserver' in window)){ return; } // sin animar: todo visible
462
+ r.classList.add('anim'); // recién acá ocultamos (fallback sin JS = visible)
463
+ els.forEach(function(el){
464
+ el.classList.add('reveal');
465
+ // stagger: retraso según la posición del elemento entre sus hermanos
466
+ var i=0,p=el.previousElementSibling;
467
+ while(p){ i++; p=p.previousElementSibling; }
468
+ el.style.transitionDelay=Math.min(i,6)*70+'ms';
469
+ });
470
+ var io=new IntersectionObserver(function(entries){
471
+ entries.forEach(function(e){
472
+ if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); }
473
+ });
474
+ },{threshold:.12, rootMargin:'0px 0px -8% 0px'});
475
+ els.forEach(function(el){ io.observe(el); });
476
+ })();
477
+ </script>
478
+ </body>
479
+ </html>
package/install.sh ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ # dai · shim de arranque para instalación por git-clone.
3
+ # Delega TODO en el CLI de Node (única fuente de verdad). Con npm/npx podés usar
4
+ # `dai <comando>` directamente y saltearte este script.
5
+ #
6
+ # ./install.sh install [--global|--local <repo>] [--force] [--dry-run]
7
+ # ./install.sh init <repo> | docs <destino> | doctor | version
8
+ # ./install.sh skills → alias de `install` (compat con versiones previas)
9
+
10
+ set -euo pipefail
11
+ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+
13
+ command -v node >/dev/null 2>&1 || { echo "dai: hace falta Node.js (>=18) para el CLI." >&2; exit 1; }
14
+
15
+ cmd="${1:-doctor}"
16
+ if [ "$cmd" = "skills" ]; then cmd="install"; fi # compat
17
+ shift 2>/dev/null || true
18
+
19
+ exec node "$HERE/cli/dai.mjs" "$cmd" "$@"
package/manifest.yaml ADDED
@@ -0,0 +1,76 @@
1
+ # dai — Desarrollo Asistido por IA
2
+ # Manifiesto del paquete: qué contiene y DÓNDE instala cada componente.
3
+ # Lo lee install.sh. La regla: un artefacto = un archivo + un destino.
4
+
5
+ name: dai
6
+ version: 0.1.0
7
+ description: >
8
+ Metodología de desarrollo asistido por IA. Un protocolo invariante
9
+ (trazabilidad QUÉ↔CÓMO) con un dial de tres niveles de ceremonia, que
10
+ escala de un dev solo a una organización grande sin cambiar de método.
11
+
12
+ # ── Componentes: cada uno declara su origen y su destino de instalación ──
13
+
14
+ components:
15
+
16
+ skills:
17
+ descripcion: Skills de Claude Code que automatizan cada paso del método.
18
+ origen: skills/
19
+ destino: ~/.claude/skills/ # la máquina del dev
20
+ modo: dai install skills
21
+ contenido:
22
+ - doc-to-backlog # doc (PDF/Word) → backlog candidato de épicas + US
23
+ - grill-intent # Gate 0: desafía el problema
24
+ - grill-epic # produce una épica y la parte en US
25
+ - grill-user-story # produce la US testeable
26
+ - link-us # ata branch + implements.yaml al ID
27
+ - tdd # red-green-refactor
28
+ - dai-review # review de PR (github/gitlab) + comentario estándar
29
+
30
+ templates:
31
+ descripcion: Los moldes que se copian a un repo de código.
32
+ origen: templates/
33
+ destino: <repo-target>/.dai/templates/ # o donde el equipo los quiera
34
+ modo: dai init <repo>
35
+ contenido:
36
+ - formato-us.md # formato canónico de User Story
37
+ - epica.md # bloque de valor que agrupa varias US
38
+ - definition-of-ready.md # gate: cuándo la US entra a implementarse
39
+ - definition-of-done.md # gate: cuándo el CÓMO está terminado
40
+ - adr.md # registro de decisión de fondo
41
+ - pull-request.md # molde de PR/MR atado al link
42
+
43
+ governance:
44
+ descripcion: Reglas de enforcement (naming de ramas, checks de CI).
45
+ origen: governance/
46
+ destino: <repo-target>/.dai/governance/
47
+ modo: dai init <repo>
48
+ contenido:
49
+ - branch-naming.md # convención de ramas (el ID en el nombre)
50
+ - ci-rules.md # qué valida el CI y qué estampa al mergear
51
+
52
+ docs:
53
+ descripcion: La fuente de verdad conceptual. Lo que el equipo lee.
54
+ origen: docs/
55
+ destino: <donde-el-equipo-lee> # repo, Confluence, GitLab Pages
56
+ modo: dai docs <destino>
57
+ contenido:
58
+ - MANIFIESTO.md # la constitución (15 artículos)
59
+ - METODOLOGIA.md # el protocolo + el dial de niveles
60
+ - SCRUM-CON-IA.md # el puente de adopción (10 pasos)
61
+ - EJEMPLO-END-TO-END.md # el golden path
62
+ - glosario.md # el vocabulario común del método
63
+ - guias/po.md # guía del PO / funcional
64
+ - guias/dev.md # guía del dev / ingeniero
65
+ - guias/lead.md # guía del lead / SM / arquitecto
66
+
67
+ landing:
68
+ descripcion: Landing autocontenido (buy-in). Un solo HTML, sin CDN → anda offline.
69
+ origen: index.html
70
+ destino: <manual> # abrir en navegador o publicar por GitHub Pages
71
+ modo: manual
72
+ contenido:
73
+ - index.html # la historia completa; se adapta a cualquier escala
74
+
75
+ # ── Fuente de verdad: si un HTML contradice un .md de docs/, gana el .md ──
76
+ fuente_de_verdad: docs/
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@dforce2055/dai",
3
+ "version": "0.1.0",
4
+ "description": "Metodología de desarrollo asistido por IA — CLI de acciones deterministas (trazabilidad QUÉ↔CÓMO).",
5
+ "repository": { "type": "git", "url": "git+https://github.com/dforce2055/dai.git" },
6
+ "homepage": "https://github.com/dforce2055/dai#readme",
7
+ "bugs": { "url": "https://github.com/dforce2055/dai/issues" },
8
+ "keywords": [
9
+ "ai",
10
+ "ai-assisted-development",
11
+ "spec-driven-development",
12
+ "traceability",
13
+ "user-story",
14
+ "openspec",
15
+ "scrum",
16
+ "tdd",
17
+ "methodology",
18
+ "cli"
19
+ ],
20
+ "author": "Diego Pérez <dperez2055@gmail.com>",
21
+ "license": "GPL-3.0-or-later",
22
+ "type": "module",
23
+ "bin": {
24
+ "dai": "cli/dai.mjs"
25
+ },
26
+ "files": [
27
+ "cli/dai.mjs",
28
+ "cli/lib",
29
+ "docs",
30
+ "templates",
31
+ "governance",
32
+ "skills",
33
+ "index.html",
34
+ "manifest.yaml",
35
+ "install.sh",
36
+ ".env.example",
37
+ "VERSION",
38
+ "LICENSE",
39
+ "README.md",
40
+ "CONTRIBUTING.md",
41
+ "CHANGELOG.md",
42
+ "SECURITY.md",
43
+ "CODE_OF_CONDUCT.md"
44
+ ],
45
+ "scripts": {
46
+ "test": "node --test cli/test/*.test.mjs",
47
+ "prepublishOnly": "npm test"
48
+ },
49
+ "engines": {
50
+ "node": ">=18"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ }
55
+ }