specleap-framework 2.1.9 → 2.1.11

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 CHANGED
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.1.11] - 2026-04-30
11
+
12
+ ### Fixed
13
+
14
+ - **`setup.sh` was lying about how many Agent Skills get installed.** The "Paso 4/6" header correctly read "34 skills" but the description right below said "SpecLeap incluye 20 Agent Skills profesionales" with a four-bullet breakdown that summed to exactly 20 — leftover text from before the 14 TIER 2 skills were added in v2.1.0. Reported by Styng during v2.1.10 testing.
15
+
16
+ #### What the user sees now
17
+
18
+ - The full count (34) is stated up front.
19
+ - TIER 1 (20) is broken down into its 6 actual categories: Consistency (3), Backend/Dev (7), Design (4), DevOps (3), Testing (2), Frontend (1).
20
+ - TIER 2 (14) is broken down into its 8 actual categories: Design/Frontend advanced (3), Mobile (2), Security audits/GDPR (2), Testing advanced (2), Infrastructure (2), Brainstorming (1), PDF (1), Documentation (1).
21
+ - Both blocks are localised (ES + EN) and visually grouped with bold tier headers so the user can scan them quickly before deciding whether to install.
22
+
23
+ The numbers now match exactly what `scripts/install-skills.sh` actually downloads from upstream repos (obra/superpowers, jeffallan/claude-skills, anthropics/skills, vercel-labs/agent-*, alirezarezvani/claude-skills).
24
+
25
+ ## [2.1.10] - 2026-04-30
26
+
27
+ ### Added
28
+
29
+ - **Installer now also asks for the folder name**, on top of the base folder prompt added in v2.1.9. The user can keep `specleap-framework` (the default) or pick a custom name like `mi-app-tienda` straight from the prompt — no more renaming after install with `mv`.
30
+ - **Two-argument CLI form:** `npx specleap-framework@latest <base> [<name>]`. Both positional. If `<name>` is omitted, the prompt asks. If `<base>` is also omitted, both prompts run interactively.
31
+ - **Folder name validation:** allows letters, numbers, `-`, `_` and `.`, must not start with `.`, must be ≤100 chars. Invalid input on the prompt re-asks until valid; invalid input on the CLI argument aborts with a clear bilingual error and exit 1.
32
+
33
+ ### Changed
34
+
35
+ - The "ya existe" abort message now reads "elige otra carpeta o nombre" (instead of just "elige otra carpeta base"), matching the new flexibility.
36
+
37
+ ### Notes
38
+
39
+ - Backwards compatible with v2.1.9: same env var (`SPECLEAP_INSTALL_PATH`) handed off to `setup.sh`, same final summary block, same fallback behaviour for direct `bash setup.sh` invocations.
40
+ - Decision rationale: keep the prompt-based flow (no native GUI dialog) so the installer keeps working over SSH, in CI/CD pipelines and inside containers — exactly the kind of environments where a Mac-only `osascript` dialog would have broken things.
41
+
10
42
  ## [2.1.9] - 2026-04-30
11
43
 
12
44
  ### Added
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  SpecLeap convierte cualquier IDE con asistente de IA en un entorno de desarrollo spec-first. Combina un contrato de proyecto inmutable, agentes conversacionales especializados, 34 Agent Skills profesionales y un pipeline de validación en tres capas para entregar código consistente y probado sin improvisación.
22
22
 
