don-cheli-sdd 1.18.0 → 1.19.0
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 +10 -0
- package/README.es.md +64 -1
- package/README.md +64 -1
- package/README.pt.md +63 -1
- package/VERSION +1 -1
- package/bin/don-cheli.js +10 -0
- package/comandos/especdev/actualizar.md +20 -0
- package/package.json +1 -1
- package/scripts/.claude/don-cheli/VERSION +1 -1
- package/scripts/.claude/don-cheli/scripts/actualizar.sh +348 -0
- package/scripts/.claude/don-cheli/scripts/instalar.sh +1 -1
- package/scripts/actualizar.sh +348 -0
- package/scripts/generar-config.sh +1 -1
- package/scripts/instalar.sh +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ 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.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.18.0...v1.19.0) (2026-04-02)
|
|
8
|
+
|
|
9
|
+
### Nuevas Funcionalidades
|
|
10
|
+
|
|
11
|
+
* script actualizar.sh con barra de progreso y comparación de mejoras ([77b21b1](https://github.com/doncheli/don-cheli-sdd/commit/77b21b1b9e5a2fd43d9076652a1a2c4ba6bba63c))
|
|
12
|
+
|
|
13
|
+
### Documentación
|
|
14
|
+
|
|
15
|
+
* 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))
|
|
16
|
+
|
|
7
17
|
## [1.18.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.17.0...v1.18.0) (2026-04-02)
|
|
8
18
|
|
|
9
19
|
### 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.
|
|
15
|
+
<img src="https://img.shields.io/badge/versión-1.19.0-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.
|
|
15
|
+
<img src="https://img.shields.io/badge/version-1.19.0-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.
|
|
15
|
+
<img src="https://img.shields.io/badge/versão-1.19.0-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.
|
|
1
|
+
1.19.0
|
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 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.19.0
|
|
@@ -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 ""
|
|
@@ -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 ""
|
|
@@ -238,7 +238,7 @@ _gen_continue() {
|
|
|
238
238
|
cat > "$dir/.continue/config/don-cheli.json" 2>/dev/null << 'CONTEOF' || true
|
|
239
239
|
{
|
|
240
240
|
"name": "don-cheli-sdd",
|
|
241
|
-
"version": "1.
|
|
241
|
+
"version": "1.19.0",
|
|
242
242
|
"description": "Don Cheli SDD Framework",
|
|
243
243
|
"rules": [
|
|
244
244
|
"All production code requires tests (TDD: RED → GREEN → REFACTOR)",
|