@saulwade/swl-ses 1.4.1 → 1.5.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/CLAUDE.md +3 -3
- package/README.md +561 -560
- package/agentes/nemesis-auditor-swl.md +161 -161
- package/bin/swl-mcp-server.js +49 -22
- package/bin/swl-ses.js +74 -0
- package/comandos/swl/.evolved.json +22 -22
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/ejecutar-fase.md +33 -4
- package/comandos/swl/metricas.md +72 -0
- package/comandos/swl/nemesis.md +122 -122
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/discutir-fase/SKILL.md +50 -2
- package/habilidades/doubt-driven-review/SKILL.md +171 -171
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -0
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/feynman-auditor-swl/SKILL.md +123 -123
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/SKILL.md +299 -299
- package/habilidades/infra-github-actions/SKILL.md +166 -166
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- package/habilidades/manejo-errores/.evolved.json +8 -8
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- package/habilidades/patrones-python/SKILL.md +229 -229
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/planear-fase/SKILL.md +319 -319
- package/habilidades/protocolo-revision-swl/SKILL.md +276 -0
- package/habilidades/release-semver/.evolved.json +8 -8
- package/habilidades/state-inconsistency-auditor-swl/SKILL.md +166 -166
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/testing-python/SKILL.md +340 -340
- package/habilidades/verificar-trabajo/SKILL.md +49 -5
- package/habilidades/web-fetcher-routing/SKILL.md +75 -75
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/rate-limit-tracker.js +253 -253
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/security-net.js +201 -201
- package/hooks/lib/skill-auditor.js +588 -588
- package/hooks/lib/sync-status.js +228 -228
- package/hooks/lib/taint-tracker.js +107 -107
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/registro-turnos.js +209 -209
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-memoria-hook.js +218 -218
- package/instintos/prompt-appendices.yaml +57 -57
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/modulos.json +1321 -1262
- package/manifiestos/perfiles.json +2 -1
- package/manifiestos/skills-lock.json +1114 -1114
- package/package.json +3 -3
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/README.md +47 -47
- package/plantillas/github-workflows/release-please.yml +44 -44
- package/plantillas/github-workflows/swl-ci.yml +107 -107
- package/plantillas/github-workflows/swl-security.yml +51 -51
- package/plugin.json +351 -343
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/arreglar-al-detectar.md +147 -147
- package/reglas/fragmentos-compartidos.md +152 -152
- package/reglas/harness-claude-code.md +213 -213
- package/reglas/usar-context7.md +226 -226
- package/schemas/diary-entry.schema.json +80 -80
- package/scripts/audit-tools/audit-history.js +330 -330
- package/scripts/audit-tools/bundle-tracker.js +290 -290
- package/scripts/audit-tools/canary-monitor.js +352 -352
- package/scripts/audit-tools/code-profiler.js +605 -605
- package/scripts/audit-tools/dep-doctor.js +320 -320
- package/scripts/audit-tools/env-validator.js +206 -206
- package/scripts/audit-tools/lib/fs-walk.js +48 -48
- package/scripts/audit-tools/lib/output.js +23 -23
- package/scripts/audit-tools/migration-checker.js +392 -392
- package/scripts/audit-tools/pentest-scanner.js +1436 -1436
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/derivar-feature-list.js +489 -0
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/doctor.js +31 -4
- package/scripts/field-report.js +199 -199
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-inventario.js +420 -420
- package/scripts/generar-matriz-lenguajes.js +271 -271
- package/scripts/instalador.js +56 -5
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-runtime.js +75 -9
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/diary-entry.js +234 -234
- package/scripts/lib/estado.js +13 -1
- package/scripts/lib/eval-metrics-store.js +218 -218
- package/scripts/lib/eval-quality.js +171 -171
- package/scripts/lib/eval-schemas.js +144 -144
- package/scripts/lib/eval-self-correct.js +106 -106
- package/scripts/lib/eval-validator.js +185 -185
- package/scripts/lib/expandir-targets.js +71 -0
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/manifiestos.js +42 -1
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/parsear-opciones.js +3 -0
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/toml-merge.js +204 -0
- package/scripts/lib/transformadores/base.js +43 -9
- package/scripts/lib/transformadores/codex.js +375 -115
- package/scripts/lib/transformadores/cursor.js +359 -0
- package/scripts/lib/transformadores/index.js +2 -0
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-server/README.md +122 -80
- package/scripts/mcp-server/auth.js +105 -0
- package/scripts/mcp-server/cache.js +106 -0
- package/scripts/mcp-server/handlers.js +386 -206
- package/scripts/mcp-server/telemetry.js +78 -0
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +201 -201
- package/scripts/publicar.js +511 -511
- package/scripts/run-eval.js +141 -141
- package/scripts/validar-manifest.js +231 -195
- package/scripts/validar-userland-vacio.js +110 -110
|
@@ -1,276 +1,276 @@
|
|
|
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.0">
|
|
6
|
-
<title>[NOMBRE DEL PROYECTO] — Diagrama de Arquitectura</title>
|
|
7
|
-
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
8
|
-
<style>
|
|
9
|
-
* {
|
|
10
|
-
margin: 0;
|
|
11
|
-
padding: 0;
|
|
12
|
-
box-sizing: border-box;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
body {
|
|
16
|
-
font-family: 'JetBrains Mono', monospace;
|
|
17
|
-
background: #020617;
|
|
18
|
-
min-height: 100vh;
|
|
19
|
-
padding: 2rem;
|
|
20
|
-
color: white;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.container {
|
|
24
|
-
max-width: 1200px;
|
|
25
|
-
margin: 0 auto;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.header {
|
|
29
|
-
margin-bottom: 2rem;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.header-row {
|
|
33
|
-
display: flex;
|
|
34
|
-
align-items: center;
|
|
35
|
-
gap: 1rem;
|
|
36
|
-
margin-bottom: 0.5rem;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.pulse-dot {
|
|
40
|
-
width: 12px;
|
|
41
|
-
height: 12px;
|
|
42
|
-
background: #22d3ee;
|
|
43
|
-
border-radius: 50%;
|
|
44
|
-
animation: pulse 2s infinite;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
@keyframes pulse {
|
|
48
|
-
0%, 100% { opacity: 1; }
|
|
49
|
-
50% { opacity: 0.5; }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
h1 {
|
|
53
|
-
font-size: 1.5rem;
|
|
54
|
-
font-weight: 700;
|
|
55
|
-
letter-spacing: -0.025em;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
.subtitle {
|
|
59
|
-
color: #94a3b8;
|
|
60
|
-
font-size: 0.875rem;
|
|
61
|
-
margin-left: 1.75rem;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.diagram-container {
|
|
65
|
-
background: rgba(15, 23, 42, 0.5);
|
|
66
|
-
border-radius: 1rem;
|
|
67
|
-
border: 1px solid #1e293b;
|
|
68
|
-
padding: 1.5rem;
|
|
69
|
-
overflow-x: auto;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
svg {
|
|
73
|
-
width: 100%;
|
|
74
|
-
min-width: 900px;
|
|
75
|
-
display: block;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.cards {
|
|
79
|
-
display: grid;
|
|
80
|
-
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
81
|
-
gap: 1rem;
|
|
82
|
-
margin-top: 2rem;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.card {
|
|
86
|
-
background: rgba(15, 23, 42, 0.5);
|
|
87
|
-
border-radius: 0.75rem;
|
|
88
|
-
border: 1px solid #1e293b;
|
|
89
|
-
padding: 1.25rem;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
.card-header {
|
|
93
|
-
display: flex;
|
|
94
|
-
align-items: center;
|
|
95
|
-
gap: 0.5rem;
|
|
96
|
-
margin-bottom: 0.75rem;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.card-dot {
|
|
100
|
-
width: 8px;
|
|
101
|
-
height: 8px;
|
|
102
|
-
border-radius: 50%;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.card-dot.cyan { background: #22d3ee; }
|
|
106
|
-
.card-dot.emerald { background: #34d399; }
|
|
107
|
-
.card-dot.violet { background: #a78bfa; }
|
|
108
|
-
.card-dot.amber { background: #fbbf24; }
|
|
109
|
-
.card-dot.rose { background: #fb7185; }
|
|
110
|
-
|
|
111
|
-
.card h3 {
|
|
112
|
-
font-size: 0.875rem;
|
|
113
|
-
font-weight: 600;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.card ul {
|
|
117
|
-
list-style: none;
|
|
118
|
-
color: #94a3b8;
|
|
119
|
-
font-size: 0.75rem;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
.card li {
|
|
123
|
-
margin-bottom: 0.375rem;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.footer {
|
|
127
|
-
text-align: center;
|
|
128
|
-
margin-top: 1.5rem;
|
|
129
|
-
color: #475569;
|
|
130
|
-
font-size: 0.75rem;
|
|
131
|
-
}
|
|
132
|
-
</style>
|
|
133
|
-
</head>
|
|
134
|
-
<body>
|
|
135
|
-
<div class="container">
|
|
136
|
-
<!-- Encabezado -->
|
|
137
|
-
<div class="header">
|
|
138
|
-
<div class="header-row">
|
|
139
|
-
<div class="pulse-dot"></div>
|
|
140
|
-
<h1>[NOMBRE DEL PROYECTO] — Arquitectura</h1>
|
|
141
|
-
</div>
|
|
142
|
-
<p class="subtitle">[Descripción del subtítulo]</p>
|
|
143
|
-
</div>
|
|
144
|
-
|
|
145
|
-
<!-- Diagrama principal -->
|
|
146
|
-
<div class="diagram-container">
|
|
147
|
-
<svg viewBox="0 0 1000 680">
|
|
148
|
-
<!-- Definiciones -->
|
|
149
|
-
<defs>
|
|
150
|
-
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
|
151
|
-
<polygon points="0 0, 10 3.5, 0 7" fill="#64748b" />
|
|
152
|
-
</marker>
|
|
153
|
-
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
154
|
-
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1e293b" stroke-width="0.5"/>
|
|
155
|
-
</pattern>
|
|
156
|
-
</defs>
|
|
157
|
-
|
|
158
|
-
<!-- Grilla de fondo -->
|
|
159
|
-
<rect width="100%" height="100%" fill="url(#grid)" />
|
|
160
|
-
|
|
161
|
-
<!-- ===============================================================
|
|
162
|
-
COMPONENTES — Copiar y personalizar estos patrones
|
|
163
|
-
=============================================================== -->
|
|
164
|
-
|
|
165
|
-
<!-- Componente externo/genérico -->
|
|
166
|
-
<rect x="30" y="280" width="100" height="50" rx="6" fill="rgba(30, 41, 59, 0.5)" stroke="#94a3b8" stroke-width="1.5"/>
|
|
167
|
-
<text x="80" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">Usuarios</text>
|
|
168
|
-
<text x="80" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">Navegador/Móvil</text>
|
|
169
|
-
|
|
170
|
-
<!-- Componente de seguridad -->
|
|
171
|
-
<rect x="30" y="80" width="100" height="60" rx="6" fill="rgba(136, 19, 55, 0.4)" stroke="#fb7185" stroke-width="1.5"/>
|
|
172
|
-
<text x="80" y="105" fill="white" font-size="11" font-weight="600" text-anchor="middle">Auth Provider</text>
|
|
173
|
-
<text x="80" y="121" fill="#94a3b8" font-size="9" text-anchor="middle">OAuth 2.0</text>
|
|
174
|
-
|
|
175
|
-
<!-- Límite de región/cloud -->
|
|
176
|
-
<rect x="160" y="40" width="820" height="620" rx="12" fill="rgba(251, 191, 36, 0.05)" stroke="#fbbf24" stroke-width="1" stroke-dasharray="8,4"/>
|
|
177
|
-
<text x="172" y="58" fill="#fbbf24" font-size="10" font-weight="600">Región Cloud</text>
|
|
178
|
-
|
|
179
|
-
<!-- Servicio cloud -->
|
|
180
|
-
<rect x="200" y="280" width="110" height="50" rx="6" fill="rgba(120, 53, 15, 0.3)" stroke="#fbbf24" stroke-width="1.5"/>
|
|
181
|
-
<text x="255" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">CDN</text>
|
|
182
|
-
<text x="255" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">CloudFront</text>
|
|
183
|
-
|
|
184
|
-
<!-- Backend -->
|
|
185
|
-
<rect x="510" y="280" width="110" height="50" rx="6" fill="rgba(6, 78, 59, 0.4)" stroke="#34d399" stroke-width="1.5"/>
|
|
186
|
-
<text x="565" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">API Server</text>
|
|
187
|
-
<text x="565" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">FastAPI :8000</text>
|
|
188
|
-
|
|
189
|
-
<!-- Base de datos -->
|
|
190
|
-
<rect x="700" y="280" width="120" height="50" rx="6" fill="rgba(76, 29, 149, 0.4)" stroke="#a78bfa" stroke-width="1.5"/>
|
|
191
|
-
<text x="760" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">Base de datos</text>
|
|
192
|
-
<text x="760" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">PostgreSQL</text>
|
|
193
|
-
|
|
194
|
-
<!-- Frontend -->
|
|
195
|
-
<rect x="200" y="520" width="200" height="110" rx="8" fill="rgba(8, 51, 68, 0.4)" stroke="#22d3ee" stroke-width="1.5"/>
|
|
196
|
-
<text x="300" y="545" fill="white" font-size="12" font-weight="600" text-anchor="middle">Frontend</text>
|
|
197
|
-
<text x="300" y="565" fill="#94a3b8" font-size="9" text-anchor="middle">React + TypeScript</text>
|
|
198
|
-
|
|
199
|
-
<!-- ===============================================================
|
|
200
|
-
FLECHAS
|
|
201
|
-
=============================================================== -->
|
|
202
|
-
<line x1="130" y1="305" x2="198" y2="305" stroke="#22d3ee" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
|
203
|
-
<text x="164" y="299" fill="#94a3b8" font-size="9" text-anchor="middle">HTTPS</text>
|
|
204
|
-
|
|
205
|
-
<line x1="310" y1="305" x2="508" y2="305" stroke="#34d399" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
|
206
|
-
<line x1="620" y1="305" x2="698" y2="305" stroke="#a78bfa" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
|
207
|
-
<text x="655" y="299" fill="#94a3b8" font-size="9">TLS</text>
|
|
208
|
-
|
|
209
|
-
<!-- ===============================================================
|
|
210
|
-
LEYENDA
|
|
211
|
-
=============================================================== -->
|
|
212
|
-
<text x="720" y="70" fill="white" font-size="10" font-weight="600">Leyenda</text>
|
|
213
|
-
|
|
214
|
-
<rect x="720" y="82" width="16" height="10" rx="2" fill="rgba(8, 51, 68, 0.4)" stroke="#22d3ee" stroke-width="1"/>
|
|
215
|
-
<text x="742" y="90" fill="#94a3b8" font-size="8">Frontend</text>
|
|
216
|
-
|
|
217
|
-
<rect x="720" y="98" width="16" height="10" rx="2" fill="rgba(6, 78, 59, 0.4)" stroke="#34d399" stroke-width="1"/>
|
|
218
|
-
<text x="742" y="106" fill="#94a3b8" font-size="8">Backend</text>
|
|
219
|
-
|
|
220
|
-
<rect x="720" y="114" width="16" height="10" rx="2" fill="rgba(120, 53, 15, 0.3)" stroke="#fbbf24" stroke-width="1"/>
|
|
221
|
-
<text x="742" y="122" fill="#94a3b8" font-size="8">Servicio Cloud</text>
|
|
222
|
-
|
|
223
|
-
<rect x="720" y="130" width="16" height="10" rx="2" fill="rgba(76, 29, 149, 0.4)" stroke="#a78bfa" stroke-width="1"/>
|
|
224
|
-
<text x="742" y="138" fill="#94a3b8" font-size="8">Base de datos</text>
|
|
225
|
-
|
|
226
|
-
<rect x="720" y="146" width="16" height="10" rx="2" fill="rgba(136, 19, 55, 0.4)" stroke="#fb7185" stroke-width="1"/>
|
|
227
|
-
<text x="742" y="154" fill="#94a3b8" font-size="8">Seguridad</text>
|
|
228
|
-
</svg>
|
|
229
|
-
</div>
|
|
230
|
-
|
|
231
|
-
<!-- Tarjetas informativas -->
|
|
232
|
-
<div class="cards">
|
|
233
|
-
<div class="card">
|
|
234
|
-
<div class="card-header">
|
|
235
|
-
<div class="card-dot rose"></div>
|
|
236
|
-
<h3>Seguridad</h3>
|
|
237
|
-
</div>
|
|
238
|
-
<ul>
|
|
239
|
-
<li>- Autenticación OAuth 2.0</li>
|
|
240
|
-
<li>- TLS en tránsito</li>
|
|
241
|
-
<li>- Cifrado en reposo</li>
|
|
242
|
-
</ul>
|
|
243
|
-
</div>
|
|
244
|
-
|
|
245
|
-
<div class="card">
|
|
246
|
-
<div class="card-header">
|
|
247
|
-
<div class="card-dot amber"></div>
|
|
248
|
-
<h3>Infraestructura</h3>
|
|
249
|
-
</div>
|
|
250
|
-
<ul>
|
|
251
|
-
<li>- CDN para activos estáticos</li>
|
|
252
|
-
<li>- Auto-scaling horizontal</li>
|
|
253
|
-
<li>- Monitoreo centralizado</li>
|
|
254
|
-
</ul>
|
|
255
|
-
</div>
|
|
256
|
-
|
|
257
|
-
<div class="card">
|
|
258
|
-
<div class="card-header">
|
|
259
|
-
<div class="card-dot violet"></div>
|
|
260
|
-
<h3>Datos</h3>
|
|
261
|
-
</div>
|
|
262
|
-
<ul>
|
|
263
|
-
<li>- PostgreSQL principal</li>
|
|
264
|
-
<li>- Backups automatizados</li>
|
|
265
|
-
<li>- Réplica de lectura</li>
|
|
266
|
-
</ul>
|
|
267
|
-
</div>
|
|
268
|
-
</div>
|
|
269
|
-
|
|
270
|
-
<!-- Pie -->
|
|
271
|
-
<p class="footer">
|
|
272
|
-
[Nombre del proyecto] — Generado con swl-ses
|
|
273
|
-
</p>
|
|
274
|
-
</div>
|
|
275
|
-
</body>
|
|
276
|
-
</html>
|
|
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.0">
|
|
6
|
+
<title>[NOMBRE DEL PROYECTO] — Diagrama de Arquitectura</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
* {
|
|
10
|
+
margin: 0;
|
|
11
|
+
padding: 0;
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
body {
|
|
16
|
+
font-family: 'JetBrains Mono', monospace;
|
|
17
|
+
background: #020617;
|
|
18
|
+
min-height: 100vh;
|
|
19
|
+
padding: 2rem;
|
|
20
|
+
color: white;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.container {
|
|
24
|
+
max-width: 1200px;
|
|
25
|
+
margin: 0 auto;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.header {
|
|
29
|
+
margin-bottom: 2rem;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.header-row {
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: 1rem;
|
|
36
|
+
margin-bottom: 0.5rem;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.pulse-dot {
|
|
40
|
+
width: 12px;
|
|
41
|
+
height: 12px;
|
|
42
|
+
background: #22d3ee;
|
|
43
|
+
border-radius: 50%;
|
|
44
|
+
animation: pulse 2s infinite;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@keyframes pulse {
|
|
48
|
+
0%, 100% { opacity: 1; }
|
|
49
|
+
50% { opacity: 0.5; }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
h1 {
|
|
53
|
+
font-size: 1.5rem;
|
|
54
|
+
font-weight: 700;
|
|
55
|
+
letter-spacing: -0.025em;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.subtitle {
|
|
59
|
+
color: #94a3b8;
|
|
60
|
+
font-size: 0.875rem;
|
|
61
|
+
margin-left: 1.75rem;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.diagram-container {
|
|
65
|
+
background: rgba(15, 23, 42, 0.5);
|
|
66
|
+
border-radius: 1rem;
|
|
67
|
+
border: 1px solid #1e293b;
|
|
68
|
+
padding: 1.5rem;
|
|
69
|
+
overflow-x: auto;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
svg {
|
|
73
|
+
width: 100%;
|
|
74
|
+
min-width: 900px;
|
|
75
|
+
display: block;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.cards {
|
|
79
|
+
display: grid;
|
|
80
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
81
|
+
gap: 1rem;
|
|
82
|
+
margin-top: 2rem;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.card {
|
|
86
|
+
background: rgba(15, 23, 42, 0.5);
|
|
87
|
+
border-radius: 0.75rem;
|
|
88
|
+
border: 1px solid #1e293b;
|
|
89
|
+
padding: 1.25rem;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.card-header {
|
|
93
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
gap: 0.5rem;
|
|
96
|
+
margin-bottom: 0.75rem;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.card-dot {
|
|
100
|
+
width: 8px;
|
|
101
|
+
height: 8px;
|
|
102
|
+
border-radius: 50%;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.card-dot.cyan { background: #22d3ee; }
|
|
106
|
+
.card-dot.emerald { background: #34d399; }
|
|
107
|
+
.card-dot.violet { background: #a78bfa; }
|
|
108
|
+
.card-dot.amber { background: #fbbf24; }
|
|
109
|
+
.card-dot.rose { background: #fb7185; }
|
|
110
|
+
|
|
111
|
+
.card h3 {
|
|
112
|
+
font-size: 0.875rem;
|
|
113
|
+
font-weight: 600;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.card ul {
|
|
117
|
+
list-style: none;
|
|
118
|
+
color: #94a3b8;
|
|
119
|
+
font-size: 0.75rem;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.card li {
|
|
123
|
+
margin-bottom: 0.375rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.footer {
|
|
127
|
+
text-align: center;
|
|
128
|
+
margin-top: 1.5rem;
|
|
129
|
+
color: #475569;
|
|
130
|
+
font-size: 0.75rem;
|
|
131
|
+
}
|
|
132
|
+
</style>
|
|
133
|
+
</head>
|
|
134
|
+
<body>
|
|
135
|
+
<div class="container">
|
|
136
|
+
<!-- Encabezado -->
|
|
137
|
+
<div class="header">
|
|
138
|
+
<div class="header-row">
|
|
139
|
+
<div class="pulse-dot"></div>
|
|
140
|
+
<h1>[NOMBRE DEL PROYECTO] — Arquitectura</h1>
|
|
141
|
+
</div>
|
|
142
|
+
<p class="subtitle">[Descripción del subtítulo]</p>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<!-- Diagrama principal -->
|
|
146
|
+
<div class="diagram-container">
|
|
147
|
+
<svg viewBox="0 0 1000 680">
|
|
148
|
+
<!-- Definiciones -->
|
|
149
|
+
<defs>
|
|
150
|
+
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
|
151
|
+
<polygon points="0 0, 10 3.5, 0 7" fill="#64748b" />
|
|
152
|
+
</marker>
|
|
153
|
+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
154
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1e293b" stroke-width="0.5"/>
|
|
155
|
+
</pattern>
|
|
156
|
+
</defs>
|
|
157
|
+
|
|
158
|
+
<!-- Grilla de fondo -->
|
|
159
|
+
<rect width="100%" height="100%" fill="url(#grid)" />
|
|
160
|
+
|
|
161
|
+
<!-- ===============================================================
|
|
162
|
+
COMPONENTES — Copiar y personalizar estos patrones
|
|
163
|
+
=============================================================== -->
|
|
164
|
+
|
|
165
|
+
<!-- Componente externo/genérico -->
|
|
166
|
+
<rect x="30" y="280" width="100" height="50" rx="6" fill="rgba(30, 41, 59, 0.5)" stroke="#94a3b8" stroke-width="1.5"/>
|
|
167
|
+
<text x="80" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">Usuarios</text>
|
|
168
|
+
<text x="80" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">Navegador/Móvil</text>
|
|
169
|
+
|
|
170
|
+
<!-- Componente de seguridad -->
|
|
171
|
+
<rect x="30" y="80" width="100" height="60" rx="6" fill="rgba(136, 19, 55, 0.4)" stroke="#fb7185" stroke-width="1.5"/>
|
|
172
|
+
<text x="80" y="105" fill="white" font-size="11" font-weight="600" text-anchor="middle">Auth Provider</text>
|
|
173
|
+
<text x="80" y="121" fill="#94a3b8" font-size="9" text-anchor="middle">OAuth 2.0</text>
|
|
174
|
+
|
|
175
|
+
<!-- Límite de región/cloud -->
|
|
176
|
+
<rect x="160" y="40" width="820" height="620" rx="12" fill="rgba(251, 191, 36, 0.05)" stroke="#fbbf24" stroke-width="1" stroke-dasharray="8,4"/>
|
|
177
|
+
<text x="172" y="58" fill="#fbbf24" font-size="10" font-weight="600">Región Cloud</text>
|
|
178
|
+
|
|
179
|
+
<!-- Servicio cloud -->
|
|
180
|
+
<rect x="200" y="280" width="110" height="50" rx="6" fill="rgba(120, 53, 15, 0.3)" stroke="#fbbf24" stroke-width="1.5"/>
|
|
181
|
+
<text x="255" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">CDN</text>
|
|
182
|
+
<text x="255" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">CloudFront</text>
|
|
183
|
+
|
|
184
|
+
<!-- Backend -->
|
|
185
|
+
<rect x="510" y="280" width="110" height="50" rx="6" fill="rgba(6, 78, 59, 0.4)" stroke="#34d399" stroke-width="1.5"/>
|
|
186
|
+
<text x="565" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">API Server</text>
|
|
187
|
+
<text x="565" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">FastAPI :8000</text>
|
|
188
|
+
|
|
189
|
+
<!-- Base de datos -->
|
|
190
|
+
<rect x="700" y="280" width="120" height="50" rx="6" fill="rgba(76, 29, 149, 0.4)" stroke="#a78bfa" stroke-width="1.5"/>
|
|
191
|
+
<text x="760" y="300" fill="white" font-size="11" font-weight="600" text-anchor="middle">Base de datos</text>
|
|
192
|
+
<text x="760" y="316" fill="#94a3b8" font-size="9" text-anchor="middle">PostgreSQL</text>
|
|
193
|
+
|
|
194
|
+
<!-- Frontend -->
|
|
195
|
+
<rect x="200" y="520" width="200" height="110" rx="8" fill="rgba(8, 51, 68, 0.4)" stroke="#22d3ee" stroke-width="1.5"/>
|
|
196
|
+
<text x="300" y="545" fill="white" font-size="12" font-weight="600" text-anchor="middle">Frontend</text>
|
|
197
|
+
<text x="300" y="565" fill="#94a3b8" font-size="9" text-anchor="middle">React + TypeScript</text>
|
|
198
|
+
|
|
199
|
+
<!-- ===============================================================
|
|
200
|
+
FLECHAS
|
|
201
|
+
=============================================================== -->
|
|
202
|
+
<line x1="130" y1="305" x2="198" y2="305" stroke="#22d3ee" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
|
203
|
+
<text x="164" y="299" fill="#94a3b8" font-size="9" text-anchor="middle">HTTPS</text>
|
|
204
|
+
|
|
205
|
+
<line x1="310" y1="305" x2="508" y2="305" stroke="#34d399" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
|
206
|
+
<line x1="620" y1="305" x2="698" y2="305" stroke="#a78bfa" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
|
207
|
+
<text x="655" y="299" fill="#94a3b8" font-size="9">TLS</text>
|
|
208
|
+
|
|
209
|
+
<!-- ===============================================================
|
|
210
|
+
LEYENDA
|
|
211
|
+
=============================================================== -->
|
|
212
|
+
<text x="720" y="70" fill="white" font-size="10" font-weight="600">Leyenda</text>
|
|
213
|
+
|
|
214
|
+
<rect x="720" y="82" width="16" height="10" rx="2" fill="rgba(8, 51, 68, 0.4)" stroke="#22d3ee" stroke-width="1"/>
|
|
215
|
+
<text x="742" y="90" fill="#94a3b8" font-size="8">Frontend</text>
|
|
216
|
+
|
|
217
|
+
<rect x="720" y="98" width="16" height="10" rx="2" fill="rgba(6, 78, 59, 0.4)" stroke="#34d399" stroke-width="1"/>
|
|
218
|
+
<text x="742" y="106" fill="#94a3b8" font-size="8">Backend</text>
|
|
219
|
+
|
|
220
|
+
<rect x="720" y="114" width="16" height="10" rx="2" fill="rgba(120, 53, 15, 0.3)" stroke="#fbbf24" stroke-width="1"/>
|
|
221
|
+
<text x="742" y="122" fill="#94a3b8" font-size="8">Servicio Cloud</text>
|
|
222
|
+
|
|
223
|
+
<rect x="720" y="130" width="16" height="10" rx="2" fill="rgba(76, 29, 149, 0.4)" stroke="#a78bfa" stroke-width="1"/>
|
|
224
|
+
<text x="742" y="138" fill="#94a3b8" font-size="8">Base de datos</text>
|
|
225
|
+
|
|
226
|
+
<rect x="720" y="146" width="16" height="10" rx="2" fill="rgba(136, 19, 55, 0.4)" stroke="#fb7185" stroke-width="1"/>
|
|
227
|
+
<text x="742" y="154" fill="#94a3b8" font-size="8">Seguridad</text>
|
|
228
|
+
</svg>
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<!-- Tarjetas informativas -->
|
|
232
|
+
<div class="cards">
|
|
233
|
+
<div class="card">
|
|
234
|
+
<div class="card-header">
|
|
235
|
+
<div class="card-dot rose"></div>
|
|
236
|
+
<h3>Seguridad</h3>
|
|
237
|
+
</div>
|
|
238
|
+
<ul>
|
|
239
|
+
<li>- Autenticación OAuth 2.0</li>
|
|
240
|
+
<li>- TLS en tránsito</li>
|
|
241
|
+
<li>- Cifrado en reposo</li>
|
|
242
|
+
</ul>
|
|
243
|
+
</div>
|
|
244
|
+
|
|
245
|
+
<div class="card">
|
|
246
|
+
<div class="card-header">
|
|
247
|
+
<div class="card-dot amber"></div>
|
|
248
|
+
<h3>Infraestructura</h3>
|
|
249
|
+
</div>
|
|
250
|
+
<ul>
|
|
251
|
+
<li>- CDN para activos estáticos</li>
|
|
252
|
+
<li>- Auto-scaling horizontal</li>
|
|
253
|
+
<li>- Monitoreo centralizado</li>
|
|
254
|
+
</ul>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<div class="card">
|
|
258
|
+
<div class="card-header">
|
|
259
|
+
<div class="card-dot violet"></div>
|
|
260
|
+
<h3>Datos</h3>
|
|
261
|
+
</div>
|
|
262
|
+
<ul>
|
|
263
|
+
<li>- PostgreSQL principal</li>
|
|
264
|
+
<li>- Backups automatizados</li>
|
|
265
|
+
<li>- Réplica de lectura</li>
|
|
266
|
+
</ul>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<!-- Pie -->
|
|
271
|
+
<p class="footer">
|
|
272
|
+
[Nombre del proyecto] — Generado con swl-ses
|
|
273
|
+
</p>
|
|
274
|
+
</div>
|
|
275
|
+
</body>
|
|
276
|
+
</html>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: discutir-fase
|
|
3
|
-
description: Cuestionario adaptativo que se ejecuta antes de planear una fase de desarrollo. Extrae decisiones técnicas y de negocio del usuario, clasifica respuestas como "cerradas" (no negociables) o "abiertas" (decisión delegada al agente), y produce un archivo CONTEXTO.md que alimenta al planificador.
|
|
4
|
-
version: "1.
|
|
3
|
+
description: Cuestionario adaptativo que se ejecuta antes de planear una fase de desarrollo. Extrae decisiones técnicas y de negocio del usuario, clasifica respuestas como "cerradas" (no negociables) o "abiertas" (decisión delegada al agente), y produce un archivo CONTEXTO.md que alimenta al planificador. Inicia con discovery routing (5 paths) que evita el cuestionario completo cuando no aplica.
|
|
4
|
+
version: "1.1.0"
|
|
5
5
|
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
6
6
|
exclusiones:
|
|
7
7
|
- "No cargar si el usuario ya tiene un CONTEXTO.md poblado para la fase en curso — ir directo a `planear-fase`."
|
|
@@ -35,6 +35,54 @@ antipatrón de planear con suposiciones implícitas que luego se contradicen.
|
|
|
35
35
|
|
|
36
36
|
---
|
|
37
37
|
|
|
38
|
+
## Paso 0 — Discovery routing (obligatorio antes del cuestionario)
|
|
39
|
+
|
|
40
|
+
Antes de lanzar el cuestionario adaptativo, ejecuta **scan ligero** de
|
|
41
|
+
`.planning/` para identificar la ruta correcta. Esto evita gastar turnos en
|
|
42
|
+
un cuestionario cuando la petición del usuario no requiere una fase nueva.
|
|
43
|
+
|
|
44
|
+
Inspirado en `kiro-discovery` (cc-sdd) — ver `temp/cc-sdd-main/tools/cc-sdd/templates/agents/claude-code-skills/skills/kiro-discovery/SKILL.md`.
|
|
45
|
+
|
|
46
|
+
### Inventario rápido (solo metadata, NO leer contenido completo)
|
|
47
|
+
|
|
48
|
+
1. `Glob` sobre `.planning/fases/*.md` → lista de fases existentes y su estado.
|
|
49
|
+
2. `Read` de `.planning/HOJA-RUTA.md` (si existe) — para mapear la petición a roadmap.
|
|
50
|
+
3. `Read` del `.planning/ESTADO.md` (si existe) — para conocer fase activa.
|
|
51
|
+
|
|
52
|
+
Si no hay `.planning/`, marca **proyecto verde** y salta al cuestionario completo (Ruta C por defecto).
|
|
53
|
+
|
|
54
|
+
### Determinar la ruta
|
|
55
|
+
|
|
56
|
+
| Ruta | Cuándo aplica | Acción |
|
|
57
|
+
|------|--------------|--------|
|
|
58
|
+
| **RUTA_A** — Extiende fase existente | La petición es una extensión, fix o enhancement dentro del scope de una fase ya planeada. Cabe en `tasks` de un PLAN.md existente. | NO ejecutar cuestionario. Informar al usuario: "Esto encaja en la fase `<N>`. ¿Procedo a actualizar su PLAN.md o lanzar `/swl:ejecutar-fase <N>` directo?" |
|
|
59
|
+
| **RUTA_B** — Sin fase necesaria | Fix trivial (<5 archivos, 1 tarea, sin decisiones de scope). Bug puntual, typo, dependencia, refactor menor. | NO ejecutar cuestionario. Informar al usuario: "Esto no requiere fase formal. Procedo directo con `implementador-swl` o el agente de stack. ¿De acuerdo?" |
|
|
60
|
+
| **RUTA_C** — Nueva fase single-scope | Petición nueva, no encaja en fases existentes, single-domain. | Ejecutar cuestionario completo (Bloques 1-4). |
|
|
61
|
+
| **RUTA_D** — Decomposición multi-fase | Petición spans múltiples dominios o produciría >20 tareas en una sola fase. | Ejecutar cuestionario **resumido** (Bloque 1 + Bloque 4) para extraer decisiones de scope. Luego sugerir descomposición en N fases. Confirmar con usuario antes de proceder. |
|
|
62
|
+
| **RUTA_E** — Mixto | La petición combina: extensión de fase existente + nueva fase + posiblemente fix trivial. | Presentar al usuario la decomposición propuesta y confirmar antes de proceder. Para la parte "nueva fase" ejecutar cuestionario reducido. |
|
|
63
|
+
|
|
64
|
+
### Heurísticas de matching
|
|
65
|
+
|
|
66
|
+
- Si la petición menciona explícitamente "fase N" → considerar RUTA_A primero.
|
|
67
|
+
- Si la petición empieza con "arregla", "corrige", "fix", "elimina" → considerar RUTA_B primero.
|
|
68
|
+
- Si la petición empieza con "implementa", "crea", "agrega feature" → RUTA_C o RUTA_D.
|
|
69
|
+
- Si la petición tiene `y`, `,`, `también` enumerando >2 cosas distintas → RUTA_D o RUTA_E.
|
|
70
|
+
|
|
71
|
+
### Cómo presentar el veredicto
|
|
72
|
+
|
|
73
|
+
Tras el scan, emite un mensaje corto al usuario antes del cuestionario:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Discovery routing: RUTA_<X>
|
|
77
|
+
Justificación: <una oración explicando por qué>
|
|
78
|
+
Próximo paso: <qué se hará a continuación>
|
|
79
|
+
¿Procedo? [s/N o sugerir otra ruta]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Solo después de confirmar la ruta procede con el cuestionario (si aplica).
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
38
86
|
## Protocolo de entrevista adaptativa
|
|
39
87
|
|
|
40
88
|
### Regla 1 — Máximo 4 preguntas por mensaje
|