@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.
- package/.env.example +30 -0
- package/CHANGELOG.md +46 -0
- package/CODE_OF_CONDUCT.md +37 -0
- package/CONTRIBUTING.md +66 -0
- package/LICENSE +674 -0
- package/README.md +288 -0
- package/SECURITY.md +37 -0
- package/VERSION +1 -0
- package/cli/dai.mjs +692 -0
- package/cli/lib/ac-hash.mjs +74 -0
- package/cli/lib/args.mjs +23 -0
- package/cli/lib/bootstrap.mjs +74 -0
- package/cli/lib/env.mjs +23 -0
- package/cli/lib/forge-api.mjs +96 -0
- package/cli/lib/forge-url.mjs +61 -0
- package/cli/lib/fsutil.mjs +24 -0
- package/cli/lib/implements.mjs +94 -0
- package/cli/lib/link-us.mjs +59 -0
- package/cli/lib/pm-adapter.mjs +59 -0
- package/cli/lib/pm-clickup.mjs +54 -0
- package/cli/lib/pm-jira.mjs +123 -0
- package/cli/lib/pr.mjs +53 -0
- package/cli/lib/us.mjs +36 -0
- package/docs/EJEMPLO-END-TO-END.md +330 -0
- package/docs/MANIFIESTO.md +114 -0
- package/docs/METODOLOGIA.md +254 -0
- package/docs/PROBAR.md +91 -0
- package/docs/SCRUM-CON-IA.md +190 -0
- package/docs/adr/0001-contrato-ac-hash.md +86 -0
- package/docs/adr/0002-agnostico-del-asistente.md +87 -0
- package/docs/adr/0003-deteccion-y-estampado-son-comandos.md +73 -0
- package/docs/adr/0004-ubicacion-y-schema-implements.md +94 -0
- package/docs/adr/0005-superficie-comandos-y-stamp.md +65 -0
- package/docs/adr/0006-distribucion-y-licencia.md +59 -0
- package/docs/adr/0007-modelo-de-autenticacion.md +63 -0
- package/docs/adr/README.md +19 -0
- package/docs/detalle/01-refinamiento.md +33 -0
- package/docs/detalle/02-planning.md +27 -0
- package/docs/detalle/03-ramas.md +32 -0
- package/docs/detalle/04-tdd.md +35 -0
- package/docs/detalle/05-smoke.md +32 -0
- package/docs/detalle/06-code-review.md +34 -0
- package/docs/detalle/07-merge-trazabilidad.md +33 -0
- package/docs/detalle/08-daily.md +29 -0
- package/docs/detalle/09-review.md +25 -0
- package/docs/detalle/10-retro.md +27 -0
- package/docs/detalle/README.md +20 -0
- package/docs/glosario.md +79 -0
- package/docs/guias/dev.md +66 -0
- package/docs/guias/lead.md +53 -0
- package/docs/guias/po.md +50 -0
- package/governance/branch-naming.md +36 -0
- package/governance/ci-rules.md +57 -0
- package/governance/commit-convention.md +76 -0
- package/index.html +479 -0
- package/install.sh +19 -0
- package/manifest.yaml +76 -0
- package/package.json +55 -0
- package/skills/dai-review/SKILL.md +78 -0
- package/skills/doc-to-backlog/SKILL.md +70 -0
- package/skills/doc-to-backlog/templates/backlog-candidato.md +49 -0
- package/skills/grill-epic/SKILL.md +76 -0
- package/skills/grill-intent/SKILL.md +43 -0
- package/skills/grill-intent/templates/intent.md +36 -0
- package/skills/grill-user-story/SKILL.md +76 -0
- package/skills/grill-user-story/templates/user-story.md +61 -0
- package/skills/link-us/SKILL.md +42 -0
- package/skills/link-us/templates/implements.yaml +16 -0
- package/skills/tdd/SKILL.md +109 -0
- package/skills/tdd/deep-modules.md +33 -0
- package/skills/tdd/interface-design.md +31 -0
- package/skills/tdd/mocking.md +59 -0
- package/skills/tdd/refactoring.md +10 -0
- package/skills/tdd/tests.md +61 -0
- package/templates/adr.md +43 -0
- package/templates/commit-msg +48 -0
- package/templates/definition-of-done.md +50 -0
- package/templates/definition-of-ready.md +51 -0
- package/templates/epica.md +62 -0
- package/templates/formato-us.md +129 -0
- 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 <ID> → 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 <ID></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
|
+
}
|