specleap-framework 2.1.6 → 2.1.8
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/CHANGELOG.md +31 -0
- package/README.md +15 -1
- package/openspec/cli/apply.sh +37 -1
- package/openspec/cli/archive.sh +32 -1
- package/openspec/cli/code-review.sh +35 -1
- package/openspec/cli/common.sh +23 -0
- package/openspec/cli/enrich.sh +37 -1
- package/openspec/cli/ff.sh +35 -1
- package/openspec/cli/new.sh +39 -1
- package/openspec/cli/report.sh +35 -1
- package/openspec/cli/status.sh +29 -1
- package/openspec/cli/verify.sh +34 -1
- package/package.json +1 -1
- package/scripts/generate-contrato.sh +7 -2
- package/scripts/install-git-hooks.sh +68 -4
- package/scripts/lib/questions.en.json +831 -0
- package/setup.sh +157 -61
- /package/scripts/lib/{questions.json → questions.es.json} +0 -0
|
@@ -0,0 +1,831 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"version": "1.0",
|
|
4
|
+
"total_questions": 58,
|
|
5
|
+
"checkpoint_interval": 10,
|
|
6
|
+
"description": "Interactive questionnaire to generate CONTRATO.md in SpecLeap"
|
|
7
|
+
},
|
|
8
|
+
"questions": [
|
|
9
|
+
{
|
|
10
|
+
"id": "project.type",
|
|
11
|
+
"number": 1,
|
|
12
|
+
"section": "Project Type",
|
|
13
|
+
"text": "What kind of project is this?",
|
|
14
|
+
"type": "select",
|
|
15
|
+
"options": [
|
|
16
|
+
"nuevo",
|
|
17
|
+
"existente"
|
|
18
|
+
],
|
|
19
|
+
"required": true,
|
|
20
|
+
"help": "nuevo = from scratch | existente = adopt a legacy project into SpecLeap",
|
|
21
|
+
"example": "nuevo"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "project.path",
|
|
25
|
+
"number": 2,
|
|
26
|
+
"section": "Project Type",
|
|
27
|
+
"text": "Path to the existing project?",
|
|
28
|
+
"type": "string",
|
|
29
|
+
"required": false,
|
|
30
|
+
"skip_if": {
|
|
31
|
+
"project.type": "nuevo"
|
|
32
|
+
},
|
|
33
|
+
"help": "Absolute or relative path to the legacy project directory",
|
|
34
|
+
"example": "/Users/me/my-legacy-project"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "project.name",
|
|
38
|
+
"number": 3,
|
|
39
|
+
"section": "Project Information",
|
|
40
|
+
"text": "Project name? (slug-style: lowercase, numbers and hyphens only)",
|
|
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": "Examples: my-online-store, rest-users-api, admin-dashboard",
|
|
50
|
+
"example": "my-project"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "project.display_name",
|
|
54
|
+
"number": 4,
|
|
55
|
+
"section": "Project Information",
|
|
56
|
+
"text": "Full display name?",
|
|
57
|
+
"type": "string",
|
|
58
|
+
"validation": {
|
|
59
|
+
"min_length": 3,
|
|
60
|
+
"max_length": 100
|
|
61
|
+
},
|
|
62
|
+
"required": true,
|
|
63
|
+
"default": null,
|
|
64
|
+
"help": "The name users will see. Can have uppercase, spaces and special characters.",
|
|
65
|
+
"example": "My Awesome Project"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "project.responsible",
|
|
69
|
+
"number": 5,
|
|
70
|
+
"section": "Project Information",
|
|
71
|
+
"text": "Who owns this project?",
|
|
72
|
+
"type": "string",
|
|
73
|
+
"required": true,
|
|
74
|
+
"default": null,
|
|
75
|
+
"help": "Name of the product owner, tech lead or main person in charge.",
|
|
76
|
+
"example": "Jane Doe"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "identity.objective",
|
|
80
|
+
"number": 6,
|
|
81
|
+
"section": "Project Identity",
|
|
82
|
+
"text": "What does this project do? (1-2 sentences, max 200 characters)",
|
|
83
|
+
"type": "text",
|
|
84
|
+
"validation": {
|
|
85
|
+
"max_length": 200
|
|
86
|
+
},
|
|
87
|
+
"required": true,
|
|
88
|
+
"help": "Brief description of the main purpose.",
|
|
89
|
+
"example": "E-commerce platform for selling artisan products with inventory management and online payments"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "identity.problem_solved",
|
|
93
|
+
"number": 7,
|
|
94
|
+
"section": "Project Identity",
|
|
95
|
+
"text": "What problem does it solve?",
|
|
96
|
+
"type": "text",
|
|
97
|
+
"validation": {
|
|
98
|
+
"max_length": 300
|
|
99
|
+
},
|
|
100
|
+
"required": true,
|
|
101
|
+
"help": "The pain point or need your project addresses.",
|
|
102
|
+
"example": "Artisans have no easy way to sell online without technical knowledge or high costs"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "identity.target_audience",
|
|
106
|
+
"number": 8,
|
|
107
|
+
"section": "Project Identity",
|
|
108
|
+
"text": "Who is the target user?",
|
|
109
|
+
"type": "select",
|
|
110
|
+
"options": [
|
|
111
|
+
"personal",
|
|
112
|
+
"team",
|
|
113
|
+
"public",
|
|
114
|
+
"niche"
|
|
115
|
+
],
|
|
116
|
+
"required": true,
|
|
117
|
+
"help": "personal = just you | team = your team | public = anyone | niche = specific audience",
|
|
118
|
+
"example": "public"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "identity.competitors",
|
|
122
|
+
"number": 9,
|
|
123
|
+
"section": "Project Identity",
|
|
124
|
+
"text": "References or competitors? (optional, comma-separated)",
|
|
125
|
+
"type": "string",
|
|
126
|
+
"required": false,
|
|
127
|
+
"default": "",
|
|
128
|
+
"help": "Similar products that inspire you.",
|
|
129
|
+
"example": "Shopify, WooCommerce, Etsy"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"id": "stack.backend.framework",
|
|
133
|
+
"number": 10,
|
|
134
|
+
"section": "Tech Stack — Backend",
|
|
135
|
+
"text": "Backend framework?",
|
|
136
|
+
"type": "select",
|
|
137
|
+
"options": [
|
|
138
|
+
"laravel",
|
|
139
|
+
"nodejs",
|
|
140
|
+
"python",
|
|
141
|
+
"rails",
|
|
142
|
+
"django",
|
|
143
|
+
"otro"
|
|
144
|
+
],
|
|
145
|
+
"required": true,
|
|
146
|
+
"help": "Main server-side framework.",
|
|
147
|
+
"example": "laravel"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "stack.backend.language",
|
|
151
|
+
"number": 11,
|
|
152
|
+
"section": "Tech Stack — Backend",
|
|
153
|
+
"text": "Backend language and version?",
|
|
154
|
+
"type": "string",
|
|
155
|
+
"required": true,
|
|
156
|
+
"help": "Examples: 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": "Tech Stack — Backend",
|
|
170
|
+
"text": "Backend framework version?",
|
|
171
|
+
"type": "string",
|
|
172
|
+
"required": true,
|
|
173
|
+
"help": "Specific framework version.",
|
|
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": "Tech Stack — Database",
|
|
187
|
+
"text": "Database engine?",
|
|
188
|
+
"type": "select",
|
|
189
|
+
"options": [
|
|
190
|
+
"postgresql",
|
|
191
|
+
"mysql",
|
|
192
|
+
"mongodb",
|
|
193
|
+
"sqlite",
|
|
194
|
+
"otro"
|
|
195
|
+
],
|
|
196
|
+
"required": true,
|
|
197
|
+
"help": "Main database for the project.",
|
|
198
|
+
"example": "postgresql"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "stack.database.version",
|
|
202
|
+
"number": 14,
|
|
203
|
+
"section": "Tech Stack — Database",
|
|
204
|
+
"text": "Database version?",
|
|
205
|
+
"type": "string",
|
|
206
|
+
"required": true,
|
|
207
|
+
"help": "Specific version.",
|
|
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": "Tech Stack — Frontend",
|
|
220
|
+
"text": "Frontend framework?",
|
|
221
|
+
"type": "select",
|
|
222
|
+
"options": [
|
|
223
|
+
"react",
|
|
224
|
+
"vue",
|
|
225
|
+
"angular",
|
|
226
|
+
"svelte",
|
|
227
|
+
"nextjs",
|
|
228
|
+
"ninguno"
|
|
229
|
+
],
|
|
230
|
+
"required": true,
|
|
231
|
+
"help": "ninguno = backend/API only without visual interface.",
|
|
232
|
+
"example": "react"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "stack.frontend.language",
|
|
236
|
+
"number": 16,
|
|
237
|
+
"section": "Tech Stack — Frontend",
|
|
238
|
+
"text": "Frontend language?",
|
|
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 is recommended for medium/large projects.",
|
|
249
|
+
"example": "typescript"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"id": "stack.frontend.build_tool",
|
|
253
|
+
"number": 17,
|
|
254
|
+
"section": "Tech Stack — Frontend",
|
|
255
|
+
"text": "Frontend build tool?",
|
|
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 is the fastest and most modern (recommended).",
|
|
268
|
+
"example": "vite"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"id": "stack.frontend.ui_library",
|
|
272
|
+
"number": 18,
|
|
273
|
+
"section": "Tech Stack — Frontend",
|
|
274
|
+
"text": "UI/CSS library?",
|
|
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 is utility-first and very popular today.",
|
|
289
|
+
"example": "tailwind"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"id": "stack.devops.hosting",
|
|
293
|
+
"number": 19,
|
|
294
|
+
"section": "Tech Stack — DevOps",
|
|
295
|
+
"text": "Where will the project be hosted?",
|
|
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": "Hosting/cloud provider.",
|
|
308
|
+
"example": "digitalocean"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"id": "stack.devops.ci_cd",
|
|
312
|
+
"number": 20,
|
|
313
|
+
"section": "Tech Stack — 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": "Continuous integration and automated deployment system.",
|
|
324
|
+
"example": "github-actions"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"id": "stack.devops.containers",
|
|
328
|
+
"number": 21,
|
|
329
|
+
"section": "Tech Stack — DevOps",
|
|
330
|
+
"text": "Will you use containers?",
|
|
331
|
+
"type": "select",
|
|
332
|
+
"options": [
|
|
333
|
+
"docker",
|
|
334
|
+
"kubernetes",
|
|
335
|
+
"ninguno"
|
|
336
|
+
],
|
|
337
|
+
"required": true,
|
|
338
|
+
"help": "Docker for development, Kubernetes for scalable production.",
|
|
339
|
+
"example": "docker"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"id": "features.core",
|
|
343
|
+
"number": 22,
|
|
344
|
+
"section": "Core Features",
|
|
345
|
+
"text": "List of main features (comma-separated, min 1, max 10)",
|
|
346
|
+
"type": "array",
|
|
347
|
+
"validation": {
|
|
348
|
+
"min_items": 1,
|
|
349
|
+
"max_items": 10,
|
|
350
|
+
"separator": ","
|
|
351
|
+
},
|
|
352
|
+
"required": true,
|
|
353
|
+
"help": "The ESSENTIAL features the MVP MUST have.",
|
|
354
|
+
"example": "User authentication, Dashboard, Product management, Shopping cart, Checkout"
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
"id": "features.secondary",
|
|
358
|
+
"number": 23,
|
|
359
|
+
"section": "Core Features",
|
|
360
|
+
"text": "Secondary features (nice-to-have, optional, comma-separated)",
|
|
361
|
+
"type": "array",
|
|
362
|
+
"validation": {
|
|
363
|
+
"min_items": 0,
|
|
364
|
+
"max_items": 10,
|
|
365
|
+
"separator": ","
|
|
366
|
+
},
|
|
367
|
+
"required": false,
|
|
368
|
+
"default": [],
|
|
369
|
+
"help": "Desirable but non-critical features for the MVP.",
|
|
370
|
+
"example": "Live chat, Review system, Personalized recommendations"
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
"id": "features.auth.enabled",
|
|
374
|
+
"number": 24,
|
|
375
|
+
"section": "User System",
|
|
376
|
+
"text": "Does it require user authentication?",
|
|
377
|
+
"type": "boolean",
|
|
378
|
+
"required": true,
|
|
379
|
+
"help": "Should users be able to sign up and log in?",
|
|
380
|
+
"example": "yes"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"id": "features.auth.methods",
|
|
384
|
+
"number": 25,
|
|
385
|
+
"section": "User System",
|
|
386
|
+
"text": "Authentication methods (comma-separated)",
|
|
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 is the minimum. OAuth adds social login.",
|
|
400
|
+
"example": "email_password, oauth_google"
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"id": "features.auth.two_factor",
|
|
404
|
+
"number": 26,
|
|
405
|
+
"section": "User System",
|
|
406
|
+
"text": "Two-factor authentication (2FA)?",
|
|
407
|
+
"type": "boolean",
|
|
408
|
+
"skip_if": {
|
|
409
|
+
"features.auth.enabled": false
|
|
410
|
+
},
|
|
411
|
+
"required": false,
|
|
412
|
+
"default": false,
|
|
413
|
+
"help": "Extra security via SMS code or authenticator app.",
|
|
414
|
+
"example": "no"
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"id": "users.registration",
|
|
418
|
+
"number": 27,
|
|
419
|
+
"section": "User System",
|
|
420
|
+
"text": "Can users register themselves?",
|
|
421
|
+
"type": "boolean",
|
|
422
|
+
"required": true,
|
|
423
|
+
"help": "If false, users must be created manually by an admin.",
|
|
424
|
+
"example": "yes"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"id": "users.roles",
|
|
428
|
+
"number": 28,
|
|
429
|
+
"section": "User System",
|
|
430
|
+
"text": "User roles (comma-separated)",
|
|
431
|
+
"type": "array",
|
|
432
|
+
"validation": {
|
|
433
|
+
"min_items": 1,
|
|
434
|
+
"max_items": 10,
|
|
435
|
+
"separator": ","
|
|
436
|
+
},
|
|
437
|
+
"required": true,
|
|
438
|
+
"help": "Types of users with different permissions.",
|
|
439
|
+
"example": "admin, user, guest"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"id": "features.admin_panel.enabled",
|
|
443
|
+
"number": 29,
|
|
444
|
+
"section": "Admin Panel",
|
|
445
|
+
"text": "Admin panel?",
|
|
446
|
+
"type": "boolean",
|
|
447
|
+
"required": true,
|
|
448
|
+
"help": "Interface to manage users, content and configuration.",
|
|
449
|
+
"example": "yes"
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"id": "features.admin_panel.level",
|
|
453
|
+
"number": 30,
|
|
454
|
+
"section": "Admin Panel",
|
|
455
|
+
"text": "Admin panel scope",
|
|
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 = full CRUD | básico = view-only | ninguno = no panel",
|
|
467
|
+
"example": "completo"
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
"id": "features.file_uploads.enabled",
|
|
471
|
+
"number": 31,
|
|
472
|
+
"section": "File Uploads",
|
|
473
|
+
"text": "File uploads (images, documents, etc.)?",
|
|
474
|
+
"type": "boolean",
|
|
475
|
+
"required": true,
|
|
476
|
+
"help": "Can users upload files?",
|
|
477
|
+
"example": "yes"
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"id": "features.file_uploads.storage",
|
|
481
|
+
"number": 32,
|
|
482
|
+
"section": "File Uploads",
|
|
483
|
+
"text": "Where are files stored?",
|
|
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 = on the server | s3/cloudinary = cloud storage",
|
|
496
|
+
"example": "s3"
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"id": "features.payments.enabled",
|
|
500
|
+
"number": 33,
|
|
501
|
+
"section": "Payments",
|
|
502
|
+
"text": "Payment system?",
|
|
503
|
+
"type": "boolean",
|
|
504
|
+
"required": true,
|
|
505
|
+
"help": "Will users pay inside the platform?",
|
|
506
|
+
"example": "yes"
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"id": "features.payments.providers",
|
|
510
|
+
"number": 34,
|
|
511
|
+
"section": "Payments",
|
|
512
|
+
"text": "Payment providers (comma-separated)",
|
|
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 is the most widely used and complete.",
|
|
526
|
+
"example": "stripe, paypal"
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"id": "features.notifications.email",
|
|
530
|
+
"number": 35,
|
|
531
|
+
"section": "Notifications",
|
|
532
|
+
"text": "Email notifications?",
|
|
533
|
+
"type": "boolean",
|
|
534
|
+
"required": true,
|
|
535
|
+
"help": "Automated emails (welcome, password reset, etc.).",
|
|
536
|
+
"example": "yes"
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
"id": "features.notifications.push",
|
|
540
|
+
"number": 36,
|
|
541
|
+
"section": "Notifications",
|
|
542
|
+
"text": "Push notifications?",
|
|
543
|
+
"type": "boolean",
|
|
544
|
+
"required": true,
|
|
545
|
+
"help": "Browser or mobile app notifications.",
|
|
546
|
+
"example": "no"
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"id": "features.notifications.in_app",
|
|
550
|
+
"number": 37,
|
|
551
|
+
"section": "Notifications",
|
|
552
|
+
"text": "In-app notifications?",
|
|
553
|
+
"type": "boolean",
|
|
554
|
+
"required": true,
|
|
555
|
+
"help": "Notifications inside the interface (bell icon with counter).",
|
|
556
|
+
"example": "yes"
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"id": "design.visual_style",
|
|
560
|
+
"number": 38,
|
|
561
|
+
"section": "Design",
|
|
562
|
+
"text": "Visual style",
|
|
563
|
+
"type": "select",
|
|
564
|
+
"options": [
|
|
565
|
+
"minimal",
|
|
566
|
+
"modern",
|
|
567
|
+
"professional",
|
|
568
|
+
"creative",
|
|
569
|
+
"playful"
|
|
570
|
+
],
|
|
571
|
+
"required": true,
|
|
572
|
+
"help": "Overall aesthetic of the interface.",
|
|
573
|
+
"example": "modern"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"id": "design.primary_color",
|
|
577
|
+
"number": 39,
|
|
578
|
+
"section": "Design",
|
|
579
|
+
"text": "Primary color (hex code, e.g. #3B82F6)",
|
|
580
|
+
"type": "string",
|
|
581
|
+
"validation": {
|
|
582
|
+
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
583
|
+
},
|
|
584
|
+
"required": false,
|
|
585
|
+
"default": "#3B82F6",
|
|
586
|
+
"help": "Main brand color (buttons, links, etc.).",
|
|
587
|
+
"example": "#3B82F6"
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"id": "design.dark_mode",
|
|
591
|
+
"number": 40,
|
|
592
|
+
"section": "Design",
|
|
593
|
+
"text": "Dark mode?",
|
|
594
|
+
"type": "boolean",
|
|
595
|
+
"required": true,
|
|
596
|
+
"help": "Alternative dark theme.",
|
|
597
|
+
"example": "no"
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
"id": "design.responsive",
|
|
601
|
+
"number": 41,
|
|
602
|
+
"section": "Design",
|
|
603
|
+
"text": "Responsive (mobile/tablet/desktop)?",
|
|
604
|
+
"type": "boolean",
|
|
605
|
+
"required": true,
|
|
606
|
+
"help": "Adapts to all screen sizes.",
|
|
607
|
+
"example": "yes"
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"id": "architecture.pattern",
|
|
611
|
+
"number": 42,
|
|
612
|
+
"section": "Architecture",
|
|
613
|
+
"text": "Architecture pattern",
|
|
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": "Architecture",
|
|
630
|
+
"text": "Backend/frontend separation",
|
|
631
|
+
"type": "select",
|
|
632
|
+
"options": [
|
|
633
|
+
"monolith",
|
|
634
|
+
"separated",
|
|
635
|
+
"microservices"
|
|
636
|
+
],
|
|
637
|
+
"required": true,
|
|
638
|
+
"help": "monolith = all together | separated = API + frontend separated | microservices = independent services",
|
|
639
|
+
"example": "separated"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"id": "deployment.ssl",
|
|
643
|
+
"number": 44,
|
|
644
|
+
"section": "Deployment",
|
|
645
|
+
"text": "Mandatory HTTPS?",
|
|
646
|
+
"type": "boolean",
|
|
647
|
+
"required": true,
|
|
648
|
+
"help": "Always recommended for production.",
|
|
649
|
+
"example": "yes"
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
"id": "deployment.custom_domain",
|
|
653
|
+
"number": 45,
|
|
654
|
+
"section": "Deployment",
|
|
655
|
+
"text": "Custom domain (optional)",
|
|
656
|
+
"type": "string",
|
|
657
|
+
"required": false,
|
|
658
|
+
"default": "",
|
|
659
|
+
"help": "Example: www.mystore.com",
|
|
660
|
+
"example": "www.myproject.com"
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"id": "deployment.environments",
|
|
664
|
+
"number": 46,
|
|
665
|
+
"section": "Deployment",
|
|
666
|
+
"text": "Deployment environments (comma-separated)",
|
|
667
|
+
"type": "array",
|
|
668
|
+
"validation": {
|
|
669
|
+
"min_items": 1,
|
|
670
|
+
"max_items": 5,
|
|
671
|
+
"separator": ","
|
|
672
|
+
},
|
|
673
|
+
"required": true,
|
|
674
|
+
"help": "Typically: development, staging, production",
|
|
675
|
+
"example": "development, staging, production"
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"id": "security.level",
|
|
679
|
+
"number": 47,
|
|
680
|
+
"section": "Security",
|
|
681
|
+
"text": "Security level",
|
|
682
|
+
"type": "select",
|
|
683
|
+
"options": [
|
|
684
|
+
"básico",
|
|
685
|
+
"medio",
|
|
686
|
+
"alto"
|
|
687
|
+
],
|
|
688
|
+
"required": true,
|
|
689
|
+
"help": "básico = standard | medio = + auditing | alto = + end-to-end encryption",
|
|
690
|
+
"example": "medio"
|
|
691
|
+
},
|
|
692
|
+
{
|
|
693
|
+
"id": "security.gdpr_compliant",
|
|
694
|
+
"number": 48,
|
|
695
|
+
"section": "Security",
|
|
696
|
+
"text": "GDPR/RGPD compliance?",
|
|
697
|
+
"type": "boolean",
|
|
698
|
+
"required": true,
|
|
699
|
+
"help": "Required if you have users in Europe.",
|
|
700
|
+
"example": "yes"
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"id": "security.sensitive_data",
|
|
704
|
+
"number": 49,
|
|
705
|
+
"section": "Security",
|
|
706
|
+
"text": "Handles sensitive data (medical, financial, etc.)?",
|
|
707
|
+
"type": "boolean",
|
|
708
|
+
"required": true,
|
|
709
|
+
"help": "Requires extra security and regulatory compliance.",
|
|
710
|
+
"example": "no"
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"id": "performance.load_time_target",
|
|
714
|
+
"number": 50,
|
|
715
|
+
"section": "Performance",
|
|
716
|
+
"text": "Target load time",
|
|
717
|
+
"type": "select",
|
|
718
|
+
"options": [
|
|
719
|
+
"< 1s",
|
|
720
|
+
"< 2s",
|
|
721
|
+
"< 3s",
|
|
722
|
+
"no crítico"
|
|
723
|
+
],
|
|
724
|
+
"required": true,
|
|
725
|
+
"help": "Initial load time of the main page.",
|
|
726
|
+
"example": "< 2s"
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
"id": "performance.api_response_target",
|
|
730
|
+
"number": 51,
|
|
731
|
+
"section": "Performance",
|
|
732
|
+
"text": "Target API response time",
|
|
733
|
+
"type": "select",
|
|
734
|
+
"options": [
|
|
735
|
+
"< 100ms",
|
|
736
|
+
"< 200ms",
|
|
737
|
+
"< 500ms",
|
|
738
|
+
"no crítico"
|
|
739
|
+
],
|
|
740
|
+
"required": true,
|
|
741
|
+
"help": "Response time of critical endpoints.",
|
|
742
|
+
"example": "< 200ms"
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"id": "performance.concurrent_users",
|
|
746
|
+
"number": 52,
|
|
747
|
+
"section": "Performance",
|
|
748
|
+
"text": "Expected concurrent users (number)",
|
|
749
|
+
"type": "number",
|
|
750
|
+
"validation": {
|
|
751
|
+
"min": 0,
|
|
752
|
+
"max": 1000000
|
|
753
|
+
},
|
|
754
|
+
"required": true,
|
|
755
|
+
"help": "How many simultaneous users you expect at launch.",
|
|
756
|
+
"example": "100"
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
"id": "testing.unit",
|
|
760
|
+
"number": 53,
|
|
761
|
+
"section": "Testing",
|
|
762
|
+
"text": "Unit tests?",
|
|
763
|
+
"type": "boolean",
|
|
764
|
+
"required": true,
|
|
765
|
+
"help": "Tests for individual functions and classes.",
|
|
766
|
+
"example": "yes"
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
"id": "testing.integration",
|
|
770
|
+
"number": 54,
|
|
771
|
+
"section": "Testing",
|
|
772
|
+
"text": "Integration tests?",
|
|
773
|
+
"type": "boolean",
|
|
774
|
+
"required": true,
|
|
775
|
+
"help": "Tests for interaction between modules/APIs.",
|
|
776
|
+
"example": "yes"
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"id": "testing.e2e",
|
|
780
|
+
"number": 55,
|
|
781
|
+
"section": "Testing",
|
|
782
|
+
"text": "End-to-end tests?",
|
|
783
|
+
"type": "boolean",
|
|
784
|
+
"required": true,
|
|
785
|
+
"help": "Tests for full user flows (Playwright, Cypress).",
|
|
786
|
+
"example": "no"
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
"id": "testing.coverage_target",
|
|
790
|
+
"number": 56,
|
|
791
|
+
"section": "Testing",
|
|
792
|
+
"text": "Target test coverage (0-100%)",
|
|
793
|
+
"type": "number",
|
|
794
|
+
"validation": {
|
|
795
|
+
"min": 0,
|
|
796
|
+
"max": 100
|
|
797
|
+
},
|
|
798
|
+
"required": false,
|
|
799
|
+
"default": 0,
|
|
800
|
+
"help": "Percentage of code covered by tests. 80% is a good target.",
|
|
801
|
+
"example": "80"
|
|
802
|
+
},
|
|
803
|
+
{
|
|
804
|
+
"id": "constraints.time_limit",
|
|
805
|
+
"number": 57,
|
|
806
|
+
"section": "Constraints",
|
|
807
|
+
"text": "Delivery deadline (optional)",
|
|
808
|
+
"type": "string",
|
|
809
|
+
"required": false,
|
|
810
|
+
"default": "",
|
|
811
|
+
"help": "Examples: 2 weeks, 3 months, none",
|
|
812
|
+
"example": "3 months"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"id": "constraints.out_of_scope",
|
|
816
|
+
"number": 58,
|
|
817
|
+
"section": "Constraints",
|
|
818
|
+
"text": "Out of scope (things NOT included, comma-separated, optional)",
|
|
819
|
+
"type": "array",
|
|
820
|
+
"validation": {
|
|
821
|
+
"min_items": 0,
|
|
822
|
+
"max_items": 10,
|
|
823
|
+
"separator": ","
|
|
824
|
+
},
|
|
825
|
+
"required": false,
|
|
826
|
+
"default": [],
|
|
827
|
+
"help": "Features explicitly excluded from the project.",
|
|
828
|
+
"example": "Social media integration, Native mobile app, Multi-language support"
|
|
829
|
+
}
|
|
830
|
+
]
|
|
831
|
+
}
|