23
- **Versión actual:** 2.1.9 · **Licencia:** MIT · **Autor:** Styng Arias ([ConceptualCreative](https://conceptualcreative.com))
23
+ **Versión actual:** 2.1.11 · **Licencia:** MIT · **Autor:** Styng Arias ([ConceptualCreative](https://conceptualcreative.com))
24
24
 
25
25
  ---
26
26
 
package/bin/specleap CHANGED
@@ -6,9 +6,19 @@ const fs = require('fs');
6
6
  const readline = require('readline');
7
7
  const os = require('os');
8
8
 
9
- // Nombre fijo de la carpeta destino. NO es configurable: si el usuario
10
- // quiere otro nombre, renombra la carpeta a posteriori con `mv`.
11
- const FOLDER_NAME = 'specleap-framework';
9
+ // Nombre por defecto de la carpeta destino. El usuario puede cambiarlo
10
+ // en el prompt; si pulsa Enter, se usa este valor.
11
+ const DEFAULT_FOLDER_NAME = 'specleap-framework';
12
+
13
+ // Validador de nombre de carpeta: caracteres seguros para sistemas de
14
+ // archivos cross-platform (sin `/`, sin nulos, sin barras). Permite letras,
15
+ // números, guiones, guiones bajos y puntos. No puede empezar con punto.
16
+ function isValidFolderName(name) {
17
+ if (!name || name.length === 0) return false;
18
+ if (name.length > 100) return false;
19
+ if (name.startsWith('.')) return false;
20
+ return /^[A-Za-z0-9_][A-Za-z0-9_.\-]*$/.test(name);
21
+ }
12
22
 
13
23
  // Directorio del paquete npm (donde están todos los archivos a copiar)
14
24
  const packageDir = path.join(__dirname, '..');
@@ -26,49 +36,104 @@ function resolveBasePath(input) {
26
36
  return path.resolve(process.cwd(), trimmed);
27
37
  }
28
38
 
29
- // Pregunta interactiva al usuario por la carpeta base.
30
- // Bilingüe en el prompt porque el idioma de SpecLeap se elige más tarde
31
- // dentro de setup.sh — aquí todavía no lo sabemos.
32
- function askBasePath(defaultBase) {
33
- return new Promise((resolve) => {
34
- const rl = readline.createInterface({
35
- input: process.stdin,
36
- output: process.stdout
37
- });
39
+ // Crea una interfaz readline reutilizable; cerramos al final del flujo.
40
+ function createPrompt() {
41
+ return readline.createInterface({
42
+ input: process.stdin,
43
+ output: process.stdout
44
+ });
45
+ }
46
+
47
+ function ask(rl, question) {
48
+ return new Promise((resolve) => rl.question(question, (a) => resolve(a)));
49
+ }
50
+
51
+ // Pregunta la carpeta base donde poner el proyecto. Bilingüe porque el
52
+ // idioma de SpecLeap se elige después dentro de setup.sh.
53
+ async function askBasePath(rl, defaultBase) {
54
+ console.log('');
55
+ console.log('📁 ¿En qué carpeta base instalar SpecLeap?');
56
+ console.log(' Where do you want to install SpecLeap?');
57
+ console.log('');
58
+ console.log(` Default: ${defaultBase}`);
59
+ console.log('');
60
+ console.log(' Ejemplos / Examples:');
61
+ console.log(' ~/Downloads → ~/Downloads/<nombre>');
62
+ console.log(' ~/Desktop/work → ~/Desktop/work/<nombre>');
63
+ console.log(' . → ./<nombre>');
64
+ console.log(' (Enter) → default arriba');
65
+ console.log('');
66
+
67
+ const answer = await ask(rl, 'Carpeta base / Base folder: ');
68
+ return resolveBasePath(answer);
69
+ }
70
+
71
+ // Pregunta el nombre de la carpeta. Default = "specleap-framework".
72
+ // Reintenta si el nombre tiene caracteres inválidos.
73
+ async function askFolderName(rl) {
74
+ console.log('');
75
+ console.log('📝 ¿Qué nombre quieres para la carpeta?');
76
+ console.log(' What name do you want for the folder?');
77
+ console.log('');
78
+ console.log(` Default: ${DEFAULT_FOLDER_NAME}`);
79
+ console.log(' Permitido / Allowed: letras, números, guiones, guiones bajos, puntos');
80
+ console.log(' No permitido / Not allowed: espacios, "/", caracteres especiales');
81
+ console.log('');
82
+
83
+ while (true) {
84
+ const answer = await ask(rl, 'Nombre / Name: ');
85
+ const name = answer.trim();
86
+
87
+ // Enter → default
88
+ if (!name) return DEFAULT_FOLDER_NAME;
89
+
90
+ if (isValidFolderName(name)) return name;
38
91
 
39
92
  console.log('');
40
- console.log('📁 ¿En qué carpeta base instalar SpecLeap?');
41
- console.log(' Where do you want to install SpecLeap?');
42
- console.log('');
43
- console.log(` Se creará / Will create: <base>/${FOLDER_NAME}`);
44
- console.log(` Default: ${defaultBase}`);
45
- console.log('');
46
- console.log(' Ejemplos / Examples:');
47
- console.log(' ~/Downloads → ~/Downloads/specleap-framework');
48
- console.log(' ~/Desktop/work → ~/Desktop/work/specleap-framework');
49
- console.log(' . → ./specleap-framework');
50
- console.log(' (Enter) → default arriba');
93
+ console.log(`❌ Nombre inválido / Invalid name: "${name}"`);
94
+ console.log(' Usa solo letras, números, "-", "_" y "." (sin empezar con ".")');
95
+ console.log(' Use only letters, numbers, "-", "_" and "." (cannot start with ".")');
51
96
  console.log('');
52
-
53
- rl.question('Carpeta base / Base folder: ', (answer) => {
54
- rl.close();
55
- resolve(resolveBasePath(answer));
56
- });
57
- });
97
+ }
58
98
  }
59
99
 
60
100
  async function main() {
61
- // Argumento CLI opcional: `npx specleap-framework@latest ~/Downloads`
62
- const args = process.argv.slice(2);
63
- const argBase = args.find((a) => !a.startsWith('-'));
64
-
65
- // Si no hay argumento, preguntar interactivamente con default = cwd
66
- let basePath;
67
- if (argBase) {
68
- basePath = resolveBasePath(argBase);
69
- console.log(`\n📁 Carpeta base: ${basePath}`);
70
- } else {
71
- basePath = await askBasePath(process.cwd());
101
+ // Argumentos CLI opcionales:
102
+ // npx specleap-framework@latest <carpeta-base> [<nombre>]
103
+ // p.ej. npx specleap-framework@latest ~/Downloads
104
+ // npx specleap-framework@latest ~/Downloads mi-app
105
+ const args = process.argv.slice(2).filter((a) => !a.startsWith('-'));
106
+ const argBase = args[0];
107
+ const argName = args[1];
108
+
109
+ // Validar el nombre del argumento CLI antes de seguir
110
+ if (argName && !isValidFolderName(argName)) {
111
+ console.error(`\n❌ Nombre inválido / Invalid name: "${argName}"`);
112
+ console.error(' Usa solo letras, números, "-", "_" y "." (sin empezar con ".")');
113
+ console.error(' Use only letters, numbers, "-", "_" and "." (cannot start with ".")\n');
114
+ process.exit(1);
115
+ }
116
+
117
+ // Si hay argumentos CLI, no abrimos prompt; si faltan, preguntamos
118
+ let basePath, folderName;
119
+ const rl = (!argBase || !argName) ? createPrompt() : null;
120
+
121
+ try {
122
+ if (argBase) {
123
+ basePath = resolveBasePath(argBase);
124
+ console.log(`\n📁 Carpeta base: ${basePath}`);
125
+ } else {
126
+ basePath = await askBasePath(rl, process.cwd());
127
+ }
128
+
129
+ if (argName) {
130
+ folderName = argName;
131
+ console.log(`📝 Nombre de carpeta: ${folderName}`);
132
+ } else {
133
+ folderName = await askFolderName(rl);
134
+ }
135
+ } finally {
136
+ if (rl) rl.close();
72
137
  }
73
138
 
74
139
  // Verificar que la carpeta base existe (o se puede crear)
@@ -83,21 +148,20 @@ async function main() {
83
148
  }
84
149
  }
85
150
 
86
- // Verificar que sea un directorio (no un archivo con ese nombre)
87
151
  const baseStat = fs.statSync(basePath);
88
152
  if (!baseStat.isDirectory()) {
89
153
  console.error(`\n❌ La ruta no es una carpeta / Path is not a directory: ${basePath}\n`);
90
154
  process.exit(1);
91
155
  }
92
156
 
93
- // Construir el destino final: <basePath>/specleap-framework
94
- const targetDir = path.join(basePath, FOLDER_NAME);
157
+ // Destino final: <basePath>/<folderName>
158
+ const targetDir = path.join(basePath, folderName);
95
159
 
96
160
  // No sobrescribir si ya existe
97
161
  if (fs.existsSync(targetDir)) {
98
162
  console.error(`\n❌ Ya existe / Already exists: ${targetDir}`);
99
- console.error(' Elige otra carpeta base o elimina la existente.');
100
- console.error(' Choose another base folder or delete the existing one.\n');
163
+ console.error(' Elige otra carpeta o nombre, o elimina la existente.');
164
+ console.error(' Choose another folder or name, or delete the existing one.\n');
101
165
  process.exit(1);
102
166
  }
103
167
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specleap-framework",
3
- "version": "2.1.9",
3
+ "version": "2.1.11",
4
4
  "description": "Spec-Driven Development Framework — Transform VSCode, Cursor, JetBrains into spec-first development machines",
5
5
  "keywords": [
6
6
  "spec-driven-development",
package/setup.sh CHANGED
@@ -395,20 +395,48 @@ echo -e "${CYAN}${LINE}${NC}"
395
395
  echo ""
396
396
 
397
397
  if [ "$LANG" = "es" ]; then
398
- echo "SpecLeap incluye 20 Agent Skills profesionales:"
399
- echo " • 5 Seguridad (OWASP, STRIDE)"
400
- echo " 3 Consistencia (verification-before-completion)"
401
- echo " 6 Diseño (Vercel-style, UI/UX)"
402
- echo " 6 Backend/Dev (Laravel, React, TDD)"
398
+ echo "SpecLeap incluye 34 Agent Skills profesionales:"
399
+ echo ""
400
+ echo " ${BOLD}TIER 1 (20 skills):${NC}"
401
+ echo " 3 Consistencia (verification-before-completion, code review)"
402
+ echo " 7 Backend/Dev (Laravel, React, Python, API, DB)"
403
+ echo " • 4 Diseño (Vercel-style, UI/UX, Canvas)"
404
+ echo " • 3 DevOps (Cloud, Architecture)"
405
+ echo " • 2 Testing (TDD, Code Review)"
406
+ echo " • 1 Frontend (TypeScript)"
407
+ echo ""
408
+ echo " ${BOLD}TIER 2 (14 skills):${NC}"
409
+ echo " • 3 Design/Frontend avanzado (Vercel agent-browser)"
410
+ echo " • 2 Mobile (React Native, Flutter)"
411
+ echo " • 2 Security (audits, GDPR/DSGVO)"
412
+ echo " • 2 Testing avanzado (Playwright, Test Master)"
413
+ echo " • 2 Infrastructure (Terraform, Monitoring)"
414
+ echo " • 1 Brainstorming"
415
+ echo " • 1 PDF"
416
+ echo " • 1 Documentation"
403
417
  echo ""
404
418
  echo "⏱️ Tiempo: 2-3 minutos"
405
419
  echo ""
406
420
  else
407
- echo "SpecLeap includes 20 professional Agent Skills:"
408
- echo " • 5 Security (OWASP, STRIDE)"
409
- echo " 3 Consistency (verification-before-completion)"
410
- echo " 6 Design (Vercel-style, UI/UX)"
411
- echo " 6 Backend/Dev (Laravel, React, TDD)"
421
+ echo "SpecLeap includes 34 professional Agent Skills:"
422
+ echo ""
423
+ echo " ${BOLD}TIER 1 (20 skills):${NC}"
424
+ echo " 3 Consistency (verification-before-completion, code review)"
425
+ echo " 7 Backend/Dev (Laravel, React, Python, API, DB)"
426
+ echo " • 4 Design (Vercel-style, UI/UX, Canvas)"
427
+ echo " • 3 DevOps (Cloud, Architecture)"
428
+ echo " • 2 Testing (TDD, Code Review)"
429
+ echo " • 1 Frontend (TypeScript)"
430
+ echo ""
431
+ echo " ${BOLD}TIER 2 (14 skills):${NC}"
432
+ echo " • 3 Design/Frontend advanced (Vercel agent-browser)"
433
+ echo " • 2 Mobile (React Native, Flutter)"
434
+ echo " • 2 Security (audits, GDPR/DSGVO)"
435
+ echo " • 2 Testing advanced (Playwright, Test Master)"
436
+ echo " • 2 Infrastructure (Terraform, Monitoring)"
437
+ echo " • 1 Brainstorming"
438
+ echo " • 1 PDF"
439
+ echo " • 1 Documentation"
412
440
  echo ""
413
441
  echo "⏱️ Time: 2-3 minutes"
414
442
  echo ""