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 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.1-blue" alt="Version">
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.1-blue" alt="Version">
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.1-blue" alt="Version">
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
+ 1.16.3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "don-cheli-sdd",
3
- "version": "1.16.1",
3
+ "version": "1.16.3",
4
4
  "description": "Framework SDD para Claude Code — 72+ comandos, 43 habilidades, 15 modelos de razonamiento. TDD como ley de hierro. EN/ES/PT.",
5
5
  "main": "bin/don-cheli.js",
6
6
  "scripts": {
@@ -1 +1 @@
1
- 1.16.1
1
+ 1.16.3
@@ -4,7 +4,7 @@
4
4
 
5
5
  set -euo pipefail
6
6
 
7
- VERSION="1.16.1"
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
- TOOLS_FLAG=""
349
- while IFS= read -r tool; do
350
- case "$tool" in
351
- "Claude Code") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}claude" ;;
352
- "Codex") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}codex" ;;
353
- "Cursor") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}cursor" ;;
354
- "Antigravity") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}antigravity" ;;
355
- "Windsurf") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}windsurf" ;;
356
- "Amp") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
357
- "Continue.dev") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
358
- "OpenCode") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
359
- "Todos") TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode" ;;
360
- esac
361
- done <<< "$TOOLS_RAW"
362
- else
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
- if ! read -r TOOLS_CHOICE < /dev/tty 2>/dev/null; then
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
- case "$PROFILE_CHOICE" in
410
- *Phantom*) PROFILE_FLAG="phantom" ;;
411
- *Reaper*) PROFILE_FLAG="reaper" ;;
412
- *Architect*) PROFILE_FLAG="architect" ;;
413
- *Speedrun*) PROFILE_FLAG="speedrun" ;;
414
- *Oracle*) PROFILE_FLAG="oracle" ;;
415
- *Dojo*) PROFILE_FLAG="dojo" ;;
416
- *Custom*) PROFILE_FLAG="custom" ;;
417
- *) PROFILE_FLAG="phantom" ;;
418
- esac
419
- else
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
- if ! read -r PROFILE_CHOICE < /dev/tty 2>/dev/null; then
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
- PROFILE_SKILLS=$(echo "$SELECTED_SKILLS_RAW" | tr '\n' ',' | sed 's/,$//')
489
- SKILLS_COUNT=$(echo "$SELECTED_SKILLS_RAW" | grep -c . || echo "0")
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
- echo -e " ${GREEN}✓${NC} ${SKILLS_COUNT} skills seleccionadas"
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
- # Build commands list
498
- ALL_CMDS=""
499
- for cmd_file in "${SCRIPT_DIR}/comandos/especdev/"*.md; do
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
- SELECTED_CMDS_RAW=$(printf "%b" "$ALL_CMDS" | sort | gum choose --no-limit \
511
- --header "Comandos — espacio para toggle, enter para confirmar" \
512
- --header.foreground="99" \
513
- --cursor.foreground="212" \
514
- --selected.foreground="120" \
515
- < /dev/tty 2>/dev/null) || true
516
-
517
- PROFILE_COMMANDS=$(echo "$SELECTED_CMDS_RAW" | tr '\n' ',' | sed 's/,$//')
518
- COMMANDS_COUNT=$(echo "$SELECTED_CMDS_RAW" | grep -c . || echo "0")
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
- echo -e " ${GREEN:-}✓${NC:-} Antigravity GEMINI.md + .agent/"
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" "$dir/GEMINI.md" 2>/dev/null || true
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" "$dir/" 2>/dev/null || true
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 "$dir/.agent" 2>/dev/null || true
172
- cp -r "$home/.agent/"* "$dir/.agent/" 2>/dev/null || true
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.1",
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)",
@@ -4,7 +4,7 @@
4
4
 
5
5
  set -euo pipefail
6
6
 
7
- VERSION="1.16.1"
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
- TOOLS_FLAG=""
349
- while IFS= read -r tool; do
350
- case "$tool" in
351
- "Claude Code") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}claude" ;;
352
- "Codex") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}codex" ;;
353
- "Cursor") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}cursor" ;;
354
- "Antigravity") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}antigravity" ;;
355
- "Windsurf") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}windsurf" ;;
356
- "Amp") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
357
- "Continue.dev") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
358
- "OpenCode") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
359
- "Todos") TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode" ;;
360
- esac
361
- done <<< "$TOOLS_RAW"
362
- else
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
- if ! read -r TOOLS_CHOICE < /dev/tty 2>/dev/null; then
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
- case "$PROFILE_CHOICE" in
410
- *Phantom*) PROFILE_FLAG="phantom" ;;
411
- *Reaper*) PROFILE_FLAG="reaper" ;;
412
- *Architect*) PROFILE_FLAG="architect" ;;
413
- *Speedrun*) PROFILE_FLAG="speedrun" ;;
414
- *Oracle*) PROFILE_FLAG="oracle" ;;
415
- *Dojo*) PROFILE_FLAG="dojo" ;;
416
- *Custom*) PROFILE_FLAG="custom" ;;
417
- *) PROFILE_FLAG="phantom" ;;
418
- esac
419
- else
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
- if ! read -r PROFILE_CHOICE < /dev/tty 2>/dev/null; then
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
- PROFILE_SKILLS=$(echo "$SELECTED_SKILLS_RAW" | tr '\n' ',' | sed 's/,$//')
489
- SKILLS_COUNT=$(echo "$SELECTED_SKILLS_RAW" | grep -c . || echo "0")
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
- echo -e " ${GREEN}✓${NC} ${SKILLS_COUNT} skills seleccionadas"
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
- # Build commands list
498
- ALL_CMDS=""
499
- for cmd_file in "${SCRIPT_DIR}/comandos/especdev/"*.md; do
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
- SELECTED_CMDS_RAW=$(printf "%b" "$ALL_CMDS" | sort | gum choose --no-limit \
511
- --header "Comandos — espacio para toggle, enter para confirmar" \
512
- --header.foreground="99" \
513
- --cursor.foreground="212" \
514
- --selected.foreground="120" \
515
- < /dev/tty 2>/dev/null) || true
516
-
517
- PROFILE_COMMANDS=$(echo "$SELECTED_CMDS_RAW" | tr '\n' ',' | sed 's/,$//')
518
- COMMANDS_COUNT=$(echo "$SELECTED_CMDS_RAW" | grep -c . || echo "0")
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
 
@@ -1,14 +0,0 @@
1
- ---
2
- description: Mostrar cambios desde la última sesión
3
- i18n: true
4
- ---
5
-
6
- # /dc:cambios
7
-
8
- ## Uso
9
-
10
- ```
11
- /dc:cambios
12
- ```
13
-
14
- Muestra un diff de los cambios realizados desde la última sesión registrada.
@@ -1,14 +0,0 @@
1
- ---
2
- description: Mostrar cambios desde la última sesión
3
- i18n: true
4
- ---
5
-
6
- # /dc:cambios
7
-
8
- ## Uso
9
-
10
- ```
11
- /dc:cambios
12
- ```
13
-
14
- Muestra un diff de los cambios realizados desde la última sesión registrada.