don-cheli-sdd 1.16.1 → 1.16.3
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 +16 -0
- package/README.es.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/VERSION +1 -1
- package/package.json +1 -1
- package/scripts/.claude/don-cheli/VERSION +1 -1
- package/scripts/.claude/don-cheli/scripts/instalar.sh +159 -70
- package/scripts/generar-config.sh +20 -7
- package/scripts/instalar.sh +159 -70
- package/comandos/especdev/cambios.md +0 -14
- package/scripts/.claude/commands/especdev/cambios.md +0 -14
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ Todos los cambios notables en Don Cheli SDD Framework.
|
|
|
4
4
|
|
|
5
5
|
Formato basado en [Conventional Commits](https://www.conventionalcommits.org/).
|
|
6
6
|
|
|
7
|
+
## [1.16.3](https://github.com/doncheli/don-cheli-sdd/compare/v1.16.2...v1.16.3) (2026-04-02)
|
|
8
|
+
|
|
9
|
+
### Correcciones
|
|
10
|
+
|
|
11
|
+
* perfil Custom muestra 0 skills/comandos cuando gum falla ([d32af4c](https://github.com/doncheli/don-cheli-sdd/commit/d32af4c36ea12a7de4173b709efb209c76e1fe59))
|
|
12
|
+
|
|
13
|
+
## [1.16.2](https://github.com/doncheli/don-cheli-sdd/compare/v1.16.1...v1.16.2) (2026-04-02)
|
|
14
|
+
|
|
15
|
+
### Correcciones
|
|
16
|
+
|
|
17
|
+
* corregir instalador interactivo y Antigravity ([3b0031c](https://github.com/doncheli/don-cheli-sdd/commit/3b0031c1f795bcc6b6b8103b40b17e7bfe13a25e))
|
|
18
|
+
|
|
19
|
+
### Documentación
|
|
20
|
+
|
|
21
|
+
* agregar Social Media Kit completo (LinkedIn, Instagram, X, TikTok, YouTube) ([599027f](https://github.com/doncheli/don-cheli-sdd/commit/599027f567bb87116b9292ecbcdbb98bba4b1651))
|
|
22
|
+
|
|
7
23
|
## [1.16.1](https://github.com/doncheli/don-cheli-sdd/compare/v1.16.0...v1.16.1) (2026-04-01)
|
|
8
24
|
|
|
9
25
|
### Correcciones
|
package/README.es.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#-instalación"><img src="https://img.shields.io/badge/instalación-2_minutos-brightgreen" alt="Install"></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/versión-1.16.
|
|
15
|
+
<img src="https://img.shields.io/badge/versión-1.16.3-blue" alt="Version">
|
|
16
16
|
<img src="https://img.shields.io/badge/licencia-Apache%202.0-green" alt="License">
|
|
17
17
|
<img src="https://img.shields.io/badge/idiomas-ES%20|%20EN%20|%20PT-red" alt="Languages">
|
|
18
18
|
<img src="https://img.shields.io/badge/comandos-85+-purple" alt="Commands">
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#-installation"><img src="https://img.shields.io/badge/install-2_minutes-brightgreen" alt="Install"></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/version-1.16.
|
|
15
|
+
<img src="https://img.shields.io/badge/version-1.16.3-blue" alt="Version">
|
|
16
16
|
<img src="https://img.shields.io/badge/license-Apache%202.0-green" alt="License">
|
|
17
17
|
<img src="https://img.shields.io/badge/languages-ES%20|%20EN%20|%20PT-red" alt="Languages">
|
|
18
18
|
<img src="https://img.shields.io/badge/commands-85+-purple" alt="Commands">
|
package/README.pt.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#-instalação"><img src="https://img.shields.io/badge/instalação-2_minutos-brightgreen" alt="Install"></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/versão-1.16.
|
|
15
|
+
<img src="https://img.shields.io/badge/versão-1.16.3-blue" alt="Version">
|
|
16
16
|
<img src="https://img.shields.io/badge/licença-Apache%202.0-green" alt="License">
|
|
17
17
|
<img src="https://img.shields.io/badge/idiomas-ES%20|%20EN%20|%20PT-red" alt="Languages">
|
|
18
18
|
<img src="https://img.shields.io/badge/comandos-85+-purple" alt="Commands">
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.16.
|
|
1
|
+
1.16.3
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.16.
|
|
1
|
+
1.16.3
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
|
-
VERSION="1.16.
|
|
7
|
+
VERSION="1.16.3"
|
|
8
8
|
REPO_URL="https://github.com/doncheli/don-cheli-sdd"
|
|
9
9
|
CLEANUP_TMPDIR=""
|
|
10
10
|
|
|
@@ -336,6 +336,7 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
336
336
|
|
|
337
337
|
# Step 1: Tool Selection (if not provided via flag)
|
|
338
338
|
if [ -z "$TOOLS_FLAG" ]; then
|
|
339
|
+
GUM_TOOLS_OK=false
|
|
339
340
|
if [ "$HAS_GUM" = true ]; then
|
|
340
341
|
TOOLS_RAW=$(printf "Claude Code\nCodex\nCursor\nAntigravity\nWindsurf\nAmp\nContinue.dev\nOpenCode\nTodos" | \
|
|
341
342
|
gum choose --no-limit \
|
|
@@ -345,21 +346,25 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
345
346
|
--selected.foreground="120" \
|
|
346
347
|
< /dev/tty 2>/dev/null) || true
|
|
347
348
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
349
|
+
if [ -n "$TOOLS_RAW" ]; then
|
|
350
|
+
TOOLS_FLAG=""
|
|
351
|
+
while IFS= read -r tool; do
|
|
352
|
+
case "$tool" in
|
|
353
|
+
"Claude Code") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}claude" ;;
|
|
354
|
+
"Codex") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}codex" ;;
|
|
355
|
+
"Cursor") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}cursor" ;;
|
|
356
|
+
"Antigravity") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}antigravity" ;;
|
|
357
|
+
"Windsurf") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}windsurf" ;;
|
|
358
|
+
"Amp") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
|
|
359
|
+
"Continue.dev") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
|
|
360
|
+
"OpenCode") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
|
|
361
|
+
"Todos") TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode" ;;
|
|
362
|
+
esac
|
|
363
|
+
done <<< "$TOOLS_RAW"
|
|
364
|
+
GUM_TOOLS_OK=true
|
|
365
|
+
fi
|
|
366
|
+
fi
|
|
367
|
+
if [ "$GUM_TOOLS_OK" = false ]; then
|
|
363
368
|
echo -e " ${BOLD}¿Dónde quieres instalar Don Cheli SDD?${NC}"
|
|
364
369
|
echo ""
|
|
365
370
|
echo -e " ${CYAN}1)${NC} Claude Code (CLAUDE.md + comandos)"
|
|
@@ -373,7 +378,10 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
373
378
|
echo -e " ${CYAN}9)${NC} Todos"
|
|
374
379
|
echo ""
|
|
375
380
|
echo -ne " ${BOLD}▸ Elige (números separados por coma): ${NC}"
|
|
376
|
-
|
|
381
|
+
TOOLS_CHOICE=""
|
|
382
|
+
read -r TOOLS_CHOICE < /dev/tty 2>/dev/null || read -r TOOLS_CHOICE 2>/dev/null || TOOLS_CHOICE=""
|
|
383
|
+
if [ -z "$TOOLS_CHOICE" ]; then
|
|
384
|
+
echo -e " ${YELLOW}⚠ No se pudo leer input. Usando: Todos${NC}"
|
|
377
385
|
TOOLS_CHOICE="9"
|
|
378
386
|
fi
|
|
379
387
|
|
|
@@ -398,6 +406,7 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
398
406
|
|
|
399
407
|
# Step 2: Profile Selection (if not provided via flag)
|
|
400
408
|
if [ -z "$PROFILE_FLAG" ]; then
|
|
409
|
+
GUM_PROFILE_OK=false
|
|
401
410
|
if [ "$HAS_GUM" = true ]; then
|
|
402
411
|
PROFILE_CHOICE=$(printf "👻 Phantom Coder [Full-stack] — Pipeline completo, TDD, quality gates\n💀 Reaper Sec [Seguridad] — OWASP, auditoría, pentest workflow\n🏗 System Architect [Arquitectura] — Blueprints, SOLID, APIs, migraciones\n⚡ Speedrunner [MVP/Startup] — PoC, estimados, validación veloz\n🔮 The Oracle [Razonamiento] — 15 modelos mentales, análisis profundo\n🥷 Dev Dojo [Aprendizaje] — Documentación viva, ADRs, Obsidian\n⚙️ Custom [Manual] — Seleccionar skills y comandos manualmente" | \
|
|
403
412
|
gum choose \
|
|
@@ -406,17 +415,21 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
406
415
|
--cursor.foreground="212" \
|
|
407
416
|
< /dev/tty 2>/dev/null) || true
|
|
408
417
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
418
|
+
if [ -n "$PROFILE_CHOICE" ]; then
|
|
419
|
+
case "$PROFILE_CHOICE" in
|
|
420
|
+
*Phantom*) PROFILE_FLAG="phantom" ;;
|
|
421
|
+
*Reaper*) PROFILE_FLAG="reaper" ;;
|
|
422
|
+
*Architect*) PROFILE_FLAG="architect" ;;
|
|
423
|
+
*Speedrun*) PROFILE_FLAG="speedrun" ;;
|
|
424
|
+
*Oracle*) PROFILE_FLAG="oracle" ;;
|
|
425
|
+
*Dojo*) PROFILE_FLAG="dojo" ;;
|
|
426
|
+
*Custom*) PROFILE_FLAG="custom" ;;
|
|
427
|
+
*) PROFILE_FLAG="phantom" ;;
|
|
428
|
+
esac
|
|
429
|
+
GUM_PROFILE_OK=true
|
|
430
|
+
fi
|
|
431
|
+
fi
|
|
432
|
+
if [ "$GUM_PROFILE_OK" = false ]; then
|
|
420
433
|
echo ""
|
|
421
434
|
echo -e " ${BOLD}Elige tu perfil de desarrollador:${NC}"
|
|
422
435
|
echo ""
|
|
@@ -429,7 +442,10 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
429
442
|
echo -e " ${CYAN}7)${NC} ⚙️ Custom ${DIM}[Manual]${NC} Seleccionar todo manualmente"
|
|
430
443
|
echo ""
|
|
431
444
|
echo -ne " ${BOLD}▸ ${NC}"
|
|
432
|
-
|
|
445
|
+
PROFILE_CHOICE=""
|
|
446
|
+
read -r PROFILE_CHOICE < /dev/tty 2>/dev/null || read -r PROFILE_CHOICE 2>/dev/null || PROFILE_CHOICE=""
|
|
447
|
+
if [ -z "$PROFILE_CHOICE" ]; then
|
|
448
|
+
echo -e " ${YELLOW}⚠ No se pudo leer input. Usando: Phantom Coder${NC}"
|
|
433
449
|
PROFILE_CHOICE="1"
|
|
434
450
|
fi
|
|
435
451
|
|
|
@@ -465,19 +481,38 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
465
481
|
# Try to install gum for interactive selection
|
|
466
482
|
install_gum
|
|
467
483
|
|
|
484
|
+
# Build skills list
|
|
485
|
+
ALL_SKILLS=""
|
|
486
|
+
ALL_SKILLS_ARRAY=()
|
|
487
|
+
for skill_dir in "${SCRIPT_DIR}/habilidades/"*/; do
|
|
488
|
+
[ -d "$skill_dir" ] || continue
|
|
489
|
+
skill_name=$(basename "$skill_dir")
|
|
490
|
+
ALL_SKILLS="${ALL_SKILLS}${skill_name}\n"
|
|
491
|
+
ALL_SKILLS_ARRAY+=("$skill_name")
|
|
492
|
+
done
|
|
493
|
+
|
|
494
|
+
# Build commands list
|
|
495
|
+
ALL_CMDS=""
|
|
496
|
+
ALL_CMDS_ARRAY=()
|
|
497
|
+
for cmd_file in "${SCRIPT_DIR}/comandos/especdev/"*.md; do
|
|
498
|
+
[ -f "$cmd_file" ] || continue
|
|
499
|
+
cmd_name="dc:$(basename "$cmd_file" .md)"
|
|
500
|
+
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
501
|
+
ALL_CMDS_ARRAY+=("$cmd_name")
|
|
502
|
+
done
|
|
503
|
+
for cmd_file in "${SCRIPT_DIR}/comandos/razonar/"*.md; do
|
|
504
|
+
[ -f "$cmd_file" ] || continue
|
|
505
|
+
cmd_name="razonar:$(basename "$cmd_file" .md)"
|
|
506
|
+
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
507
|
+
ALL_CMDS_ARRAY+=("$cmd_name")
|
|
508
|
+
done
|
|
509
|
+
|
|
510
|
+
CUSTOM_GUM_OK=false
|
|
468
511
|
if [ "$HAS_GUM" = true ]; then
|
|
469
512
|
echo ""
|
|
470
513
|
echo -e " ${BOLD}Selecciona las skills que necesitas:${NC}"
|
|
471
514
|
echo ""
|
|
472
515
|
|
|
473
|
-
# Build skills list from habilidades/ directory
|
|
474
|
-
ALL_SKILLS=""
|
|
475
|
-
for skill_dir in "${SCRIPT_DIR}/habilidades/"*/; do
|
|
476
|
-
[ -d "$skill_dir" ] || continue
|
|
477
|
-
skill_name=$(basename "$skill_dir")
|
|
478
|
-
ALL_SKILLS="${ALL_SKILLS}${skill_name}\n"
|
|
479
|
-
done
|
|
480
|
-
|
|
481
516
|
SELECTED_SKILLS_RAW=$(printf "%b" "$ALL_SKILLS" | sort | gum choose --no-limit \
|
|
482
517
|
--header "Skills — espacio para toggle, enter para confirmar" \
|
|
483
518
|
--header.foreground="99" \
|
|
@@ -485,46 +520,100 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
485
520
|
--selected.foreground="120" \
|
|
486
521
|
< /dev/tty 2>/dev/null) || true
|
|
487
522
|
|
|
488
|
-
|
|
489
|
-
|
|
523
|
+
if [ -n "$SELECTED_SKILLS_RAW" ]; then
|
|
524
|
+
PROFILE_SKILLS=$(echo "$SELECTED_SKILLS_RAW" | tr '\n' ',' | sed 's/,$//')
|
|
525
|
+
SKILLS_COUNT=$(echo "$SELECTED_SKILLS_RAW" | grep -c . || echo "0")
|
|
526
|
+
echo -e " ${GREEN}✓${NC} ${SKILLS_COUNT} skills seleccionadas"
|
|
527
|
+
echo ""
|
|
528
|
+
|
|
529
|
+
echo -e " ${BOLD}Selecciona los comandos que necesitas:${NC}"
|
|
530
|
+
echo ""
|
|
531
|
+
|
|
532
|
+
SELECTED_CMDS_RAW=$(printf "%b" "$ALL_CMDS" | sort | gum choose --no-limit \
|
|
533
|
+
--header "Comandos — espacio para toggle, enter para confirmar" \
|
|
534
|
+
--header.foreground="99" \
|
|
535
|
+
--cursor.foreground="212" \
|
|
536
|
+
--selected.foreground="120" \
|
|
537
|
+
< /dev/tty 2>/dev/null) || true
|
|
538
|
+
|
|
539
|
+
if [ -n "$SELECTED_CMDS_RAW" ]; then
|
|
540
|
+
PROFILE_COMMANDS=$(echo "$SELECTED_CMDS_RAW" | tr '\n' ',' | sed 's/,$//')
|
|
541
|
+
COMMANDS_COUNT=$(echo "$SELECTED_CMDS_RAW" | grep -c . || echo "0")
|
|
542
|
+
echo -e " ${GREEN}✓${NC} ${COMMANDS_COUNT} comandos seleccionados"
|
|
543
|
+
CUSTOM_GUM_OK=true
|
|
544
|
+
fi
|
|
545
|
+
fi
|
|
546
|
+
fi
|
|
490
547
|
|
|
491
|
-
|
|
548
|
+
if [ "$CUSTOM_GUM_OK" = false ]; then
|
|
549
|
+
# Fallback: interactive numbered list
|
|
550
|
+
echo ""
|
|
551
|
+
echo -e " ${BOLD}Selecciona las skills que necesitas:${NC}"
|
|
552
|
+
echo -e " ${DIM}(números separados por coma, 'a' para todas, enter para ninguna)${NC}"
|
|
553
|
+
echo ""
|
|
554
|
+
local i=1
|
|
555
|
+
for s in "${ALL_SKILLS_ARRAY[@]}"; do
|
|
556
|
+
echo -e " ${CYAN}${i})${NC} ${s}"
|
|
557
|
+
i=$((i + 1))
|
|
558
|
+
done
|
|
492
559
|
echo ""
|
|
560
|
+
echo -ne " ${BOLD}▸ ${NC}"
|
|
561
|
+
SKILLS_CHOICE=""
|
|
562
|
+
read -r SKILLS_CHOICE < /dev/tty 2>/dev/null || read -r SKILLS_CHOICE 2>/dev/null || SKILLS_CHOICE=""
|
|
563
|
+
|
|
564
|
+
if [ "$SKILLS_CHOICE" = "a" ] || [ "$SKILLS_CHOICE" = "all" ]; then
|
|
565
|
+
PROFILE_SKILLS=$(printf "%s," "${ALL_SKILLS_ARRAY[@]}" | sed 's/,$//')
|
|
566
|
+
SKILLS_COUNT="${#ALL_SKILLS_ARRAY[@]}"
|
|
567
|
+
elif [ -n "$SKILLS_CHOICE" ]; then
|
|
568
|
+
PROFILE_SKILLS=""
|
|
569
|
+
SKILLS_COUNT=0
|
|
570
|
+
for num in $(echo "$SKILLS_CHOICE" | tr ',' ' '); do
|
|
571
|
+
idx=$((num - 1))
|
|
572
|
+
if [ "$idx" -ge 0 ] 2>/dev/null && [ "$idx" -lt "${#ALL_SKILLS_ARRAY[@]}" ]; then
|
|
573
|
+
PROFILE_SKILLS="${PROFILE_SKILLS:+$PROFILE_SKILLS,}${ALL_SKILLS_ARRAY[$idx]}"
|
|
574
|
+
SKILLS_COUNT=$((SKILLS_COUNT + 1))
|
|
575
|
+
fi
|
|
576
|
+
done
|
|
577
|
+
else
|
|
578
|
+
# Empty = install all
|
|
579
|
+
PROFILE_SKILLS=""
|
|
580
|
+
SKILLS_COUNT="todas"
|
|
581
|
+
fi
|
|
582
|
+
echo -e " ${GREEN}✓${NC} ${SKILLS_COUNT} skills seleccionadas"
|
|
493
583
|
|
|
584
|
+
echo ""
|
|
494
585
|
echo -e " ${BOLD}Selecciona los comandos que necesitas:${NC}"
|
|
586
|
+
echo -e " ${DIM}(números separados por coma, 'a' para todos, enter para ninguno)${NC}"
|
|
495
587
|
echo ""
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
[ -f "$cmd_file" ] || continue
|
|
501
|
-
cmd_name="dc:$(basename "$cmd_file" .md)"
|
|
502
|
-
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
503
|
-
done
|
|
504
|
-
for cmd_file in "${SCRIPT_DIR}/comandos/razonar/"*.md; do
|
|
505
|
-
[ -f "$cmd_file" ] || continue
|
|
506
|
-
cmd_name="razonar:$(basename "$cmd_file" .md)"
|
|
507
|
-
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
588
|
+
i=1
|
|
589
|
+
for c in "${ALL_CMDS_ARRAY[@]}"; do
|
|
590
|
+
echo -e " ${CYAN}${i})${NC} ${c}"
|
|
591
|
+
i=$((i + 1))
|
|
508
592
|
done
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
593
|
+
echo ""
|
|
594
|
+
echo -ne " ${BOLD}▸ ${NC}"
|
|
595
|
+
CMDS_CHOICE=""
|
|
596
|
+
read -r CMDS_CHOICE < /dev/tty 2>/dev/null || read -r CMDS_CHOICE 2>/dev/null || CMDS_CHOICE=""
|
|
597
|
+
|
|
598
|
+
if [ "$CMDS_CHOICE" = "a" ] || [ "$CMDS_CHOICE" = "all" ]; then
|
|
599
|
+
PROFILE_COMMANDS=$(printf "%s," "${ALL_CMDS_ARRAY[@]}" | sed 's/,$//')
|
|
600
|
+
COMMANDS_COUNT="${#ALL_CMDS_ARRAY[@]}"
|
|
601
|
+
elif [ -n "$CMDS_CHOICE" ]; then
|
|
602
|
+
PROFILE_COMMANDS=""
|
|
603
|
+
COMMANDS_COUNT=0
|
|
604
|
+
for num in $(echo "$CMDS_CHOICE" | tr ',' ' '); do
|
|
605
|
+
idx=$((num - 1))
|
|
606
|
+
if [ "$idx" -ge 0 ] 2>/dev/null && [ "$idx" -lt "${#ALL_CMDS_ARRAY[@]}" ]; then
|
|
607
|
+
PROFILE_COMMANDS="${PROFILE_COMMANDS:+$PROFILE_COMMANDS,}${ALL_CMDS_ARRAY[$idx]}"
|
|
608
|
+
COMMANDS_COUNT=$((COMMANDS_COUNT + 1))
|
|
609
|
+
fi
|
|
610
|
+
done
|
|
611
|
+
else
|
|
612
|
+
# Empty = install all
|
|
613
|
+
PROFILE_COMMANDS=""
|
|
614
|
+
COMMANDS_COUNT="todos"
|
|
615
|
+
fi
|
|
520
616
|
echo -e " ${GREEN}✓${NC} ${COMMANDS_COUNT} comandos seleccionados"
|
|
521
|
-
else
|
|
522
|
-
# Fallback without gum — install everything
|
|
523
|
-
echo -e " ${YELLOW}⚠ gum no disponible. Instalando todas las skills y comandos.${NC}"
|
|
524
|
-
PROFILE_SKILLS=""
|
|
525
|
-
PROFILE_COMMANDS=""
|
|
526
|
-
SKILLS_COUNT="todas"
|
|
527
|
-
COMMANDS_COUNT="todos"
|
|
528
617
|
fi
|
|
529
618
|
fi
|
|
530
619
|
|
|
@@ -152,24 +152,37 @@ _gen_cursor() {
|
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
# ─────────────────────────────────────────────
|
|
155
|
-
# Antigravity → GEMINI.md + .agent/
|
|
155
|
+
# Antigravity → GEMINI.md + .agent/ (at PROJECT ROOT, not inside .claude/)
|
|
156
156
|
# ─────────────────────────────────────────────
|
|
157
157
|
_gen_antigravity() {
|
|
158
158
|
local dir="$1" home="$2" locale="$3"
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
# Antigravity needs files at project root, not inside .claude/don-cheli/
|
|
161
|
+
# Detect project root: go up from .claude/don-cheli/ or use current dir
|
|
162
|
+
local project_root
|
|
163
|
+
if [[ "$dir" == *".claude/don-cheli"* ]]; then
|
|
164
|
+
project_root="${dir%/.claude/don-cheli*}"
|
|
165
|
+
[ -z "$project_root" ] && project_root="."
|
|
166
|
+
elif [[ "$dir" == *".claude"* ]]; then
|
|
167
|
+
project_root="${dir%/.claude*}"
|
|
168
|
+
[ -z "$project_root" ] && project_root="."
|
|
169
|
+
else
|
|
170
|
+
project_root="$dir"
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
echo -e " ${GREEN:-}✓${NC:-} Antigravity → GEMINI.md + .agent/ (en $project_root/)"
|
|
161
174
|
|
|
162
175
|
if [ "$locale" != "en" ] && [ -f "$home/GEMINI.${locale}.md" ]; then
|
|
163
|
-
cp "$home/GEMINI.${locale}.md" "$
|
|
176
|
+
cp "$home/GEMINI.${locale}.md" "$project_root/GEMINI.md" 2>/dev/null || true
|
|
164
177
|
elif [ -f "$home/GEMINI.md" ]; then
|
|
165
|
-
cp "$home/GEMINI.md" "$
|
|
178
|
+
cp "$home/GEMINI.md" "$project_root/" 2>/dev/null || true
|
|
166
179
|
else
|
|
167
180
|
echo -e " ${YELLOW:-}⚠${NC:-} GEMINI.md not found in $home — skipping" >&2
|
|
168
181
|
fi
|
|
169
182
|
|
|
170
183
|
if [ -d "$home/.agent" ]; then
|
|
171
|
-
mkdir -p "$
|
|
172
|
-
cp -r "$home/.agent/"* "$
|
|
184
|
+
mkdir -p "$project_root/.agent" 2>/dev/null || true
|
|
185
|
+
cp -r "$home/.agent/"* "$project_root/.agent/" 2>/dev/null || true
|
|
173
186
|
fi
|
|
174
187
|
}
|
|
175
188
|
|
|
@@ -225,7 +238,7 @@ _gen_continue() {
|
|
|
225
238
|
cat > "$dir/.continue/config/don-cheli.json" 2>/dev/null << 'CONTEOF' || true
|
|
226
239
|
{
|
|
227
240
|
"name": "don-cheli-sdd",
|
|
228
|
-
"version": "1.16.
|
|
241
|
+
"version": "1.16.3",
|
|
229
242
|
"description": "Don Cheli SDD Framework",
|
|
230
243
|
"rules": [
|
|
231
244
|
"All production code requires tests (TDD: RED → GREEN → REFACTOR)",
|
package/scripts/instalar.sh
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
|
-
VERSION="1.16.
|
|
7
|
+
VERSION="1.16.3"
|
|
8
8
|
REPO_URL="https://github.com/doncheli/don-cheli-sdd"
|
|
9
9
|
CLEANUP_TMPDIR=""
|
|
10
10
|
|
|
@@ -336,6 +336,7 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
336
336
|
|
|
337
337
|
# Step 1: Tool Selection (if not provided via flag)
|
|
338
338
|
if [ -z "$TOOLS_FLAG" ]; then
|
|
339
|
+
GUM_TOOLS_OK=false
|
|
339
340
|
if [ "$HAS_GUM" = true ]; then
|
|
340
341
|
TOOLS_RAW=$(printf "Claude Code\nCodex\nCursor\nAntigravity\nWindsurf\nAmp\nContinue.dev\nOpenCode\nTodos" | \
|
|
341
342
|
gum choose --no-limit \
|
|
@@ -345,21 +346,25 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
345
346
|
--selected.foreground="120" \
|
|
346
347
|
< /dev/tty 2>/dev/null) || true
|
|
347
348
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
349
|
+
if [ -n "$TOOLS_RAW" ]; then
|
|
350
|
+
TOOLS_FLAG=""
|
|
351
|
+
while IFS= read -r tool; do
|
|
352
|
+
case "$tool" in
|
|
353
|
+
"Claude Code") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}claude" ;;
|
|
354
|
+
"Codex") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}codex" ;;
|
|
355
|
+
"Cursor") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}cursor" ;;
|
|
356
|
+
"Antigravity") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}antigravity" ;;
|
|
357
|
+
"Windsurf") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}windsurf" ;;
|
|
358
|
+
"Amp") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
|
|
359
|
+
"Continue.dev") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
|
|
360
|
+
"OpenCode") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
|
|
361
|
+
"Todos") TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode" ;;
|
|
362
|
+
esac
|
|
363
|
+
done <<< "$TOOLS_RAW"
|
|
364
|
+
GUM_TOOLS_OK=true
|
|
365
|
+
fi
|
|
366
|
+
fi
|
|
367
|
+
if [ "$GUM_TOOLS_OK" = false ]; then
|
|
363
368
|
echo -e " ${BOLD}¿Dónde quieres instalar Don Cheli SDD?${NC}"
|
|
364
369
|
echo ""
|
|
365
370
|
echo -e " ${CYAN}1)${NC} Claude Code (CLAUDE.md + comandos)"
|
|
@@ -373,7 +378,10 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
373
378
|
echo -e " ${CYAN}9)${NC} Todos"
|
|
374
379
|
echo ""
|
|
375
380
|
echo -ne " ${BOLD}▸ Elige (números separados por coma): ${NC}"
|
|
376
|
-
|
|
381
|
+
TOOLS_CHOICE=""
|
|
382
|
+
read -r TOOLS_CHOICE < /dev/tty 2>/dev/null || read -r TOOLS_CHOICE 2>/dev/null || TOOLS_CHOICE=""
|
|
383
|
+
if [ -z "$TOOLS_CHOICE" ]; then
|
|
384
|
+
echo -e " ${YELLOW}⚠ No se pudo leer input. Usando: Todos${NC}"
|
|
377
385
|
TOOLS_CHOICE="9"
|
|
378
386
|
fi
|
|
379
387
|
|
|
@@ -398,6 +406,7 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
398
406
|
|
|
399
407
|
# Step 2: Profile Selection (if not provided via flag)
|
|
400
408
|
if [ -z "$PROFILE_FLAG" ]; then
|
|
409
|
+
GUM_PROFILE_OK=false
|
|
401
410
|
if [ "$HAS_GUM" = true ]; then
|
|
402
411
|
PROFILE_CHOICE=$(printf "👻 Phantom Coder [Full-stack] — Pipeline completo, TDD, quality gates\n💀 Reaper Sec [Seguridad] — OWASP, auditoría, pentest workflow\n🏗 System Architect [Arquitectura] — Blueprints, SOLID, APIs, migraciones\n⚡ Speedrunner [MVP/Startup] — PoC, estimados, validación veloz\n🔮 The Oracle [Razonamiento] — 15 modelos mentales, análisis profundo\n🥷 Dev Dojo [Aprendizaje] — Documentación viva, ADRs, Obsidian\n⚙️ Custom [Manual] — Seleccionar skills y comandos manualmente" | \
|
|
403
412
|
gum choose \
|
|
@@ -406,17 +415,21 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
406
415
|
--cursor.foreground="212" \
|
|
407
416
|
< /dev/tty 2>/dev/null) || true
|
|
408
417
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
418
|
+
if [ -n "$PROFILE_CHOICE" ]; then
|
|
419
|
+
case "$PROFILE_CHOICE" in
|
|
420
|
+
*Phantom*) PROFILE_FLAG="phantom" ;;
|
|
421
|
+
*Reaper*) PROFILE_FLAG="reaper" ;;
|
|
422
|
+
*Architect*) PROFILE_FLAG="architect" ;;
|
|
423
|
+
*Speedrun*) PROFILE_FLAG="speedrun" ;;
|
|
424
|
+
*Oracle*) PROFILE_FLAG="oracle" ;;
|
|
425
|
+
*Dojo*) PROFILE_FLAG="dojo" ;;
|
|
426
|
+
*Custom*) PROFILE_FLAG="custom" ;;
|
|
427
|
+
*) PROFILE_FLAG="phantom" ;;
|
|
428
|
+
esac
|
|
429
|
+
GUM_PROFILE_OK=true
|
|
430
|
+
fi
|
|
431
|
+
fi
|
|
432
|
+
if [ "$GUM_PROFILE_OK" = false ]; then
|
|
420
433
|
echo ""
|
|
421
434
|
echo -e " ${BOLD}Elige tu perfil de desarrollador:${NC}"
|
|
422
435
|
echo ""
|
|
@@ -429,7 +442,10 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
429
442
|
echo -e " ${CYAN}7)${NC} ⚙️ Custom ${DIM}[Manual]${NC} Seleccionar todo manualmente"
|
|
430
443
|
echo ""
|
|
431
444
|
echo -ne " ${BOLD}▸ ${NC}"
|
|
432
|
-
|
|
445
|
+
PROFILE_CHOICE=""
|
|
446
|
+
read -r PROFILE_CHOICE < /dev/tty 2>/dev/null || read -r PROFILE_CHOICE 2>/dev/null || PROFILE_CHOICE=""
|
|
447
|
+
if [ -z "$PROFILE_CHOICE" ]; then
|
|
448
|
+
echo -e " ${YELLOW}⚠ No se pudo leer input. Usando: Phantom Coder${NC}"
|
|
433
449
|
PROFILE_CHOICE="1"
|
|
434
450
|
fi
|
|
435
451
|
|
|
@@ -465,19 +481,38 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
465
481
|
# Try to install gum for interactive selection
|
|
466
482
|
install_gum
|
|
467
483
|
|
|
484
|
+
# Build skills list
|
|
485
|
+
ALL_SKILLS=""
|
|
486
|
+
ALL_SKILLS_ARRAY=()
|
|
487
|
+
for skill_dir in "${SCRIPT_DIR}/habilidades/"*/; do
|
|
488
|
+
[ -d "$skill_dir" ] || continue
|
|
489
|
+
skill_name=$(basename "$skill_dir")
|
|
490
|
+
ALL_SKILLS="${ALL_SKILLS}${skill_name}\n"
|
|
491
|
+
ALL_SKILLS_ARRAY+=("$skill_name")
|
|
492
|
+
done
|
|
493
|
+
|
|
494
|
+
# Build commands list
|
|
495
|
+
ALL_CMDS=""
|
|
496
|
+
ALL_CMDS_ARRAY=()
|
|
497
|
+
for cmd_file in "${SCRIPT_DIR}/comandos/especdev/"*.md; do
|
|
498
|
+
[ -f "$cmd_file" ] || continue
|
|
499
|
+
cmd_name="dc:$(basename "$cmd_file" .md)"
|
|
500
|
+
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
501
|
+
ALL_CMDS_ARRAY+=("$cmd_name")
|
|
502
|
+
done
|
|
503
|
+
for cmd_file in "${SCRIPT_DIR}/comandos/razonar/"*.md; do
|
|
504
|
+
[ -f "$cmd_file" ] || continue
|
|
505
|
+
cmd_name="razonar:$(basename "$cmd_file" .md)"
|
|
506
|
+
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
507
|
+
ALL_CMDS_ARRAY+=("$cmd_name")
|
|
508
|
+
done
|
|
509
|
+
|
|
510
|
+
CUSTOM_GUM_OK=false
|
|
468
511
|
if [ "$HAS_GUM" = true ]; then
|
|
469
512
|
echo ""
|
|
470
513
|
echo -e " ${BOLD}Selecciona las skills que necesitas:${NC}"
|
|
471
514
|
echo ""
|
|
472
515
|
|
|
473
|
-
# Build skills list from habilidades/ directory
|
|
474
|
-
ALL_SKILLS=""
|
|
475
|
-
for skill_dir in "${SCRIPT_DIR}/habilidades/"*/; do
|
|
476
|
-
[ -d "$skill_dir" ] || continue
|
|
477
|
-
skill_name=$(basename "$skill_dir")
|
|
478
|
-
ALL_SKILLS="${ALL_SKILLS}${skill_name}\n"
|
|
479
|
-
done
|
|
480
|
-
|
|
481
516
|
SELECTED_SKILLS_RAW=$(printf "%b" "$ALL_SKILLS" | sort | gum choose --no-limit \
|
|
482
517
|
--header "Skills — espacio para toggle, enter para confirmar" \
|
|
483
518
|
--header.foreground="99" \
|
|
@@ -485,46 +520,100 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
485
520
|
--selected.foreground="120" \
|
|
486
521
|
< /dev/tty 2>/dev/null) || true
|
|
487
522
|
|
|
488
|
-
|
|
489
|
-
|
|
523
|
+
if [ -n "$SELECTED_SKILLS_RAW" ]; then
|
|
524
|
+
PROFILE_SKILLS=$(echo "$SELECTED_SKILLS_RAW" | tr '\n' ',' | sed 's/,$//')
|
|
525
|
+
SKILLS_COUNT=$(echo "$SELECTED_SKILLS_RAW" | grep -c . || echo "0")
|
|
526
|
+
echo -e " ${GREEN}✓${NC} ${SKILLS_COUNT} skills seleccionadas"
|
|
527
|
+
echo ""
|
|
528
|
+
|
|
529
|
+
echo -e " ${BOLD}Selecciona los comandos que necesitas:${NC}"
|
|
530
|
+
echo ""
|
|
531
|
+
|
|
532
|
+
SELECTED_CMDS_RAW=$(printf "%b" "$ALL_CMDS" | sort | gum choose --no-limit \
|
|
533
|
+
--header "Comandos — espacio para toggle, enter para confirmar" \
|
|
534
|
+
--header.foreground="99" \
|
|
535
|
+
--cursor.foreground="212" \
|
|
536
|
+
--selected.foreground="120" \
|
|
537
|
+
< /dev/tty 2>/dev/null) || true
|
|
538
|
+
|
|
539
|
+
if [ -n "$SELECTED_CMDS_RAW" ]; then
|
|
540
|
+
PROFILE_COMMANDS=$(echo "$SELECTED_CMDS_RAW" | tr '\n' ',' | sed 's/,$//')
|
|
541
|
+
COMMANDS_COUNT=$(echo "$SELECTED_CMDS_RAW" | grep -c . || echo "0")
|
|
542
|
+
echo -e " ${GREEN}✓${NC} ${COMMANDS_COUNT} comandos seleccionados"
|
|
543
|
+
CUSTOM_GUM_OK=true
|
|
544
|
+
fi
|
|
545
|
+
fi
|
|
546
|
+
fi
|
|
490
547
|
|
|
491
|
-
|
|
548
|
+
if [ "$CUSTOM_GUM_OK" = false ]; then
|
|
549
|
+
# Fallback: interactive numbered list
|
|
550
|
+
echo ""
|
|
551
|
+
echo -e " ${BOLD}Selecciona las skills que necesitas:${NC}"
|
|
552
|
+
echo -e " ${DIM}(números separados por coma, 'a' para todas, enter para ninguna)${NC}"
|
|
553
|
+
echo ""
|
|
554
|
+
local i=1
|
|
555
|
+
for s in "${ALL_SKILLS_ARRAY[@]}"; do
|
|
556
|
+
echo -e " ${CYAN}${i})${NC} ${s}"
|
|
557
|
+
i=$((i + 1))
|
|
558
|
+
done
|
|
492
559
|
echo ""
|
|
560
|
+
echo -ne " ${BOLD}▸ ${NC}"
|
|
561
|
+
SKILLS_CHOICE=""
|
|
562
|
+
read -r SKILLS_CHOICE < /dev/tty 2>/dev/null || read -r SKILLS_CHOICE 2>/dev/null || SKILLS_CHOICE=""
|
|
563
|
+
|
|
564
|
+
if [ "$SKILLS_CHOICE" = "a" ] || [ "$SKILLS_CHOICE" = "all" ]; then
|
|
565
|
+
PROFILE_SKILLS=$(printf "%s," "${ALL_SKILLS_ARRAY[@]}" | sed 's/,$//')
|
|
566
|
+
SKILLS_COUNT="${#ALL_SKILLS_ARRAY[@]}"
|
|
567
|
+
elif [ -n "$SKILLS_CHOICE" ]; then
|
|
568
|
+
PROFILE_SKILLS=""
|
|
569
|
+
SKILLS_COUNT=0
|
|
570
|
+
for num in $(echo "$SKILLS_CHOICE" | tr ',' ' '); do
|
|
571
|
+
idx=$((num - 1))
|
|
572
|
+
if [ "$idx" -ge 0 ] 2>/dev/null && [ "$idx" -lt "${#ALL_SKILLS_ARRAY[@]}" ]; then
|
|
573
|
+
PROFILE_SKILLS="${PROFILE_SKILLS:+$PROFILE_SKILLS,}${ALL_SKILLS_ARRAY[$idx]}"
|
|
574
|
+
SKILLS_COUNT=$((SKILLS_COUNT + 1))
|
|
575
|
+
fi
|
|
576
|
+
done
|
|
577
|
+
else
|
|
578
|
+
# Empty = install all
|
|
579
|
+
PROFILE_SKILLS=""
|
|
580
|
+
SKILLS_COUNT="todas"
|
|
581
|
+
fi
|
|
582
|
+
echo -e " ${GREEN}✓${NC} ${SKILLS_COUNT} skills seleccionadas"
|
|
493
583
|
|
|
584
|
+
echo ""
|
|
494
585
|
echo -e " ${BOLD}Selecciona los comandos que necesitas:${NC}"
|
|
586
|
+
echo -e " ${DIM}(números separados por coma, 'a' para todos, enter para ninguno)${NC}"
|
|
495
587
|
echo ""
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
[ -f "$cmd_file" ] || continue
|
|
501
|
-
cmd_name="dc:$(basename "$cmd_file" .md)"
|
|
502
|
-
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
503
|
-
done
|
|
504
|
-
for cmd_file in "${SCRIPT_DIR}/comandos/razonar/"*.md; do
|
|
505
|
-
[ -f "$cmd_file" ] || continue
|
|
506
|
-
cmd_name="razonar:$(basename "$cmd_file" .md)"
|
|
507
|
-
ALL_CMDS="${ALL_CMDS}${cmd_name}\n"
|
|
588
|
+
i=1
|
|
589
|
+
for c in "${ALL_CMDS_ARRAY[@]}"; do
|
|
590
|
+
echo -e " ${CYAN}${i})${NC} ${c}"
|
|
591
|
+
i=$((i + 1))
|
|
508
592
|
done
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
593
|
+
echo ""
|
|
594
|
+
echo -ne " ${BOLD}▸ ${NC}"
|
|
595
|
+
CMDS_CHOICE=""
|
|
596
|
+
read -r CMDS_CHOICE < /dev/tty 2>/dev/null || read -r CMDS_CHOICE 2>/dev/null || CMDS_CHOICE=""
|
|
597
|
+
|
|
598
|
+
if [ "$CMDS_CHOICE" = "a" ] || [ "$CMDS_CHOICE" = "all" ]; then
|
|
599
|
+
PROFILE_COMMANDS=$(printf "%s," "${ALL_CMDS_ARRAY[@]}" | sed 's/,$//')
|
|
600
|
+
COMMANDS_COUNT="${#ALL_CMDS_ARRAY[@]}"
|
|
601
|
+
elif [ -n "$CMDS_CHOICE" ]; then
|
|
602
|
+
PROFILE_COMMANDS=""
|
|
603
|
+
COMMANDS_COUNT=0
|
|
604
|
+
for num in $(echo "$CMDS_CHOICE" | tr ',' ' '); do
|
|
605
|
+
idx=$((num - 1))
|
|
606
|
+
if [ "$idx" -ge 0 ] 2>/dev/null && [ "$idx" -lt "${#ALL_CMDS_ARRAY[@]}" ]; then
|
|
607
|
+
PROFILE_COMMANDS="${PROFILE_COMMANDS:+$PROFILE_COMMANDS,}${ALL_CMDS_ARRAY[$idx]}"
|
|
608
|
+
COMMANDS_COUNT=$((COMMANDS_COUNT + 1))
|
|
609
|
+
fi
|
|
610
|
+
done
|
|
611
|
+
else
|
|
612
|
+
# Empty = install all
|
|
613
|
+
PROFILE_COMMANDS=""
|
|
614
|
+
COMMANDS_COUNT="todos"
|
|
615
|
+
fi
|
|
520
616
|
echo -e " ${GREEN}✓${NC} ${COMMANDS_COUNT} comandos seleccionados"
|
|
521
|
-
else
|
|
522
|
-
# Fallback without gum — install everything
|
|
523
|
-
echo -e " ${YELLOW}⚠ gum no disponible. Instalando todas las skills y comandos.${NC}"
|
|
524
|
-
PROFILE_SKILLS=""
|
|
525
|
-
PROFILE_COMMANDS=""
|
|
526
|
-
SKILLS_COUNT="todas"
|
|
527
|
-
COMMANDS_COUNT="todos"
|
|
528
617
|
fi
|
|
529
618
|
fi
|
|
530
619
|
|