don-cheli-sdd 1.18.0 → 1.19.1

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.19.1](https://github.com/doncheli/don-cheli-sdd/compare/v1.19.0...v1.19.1) (2026-04-03)
8
+
9
+ ### Correcciones
10
+
11
+ * **opencode:** agregar generación de config para skills.paths ([8583f98](https://github.com/doncheli/don-cheli-sdd/commit/8583f983904ebe19cc4348ef7b8a364d4507ea7e))
12
+
13
+ ## [1.19.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.18.0...v1.19.0) (2026-04-02)
14
+
15
+ ### Nuevas Funcionalidades
16
+
17
+ * script actualizar.sh con barra de progreso y comparación de mejoras ([77b21b1](https://github.com/doncheli/don-cheli-sdd/commit/77b21b1b9e5a2fd43d9076652a1a2c4ba6bba63c))
18
+
19
+ ### Documentación
20
+
21
+ * actualizar READMEs (ES/EN/PT) con CI/CD, Custom Gates, Telemetría y VS Code Extension ([1c8b203](https://github.com/doncheli/don-cheli-sdd/commit/1c8b20384f9fdd9eb3d08e73d68efd36596c3d82))
22
+
7
23
  ## [1.18.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.17.0...v1.18.0) (2026-04-02)
8
24
 
9
25
  ### Nuevas Funcionalidades
package/README.es.md CHANGED
@@ -12,12 +12,13 @@
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.18.0-blue" alt="Version">
15
+ <img src="https://img.shields.io/badge/versión-1.19.1-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">
19
19
  <img src="https://img.shields.io/badge/habilidades-42+-orange" alt="Skills">
20
20
  <img src="https://img.shields.io/badge/Anthropic%20Skills%202.0-compatible-blueviolet" alt="Skills 2.0">
21
+ <a href="https://marketplace.visualstudio.com/items?itemName=doncheli.don-cheli-sdd"><img src="https://img.shields.io/visual-studio-marketplace/v/doncheli.don-cheli-sdd?label=VS%20Code&color=007ACC" alt="VS Code"></a>
21
22
  <br/>
22
23
  <a href="https://github.com/doncheli/don-cheli-sdd/actions/workflows/validar.yml"><img src="https://github.com/doncheli/don-cheli-sdd/actions/workflows/validar.yml/badge.svg" alt="CI"></a>
23
24
  <a href="https://codecov.io/gh/doncheli/don-cheli-sdd"><img src="https://codecov.io/gh/doncheli/don-cheli-sdd/branch/main/graph/badge.svg" alt="Codecov"></a>
@@ -90,6 +91,16 @@ don-cheli install --global
90
91
  /dc:iniciar
91
92
  ```
92
93
 
94
+ ### Extension VS Code
95
+
96
+ Busca **"Don Cheli SDD"** en VS Code Extensions, o:
97
+
98
+ ```bash
99
+ code --install-extension doncheli.don-cheli-sdd
100
+ ```
101
+
102
+ Te da: sidebar con estado del proyecto, quality gates, explorador de comandos y dashboard de metricas.
103
+
93
104
  ### Via git clone
94
105
 
95
106
  ```bash
@@ -236,6 +247,10 @@ No negociables. Se aplican siempre. Sin excepciones.
236
247
  <tr><td>Detección de loops</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
237
248
  <tr><td>Skills Marketplace</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
238
249
  <tr><td>Debate adversarial multi-rol</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
250
+ <tr><td>CI/CD GitHub Action</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
251
+ <tr><td>Custom Quality Gates (plugins)</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
252
+ <tr><td>Dashboard de telemetría</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
253
+ <tr><td>Extensión VS Code</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
239
254
  </table>
240
255
 
241
256
  <details>
@@ -364,6 +379,54 @@ Don Cheli no es un programa. Son archivos Markdown que cualquier agente de IA pu
364
379
 
365
380
  ---
366
381
 
382
+ ## Integración CI/CD
383
+
384
+ Aplica quality gates en cada Pull Request con una linea:
385
+
386
+ ```yaml
387
+ # .github/workflows/sdd-check.yml
388
+ - uses: doncheli/don-cheli-sdd@main
389
+ with:
390
+ gates: all # spec, tdd, coverage, owasp, custom
391
+ min-coverage: 85
392
+ comment-pr: true # publica resultado como comentario en el PR
393
+ ```
394
+
395
+ Verifica artefactos `.dc/`, TDD, cobertura, OWASP y gates custom. [Docs CI/CD →](docs/ci-cd.md) | [Template GitLab CI →](examples/ci/gitlab-ci.yml)
396
+
397
+ ---
398
+
399
+ ## Custom Quality Gates
400
+
401
+ Define tus propias reglas en `.dc/gates/` como archivos YAML simples:
402
+
403
+ ```yaml
404
+ # .dc/gates/no-console-log.yml
405
+ name: No console.log en produccion
406
+ type: grep
407
+ pattern: "console\\.log"
408
+ files: "src/**/*.ts"
409
+ severity: block
410
+ ```
411
+
412
+ 5 gates incluidos de fabrica. Crea los tuyos con `/dc:gate crear`. [Docs Custom Gates →](docs/custom-gates.md)
413
+
414
+ ---
415
+
416
+ ## Telemetría y Dashboard
417
+
418
+ Metricas 100% locales. Ningun dato sale de tu maquina.
419
+
420
+ ```bash
421
+ /dc:metricas # Resumen en terminal
422
+ /dc:dashboard # Dashboard HTML interactivo
423
+ /dc:dashboard --csv # Export para reporting corporativo
424
+ ```
425
+
426
+ Trackea: tasa TDD, tendencia de cobertura, quality gates, precision de estimados, stubs detectados, OWASP. [Docs Telemetría →](docs/telemetry.md)
427
+
428
+ ---
429
+
367
430
  ## Certificación SDD
368
431
 
369
432
  Demuestra que tu proyecto fue construido con disciplina de ingeniería. Agrega estos badges a tu README:
package/README.md CHANGED
@@ -12,12 +12,13 @@
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.18.0-blue" alt="Version">
15
+ <img src="https://img.shields.io/badge/version-1.19.1-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">
19
19
  <img src="https://img.shields.io/badge/skills-42+-orange" alt="Skills">
20
20
  <img src="https://img.shields.io/badge/Anthropic%20Skills%202.0-compatible-blueviolet" alt="Skills 2.0">
21
+ <a href="https://marketplace.visualstudio.com/items?itemName=doncheli.don-cheli-sdd"><img src="https://img.shields.io/visual-studio-marketplace/v/doncheli.don-cheli-sdd?label=VS%20Code&color=007ACC" alt="VS Code"></a>
21
22
  <br/>
22
23
  <a href="https://github.com/doncheli/don-cheli-sdd/actions/workflows/validar.yml"><img src="https://github.com/doncheli/don-cheli-sdd/actions/workflows/validar.yml/badge.svg" alt="CI"></a>
23
24
  <a href="https://codecov.io/gh/doncheli/don-cheli-sdd"><img src="https://codecov.io/gh/doncheli/don-cheli-sdd/branch/main/graph/badge.svg" alt="Codecov"></a>
@@ -90,6 +91,16 @@ don-cheli install --global
90
91
  /dc:init
91
92
  ```
92
93
 
94
+ ### VS Code Extension
95
+
96
+ Search **"Don Cheli SDD"** in VS Code Extensions, or:
97
+
98
+ ```bash
99
+ code --install-extension doncheli.don-cheli-sdd
100
+ ```
101
+
102
+ Gives you: sidebar with project status, quality gates, commands browser and metrics dashboard.
103
+
93
104
  ### Via git clone
94
105
 
95
106
  ```bash
@@ -236,6 +247,10 @@ Non-negotiable. Always enforced. No exceptions.
236
247
  <tr><td>Loop Detection</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
237
248
  <tr><td>Skills Marketplace</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
238
249
  <tr><td>Adversarial Multi-role Debate</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
250
+ <tr><td>CI/CD GitHub Action</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
251
+ <tr><td>Custom Quality Gates (plugins)</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
252
+ <tr><td>Telemetry Dashboard</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
253
+ <tr><td>VS Code Extension</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
239
254
  </table>
240
255
 
241
256
  <details>
@@ -364,6 +379,54 @@ Don Cheli is not a program. It's Markdown files that any AI agent can interpret.
364
379
 
365
380
  ---
366
381
 
382
+ ## CI/CD Integration
383
+
384
+ Enforce quality gates on every Pull Request with one line:
385
+
386
+ ```yaml
387
+ # .github/workflows/sdd-check.yml
388
+ - uses: doncheli/don-cheli-sdd@main
389
+ with:
390
+ gates: all # spec, tdd, coverage, owasp, custom
391
+ min-coverage: 85
392
+ comment-pr: true # posts results as PR comment
393
+ ```
394
+
395
+ The action verifies `.dc/` artifacts, TDD compliance, coverage, OWASP and custom gates. [Full CI/CD docs →](docs/ci-cd.md) | [GitLab CI template →](examples/ci/gitlab-ci.yml)
396
+
397
+ ---
398
+
399
+ ## Custom Quality Gates
400
+
401
+ Define your own rules in `.dc/gates/` as simple YAML files:
402
+
403
+ ```yaml
404
+ # .dc/gates/no-console-log.yml
405
+ name: No console.log in production
406
+ type: grep
407
+ pattern: "console\\.log"
408
+ files: "src/**/*.ts"
409
+ severity: block
410
+ ```
411
+
412
+ 5 gates included out of the box. Create your own with `/dc:gate create`. [Custom Gates docs →](docs/custom-gates.md)
413
+
414
+ ---
415
+
416
+ ## Telemetry & Dashboard
417
+
418
+ 100% local metrics. No data leaves your machine.
419
+
420
+ ```bash
421
+ /dc:metrics # Summary in terminal
422
+ /dc:dashboard # Interactive HTML dashboard
423
+ /dc:dashboard --csv # Export for corporate reporting
424
+ ```
425
+
426
+ Tracks: TDD success rate, coverage trend, quality gates pass rate, estimation accuracy, stubs detected, OWASP findings. [Telemetry docs →](docs/telemetry.md)
427
+
428
+ ---
429
+
367
430
  ## SDD Certification
368
431
 
369
432
  Show that your project was built with engineering discipline. Add these badges to your README:
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.18.0-blue" alt="Version">
15
+ <img src="https://img.shields.io/badge/versão-1.19.1-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">
@@ -90,6 +90,16 @@ don-cheli install --global
90
90
  /dc:iniciar
91
91
  ```
92
92
 
93
+ ### Extensao VS Code
94
+
95
+ Busque **"Don Cheli SDD"** no VS Code Extensions, ou:
96
+
97
+ ```bash
98
+ code --install-extension doncheli.don-cheli-sdd
99
+ ```
100
+
101
+ Inclui: sidebar com status do projeto, quality gates, explorador de comandos e dashboard de metricas.
102
+
93
103
  ### Via git clone
94
104
 
95
105
  ```bash
@@ -236,6 +246,10 @@ Não negociáveis. Sempre aplicadas. Sem exceções.
236
246
  <tr><td>Detecção de loops</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
237
247
  <tr><td>Skills Marketplace</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
238
248
  <tr><td>Debate adversarial multi-papel</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
249
+ <tr><td>CI/CD GitHub Action</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
250
+ <tr><td>Custom Quality Gates (plugins)</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
251
+ <tr><td>Dashboard de telemetria</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
252
+ <tr><td>Extensao VS Code</td><td>—</td><td>—</td><td>—</td><td><strong>✅</strong></td></tr>
239
253
  </table>
240
254
 
241
255
  <details>
@@ -364,6 +378,54 @@ Don Cheli não é um programa. São arquivos Markdown que qualquer agente de IA
364
378
 
365
379
  ---
366
380
 
381
+ ## Integração CI/CD
382
+
383
+ Aplique quality gates em cada Pull Request com uma linha:
384
+
385
+ ```yaml
386
+ # .github/workflows/sdd-check.yml
387
+ - uses: doncheli/don-cheli-sdd@main
388
+ with:
389
+ gates: all # spec, tdd, coverage, owasp, custom
390
+ min-coverage: 85
391
+ comment-pr: true # publica resultado como comentário no PR
392
+ ```
393
+
394
+ Verifica artefatos `.dc/`, TDD, cobertura, OWASP e gates custom. [Docs CI/CD →](docs/ci-cd.md) | [Template GitLab CI →](examples/ci/gitlab-ci.yml)
395
+
396
+ ---
397
+
398
+ ## Custom Quality Gates
399
+
400
+ Defina suas próprias regras em `.dc/gates/` como arquivos YAML simples:
401
+
402
+ ```yaml
403
+ # .dc/gates/no-console-log.yml
404
+ name: No console.log em produção
405
+ type: grep
406
+ pattern: "console\\.log"
407
+ files: "src/**/*.ts"
408
+ severity: block
409
+ ```
410
+
411
+ 5 gates incluídos de fábrica. Crie os seus com `/dc:gate criar`. [Docs Custom Gates →](docs/custom-gates.md)
412
+
413
+ ---
414
+
415
+ ## Telemetria e Dashboard
416
+
417
+ Métricas 100% locais. Nenhum dado sai da sua máquina.
418
+
419
+ ```bash
420
+ /dc:metricas # Resumo no terminal
421
+ /dc:dashboard # Dashboard HTML interativo
422
+ /dc:dashboard --csv # Export para reporting corporativo
423
+ ```
424
+
425
+ Rastreia: taxa TDD, tendência de cobertura, quality gates, precisão de estimativas, stubs detectados, OWASP. [Docs Telemetria →](docs/telemetry.md)
426
+
427
+ ---
428
+
367
429
  ## Certificação SDD
368
430
 
369
431
  Demonstre que seu projeto foi construído com disciplina de engenharia. Adicione estes badges ao seu README:
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.18.0
1
+ 1.19.1
package/bin/don-cheli.js CHANGED
@@ -8,6 +8,7 @@ const FRAMEWORK_ROOT = path.resolve(__dirname, '..');
8
8
  const VERSION = fs.readFileSync(path.join(FRAMEWORK_ROOT, 'VERSION'), 'utf8').trim();
9
9
  const INSTALLER = path.join(FRAMEWORK_ROOT, 'scripts', 'instalar.sh');
10
10
  const VALIDATOR = path.join(FRAMEWORK_ROOT, 'scripts', 'validar.sh');
11
+ const UPDATER = path.join(FRAMEWORK_ROOT, 'scripts', 'actualizar.sh');
11
12
 
12
13
  const args = process.argv.slice(2);
13
14
  const command = args[0] || 'help';
@@ -23,6 +24,8 @@ const HELP = `
23
24
  install, instalar Instalar el framework (interactivo)
24
25
  install --global Instalar globalmente
25
26
  install --lang <es|en|pt> Instalar con idioma específico
27
+ update, actualizar Actualizar a la última versión
28
+ update --check Solo verificar, no aplicar
26
29
  validate, validar Validar estructura del framework
27
30
  version Mostrar versión
28
31
  help Mostrar esta ayuda
@@ -30,6 +33,7 @@ const HELP = `
30
33
  Ejemplos:
31
34
  don-cheli install
32
35
  don-cheli install --global --lang es
36
+ don-cheli update
33
37
  don-cheli install --global --lang en --profile phantom
34
38
  don-cheli validate
35
39
  npx don-cheli-sdd install --global
@@ -61,6 +65,12 @@ switch (command) {
61
65
  run(VALIDATOR, args.slice(1));
62
66
  break;
63
67
 
68
+ case 'update':
69
+ case 'actualizar':
70
+ case 'upgrade':
71
+ run(UPDATER, args.slice(1));
72
+ break;
73
+
64
74
  case 'version':
65
75
  case '--version':
66
76
  case '-v':
@@ -18,6 +18,26 @@ Verificar si hay actualizaciones disponibles en el repositorio de Don Cheli y of
18
18
  /dc:actualizar --auto # Auto-actualizar con auditoría de seguridad (usado por auto-check de sesión)
19
19
  ```
20
20
 
21
+ ## Script ejecutable
22
+
23
+ Para ejecutar directamente desde terminal (sin agente IA):
24
+
25
+ ```bash
26
+ bash scripts/actualizar.sh # Interactivo con barra de progreso
27
+ bash scripts/actualizar.sh --verificar # Solo verificar
28
+ don-cheli update # Via CLI npm
29
+ don-cheli update --check # Solo verificar via npm
30
+ ```
31
+
32
+ El script incluye:
33
+ - Barra de progreso visual con porcentaje
34
+ - Comparación de versiones (local vs remota)
35
+ - Reporte de commits por tipo (feat/fix/refactor/docs)
36
+ - Tabla de componentes (comandos, habilidades) con delta
37
+ - Lista de nuevas funcionalidades y correcciones
38
+ - Auditoría de seguridad pre-actualización
39
+ - Preservación de perfil e idioma al actualizar
40
+
21
41
  ## Proceso
22
42
 
23
43
  ### 1. Detectar instalación
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "don-cheli-sdd",
3
- "version": "1.18.0",
3
+ "version": "1.19.1",
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.18.0
1
+ 1.19.1
@@ -0,0 +1,348 @@
1
+ #!/bin/bash
2
+ # Don Cheli — Actualizador con barra de progreso y comparación de mejoras
3
+ # Usage:
4
+ # bash scripts/actualizar.sh # Interactivo
5
+ # bash scripts/actualizar.sh --verificar # Solo verificar
6
+ # bash scripts/actualizar.sh --forzar # Aplicar sin confirmar
7
+ # bash scripts/actualizar.sh --auto # Auto-update silencioso
8
+ # don-cheli update # Via CLI npm
9
+
10
+ set -euo pipefail
11
+
12
+ # ═══════════════════════════════════════════════════════════════
13
+ # COLORS & HELPERS
14
+ # ═══════════════════════════════════════════════════════════════
15
+
16
+ GREEN='\033[0;32m'
17
+ RED='\033[0;31m'
18
+ YELLOW='\033[1;33m'
19
+ CYAN='\033[0;36m'
20
+ BOLD='\033[1m'
21
+ DIM='\033[2m'
22
+ NC='\033[0m'
23
+
24
+ REPO_URL="https://github.com/doncheli/don-cheli-sdd"
25
+ RAW_URL="https://raw.githubusercontent.com/doncheli/don-cheli-sdd/main"
26
+ API_URL="https://api.github.com/repos/doncheli/don-cheli-sdd"
27
+
28
+ # Parse flags
29
+ MODE="interactive"
30
+ for arg in "$@"; do
31
+ case "$arg" in
32
+ --verificar|--check) MODE="check" ;;
33
+ --forzar|--force) MODE="force" ;;
34
+ --auto) MODE="auto" ;;
35
+ esac
36
+ done
37
+
38
+ # ═══════════════════════════════════════════════════════════════
39
+ # PROGRESS BAR
40
+ # ═══════════════════════════════════════════════════════════════
41
+
42
+ TOTAL_STEPS=10
43
+ CURRENT_STEP=0
44
+
45
+ progress() {
46
+ local label="$1"
47
+ CURRENT_STEP=$((CURRENT_STEP + 1))
48
+ local pct=$((CURRENT_STEP * 100 / TOTAL_STEPS))
49
+ local filled=$((pct / 5))
50
+ local empty=$((20 - filled))
51
+
52
+ # Build bar
53
+ local bar=""
54
+ for ((i=0; i<filled; i++)); do bar="${bar}█"; done
55
+ for ((i=0; i<empty; i++)); do bar="${bar}░"; done
56
+
57
+ printf "\r ${CYAN}[${bar}]${NC} ${BOLD}%3d%%${NC} ${label}%-40s" "$pct" ""
58
+
59
+ # Newline at 100%
60
+ if [ "$pct" -ge 100 ]; then echo ""; fi
61
+ }
62
+
63
+ # ═══════════════════════════════════════════════════════════════
64
+ # DETECT INSTALLATION
65
+ # ═══════════════════════════════════════════════════════════════
66
+
67
+ echo ""
68
+ echo -e "${BOLD} ╔═══════════════════════════════════════════╗${NC}"
69
+ echo -e "${BOLD} ║ Don Cheli — Actualizador ║${NC}"
70
+ echo -e "${BOLD} ╚═══════════════════════════════════════════╝${NC}"
71
+ echo ""
72
+
73
+ progress "Detectando instalación..."
74
+
75
+ INSTALL_DIR=""
76
+ if [ -f "$HOME/.claude/don-cheli/VERSION" ]; then
77
+ INSTALL_DIR="$HOME/.claude/don-cheli"
78
+ INSTALL_TYPE="global"
79
+ elif [ -f "./.claude/don-cheli/VERSION" ]; then
80
+ INSTALL_DIR="./.claude/don-cheli"
81
+ INSTALL_TYPE="local"
82
+ else
83
+ echo ""
84
+ echo -e " ${RED}❌ Don Cheli no está instalado${NC}"
85
+ echo -e " Ejecuta: ${CYAN}npm install -g don-cheli-sdd && don-cheli install --global${NC}"
86
+ exit 1
87
+ fi
88
+
89
+ VERSION_LOCAL=$(cat "$INSTALL_DIR/VERSION" | tr -d '[:space:]')
90
+ LOCALE=$(cat "$INSTALL_DIR/locale" 2>/dev/null || echo "es")
91
+
92
+ progress "Versión local: v${VERSION_LOCAL}"
93
+
94
+ # ═══════════════════════════════════════════════════════════════
95
+ # CHECK REMOTE VERSION
96
+ # ═══════════════════════════════════════════════════════════════
97
+
98
+ progress "Consultando versión remota..."
99
+
100
+ VERSION_REMOTE=$(curl -fsSL "${RAW_URL}/VERSION" 2>/dev/null | tr -d '[:space:]') || {
101
+ echo ""
102
+ echo -e " ${RED}❌ No se pudo consultar la versión remota${NC}"
103
+ echo -e " Verifica tu conexión a internet."
104
+ exit 1
105
+ }
106
+
107
+ progress "Versión remota: v${VERSION_REMOTE}"
108
+
109
+ # ═══════════════════════════════════════════════════════════════
110
+ # COMPARE VERSIONS
111
+ # ═══════════════════════════════════════════════════════════════
112
+
113
+ echo ""
114
+ echo ""
115
+ echo -e " ┌─────────────────────────────────────────┐"
116
+ echo -e " │ ${BOLD}Comparación de versiones${NC} │"
117
+ echo -e " ├─────────────────────────────────────────┤"
118
+ printf " │ Instalada: ${CYAN}%-27s${NC}│\n" "v${VERSION_LOCAL} (${INSTALL_TYPE})"
119
+ printf " │ Disponible: ${GREEN}%-27s${NC}│\n" "v${VERSION_REMOTE}"
120
+
121
+ if [ "$VERSION_LOCAL" = "$VERSION_REMOTE" ]; then
122
+ echo -e " │ Estado: ${GREEN}✅ Al día${NC} │"
123
+ echo -e " └─────────────────────────────────────────┘"
124
+ echo ""
125
+ if [ "$MODE" = "check" ] || [ "$MODE" = "auto" ]; then exit 0; fi
126
+ echo -e " Ya tienes la última versión."
127
+ exit 0
128
+ else
129
+ echo -e " │ Estado: ${YELLOW}⬆️ Actualización disponible${NC} │"
130
+ echo -e " └─────────────────────────────────────────┘"
131
+ fi
132
+
133
+ if [ "$MODE" = "check" ]; then
134
+ echo ""
135
+ exit 0
136
+ fi
137
+
138
+ # ═══════════════════════════════════════════════════════════════
139
+ # FETCH CHANGELOG AND DIFF
140
+ # ═══════════════════════════════════════════════════════════════
141
+
142
+ echo ""
143
+ progress "Obteniendo cambios entre versiones..."
144
+
145
+ # Get commits between versions
146
+ CHANGES=""
147
+ COMMITS_JSON=$(curl -fsSL "${API_URL}/compare/v${VERSION_LOCAL}...v${VERSION_REMOTE}" 2>/dev/null) || true
148
+
149
+ FEAT_COUNT=0
150
+ FIX_COUNT=0
151
+ REFACTOR_COUNT=0
152
+ DOCS_COUNT=0
153
+ OTHER_COUNT=0
154
+ FILES_CHANGED=0
155
+ FEATURES=""
156
+ FIXES=""
157
+
158
+ if [ -n "$COMMITS_JSON" ]; then
159
+ # Count commit types
160
+ FEAT_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"feat[:(]' | wc -l | tr -d ' ')
161
+ FIX_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"fix[:(]' | wc -l | tr -d ' ')
162
+ REFACTOR_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"refactor[:(]' | wc -l | tr -d ' ')
163
+ DOCS_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"docs[:(]' | wc -l | tr -d ' ')
164
+
165
+ # Get file count
166
+ FILES_CHANGED=$(echo "$COMMITS_JSON" | grep -o '"filename"' | wc -l | tr -d ' ')
167
+
168
+ # Extract feature descriptions
169
+ FEATURES=$(echo "$COMMITS_JSON" | grep -o '"message":"feat[^"]*"' | sed 's/"message":"feat[:(]\s*/ ✨ /' | sed 's/"//' | head -10)
170
+ FIXES=$(echo "$COMMITS_JSON" | grep -o '"message":"fix[^"]*"' | sed 's/"message":"fix[:(]\s*/ 🔧 /' | sed 's/"//' | head -10)
171
+ fi
172
+
173
+ progress "Analizando cambios..."
174
+
175
+ # Count new commands and skills in remote
176
+ REMOTE_CMDS=$(curl -fsSL "${API_URL}/contents/comandos/especdev" 2>/dev/null | grep -c '"name"' || echo "?")
177
+ REMOTE_SKILLS=$(curl -fsSL "${API_URL}/contents/habilidades" 2>/dev/null | grep -c '"name"' || echo "?")
178
+ LOCAL_CMDS=$(find "$INSTALL_DIR/../commands/especdev/" -name "*.md" 2>/dev/null | wc -l | tr -d ' ' || echo "?")
179
+ LOCAL_SKILLS=$(find "$INSTALL_DIR/habilidades/" -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' ' || echo "?")
180
+ LOCAL_SKILLS=$((LOCAL_SKILLS - 1)) # subtract the parent dir
181
+
182
+ # ═══════════════════════════════════════════════════════════════
183
+ # SHOW COMPARISON REPORT
184
+ # ═══════════════════════════════════════════════════════════════
185
+
186
+ echo ""
187
+ echo ""
188
+ echo -e " ${BOLD}═══════════════════════════════════════════${NC}"
189
+ echo -e " ${BOLD} 📋 Reporte de cambios: v${VERSION_LOCAL} → v${VERSION_REMOTE}${NC}"
190
+ echo -e " ${BOLD}═══════════════════════════════════════════${NC}"
191
+ echo ""
192
+
193
+ # Commit summary
194
+ echo -e " ${BOLD}Commits por tipo:${NC}"
195
+ [ "$FEAT_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${GREEN}✨ $FEAT_COUNT nuevas funcionalidades${NC}"
196
+ [ "$FIX_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${YELLOW}🔧 $FIX_COUNT correcciones${NC}"
197
+ [ "$REFACTOR_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${CYAN}♻️ $REFACTOR_COUNT refactorizaciones${NC}"
198
+ [ "$DOCS_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${DIM}📝 $DOCS_COUNT documentación${NC}"
199
+ echo -e " ${DIM}📁 $FILES_CHANGED archivos modificados${NC}"
200
+ echo ""
201
+
202
+ # Component comparison
203
+ echo -e " ${BOLD}Comparación de componentes:${NC}"
204
+ echo ""
205
+ echo -e " │ Componente │ Actual │ Nueva │ Δ"
206
+ echo -e " ├───────────────────┼─────────┼─────────┼──────"
207
+ if [ "$REMOTE_CMDS" != "?" ] && [ "$LOCAL_CMDS" != "?" ]; then
208
+ DELTA_CMDS=$((REMOTE_CMDS - LOCAL_CMDS))
209
+ if [ "$DELTA_CMDS" -gt 0 ]; then
210
+ printf " │ Comandos │ %-7s │ %-7s │ ${GREEN}+%s${NC}\n" "$LOCAL_CMDS" "$REMOTE_CMDS" "$DELTA_CMDS"
211
+ else
212
+ printf " │ Comandos │ %-7s │ %-7s │ =${NC}\n" "$LOCAL_CMDS" "$REMOTE_CMDS"
213
+ fi
214
+ fi
215
+ if [ "$REMOTE_SKILLS" != "?" ] && [ "$LOCAL_SKILLS" != "?" ]; then
216
+ DELTA_SKILLS=$((REMOTE_SKILLS - LOCAL_SKILLS))
217
+ if [ "$DELTA_SKILLS" -gt 0 ]; then
218
+ printf " │ Habilidades │ %-7s │ %-7s │ ${GREEN}+%s${NC}\n" "$LOCAL_SKILLS" "$REMOTE_SKILLS" "$DELTA_SKILLS"
219
+ else
220
+ printf " │ Habilidades │ %-7s │ %-7s │ =${NC}\n" "$LOCAL_SKILLS" "$REMOTE_SKILLS"
221
+ fi
222
+ fi
223
+ printf " │ Versión │ %-7s │ %-7s │ ${GREEN}⬆️${NC}\n" "$VERSION_LOCAL" "$VERSION_REMOTE"
224
+ echo ""
225
+
226
+ # Features list
227
+ if [ -n "$FEATURES" ]; then
228
+ echo -e " ${BOLD}Nuevas funcionalidades:${NC}"
229
+ echo "$FEATURES"
230
+ echo ""
231
+ fi
232
+
233
+ # Fixes list
234
+ if [ -n "$FIXES" ]; then
235
+ echo -e " ${BOLD}Correcciones:${NC}"
236
+ echo "$FIXES"
237
+ echo ""
238
+ fi
239
+
240
+ echo -e " ${DIM}Changelog completo: ${REPO_URL}/blob/main/CHANGELOG.md${NC}"
241
+ echo ""
242
+
243
+ # ═══════════════════════════════════════════════════════════════
244
+ # CONFIRM
245
+ # ═══════════════════════════════════════════════════════════════
246
+
247
+ if [ "$MODE" = "interactive" ]; then
248
+ echo -ne " ${BOLD}¿Actualizar Don Cheli de v${VERSION_LOCAL} a v${VERSION_REMOTE}? [S/n] ${NC}"
249
+ CONFIRM=""
250
+ read -r CONFIRM < /dev/tty 2>/dev/null || read -r CONFIRM 2>/dev/null || CONFIRM="s"
251
+ case "$CONFIRM" in
252
+ [nN]*) echo -e " ${DIM}Actualización cancelada.${NC}"; exit 0 ;;
253
+ esac
254
+ fi
255
+
256
+ # ═══════════════════════════════════════════════════════════════
257
+ # SECURITY AUDIT
258
+ # ═══════════════════════════════════════════════════════════════
259
+
260
+ echo ""
261
+ progress "Auditoria de seguridad pre-actualización..."
262
+
263
+ TEMP_DIR=$(mktemp -d)
264
+ trap 'rm -rf "$TEMP_DIR"' EXIT
265
+
266
+ progress "Descargando v${VERSION_REMOTE}..."
267
+
268
+ git clone --depth 1 "${REPO_URL}.git" "$TEMP_DIR/don-cheli-sdd" > /dev/null 2>&1 || {
269
+ echo ""
270
+ echo -e " ${RED}❌ Error al descargar. Verifica tu conexión.${NC}"
271
+ exit 1
272
+ }
273
+
274
+ progress "Escaneando scripts por seguridad..."
275
+
276
+ AUDIT_ISSUES=0
277
+ # Check for suspicious patterns in new scripts
278
+ for f in "$TEMP_DIR/don-cheli-sdd/scripts/"*.sh; do
279
+ [ -f "$f" ] || continue
280
+ # Check for eval, curl|bash, base64 decode, etc.
281
+ SUSPICIOUS=$(grep -cn "eval \"\$\|curl.*|.*bash\|base64.*-d\|rm -rf /\|chmod 777" "$f" 2>/dev/null || echo 0)
282
+ if [ "$SUSPICIOUS" -gt 0 ]; then
283
+ AUDIT_ISSUES=$((AUDIT_ISSUES + SUSPICIOUS))
284
+ fi
285
+ done
286
+
287
+ progress "Verificando integridad..."
288
+
289
+ if [ "$AUDIT_ISSUES" -gt 0 ]; then
290
+ echo ""
291
+ echo -e " ${RED}🛑 Auditoría bloqueó la actualización${NC}"
292
+ echo -e " ${RED} $AUDIT_ISSUES patrón(es) sospechoso(s) encontrado(s) en scripts${NC}"
293
+ echo -e " Ejecuta ${CYAN}/dc:auditar-seguridad${NC} manualmente para detalles."
294
+ exit 1
295
+ fi
296
+
297
+ echo ""
298
+ echo -e " ${GREEN}✅ Auditoría de seguridad: LIMPIA${NC}"
299
+ echo ""
300
+
301
+ # ═══════════════════════════════════════════════════════════════
302
+ # APPLY UPDATE
303
+ # ═══════════════════════════════════════════════════════════════
304
+
305
+ progress "Instalando v${VERSION_REMOTE}..."
306
+
307
+ INSTALL_FLAGS="--lang $LOCALE"
308
+ if [ "$INSTALL_TYPE" = "global" ]; then
309
+ INSTALL_FLAGS="$INSTALL_FLAGS --global"
310
+ fi
311
+
312
+ # Preserve profile if exists
313
+ if [ -f "$INSTALL_DIR/perfil" ]; then
314
+ PROFILE=$(cat "$INSTALL_DIR/perfil")
315
+ INSTALL_FLAGS="$INSTALL_FLAGS --profile $PROFILE"
316
+ fi
317
+
318
+ cd "$TEMP_DIR/don-cheli-sdd" && bash scripts/instalar.sh $INSTALL_FLAGS > /dev/null 2>&1
319
+
320
+ progress "Verificando instalación..."
321
+
322
+ # Verify new version
323
+ NEW_VERSION=$(cat "$INSTALL_DIR/VERSION" 2>/dev/null | tr -d '[:space:]')
324
+
325
+ progress "¡Actualización completa!"
326
+
327
+ # ═══════════════════════════════════════════════════════════════
328
+ # FINAL REPORT
329
+ # ═══════════════════════════════════════════════════════════════
330
+
331
+ echo ""
332
+ echo ""
333
+ echo -e " ${GREEN}${BOLD}══════════════════════════════════════════════════${NC}"
334
+ echo -e " ${GREEN}${BOLD} ✅ Don Cheli actualizado: v${VERSION_LOCAL} → v${NEW_VERSION}${NC}"
335
+ echo -e " ${GREEN}${BOLD}══════════════════════════════════════════════════${NC}"
336
+ echo ""
337
+ echo -e " ${BOLD}Resumen:${NC}"
338
+ [ "$FEAT_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${GREEN}✨ $FEAT_COUNT nuevas funcionalidades${NC}"
339
+ [ "$FIX_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${YELLOW}🔧 $FIX_COUNT correcciones${NC}"
340
+ [ "$REFACTOR_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${CYAN}♻️ $REFACTOR_COUNT refactorizaciones${NC}"
341
+ echo -e " ${DIM}📁 $FILES_CHANGED archivos actualizados${NC}"
342
+ echo -e " ${GREEN}🛡️ Auditoría de seguridad: LIMPIA${NC}"
343
+ echo ""
344
+ echo -e " ${BOLD}Próximo paso:${NC}"
345
+ echo -e " Reinicia Claude Code para aplicar los cambios."
346
+ echo ""
347
+ echo -e " ${DIM}Deja de adivinar. Empieza a hacer ingeniería.${NC}"
348
+ echo ""
@@ -4,7 +4,7 @@
4
4
 
5
5
  set -euo pipefail
6
6
 
7
- VERSION="1.18.0"
7
+ VERSION="1.19.1"
8
8
  REPO_URL="https://github.com/doncheli/don-cheli-sdd"
9
9
  CLEANUP_TMPDIR=""
10
10
 
@@ -0,0 +1,348 @@
1
+ #!/bin/bash
2
+ # Don Cheli — Actualizador con barra de progreso y comparación de mejoras
3
+ # Usage:
4
+ # bash scripts/actualizar.sh # Interactivo
5
+ # bash scripts/actualizar.sh --verificar # Solo verificar
6
+ # bash scripts/actualizar.sh --forzar # Aplicar sin confirmar
7
+ # bash scripts/actualizar.sh --auto # Auto-update silencioso
8
+ # don-cheli update # Via CLI npm
9
+
10
+ set -euo pipefail
11
+
12
+ # ═══════════════════════════════════════════════════════════════
13
+ # COLORS & HELPERS
14
+ # ═══════════════════════════════════════════════════════════════
15
+
16
+ GREEN='\033[0;32m'
17
+ RED='\033[0;31m'
18
+ YELLOW='\033[1;33m'
19
+ CYAN='\033[0;36m'
20
+ BOLD='\033[1m'
21
+ DIM='\033[2m'
22
+ NC='\033[0m'
23
+
24
+ REPO_URL="https://github.com/doncheli/don-cheli-sdd"
25
+ RAW_URL="https://raw.githubusercontent.com/doncheli/don-cheli-sdd/main"
26
+ API_URL="https://api.github.com/repos/doncheli/don-cheli-sdd"
27
+
28
+ # Parse flags
29
+ MODE="interactive"
30
+ for arg in "$@"; do
31
+ case "$arg" in
32
+ --verificar|--check) MODE="check" ;;
33
+ --forzar|--force) MODE="force" ;;
34
+ --auto) MODE="auto" ;;
35
+ esac
36
+ done
37
+
38
+ # ═══════════════════════════════════════════════════════════════
39
+ # PROGRESS BAR
40
+ # ═══════════════════════════════════════════════════════════════
41
+
42
+ TOTAL_STEPS=10
43
+ CURRENT_STEP=0
44
+
45
+ progress() {
46
+ local label="$1"
47
+ CURRENT_STEP=$((CURRENT_STEP + 1))
48
+ local pct=$((CURRENT_STEP * 100 / TOTAL_STEPS))
49
+ local filled=$((pct / 5))
50
+ local empty=$((20 - filled))
51
+
52
+ # Build bar
53
+ local bar=""
54
+ for ((i=0; i<filled; i++)); do bar="${bar}█"; done
55
+ for ((i=0; i<empty; i++)); do bar="${bar}░"; done
56
+
57
+ printf "\r ${CYAN}[${bar}]${NC} ${BOLD}%3d%%${NC} ${label}%-40s" "$pct" ""
58
+
59
+ # Newline at 100%
60
+ if [ "$pct" -ge 100 ]; then echo ""; fi
61
+ }
62
+
63
+ # ═══════════════════════════════════════════════════════════════
64
+ # DETECT INSTALLATION
65
+ # ═══════════════════════════════════════════════════════════════
66
+
67
+ echo ""
68
+ echo -e "${BOLD} ╔═══════════════════════════════════════════╗${NC}"
69
+ echo -e "${BOLD} ║ Don Cheli — Actualizador ║${NC}"
70
+ echo -e "${BOLD} ╚═══════════════════════════════════════════╝${NC}"
71
+ echo ""
72
+
73
+ progress "Detectando instalación..."
74
+
75
+ INSTALL_DIR=""
76
+ if [ -f "$HOME/.claude/don-cheli/VERSION" ]; then
77
+ INSTALL_DIR="$HOME/.claude/don-cheli"
78
+ INSTALL_TYPE="global"
79
+ elif [ -f "./.claude/don-cheli/VERSION" ]; then
80
+ INSTALL_DIR="./.claude/don-cheli"
81
+ INSTALL_TYPE="local"
82
+ else
83
+ echo ""
84
+ echo -e " ${RED}❌ Don Cheli no está instalado${NC}"
85
+ echo -e " Ejecuta: ${CYAN}npm install -g don-cheli-sdd && don-cheli install --global${NC}"
86
+ exit 1
87
+ fi
88
+
89
+ VERSION_LOCAL=$(cat "$INSTALL_DIR/VERSION" | tr -d '[:space:]')
90
+ LOCALE=$(cat "$INSTALL_DIR/locale" 2>/dev/null || echo "es")
91
+
92
+ progress "Versión local: v${VERSION_LOCAL}"
93
+
94
+ # ═══════════════════════════════════════════════════════════════
95
+ # CHECK REMOTE VERSION
96
+ # ═══════════════════════════════════════════════════════════════
97
+
98
+ progress "Consultando versión remota..."
99
+
100
+ VERSION_REMOTE=$(curl -fsSL "${RAW_URL}/VERSION" 2>/dev/null | tr -d '[:space:]') || {
101
+ echo ""
102
+ echo -e " ${RED}❌ No se pudo consultar la versión remota${NC}"
103
+ echo -e " Verifica tu conexión a internet."
104
+ exit 1
105
+ }
106
+
107
+ progress "Versión remota: v${VERSION_REMOTE}"
108
+
109
+ # ═══════════════════════════════════════════════════════════════
110
+ # COMPARE VERSIONS
111
+ # ═══════════════════════════════════════════════════════════════
112
+
113
+ echo ""
114
+ echo ""
115
+ echo -e " ┌─────────────────────────────────────────┐"
116
+ echo -e " │ ${BOLD}Comparación de versiones${NC} │"
117
+ echo -e " ├─────────────────────────────────────────┤"
118
+ printf " │ Instalada: ${CYAN}%-27s${NC}│\n" "v${VERSION_LOCAL} (${INSTALL_TYPE})"
119
+ printf " │ Disponible: ${GREEN}%-27s${NC}│\n" "v${VERSION_REMOTE}"
120
+
121
+ if [ "$VERSION_LOCAL" = "$VERSION_REMOTE" ]; then
122
+ echo -e " │ Estado: ${GREEN}✅ Al día${NC} │"
123
+ echo -e " └─────────────────────────────────────────┘"
124
+ echo ""
125
+ if [ "$MODE" = "check" ] || [ "$MODE" = "auto" ]; then exit 0; fi
126
+ echo -e " Ya tienes la última versión."
127
+ exit 0
128
+ else
129
+ echo -e " │ Estado: ${YELLOW}⬆️ Actualización disponible${NC} │"
130
+ echo -e " └─────────────────────────────────────────┘"
131
+ fi
132
+
133
+ if [ "$MODE" = "check" ]; then
134
+ echo ""
135
+ exit 0
136
+ fi
137
+
138
+ # ═══════════════════════════════════════════════════════════════
139
+ # FETCH CHANGELOG AND DIFF
140
+ # ═══════════════════════════════════════════════════════════════
141
+
142
+ echo ""
143
+ progress "Obteniendo cambios entre versiones..."
144
+
145
+ # Get commits between versions
146
+ CHANGES=""
147
+ COMMITS_JSON=$(curl -fsSL "${API_URL}/compare/v${VERSION_LOCAL}...v${VERSION_REMOTE}" 2>/dev/null) || true
148
+
149
+ FEAT_COUNT=0
150
+ FIX_COUNT=0
151
+ REFACTOR_COUNT=0
152
+ DOCS_COUNT=0
153
+ OTHER_COUNT=0
154
+ FILES_CHANGED=0
155
+ FEATURES=""
156
+ FIXES=""
157
+
158
+ if [ -n "$COMMITS_JSON" ]; then
159
+ # Count commit types
160
+ FEAT_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"feat[:(]' | wc -l | tr -d ' ')
161
+ FIX_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"fix[:(]' | wc -l | tr -d ' ')
162
+ REFACTOR_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"refactor[:(]' | wc -l | tr -d ' ')
163
+ DOCS_COUNT=$(echo "$COMMITS_JSON" | grep -o '"message":"docs[:(]' | wc -l | tr -d ' ')
164
+
165
+ # Get file count
166
+ FILES_CHANGED=$(echo "$COMMITS_JSON" | grep -o '"filename"' | wc -l | tr -d ' ')
167
+
168
+ # Extract feature descriptions
169
+ FEATURES=$(echo "$COMMITS_JSON" | grep -o '"message":"feat[^"]*"' | sed 's/"message":"feat[:(]\s*/ ✨ /' | sed 's/"//' | head -10)
170
+ FIXES=$(echo "$COMMITS_JSON" | grep -o '"message":"fix[^"]*"' | sed 's/"message":"fix[:(]\s*/ 🔧 /' | sed 's/"//' | head -10)
171
+ fi
172
+
173
+ progress "Analizando cambios..."
174
+
175
+ # Count new commands and skills in remote
176
+ REMOTE_CMDS=$(curl -fsSL "${API_URL}/contents/comandos/especdev" 2>/dev/null | grep -c '"name"' || echo "?")
177
+ REMOTE_SKILLS=$(curl -fsSL "${API_URL}/contents/habilidades" 2>/dev/null | grep -c '"name"' || echo "?")
178
+ LOCAL_CMDS=$(find "$INSTALL_DIR/../commands/especdev/" -name "*.md" 2>/dev/null | wc -l | tr -d ' ' || echo "?")
179
+ LOCAL_SKILLS=$(find "$INSTALL_DIR/habilidades/" -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' ' || echo "?")
180
+ LOCAL_SKILLS=$((LOCAL_SKILLS - 1)) # subtract the parent dir
181
+
182
+ # ═══════════════════════════════════════════════════════════════
183
+ # SHOW COMPARISON REPORT
184
+ # ═══════════════════════════════════════════════════════════════
185
+
186
+ echo ""
187
+ echo ""
188
+ echo -e " ${BOLD}═══════════════════════════════════════════${NC}"
189
+ echo -e " ${BOLD} 📋 Reporte de cambios: v${VERSION_LOCAL} → v${VERSION_REMOTE}${NC}"
190
+ echo -e " ${BOLD}═══════════════════════════════════════════${NC}"
191
+ echo ""
192
+
193
+ # Commit summary
194
+ echo -e " ${BOLD}Commits por tipo:${NC}"
195
+ [ "$FEAT_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${GREEN}✨ $FEAT_COUNT nuevas funcionalidades${NC}"
196
+ [ "$FIX_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${YELLOW}🔧 $FIX_COUNT correcciones${NC}"
197
+ [ "$REFACTOR_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${CYAN}♻️ $REFACTOR_COUNT refactorizaciones${NC}"
198
+ [ "$DOCS_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${DIM}📝 $DOCS_COUNT documentación${NC}"
199
+ echo -e " ${DIM}📁 $FILES_CHANGED archivos modificados${NC}"
200
+ echo ""
201
+
202
+ # Component comparison
203
+ echo -e " ${BOLD}Comparación de componentes:${NC}"
204
+ echo ""
205
+ echo -e " │ Componente │ Actual │ Nueva │ Δ"
206
+ echo -e " ├───────────────────┼─────────┼─────────┼──────"
207
+ if [ "$REMOTE_CMDS" != "?" ] && [ "$LOCAL_CMDS" != "?" ]; then
208
+ DELTA_CMDS=$((REMOTE_CMDS - LOCAL_CMDS))
209
+ if [ "$DELTA_CMDS" -gt 0 ]; then
210
+ printf " │ Comandos │ %-7s │ %-7s │ ${GREEN}+%s${NC}\n" "$LOCAL_CMDS" "$REMOTE_CMDS" "$DELTA_CMDS"
211
+ else
212
+ printf " │ Comandos │ %-7s │ %-7s │ =${NC}\n" "$LOCAL_CMDS" "$REMOTE_CMDS"
213
+ fi
214
+ fi
215
+ if [ "$REMOTE_SKILLS" != "?" ] && [ "$LOCAL_SKILLS" != "?" ]; then
216
+ DELTA_SKILLS=$((REMOTE_SKILLS - LOCAL_SKILLS))
217
+ if [ "$DELTA_SKILLS" -gt 0 ]; then
218
+ printf " │ Habilidades │ %-7s │ %-7s │ ${GREEN}+%s${NC}\n" "$LOCAL_SKILLS" "$REMOTE_SKILLS" "$DELTA_SKILLS"
219
+ else
220
+ printf " │ Habilidades │ %-7s │ %-7s │ =${NC}\n" "$LOCAL_SKILLS" "$REMOTE_SKILLS"
221
+ fi
222
+ fi
223
+ printf " │ Versión │ %-7s │ %-7s │ ${GREEN}⬆️${NC}\n" "$VERSION_LOCAL" "$VERSION_REMOTE"
224
+ echo ""
225
+
226
+ # Features list
227
+ if [ -n "$FEATURES" ]; then
228
+ echo -e " ${BOLD}Nuevas funcionalidades:${NC}"
229
+ echo "$FEATURES"
230
+ echo ""
231
+ fi
232
+
233
+ # Fixes list
234
+ if [ -n "$FIXES" ]; then
235
+ echo -e " ${BOLD}Correcciones:${NC}"
236
+ echo "$FIXES"
237
+ echo ""
238
+ fi
239
+
240
+ echo -e " ${DIM}Changelog completo: ${REPO_URL}/blob/main/CHANGELOG.md${NC}"
241
+ echo ""
242
+
243
+ # ═══════════════════════════════════════════════════════════════
244
+ # CONFIRM
245
+ # ═══════════════════════════════════════════════════════════════
246
+
247
+ if [ "$MODE" = "interactive" ]; then
248
+ echo -ne " ${BOLD}¿Actualizar Don Cheli de v${VERSION_LOCAL} a v${VERSION_REMOTE}? [S/n] ${NC}"
249
+ CONFIRM=""
250
+ read -r CONFIRM < /dev/tty 2>/dev/null || read -r CONFIRM 2>/dev/null || CONFIRM="s"
251
+ case "$CONFIRM" in
252
+ [nN]*) echo -e " ${DIM}Actualización cancelada.${NC}"; exit 0 ;;
253
+ esac
254
+ fi
255
+
256
+ # ═══════════════════════════════════════════════════════════════
257
+ # SECURITY AUDIT
258
+ # ═══════════════════════════════════════════════════════════════
259
+
260
+ echo ""
261
+ progress "Auditoria de seguridad pre-actualización..."
262
+
263
+ TEMP_DIR=$(mktemp -d)
264
+ trap 'rm -rf "$TEMP_DIR"' EXIT
265
+
266
+ progress "Descargando v${VERSION_REMOTE}..."
267
+
268
+ git clone --depth 1 "${REPO_URL}.git" "$TEMP_DIR/don-cheli-sdd" > /dev/null 2>&1 || {
269
+ echo ""
270
+ echo -e " ${RED}❌ Error al descargar. Verifica tu conexión.${NC}"
271
+ exit 1
272
+ }
273
+
274
+ progress "Escaneando scripts por seguridad..."
275
+
276
+ AUDIT_ISSUES=0
277
+ # Check for suspicious patterns in new scripts
278
+ for f in "$TEMP_DIR/don-cheli-sdd/scripts/"*.sh; do
279
+ [ -f "$f" ] || continue
280
+ # Check for eval, curl|bash, base64 decode, etc.
281
+ SUSPICIOUS=$(grep -cn "eval \"\$\|curl.*|.*bash\|base64.*-d\|rm -rf /\|chmod 777" "$f" 2>/dev/null || echo 0)
282
+ if [ "$SUSPICIOUS" -gt 0 ]; then
283
+ AUDIT_ISSUES=$((AUDIT_ISSUES + SUSPICIOUS))
284
+ fi
285
+ done
286
+
287
+ progress "Verificando integridad..."
288
+
289
+ if [ "$AUDIT_ISSUES" -gt 0 ]; then
290
+ echo ""
291
+ echo -e " ${RED}🛑 Auditoría bloqueó la actualización${NC}"
292
+ echo -e " ${RED} $AUDIT_ISSUES patrón(es) sospechoso(s) encontrado(s) en scripts${NC}"
293
+ echo -e " Ejecuta ${CYAN}/dc:auditar-seguridad${NC} manualmente para detalles."
294
+ exit 1
295
+ fi
296
+
297
+ echo ""
298
+ echo -e " ${GREEN}✅ Auditoría de seguridad: LIMPIA${NC}"
299
+ echo ""
300
+
301
+ # ═══════════════════════════════════════════════════════════════
302
+ # APPLY UPDATE
303
+ # ═══════════════════════════════════════════════════════════════
304
+
305
+ progress "Instalando v${VERSION_REMOTE}..."
306
+
307
+ INSTALL_FLAGS="--lang $LOCALE"
308
+ if [ "$INSTALL_TYPE" = "global" ]; then
309
+ INSTALL_FLAGS="$INSTALL_FLAGS --global"
310
+ fi
311
+
312
+ # Preserve profile if exists
313
+ if [ -f "$INSTALL_DIR/perfil" ]; then
314
+ PROFILE=$(cat "$INSTALL_DIR/perfil")
315
+ INSTALL_FLAGS="$INSTALL_FLAGS --profile $PROFILE"
316
+ fi
317
+
318
+ cd "$TEMP_DIR/don-cheli-sdd" && bash scripts/instalar.sh $INSTALL_FLAGS > /dev/null 2>&1
319
+
320
+ progress "Verificando instalación..."
321
+
322
+ # Verify new version
323
+ NEW_VERSION=$(cat "$INSTALL_DIR/VERSION" 2>/dev/null | tr -d '[:space:]')
324
+
325
+ progress "¡Actualización completa!"
326
+
327
+ # ═══════════════════════════════════════════════════════════════
328
+ # FINAL REPORT
329
+ # ═══════════════════════════════════════════════════════════════
330
+
331
+ echo ""
332
+ echo ""
333
+ echo -e " ${GREEN}${BOLD}══════════════════════════════════════════════════${NC}"
334
+ echo -e " ${GREEN}${BOLD} ✅ Don Cheli actualizado: v${VERSION_LOCAL} → v${NEW_VERSION}${NC}"
335
+ echo -e " ${GREEN}${BOLD}══════════════════════════════════════════════════${NC}"
336
+ echo ""
337
+ echo -e " ${BOLD}Resumen:${NC}"
338
+ [ "$FEAT_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${GREEN}✨ $FEAT_COUNT nuevas funcionalidades${NC}"
339
+ [ "$FIX_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${YELLOW}🔧 $FIX_COUNT correcciones${NC}"
340
+ [ "$REFACTOR_COUNT" -gt 0 ] 2>/dev/null && echo -e " ${CYAN}♻️ $REFACTOR_COUNT refactorizaciones${NC}"
341
+ echo -e " ${DIM}📁 $FILES_CHANGED archivos actualizados${NC}"
342
+ echo -e " ${GREEN}🛡️ Auditoría de seguridad: LIMPIA${NC}"
343
+ echo ""
344
+ echo -e " ${BOLD}Próximo paso:${NC}"
345
+ echo -e " Reinicia Claude Code para aplicar los cambios."
346
+ echo ""
347
+ echo -e " ${DIM}Deja de adivinar. Empieza a hacer ingeniería.${NC}"
348
+ echo ""
@@ -56,6 +56,9 @@ generar_configs() {
56
56
  continue)
57
57
  _gen_continue "$install_dir" "$framework_home" "$locale"
58
58
  ;;
59
+ opencode)
60
+ _gen_opencode "$install_dir" "$framework_home" "$locale"
61
+ ;;
59
62
  *)
60
63
  echo -e " ${YELLOW}⚠${NC} Unknown tool: '$tool' — skipping" >&2
61
64
  ;;
@@ -238,7 +241,7 @@ _gen_continue() {
238
241
  cat > "$dir/.continue/config/don-cheli.json" 2>/dev/null << 'CONTEOF' || true
239
242
  {
240
243
  "name": "don-cheli-sdd",
241
- "version": "1.18.0",
244
+ "version": "1.19.1",
242
245
  "description": "Don Cheli SDD Framework",
243
246
  "rules": [
244
247
  "All production code requires tests (TDD: RED → GREEN → REFACTOR)",
@@ -251,3 +254,68 @@ _gen_continue() {
251
254
  CONTEOF
252
255
  fi
253
256
  }
257
+
258
+ # ─────────────────────────────────────────────
259
+ # OpenCode → ~/.config/opencode/config.json
260
+ # ─────────────────────────────────────────────
261
+ _gen_opencode() {
262
+ local dir="$1" home="$2" locale="$3"
263
+
264
+ echo -e " ${GREEN:-}✓${NC:-} OpenCode → ~/.config/opencode/config.json"
265
+
266
+ local opencode_config="$HOME/.config/opencode/config.json"
267
+ local skills_path="${home}/.agent/skills"
268
+ local tmp_config
269
+
270
+ # Ensure opencode config directory exists
271
+ mkdir -p "$(dirname "$opencode_config")" 2>/dev/null || true
272
+
273
+ # If config doesn't exist, create it
274
+ if [ ! -f "$opencode_config" ]; then
275
+ cat > "$opencode_config" << 'OPENCODECONFIG'
276
+ {
277
+ "$schema": "https://opencode.ai/config.json",
278
+ "autoupdate": true,
279
+ "permission": {
280
+ "external_directory": {}
281
+ },
282
+ "skills": {
283
+ "paths": []
284
+ }
285
+ }
286
+ OPENCODECONFIG
287
+ echo -e " ${GREEN:-}✓${NC:-} Created new opencode config"
288
+ fi
289
+
290
+ # Use jq if available for robust JSON editing
291
+ if command -v jq &>/dev/null; then
292
+ # Add external_directory permission
293
+ jq '(.permission.external_directory // {}) |= if has("/root/.claude/**") then . else . + {"/root/.claude/**": "allow"} end' "$opencode_config" > "${opencode_config}.tmp" && mv "${opencode_config}.tmp" "$opencode_config"
294
+
295
+ # Add skills path
296
+ jq ".skills.paths += [\"${skills_path}\"] | .skills.paths = (.skills.paths | unique)" "$opencode_config" > "${opencode_config}.tmp" && mv "${opencode_config}.tmp" "$opencode_config"
297
+
298
+ echo -e " ${GREEN:-}✓${NC:-} Config updated with jq"
299
+ else
300
+ # Fallback: append to paths array manually (less robust)
301
+ if ! grep -q "${skills_path}" "$opencode_config" 2>/dev/null; then
302
+ # Simple append to paths array (last element stays as empty array)
303
+ sed -i "s/\"paths\": \[\]/\"paths\": [\"${skills_path}\"]/" "$opencode_config" 2>/dev/null || true
304
+ fi
305
+
306
+ if ! grep -q '"/root/.claude' "$opencode_config" 2>/dev/null; then
307
+ # Simple append to external_directory (might create invalid JSON)
308
+ sed -i 's/"external_directory": {}/"external_directory": { "\/root\/.claude\/**": "allow" }/' "$opencode_config" 2>/dev/null || true
309
+ fi
310
+
311
+ echo -e " ${YELLOW:-}⚠${NC:-} jq not found, used fallback sed (less reliable)"
312
+ fi
313
+
314
+ # Verify final config
315
+ if [ -f "$opencode_config" ]; then
316
+ echo -e " ${GREEN:-}✓${NC:-} Config saved to ${opencode_config}"
317
+ echo -e " ${GREEN:-}✓${NC:-} Skills path: ${skills_path}"
318
+ else
319
+ echo -e " ${YELLOW:-}⚠${NC:-} Failed to write config"
320
+ fi
321
+ }
@@ -4,7 +4,7 @@
4
4
 
5
5
  set -euo pipefail
6
6
 
7
- VERSION="1.18.0"
7
+ VERSION="1.19.1"
8
8
  REPO_URL="https://github.com/doncheli/don-cheli-sdd"
9
9
  CLEANUP_TMPDIR=""
10
10