specleap-framework 2.0.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/.agents/backend.md +419 -0
- package/.agents/frontend.md +577 -0
- package/.agents/producto.md +516 -0
- package/.commands/adoptar.md +323 -0
- package/.commands/ayuda.md +142 -0
- package/.commands/crear-tickets.md +55 -0
- package/.commands/documentar.md +285 -0
- package/.commands/explicar.md +234 -0
- package/.commands/implementar.md +383 -0
- package/.commands/inicio.md +824 -0
- package/.commands/nuevo/README.md +292 -0
- package/.commands/nuevo/questions-base.yaml +320 -0
- package/.commands/nuevo/responses-example.yaml +53 -0
- package/.commands/planificar.md +253 -0
- package/.commands/refinar.md +306 -0
- package/LICENSE +21 -0
- package/README.md +603 -0
- package/SETUP.md +351 -0
- package/install.sh +152 -0
- package/package.json +60 -0
- package/proyectos/_template/.gitkeep +1 -0
- package/proyectos/_template/ANEXOS.md +21 -0
- package/proyectos/_template/CONTRATO.md +26 -0
- package/proyectos/_template/context/.gitkeep +1 -0
- package/rules/development-rules.md +113 -0
- package/rules/environment-protection.md +97 -0
- package/rules/git-workflow.md +142 -0
- package/rules/session-protocol.md +121 -0
- package/scripts/README.md +129 -0
- package/scripts/analyze-project.sh +826 -0
- package/scripts/create-asana-tasks.sh +133 -0
- package/scripts/detect-project-type.sh +141 -0
- package/scripts/estimate-effort.sh +290 -0
- package/scripts/generate-asana-structure.sh +262 -0
- package/scripts/generate-contract.sh +360 -0
- package/scripts/generate-contrato.sh +555 -0
- package/scripts/install-git-hooks.sh +141 -0
- package/scripts/install-skills.sh +130 -0
- package/scripts/lib/asana-utils.sh +191 -0
- package/scripts/lib/jira-project-utils.sh +222 -0
- package/scripts/lib/questions.json +831 -0
- package/scripts/lib/render-contrato.py +195 -0
- package/scripts/lib/validate.sh +325 -0
- package/scripts/parse-contrato.sh +190 -0
- package/scripts/setup-mcp.sh +654 -0
- package/scripts/test-cuestionario.sh +428 -0
- package/setup.sh +458 -0
|
@@ -0,0 +1,831 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"version": "1.0",
|
|
4
|
+
"total_questions": 58,
|
|
5
|
+
"checkpoint_interval": 10,
|
|
6
|
+
"description": "Cuestionario interactivo para generar CONTRATO.md en SpecLeap"
|
|
7
|
+
},
|
|
8
|
+
"questions": [
|
|
9
|
+
{
|
|
10
|
+
"id": "project.type",
|
|
11
|
+
"number": 1,
|
|
12
|
+
"section": "Tipo de Proyecto",
|
|
13
|
+
"text": "¿Qué tipo de proyecto es?",
|
|
14
|
+
"type": "select",
|
|
15
|
+
"options": [
|
|
16
|
+
"nuevo",
|
|
17
|
+
"existente"
|
|
18
|
+
],
|
|
19
|
+
"required": true,
|
|
20
|
+
"help": "nuevo = desde cero | existente = adoptar proyecto legacy en SpecLeap",
|
|
21
|
+
"example": "nuevo"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "project.path",
|
|
25
|
+
"number": 2,
|
|
26
|
+
"section": "Tipo de Proyecto",
|
|
27
|
+
"text": "¿Ruta del proyecto existente?",
|
|
28
|
+
"type": "string",
|
|
29
|
+
"required": false,
|
|
30
|
+
"skip_if": {
|
|
31
|
+
"project.type": "nuevo"
|
|
32
|
+
},
|
|
33
|
+
"help": "Ruta absoluta o relativa al directorio del proyecto legacy",
|
|
34
|
+
"example": "/Users/usuario/mi-proyecto-legacy"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "project.name",
|
|
38
|
+
"number": 3,
|
|
39
|
+
"section": "Información del Proyecto",
|
|
40
|
+
"text": "¿Cuál es el nombre del proyecto? (slug-style: solo minúsculas, números y guiones)",
|
|
41
|
+
"type": "string",
|
|
42
|
+
"validation": {
|
|
43
|
+
"pattern": "^[a-z0-9-]+$",
|
|
44
|
+
"min_length": 3,
|
|
45
|
+
"max_length": 50
|
|
46
|
+
},
|
|
47
|
+
"required": true,
|
|
48
|
+
"default": null,
|
|
49
|
+
"help": "Ejemplo: mi-tienda-online, api-rest-usuarios, dashboard-admin",
|
|
50
|
+
"example": "mi-proyecto"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "project.display_name",
|
|
54
|
+
"number": 4,
|
|
55
|
+
"section": "Información del Proyecto",
|
|
56
|
+
"text": "¿Nombre completo para mostrar?",
|
|
57
|
+
"type": "string",
|
|
58
|
+
"validation": {
|
|
59
|
+
"min_length": 3,
|
|
60
|
+
"max_length": 100
|
|
61
|
+
},
|
|
62
|
+
"required": true,
|
|
63
|
+
"default": null,
|
|
64
|
+
"help": "El nombre que verán los usuarios. Puede tener mayúsculas, espacios y caracteres especiales.",
|
|
65
|
+
"example": "Mi Proyecto Awesome"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "project.responsible",
|
|
69
|
+
"number": 5,
|
|
70
|
+
"section": "Información del Proyecto",
|
|
71
|
+
"text": "¿Quién es el responsable del proyecto?",
|
|
72
|
+
"type": "string",
|
|
73
|
+
"required": true,
|
|
74
|
+
"default": null,
|
|
75
|
+
"help": "Nombre del product owner, tech lead o responsable principal.",
|
|
76
|
+
"example": "Juan Pérez"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "identity.objective",
|
|
80
|
+
"number": 6,
|
|
81
|
+
"section": "Identidad del Proyecto",
|
|
82
|
+
"text": "¿Qué hace este proyecto? (1-2 frases, máximo 200 caracteres)",
|
|
83
|
+
"type": "text",
|
|
84
|
+
"validation": {
|
|
85
|
+
"max_length": 200
|
|
86
|
+
},
|
|
87
|
+
"required": true,
|
|
88
|
+
"help": "Descripción breve del propósito principal.",
|
|
89
|
+
"example": "Plataforma e-commerce para venta de productos artesanales con gestión de inventario y pagos online"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "identity.problem_solved",
|
|
93
|
+
"number": 7,
|
|
94
|
+
"section": "Identidad del Proyecto",
|
|
95
|
+
"text": "¿Qué problema resuelve?",
|
|
96
|
+
"type": "text",
|
|
97
|
+
"validation": {
|
|
98
|
+
"max_length": 300
|
|
99
|
+
},
|
|
100
|
+
"required": true,
|
|
101
|
+
"help": "El dolor o necesidad que soluciona tu proyecto.",
|
|
102
|
+
"example": "Los artesanos no tienen forma fácil de vender online sin conocimientos técnicos ni costos altos"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "identity.target_audience",
|
|
106
|
+
"number": 8,
|
|
107
|
+
"section": "Identidad del Proyecto",
|
|
108
|
+
"text": "¿Quién es el usuario objetivo?",
|
|
109
|
+
"type": "select",
|
|
110
|
+
"options": [
|
|
111
|
+
"personal",
|
|
112
|
+
"team",
|
|
113
|
+
"public",
|
|
114
|
+
"niche"
|
|
115
|
+
],
|
|
116
|
+
"required": true,
|
|
117
|
+
"help": "personal = solo tú | team = tu equipo | public = cualquiera | niche = audiencia específica",
|
|
118
|
+
"example": "public"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "identity.competitors",
|
|
122
|
+
"number": 9,
|
|
123
|
+
"section": "Identidad del Proyecto",
|
|
124
|
+
"text": "¿Referencias o competidores? (opcional, separados por coma)",
|
|
125
|
+
"type": "string",
|
|
126
|
+
"required": false,
|
|
127
|
+
"default": "",
|
|
128
|
+
"help": "Productos similares que te sirven de inspiración.",
|
|
129
|
+
"example": "Shopify, WooCommerce, Etsy"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"id": "stack.backend.framework",
|
|
133
|
+
"number": 10,
|
|
134
|
+
"section": "Stack Tecnológico - Backend",
|
|
135
|
+
"text": "¿Framework backend?",
|
|
136
|
+
"type": "select",
|
|
137
|
+
"options": [
|
|
138
|
+
"laravel",
|
|
139
|
+
"nodejs",
|
|
140
|
+
"python",
|
|
141
|
+
"rails",
|
|
142
|
+
"django",
|
|
143
|
+
"otro"
|
|
144
|
+
],
|
|
145
|
+
"required": true,
|
|
146
|
+
"help": "Framework principal para el servidor.",
|
|
147
|
+
"example": "laravel"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "stack.backend.language",
|
|
151
|
+
"number": 11,
|
|
152
|
+
"section": "Stack Tecnológico - Backend",
|
|
153
|
+
"text": "¿Lenguaje y versión backend?",
|
|
154
|
+
"type": "string",
|
|
155
|
+
"required": true,
|
|
156
|
+
"help": "Ejemplo: PHP 8.3, TypeScript, Python 3.11, Ruby 3.x",
|
|
157
|
+
"example": "PHP 8.3",
|
|
158
|
+
"auto_suggest": {
|
|
159
|
+
"laravel": "PHP 8.3",
|
|
160
|
+
"nodejs": "TypeScript",
|
|
161
|
+
"python": "Python 3.11",
|
|
162
|
+
"django": "Python 3.11",
|
|
163
|
+
"rails": "Ruby 3.2"
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"id": "stack.backend.version",
|
|
168
|
+
"number": 12,
|
|
169
|
+
"section": "Stack Tecnológico - Backend",
|
|
170
|
+
"text": "¿Versión del framework backend?",
|
|
171
|
+
"type": "string",
|
|
172
|
+
"required": true,
|
|
173
|
+
"help": "Versión específica del framework.",
|
|
174
|
+
"example": "11.x",
|
|
175
|
+
"auto_suggest": {
|
|
176
|
+
"laravel": "11.x",
|
|
177
|
+
"nodejs": "20.x",
|
|
178
|
+
"python": "3.11",
|
|
179
|
+
"django": "5.x",
|
|
180
|
+
"rails": "7.x"
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "stack.database.engine",
|
|
185
|
+
"number": 13,
|
|
186
|
+
"section": "Stack Tecnológico - Base de Datos",
|
|
187
|
+
"text": "¿Motor de base de datos?",
|
|
188
|
+
"type": "select",
|
|
189
|
+
"options": [
|
|
190
|
+
"postgresql",
|
|
191
|
+
"mysql",
|
|
192
|
+
"mongodb",
|
|
193
|
+
"sqlite",
|
|
194
|
+
"otro"
|
|
195
|
+
],
|
|
196
|
+
"required": true,
|
|
197
|
+
"help": "Base de datos principal del proyecto.",
|
|
198
|
+
"example": "postgresql"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "stack.database.version",
|
|
202
|
+
"number": 14,
|
|
203
|
+
"section": "Stack Tecnológico - Base de Datos",
|
|
204
|
+
"text": "¿Versión de la base de datos?",
|
|
205
|
+
"type": "string",
|
|
206
|
+
"required": true,
|
|
207
|
+
"help": "Versión específica.",
|
|
208
|
+
"example": "16.x",
|
|
209
|
+
"auto_suggest": {
|
|
210
|
+
"postgresql": "16.x",
|
|
211
|
+
"mysql": "8.0",
|
|
212
|
+
"mongodb": "7.x",
|
|
213
|
+
"sqlite": "3.x"
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": "stack.frontend.framework",
|
|
218
|
+
"number": 15,
|
|
219
|
+
"section": "Stack Tecnológico - Frontend",
|
|
220
|
+
"text": "¿Framework frontend?",
|
|
221
|
+
"type": "select",
|
|
222
|
+
"options": [
|
|
223
|
+
"react",
|
|
224
|
+
"vue",
|
|
225
|
+
"angular",
|
|
226
|
+
"svelte",
|
|
227
|
+
"nextjs",
|
|
228
|
+
"ninguno"
|
|
229
|
+
],
|
|
230
|
+
"required": true,
|
|
231
|
+
"help": "ninguno = solo backend/API sin interfaz visual.",
|
|
232
|
+
"example": "react"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "stack.frontend.language",
|
|
236
|
+
"number": 16,
|
|
237
|
+
"section": "Stack Tecnológico - Frontend",
|
|
238
|
+
"text": "¿Lenguaje frontend?",
|
|
239
|
+
"type": "select",
|
|
240
|
+
"options": [
|
|
241
|
+
"typescript",
|
|
242
|
+
"javascript"
|
|
243
|
+
],
|
|
244
|
+
"required": false,
|
|
245
|
+
"skip_if": {
|
|
246
|
+
"stack.frontend.framework": "none"
|
|
247
|
+
},
|
|
248
|
+
"help": "TypeScript es recomendado para proyectos medianos/grandes.",
|
|
249
|
+
"example": "typescript"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"id": "stack.frontend.build_tool",
|
|
253
|
+
"number": 17,
|
|
254
|
+
"section": "Stack Tecnológico - Frontend",
|
|
255
|
+
"text": "¿Build tool frontend?",
|
|
256
|
+
"type": "select",
|
|
257
|
+
"options": [
|
|
258
|
+
"vite",
|
|
259
|
+
"webpack",
|
|
260
|
+
"parcel",
|
|
261
|
+
"esbuild"
|
|
262
|
+
],
|
|
263
|
+
"required": false,
|
|
264
|
+
"skip_if": {
|
|
265
|
+
"stack.frontend.framework": "none"
|
|
266
|
+
},
|
|
267
|
+
"help": "Vite es el más rápido y moderno (recomendado).",
|
|
268
|
+
"example": "vite"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"id": "stack.frontend.ui_library",
|
|
272
|
+
"number": 18,
|
|
273
|
+
"section": "Stack Tecnológico - Frontend",
|
|
274
|
+
"text": "¿Librería de UI/CSS?",
|
|
275
|
+
"type": "select",
|
|
276
|
+
"options": [
|
|
277
|
+
"tailwind",
|
|
278
|
+
"mui",
|
|
279
|
+
"antd",
|
|
280
|
+
"bootstrap",
|
|
281
|
+
"chakra",
|
|
282
|
+
"custom"
|
|
283
|
+
],
|
|
284
|
+
"required": false,
|
|
285
|
+
"skip_if": {
|
|
286
|
+
"stack.frontend.framework": "none"
|
|
287
|
+
},
|
|
288
|
+
"help": "Tailwind es utility-first y muy popular actualmente.",
|
|
289
|
+
"example": "tailwind"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"id": "stack.devops.hosting",
|
|
293
|
+
"number": 19,
|
|
294
|
+
"section": "Stack Tecnológico - DevOps",
|
|
295
|
+
"text": "¿Dónde se alojará el proyecto?",
|
|
296
|
+
"type": "select",
|
|
297
|
+
"options": [
|
|
298
|
+
"aws",
|
|
299
|
+
"digitalocean",
|
|
300
|
+
"hostinger",
|
|
301
|
+
"vercel",
|
|
302
|
+
"railway",
|
|
303
|
+
"local",
|
|
304
|
+
"otro"
|
|
305
|
+
],
|
|
306
|
+
"required": true,
|
|
307
|
+
"help": "Proveedor de hosting/cloud.",
|
|
308
|
+
"example": "digitalocean"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"id": "stack.devops.ci_cd",
|
|
312
|
+
"number": 20,
|
|
313
|
+
"section": "Stack Tecnológico - DevOps",
|
|
314
|
+
"text": "¿CI/CD?",
|
|
315
|
+
"type": "select",
|
|
316
|
+
"options": [
|
|
317
|
+
"github-actions",
|
|
318
|
+
"gitlab-ci",
|
|
319
|
+
"jenkins",
|
|
320
|
+
"ninguno"
|
|
321
|
+
],
|
|
322
|
+
"required": true,
|
|
323
|
+
"help": "Sistema de integración continua y despliegue automático.",
|
|
324
|
+
"example": "github-actions"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"id": "stack.devops.containers",
|
|
328
|
+
"number": 21,
|
|
329
|
+
"section": "Stack Tecnológico - DevOps",
|
|
330
|
+
"text": "¿Usarás contenedores?",
|
|
331
|
+
"type": "select",
|
|
332
|
+
"options": [
|
|
333
|
+
"docker",
|
|
334
|
+
"kubernetes",
|
|
335
|
+
"ninguno"
|
|
336
|
+
],
|
|
337
|
+
"required": true,
|
|
338
|
+
"help": "Docker para desarrollo, Kubernetes para producción escalable.",
|
|
339
|
+
"example": "docker"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"id": "features.core",
|
|
343
|
+
"number": 22,
|
|
344
|
+
"section": "Funcionalidades Core",
|
|
345
|
+
"text": "Lista de funcionalidades principales (separadas por coma, mínimo 1, máximo 10)",
|
|
346
|
+
"type": "array",
|
|
347
|
+
"validation": {
|
|
348
|
+
"min_items": 1,
|
|
349
|
+
"max_items": 10,
|
|
350
|
+
"separator": ","
|
|
351
|
+
},
|
|
352
|
+
"required": true,
|
|
353
|
+
"help": "Las funcionalidades ESENCIALES que DEBE tener el MVP.",
|
|
354
|
+
"example": "Autenticación de usuarios, Dashboard, Gestión de productos, Carrito de compras, Checkout"
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
"id": "features.secondary",
|
|
358
|
+
"number": 23,
|
|
359
|
+
"section": "Funcionalidades Core",
|
|
360
|
+
"text": "Funcionalidades secundarias (nice-to-have, opcional, separadas por coma)",
|
|
361
|
+
"type": "array",
|
|
362
|
+
"validation": {
|
|
363
|
+
"min_items": 0,
|
|
364
|
+
"max_items": 10,
|
|
365
|
+
"separator": ","
|
|
366
|
+
},
|
|
367
|
+
"required": false,
|
|
368
|
+
"default": [],
|
|
369
|
+
"help": "Funcionalidades deseables pero no críticas para el MVP.",
|
|
370
|
+
"example": "Chat en vivo, Sistema de reseñas, Recomendaciones personalizadas"
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
"id": "features.auth.enabled",
|
|
374
|
+
"number": 24,
|
|
375
|
+
"section": "Sistema de Usuarios",
|
|
376
|
+
"text": "¿Requiere autenticación de usuarios?",
|
|
377
|
+
"type": "boolean",
|
|
378
|
+
"required": true,
|
|
379
|
+
"help": "¿Los usuarios deben poder registrarse y hacer login?",
|
|
380
|
+
"example": "sí"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"id": "features.auth.methods",
|
|
384
|
+
"number": 25,
|
|
385
|
+
"section": "Sistema de Usuarios",
|
|
386
|
+
"text": "Métodos de autenticación (separados por coma)",
|
|
387
|
+
"type": "multiselect",
|
|
388
|
+
"options": [
|
|
389
|
+
"email_password",
|
|
390
|
+
"oauth_google",
|
|
391
|
+
"oauth_github",
|
|
392
|
+
"oauth_facebook",
|
|
393
|
+
"magic_link"
|
|
394
|
+
],
|
|
395
|
+
"skip_if": {
|
|
396
|
+
"features.auth.enabled": false
|
|
397
|
+
},
|
|
398
|
+
"required": false,
|
|
399
|
+
"help": "email_password es el mínimo. OAuth agrega login con redes sociales.",
|
|
400
|
+
"example": "email_password, oauth_google"
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"id": "features.auth.two_factor",
|
|
404
|
+
"number": 26,
|
|
405
|
+
"section": "Sistema de Usuarios",
|
|
406
|
+
"text": "¿Autenticación de dos factores (2FA)?",
|
|
407
|
+
"type": "boolean",
|
|
408
|
+
"skip_if": {
|
|
409
|
+
"features.auth.enabled": false
|
|
410
|
+
},
|
|
411
|
+
"required": false,
|
|
412
|
+
"default": false,
|
|
413
|
+
"help": "Seguridad adicional mediante código SMS/app.",
|
|
414
|
+
"example": "no"
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"id": "users.registration",
|
|
418
|
+
"number": 27,
|
|
419
|
+
"section": "Sistema de Usuarios",
|
|
420
|
+
"text": "¿Los usuarios pueden registrarse?",
|
|
421
|
+
"type": "boolean",
|
|
422
|
+
"required": true,
|
|
423
|
+
"help": "Si es false, los usuarios deben ser creados manualmente por admin.",
|
|
424
|
+
"example": "sí"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"id": "users.roles",
|
|
428
|
+
"number": 28,
|
|
429
|
+
"section": "Sistema de Usuarios",
|
|
430
|
+
"text": "Roles de usuario (separados por coma)",
|
|
431
|
+
"type": "array",
|
|
432
|
+
"validation": {
|
|
433
|
+
"min_items": 1,
|
|
434
|
+
"max_items": 10,
|
|
435
|
+
"separator": ","
|
|
436
|
+
},
|
|
437
|
+
"required": true,
|
|
438
|
+
"help": "Tipos de usuarios con diferentes permisos.",
|
|
439
|
+
"example": "admin, user, guest"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"id": "features.admin_panel.enabled",
|
|
443
|
+
"number": 29,
|
|
444
|
+
"section": "Panel de Administración",
|
|
445
|
+
"text": "¿Panel de administración?",
|
|
446
|
+
"type": "boolean",
|
|
447
|
+
"required": true,
|
|
448
|
+
"help": "Interfaz para gestionar usuarios, contenido, configuración.",
|
|
449
|
+
"example": "sí"
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"id": "features.admin_panel.level",
|
|
453
|
+
"number": 30,
|
|
454
|
+
"section": "Panel de Administración",
|
|
455
|
+
"text": "Nivel del panel de administración",
|
|
456
|
+
"type": "select",
|
|
457
|
+
"options": [
|
|
458
|
+
"completo",
|
|
459
|
+
"básico",
|
|
460
|
+
"ninguno"
|
|
461
|
+
],
|
|
462
|
+
"skip_if": {
|
|
463
|
+
"features.admin_panel.enabled": false
|
|
464
|
+
},
|
|
465
|
+
"required": false,
|
|
466
|
+
"help": "completo = CRUD completo | básico = solo visualización | ninguno = sin panel",
|
|
467
|
+
"example": "completo"
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
"id": "features.file_uploads.enabled",
|
|
471
|
+
"number": 31,
|
|
472
|
+
"section": "Subida de Archivos",
|
|
473
|
+
"text": "¿Subida de archivos (imágenes, documentos, etc.)?",
|
|
474
|
+
"type": "boolean",
|
|
475
|
+
"required": true,
|
|
476
|
+
"help": "¿Los usuarios pueden subir archivos?",
|
|
477
|
+
"example": "sí"
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"id": "features.file_uploads.storage",
|
|
481
|
+
"number": 32,
|
|
482
|
+
"section": "Subida de Archivos",
|
|
483
|
+
"text": "¿Dónde se almacenan los archivos?",
|
|
484
|
+
"type": "select",
|
|
485
|
+
"options": [
|
|
486
|
+
"local",
|
|
487
|
+
"s3",
|
|
488
|
+
"cloudinary",
|
|
489
|
+
"otro"
|
|
490
|
+
],
|
|
491
|
+
"skip_if": {
|
|
492
|
+
"features.file_uploads.enabled": false
|
|
493
|
+
},
|
|
494
|
+
"required": false,
|
|
495
|
+
"help": "local = en el servidor | s3/cloudinary = cloud storage",
|
|
496
|
+
"example": "s3"
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"id": "features.payments.enabled",
|
|
500
|
+
"number": 33,
|
|
501
|
+
"section": "Sistema de Pagos",
|
|
502
|
+
"text": "¿Sistema de pagos?",
|
|
503
|
+
"type": "boolean",
|
|
504
|
+
"required": true,
|
|
505
|
+
"help": "¿Los usuarios pagarán dentro de la plataforma?",
|
|
506
|
+
"example": "sí"
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"id": "features.payments.providers",
|
|
510
|
+
"number": 34,
|
|
511
|
+
"section": "Sistema de Pagos",
|
|
512
|
+
"text": "Proveedores de pago (separados por coma)",
|
|
513
|
+
"type": "multiselect",
|
|
514
|
+
"options": [
|
|
515
|
+
"stripe",
|
|
516
|
+
"paypal",
|
|
517
|
+
"mercadopago",
|
|
518
|
+
"redsys",
|
|
519
|
+
"otro"
|
|
520
|
+
],
|
|
521
|
+
"skip_if": {
|
|
522
|
+
"features.payments.enabled": false
|
|
523
|
+
},
|
|
524
|
+
"required": false,
|
|
525
|
+
"help": "Stripe es el más usado y completo.",
|
|
526
|
+
"example": "stripe, paypal"
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"id": "features.notifications.email",
|
|
530
|
+
"number": 35,
|
|
531
|
+
"section": "Notificaciones",
|
|
532
|
+
"text": "¿Notificaciones por email?",
|
|
533
|
+
"type": "boolean",
|
|
534
|
+
"required": true,
|
|
535
|
+
"help": "Envío de emails automáticos (bienvenida, recuperación password, etc.).",
|
|
536
|
+
"example": "sí"
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
"id": "features.notifications.push",
|
|
540
|
+
"number": 36,
|
|
541
|
+
"section": "Notificaciones",
|
|
542
|
+
"text": "¿Notificaciones push?",
|
|
543
|
+
"type": "boolean",
|
|
544
|
+
"required": true,
|
|
545
|
+
"help": "Notificaciones en navegador o app móvil.",
|
|
546
|
+
"example": "no"
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"id": "features.notifications.in_app",
|
|
550
|
+
"number": 37,
|
|
551
|
+
"section": "Notificaciones",
|
|
552
|
+
"text": "¿Notificaciones in-app?",
|
|
553
|
+
"type": "boolean",
|
|
554
|
+
"required": true,
|
|
555
|
+
"help": "Notificaciones dentro de la interfaz (campana con contador).",
|
|
556
|
+
"example": "sí"
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"id": "design.visual_style",
|
|
560
|
+
"number": 38,
|
|
561
|
+
"section": "Diseño",
|
|
562
|
+
"text": "Estilo visual",
|
|
563
|
+
"type": "select",
|
|
564
|
+
"options": [
|
|
565
|
+
"minimal",
|
|
566
|
+
"modern",
|
|
567
|
+
"professional",
|
|
568
|
+
"creative",
|
|
569
|
+
"playful"
|
|
570
|
+
],
|
|
571
|
+
"required": true,
|
|
572
|
+
"help": "Estética general de la interfaz.",
|
|
573
|
+
"example": "modern"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"id": "design.primary_color",
|
|
577
|
+
"number": 39,
|
|
578
|
+
"section": "Diseño",
|
|
579
|
+
"text": "Color primario (hexcode, ejemplo: #3B82F6)",
|
|
580
|
+
"type": "string",
|
|
581
|
+
"validation": {
|
|
582
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
583
|
+
},
|
|
584
|
+
"required": false,
|
|
585
|
+
"default": "#3B82F6",
|
|
586
|
+
"help": "Color principal de la marca (botones, enlaces, etc.).",
|
|
587
|
+
"example": "#3B82F6"
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"id": "design.dark_mode",
|
|
591
|
+
"number": 40,
|
|
592
|
+
"section": "Diseño",
|
|
593
|
+
"text": "¿Modo oscuro?",
|
|
594
|
+
"type": "boolean",
|
|
595
|
+
"required": true,
|
|
596
|
+
"help": "Tema dark alternativo.",
|
|
597
|
+
"example": "no"
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
"id": "design.responsive",
|
|
601
|
+
"number": 41,
|
|
602
|
+
"section": "Diseño",
|
|
603
|
+
"text": "¿Responsive (móvil/tablet/desktop)?",
|
|
604
|
+
"type": "boolean",
|
|
605
|
+
"required": true,
|
|
606
|
+
"help": "Adaptación a todos los tamaños de pantalla.",
|
|
607
|
+
"example": "sí"
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"id": "architecture.pattern",
|
|
611
|
+
"number": 42,
|
|
612
|
+
"section": "Arquitectura",
|
|
613
|
+
"text": "Patrón de arquitectura",
|
|
614
|
+
"type": "select",
|
|
615
|
+
"options": [
|
|
616
|
+
"mvc",
|
|
617
|
+
"ddd",
|
|
618
|
+
"clean",
|
|
619
|
+
"hexagonal",
|
|
620
|
+
"otro"
|
|
621
|
+
],
|
|
622
|
+
"required": true,
|
|
623
|
+
"help": "mvc = Model-View-Controller (Laravel default) | ddd = Domain-Driven Design",
|
|
624
|
+
"example": "mvc"
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"id": "architecture.separation",
|
|
628
|
+
"number": 43,
|
|
629
|
+
"section": "Arquitectura",
|
|
630
|
+
"text": "Separación backend/frontend",
|
|
631
|
+
"type": "select",
|
|
632
|
+
"options": [
|
|
633
|
+
"monolith",
|
|
634
|
+
"separated",
|
|
635
|
+
"microservices"
|
|
636
|
+
],
|
|
637
|
+
"required": true,
|
|
638
|
+
"help": "monolith = todo junto | separated = API + frontend separados | microservices = servicios independientes",
|
|
639
|
+
"example": "separated"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"id": "deployment.ssl",
|
|
643
|
+
"number": 44,
|
|
644
|
+
"section": "Despliegue",
|
|
645
|
+
"text": "¿HTTPS obligatorio?",
|
|
646
|
+
"type": "boolean",
|
|
647
|
+
"required": true,
|
|
648
|
+
"help": "Siempre recomendado para producción.",
|
|
649
|
+
"example": "sí"
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
"id": "deployment.custom_domain",
|
|
653
|
+
"number": 45,
|
|
654
|
+
"section": "Despliegue",
|
|
655
|
+
"text": "Dominio personalizado (opcional)",
|
|
656
|
+
"type": "string",
|
|
657
|
+
"required": false,
|
|
658
|
+
"default": "",
|
|
659
|
+
"help": "Ejemplo: www.mitienda.com",
|
|
660
|
+
"example": "www.miproyecto.com"
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"id": "deployment.environments",
|
|
664
|
+
"number": 46,
|
|
665
|
+
"section": "Despliegue",
|
|
666
|
+
"text": "Entornos de despliegue (separados por coma)",
|
|
667
|
+
"type": "array",
|
|
668
|
+
"validation": {
|
|
669
|
+
"min_items": 1,
|
|
670
|
+
"max_items": 5,
|
|
671
|
+
"separator": ","
|
|
672
|
+
},
|
|
673
|
+
"required": true,
|
|
674
|
+
"help": "Típicamente: development, staging, production",
|
|
675
|
+
"example": "development, staging, production"
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"id": "security.level",
|
|
679
|
+
"number": 47,
|
|
680
|
+
"section": "Seguridad",
|
|
681
|
+
"text": "Nivel de seguridad",
|
|
682
|
+
"type": "select",
|
|
683
|
+
"options": [
|
|
684
|
+
"básico",
|
|
685
|
+
"medio",
|
|
686
|
+
"alto"
|
|
687
|
+
],
|
|
688
|
+
"required": true,
|
|
689
|
+
"help": "básico = estándar | medio = + auditoría | alto = + encriptación end-to-end",
|
|
690
|
+
"example": "medio"
|
|
691
|
+
},
|
|
692
|
+
{
|
|
693
|
+
"id": "security.gdpr_compliant",
|
|
694
|
+
"number": 48,
|
|
695
|
+
"section": "Seguridad",
|
|
696
|
+
"text": "¿Cumplimiento GDPR/RGPD?",
|
|
697
|
+
"type": "boolean",
|
|
698
|
+
"required": true,
|
|
699
|
+
"help": "Requerido si tienes usuarios en Europa.",
|
|
700
|
+
"example": "sí"
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"id": "security.sensitive_data",
|
|
704
|
+
"number": 49,
|
|
705
|
+
"section": "Seguridad",
|
|
706
|
+
"text": "¿Maneja datos sensibles (médicos, financieros, etc.)?",
|
|
707
|
+
"type": "boolean",
|
|
708
|
+
"required": true,
|
|
709
|
+
"help": "Requiere seguridad adicional y cumplimiento normativo.",
|
|
710
|
+
"example": "no"
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"id": "performance.load_time_target",
|
|
714
|
+
"number": 50,
|
|
715
|
+
"section": "Rendimiento",
|
|
716
|
+
"text": "Tiempo de carga objetivo",
|
|
717
|
+
"type": "select",
|
|
718
|
+
"options": [
|
|
719
|
+
"< 1s",
|
|
720
|
+
"< 2s",
|
|
721
|
+
"< 3s",
|
|
722
|
+
"no crítico"
|
|
723
|
+
],
|
|
724
|
+
"required": true,
|
|
725
|
+
"help": "Tiempo de carga inicial de la página principal.",
|
|
726
|
+
"example": "< 2s"
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
"id": "performance.api_response_target",
|
|
730
|
+
"number": 51,
|
|
731
|
+
"section": "Rendimiento",
|
|
732
|
+
"text": "Tiempo de respuesta API objetivo",
|
|
733
|
+
"type": "select",
|
|
734
|
+
"options": [
|
|
735
|
+
"< 100ms",
|
|
736
|
+
"< 200ms",
|
|
737
|
+
"< 500ms",
|
|
738
|
+
"no crítico"
|
|
739
|
+
],
|
|
740
|
+
"required": true,
|
|
741
|
+
"help": "Tiempo de respuesta de endpoints críticos.",
|
|
742
|
+
"example": "< 200ms"
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"id": "performance.concurrent_users",
|
|
746
|
+
"number": 52,
|
|
747
|
+
"section": "Rendimiento",
|
|
748
|
+
"text": "Usuarios concurrentes esperados (número)",
|
|
749
|
+
"type": "number",
|
|
750
|
+
"validation": {
|
|
751
|
+
"min": 0,
|
|
752
|
+
"max": 1000000
|
|
753
|
+
},
|
|
754
|
+
"required": true,
|
|
755
|
+
"help": "Cuántos usuarios simultáneos esperas al lanzar.",
|
|
756
|
+
"example": "100"
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
"id": "testing.unit",
|
|
760
|
+
"number": 53,
|
|
761
|
+
"section": "Testing",
|
|
762
|
+
"text": "¿Tests unitarios?",
|
|
763
|
+
"type": "boolean",
|
|
764
|
+
"required": true,
|
|
765
|
+
"help": "Tests de funciones y clases individuales.",
|
|
766
|
+
"example": "sí"
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
"id": "testing.integration",
|
|
770
|
+
"number": 54,
|
|
771
|
+
"section": "Testing",
|
|
772
|
+
"text": "¿Tests de integración?",
|
|
773
|
+
"type": "boolean",
|
|
774
|
+
"required": true,
|
|
775
|
+
"help": "Tests de interacción entre módulos/APIs.",
|
|
776
|
+
"example": "sí"
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"id": "testing.e2e",
|
|
780
|
+
"number": 55,
|
|
781
|
+
"section": "Testing",
|
|
782
|
+
"text": "¿Tests end-to-end?",
|
|
783
|
+
"type": "boolean",
|
|
784
|
+
"required": true,
|
|
785
|
+
"help": "Tests de flujos completos de usuario (Playwright, Cypress).",
|
|
786
|
+
"example": "no"
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
"id": "testing.coverage_target",
|
|
790
|
+
"number": 56,
|
|
791
|
+
"section": "Testing",
|
|
792
|
+
"text": "Cobertura de tests objetivo (0-100%)",
|
|
793
|
+
"type": "number",
|
|
794
|
+
"validation": {
|
|
795
|
+
"min": 0,
|
|
796
|
+
"max": 100
|
|
797
|
+
},
|
|
798
|
+
"required": false,
|
|
799
|
+
"default": 0,
|
|
800
|
+
"help": "Porcentaje de código cubierto por tests. 80% es buen objetivo.",
|
|
801
|
+
"example": "80"
|
|
802
|
+
},
|
|
803
|
+
{
|
|
804
|
+
"id": "constraints.time_limit",
|
|
805
|
+
"number": 57,
|
|
806
|
+
"section": "Restricciones",
|
|
807
|
+
"text": "Plazo de entrega (opcional)",
|
|
808
|
+
"type": "string",
|
|
809
|
+
"required": false,
|
|
810
|
+
"default": "",
|
|
811
|
+
"help": "Ejemplo: 2 weeks, 3 months, none",
|
|
812
|
+
"example": "3 months"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"id": "constraints.out_of_scope",
|
|
816
|
+
"number": 58,
|
|
817
|
+
"section": "Restricciones",
|
|
818
|
+
"text": "Fuera de alcance (cosas que NO se incluyen, separadas por coma, opcional)",
|
|
819
|
+
"type": "array",
|
|
820
|
+
"validation": {
|
|
821
|
+
"min_items": 0,
|
|
822
|
+
"max_items": 10,
|
|
823
|
+
"separator": ","
|
|
824
|
+
},
|
|
825
|
+
"required": false,
|
|
826
|
+
"default": [],
|
|
827
|
+
"help": "Funcionalidades explícitamente excluidas del proyecto.",
|
|
828
|
+
"example": "Integración con redes sociales, App móvil nativa, Soporte multiidioma"
|
|
829
|
+
}
|
|
830
|
+
]
|
|
831
|
+
}
|