@saulwade/swl-ses 1.6.5 → 1.6.7

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/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- # CLAUDE.md — @saulwade/swl-ses v1.6.5
1
+ # CLAUDE.md — @saulwade/swl-ses v1.6.7
2
2
 
3
3
  ## Reglas de máxima prioridad (aplican SIEMPRE, sin excepción)
4
4
 
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # swl-ses v1.6.5
1
+ # swl-ses v1.6.7
2
2
 
3
3
  > El paquete anterior `@saulwadeleon/swl-software-engineering-system` está deprecado. Migrar a `@saulwade/swl-ses` (npmjs.org canónico) o `@saul-wade/swl-ses` (mirror en GitHub Packages) — el CLI `swl-ses` no cambia.
4
4
 
@@ -136,6 +136,10 @@ function esVersionNueva(local, remota) {
136
136
  function debeVerificar() {
137
137
  try {
138
138
  const data = JSON.parse(fs.readFileSync(flagPath(), 'utf8'));
139
+ // FIX v1.6.7: si el flag fue escrito por el instalador (postInstall:
140
+ // true), forzar el primer check de operación normal. Sin esto, el flag
141
+ // post-install bloquearía el hook real durante 24h tras la instalación.
142
+ if (data.postInstall === true) return true;
139
143
  const intervalo = data.remota ? CHECK_INTERVAL_MS : RETRY_INTERVAL_MS;
140
144
  return (Date.now() - data.timestamp) > intervalo;
141
145
  } catch {
@@ -46,6 +46,35 @@ const EVOLUTION_FIELDS = {
46
46
  /** Nombre del archivo sidecar para componentes sin frontmatter (reglas). */
47
47
  const SIDECAR_FILENAME = '.evolved.json';
48
48
 
49
+ /**
50
+ * Patrones de nombre de archivo que NUNCA deben tratarse como componentes
51
+ * evolucionados aunque tengan extensión `.md` y frontmatter `evolved: true`.
52
+ * Cubren residuos de herramientas externas (Syncthing, merge tools, editores).
53
+ *
54
+ * Cuando un dispositivo sincroniza vía Syncthing y hay un conflicto, se crea
55
+ * `SKILL.sync-conflict-YYYYMMDD-HHMMSS-XXXX.md` que es copia del original con
56
+ * el mismo frontmatter. Sin este filtro, scanEvolved los reportaba como
57
+ * "evoluciones" independientes y el output mostraba 4 SKILL.md duplicados sin
58
+ * forma de distinguirlos (v1.6.5 release sesión 2026-05-21).
59
+ */
60
+ const EXCLUDED_FILENAME_PATTERNS = [
61
+ /\.sync-conflict-/, // Syncthing
62
+ /\.orig$/, // git merge backup
63
+ /\.bak$/, // backups varios
64
+ /\.rej$/, // patch reject
65
+ /\.merge_file_/, // merge tools (kdiff3, etc.)
66
+ /~$/, // editores tipo Emacs/Vim
67
+ ];
68
+
69
+ /**
70
+ * Decide si un nombre de archivo debe ignorarse al escanear evoluciones.
71
+ * @param {string} filename
72
+ * @returns {boolean}
73
+ */
74
+ function isExcludedFilename(filename) {
75
+ return EXCLUDED_FILENAME_PATTERNS.some((re) => re.test(filename));
76
+ }
77
+
49
78
  /** Comandos que generan evoluciones. */
50
79
  const EVOLUTION_SOURCES = [
51
80
  'evolucionar',
@@ -560,7 +589,7 @@ function scanEvolved(dir, opts = {}) {
560
589
 
561
590
  if (entry.isDirectory() && recursive) {
562
591
  results.push(...scanEvolved(fullPath, opts));
563
- } else if (entry.name.endsWith('.md')) {
592
+ } else if (entry.name.endsWith('.md') && !isExcludedFilename(entry.name)) {
564
593
  const evo = readEvolutionMeta(fullPath);
565
594
  if (evo.evolved) {
566
595
  results.push({ path: fullPath, ...evo.metadata });
@@ -575,7 +604,7 @@ function scanEvolved(dir, opts = {}) {
575
604
  try {
576
605
  const data = JSON.parse(fs.readFileSync(sidecarPath, 'utf8'));
577
606
  for (const [filename, meta] of Object.entries(data)) {
578
- if (meta.evolved) {
607
+ if (meta.evolved && !isExcludedFilename(filename)) {
579
608
  results.push({ path: path.join(dir, filename), ...meta });
580
609
  }
581
610
  }
@@ -595,8 +624,10 @@ module.exports = {
595
624
  decideUpdateStrategy,
596
625
  mergeEvolved,
597
626
  scanEvolved,
627
+ isExcludedFilename,
598
628
  isPackageRoot,
599
629
  EVOLUTION_FIELDS,
600
630
  EVOLUTION_SOURCES,
631
+ EXCLUDED_FILENAME_PATTERNS,
601
632
  SIDECAR_FILENAME,
602
633
  };
package/package.json CHANGED
@@ -1,92 +1,92 @@
1
- {
2
- "name": "@saulwade/swl-ses",
3
- "version": "1.6.5",
4
- "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot con 61 agentes, 177 habilidades, 44 comandos, 69 reglas y 42 hooks. Soporta 11 lenguajes y 7 runtimes: Claude Code, OpenClaude, OpenCode, Gemini CLI, Cursor, Codex CLI (soporte completo); GitHub Copilot (soporte parcial). 100% en espanol (Mexico). Multi-target install (--target CSV / --all-runtimes), autoconfig MCP en Cursor/Codex con --with-mcp, agentes Codex en TOML, hooks Cursor (17 eventos) y Codex (6 eventos). Gateway bidireccional con relay Telegram y auditoria profunda Nemesis con loop evaluator-optimizer opt-in (ADR-0021) y 8 tools ejecutables. v1.6.5 integra 3 patrones de awesome-codex-skills (ComposioHQ, MIT) — agent-deep-links + changelog-generator + gh-fix-ci-swl — ADR-0029, y promueve 3 evoluciones SIGAF al sistema global (D1 nemesis SendMessage + D2 verificar smoke frontend + L2 alineacion veredicto).",
5
- "bin": {
6
- "swl-ses": "bin/swl-ses.js",
7
- "swl-telegram-bot": "bin/swl-telegram-bot.js",
8
- "swl-mcp-server": "bin/swl-mcp-server.js",
9
- "swl-webhook-server": "bin/swl-webhook-server.js"
10
- },
11
- "files": [
12
- "bin",
13
- "scripts",
14
- "manifiestos",
15
- "agentes",
16
- "habilidades",
17
- "comandos",
18
- "reglas",
19
- "hooks",
20
- "gateway",
21
- "plantillas",
22
- "contextos",
23
- "instintos",
24
- "schemas",
25
- "_userland",
26
- "plugin.json",
27
- "CLAUDE.md"
28
- ],
29
- "scripts": {
30
- "postinstall": "echo '\n swl-software-engineering-system instalado.\n Ejecuta: npx swl-ses init\n'",
31
- "test": "node --test tests/lib/*.test.js tests/scripts/*.test.js tests/scripts/lib/*.test.js tests/scripts/tui/*.test.js tests/hooks/*.test.js tests/hooks/lib/*.test.js tests/habilidades/*.test.js tests/gateway/*.test.js tests/bin/*.test.js tests/transformadores/*.test.js tests/mcp-server/*.test.js",
32
- "test:validate": "node scripts/validar.js",
33
- "test:manifest": "node scripts/validar-manifest.js",
34
- "test:docs": "node scripts/verificar-docs-vs-codigo.js",
35
- "test:smoke": "node scripts/smoke-test.js",
36
- "test:aislamiento": "node scripts/validar-tests-aislamiento.js",
37
- "test:all": "npm test && node scripts/validar.js && node scripts/validar-manifest.js && node scripts/verificar-docs-vs-codigo.js && node scripts/derivar-feature-list.js --check",
38
- "test:userland": "node scripts/validar-userland-vacio.js",
39
- "test:release": "npm run test:all && npm run test:userland && npm run test:smoke",
40
- "doctor": "node scripts/doctor.js",
41
- "prepack": "node scripts/limpiar-artefactos-python.js && node scripts/validar-userland-vacio.js",
42
- "prepublishOnly": "npm run test:release",
43
- "publish:all": "node scripts/publicar.js",
44
- "publish:github": "node scripts/publicar.js --solo-github",
45
- "publish:npmjs": "node scripts/publicar.js --solo-npmjs",
46
- "publish:dry": "node scripts/publicar.js --dry-run",
47
- "generate:docs": "node scripts/generar-inventario.js",
48
- "gen-checklists": "node scripts/generar-checklists-consolidados.js",
49
- "gen-checklists:check": "node scripts/generar-checklists-consolidados.js --check",
50
- "gen:feature-list": "node scripts/derivar-feature-list.js",
51
- "gen:feature-list:check": "node scripts/derivar-feature-list.js --check",
52
- "field-report": "node scripts/field-report.js",
53
- "configure:branch-protection": "node scripts/configurar-branch-protection.js"
54
- },
55
- "engines": {
56
- "node": ">=22.0.0"
57
- },
58
- "keywords": [
59
- "claude-code",
60
- "github-copilot",
61
- "gemini-cli",
62
- "opencode",
63
- "codex-cli",
64
- "agentes",
65
- "skills",
66
- "multi-runtime",
67
- "spec-driven",
68
- "orquestacion",
69
- "ingenieria-software"
70
- ],
71
- "author": "Saul Wade Leon",
72
- "license": "MIT",
73
- "repository": {
74
- "type": "git",
75
- "url": "git+https://github.com/saul-wade/swl-ses.git"
76
- },
77
- "homepage": "https://github.com/saul-wade/swl-ses#readme",
78
- "bugs": {
79
- "url": "https://github.com/saul-wade/swl-ses/issues"
80
- },
81
- "publishConfig": {
82
- "registry": "https://registry.npmjs.org/",
83
- "access": "public"
84
- },
85
- "dependencies": {
86
- "docx": "^9.6.1"
87
- },
88
- "overrides": {
89
- "pako": "^2.1.0",
90
- "readable-stream": "^4.7.0"
91
- }
92
- }
1
+ {
2
+ "name": "@saulwade/swl-ses",
3
+ "version": "1.6.7",
4
+ "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot con 61 agentes, 177 habilidades, 44 comandos, 69 reglas y 42 hooks. Soporta 11 lenguajes y 7 runtimes: Claude Code, OpenClaude, OpenCode, Gemini CLI, Cursor, Codex CLI (soporte completo); GitHub Copilot (soporte parcial). 100% en espanol (Mexico). Multi-target install (--target CSV / --all-runtimes), autoconfig MCP en Cursor/Codex con --with-mcp, agentes Codex en TOML, hooks Cursor (17 eventos) y Codex (6 eventos). Gateway bidireccional con relay Telegram y auditoria profunda Nemesis con loop evaluator-optimizer opt-in (ADR-0021) y 8 tools ejecutables. v1.6.5 integra 3 patrones de awesome-codex-skills (ComposioHQ, MIT) — agent-deep-links + changelog-generator + gh-fix-ci-swl — ADR-0029, y promueve 3 evoluciones SIGAF al sistema global (D1 nemesis SendMessage + D2 verificar smoke frontend + L2 alineacion veredicto).",
5
+ "bin": {
6
+ "swl-ses": "bin/swl-ses.js",
7
+ "swl-telegram-bot": "bin/swl-telegram-bot.js",
8
+ "swl-mcp-server": "bin/swl-mcp-server.js",
9
+ "swl-webhook-server": "bin/swl-webhook-server.js"
10
+ },
11
+ "files": [
12
+ "bin",
13
+ "scripts",
14
+ "manifiestos",
15
+ "agentes",
16
+ "habilidades",
17
+ "comandos",
18
+ "reglas",
19
+ "hooks",
20
+ "gateway",
21
+ "plantillas",
22
+ "contextos",
23
+ "instintos",
24
+ "schemas",
25
+ "_userland",
26
+ "plugin.json",
27
+ "CLAUDE.md"
28
+ ],
29
+ "scripts": {
30
+ "postinstall": "echo '\n swl-software-engineering-system instalado.\n Ejecuta: npx swl-ses init\n'",
31
+ "test": "node --test tests/lib/*.test.js tests/scripts/*.test.js tests/scripts/lib/*.test.js tests/scripts/tui/*.test.js tests/hooks/*.test.js tests/hooks/lib/*.test.js tests/habilidades/*.test.js tests/gateway/*.test.js tests/bin/*.test.js tests/transformadores/*.test.js tests/mcp-server/*.test.js",
32
+ "test:validate": "node scripts/validar.js",
33
+ "test:manifest": "node scripts/validar-manifest.js",
34
+ "test:docs": "node scripts/verificar-docs-vs-codigo.js",
35
+ "test:smoke": "node scripts/smoke-test.js",
36
+ "test:aislamiento": "node scripts/validar-tests-aislamiento.js",
37
+ "test:all": "npm test && node scripts/validar.js && node scripts/validar-manifest.js && node scripts/verificar-docs-vs-codigo.js && node scripts/derivar-feature-list.js --check",
38
+ "test:userland": "node scripts/validar-userland-vacio.js",
39
+ "test:release": "npm run test:all && npm run test:userland && npm run test:smoke",
40
+ "doctor": "node scripts/doctor.js",
41
+ "prepack": "node scripts/limpiar-artefactos-python.js && node scripts/validar-userland-vacio.js",
42
+ "prepublishOnly": "npm run test:release",
43
+ "publish:all": "node scripts/publicar.js",
44
+ "publish:github": "node scripts/publicar.js --solo-github",
45
+ "publish:npmjs": "node scripts/publicar.js --solo-npmjs",
46
+ "publish:dry": "node scripts/publicar.js --dry-run",
47
+ "generate:docs": "node scripts/generar-inventario.js",
48
+ "gen-checklists": "node scripts/generar-checklists-consolidados.js",
49
+ "gen-checklists:check": "node scripts/generar-checklists-consolidados.js --check",
50
+ "gen:feature-list": "node scripts/derivar-feature-list.js",
51
+ "gen:feature-list:check": "node scripts/derivar-feature-list.js --check",
52
+ "field-report": "node scripts/field-report.js",
53
+ "configure:branch-protection": "node scripts/configurar-branch-protection.js"
54
+ },
55
+ "engines": {
56
+ "node": ">=22.0.0"
57
+ },
58
+ "keywords": [
59
+ "claude-code",
60
+ "github-copilot",
61
+ "gemini-cli",
62
+ "opencode",
63
+ "codex-cli",
64
+ "agentes",
65
+ "skills",
66
+ "multi-runtime",
67
+ "spec-driven",
68
+ "orquestacion",
69
+ "ingenieria-software"
70
+ ],
71
+ "author": "Saul Wade Leon",
72
+ "license": "MIT",
73
+ "repository": {
74
+ "type": "git",
75
+ "url": "git+https://github.com/saul-wade/swl-ses.git"
76
+ },
77
+ "homepage": "https://github.com/saul-wade/swl-ses#readme",
78
+ "bugs": {
79
+ "url": "https://github.com/saul-wade/swl-ses/issues"
80
+ },
81
+ "publishConfig": {
82
+ "registry": "https://registry.npmjs.org/",
83
+ "access": "public"
84
+ },
85
+ "dependencies": {
86
+ "docx": "^9.6.1"
87
+ },
88
+ "overrides": {
89
+ "pako": "^2.1.0",
90
+ "readable-stream": "^4.7.0"
91
+ }
92
+ }
package/plugin.json CHANGED
@@ -1,371 +1,371 @@
1
- {
2
- "name": "swl-ses",
3
- "version": "1.6.5",
4
- "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot. 61 agentes, 177 habilidades, 44 comandos, 69 reglas y 42 hooks. 62 librerias. 11 lenguajes. Soporta Claude Code, Copilot, OpenCode, Codex y Gemini CLI. Loop evaluator-optimizer en /swl:nemesis (ADR-0021). 3 patrones de awesome-codex-skills (ComposioHQ, MIT) adoptados (ADR-0029) — agent-deep-links + changelog-generator + gh-fix-ci-swl. Promueve 3 evoluciones SIGAF (D1 nemesis SendMessage, D2 verificar smoke frontend, L2 alineacion veredicto).",
5
- "author": "Saul Wade Leon",
6
- "license": "MIT",
7
- "repository": "https://github.com/saul-wade/swl-ses",
8
- "skills": [
9
- "habilidades/accesibilidad-a11y",
10
- "habilidades/agent-browser",
11
- "habilidades/agent-deep-links",
12
- "habilidades/agentes-como-servicio",
13
- "habilidades/ai-runtime-security",
14
- "habilidades/angular-avanzado",
15
- "habilidades/angular-moderno",
16
- "habilidades/api-rest-diseno",
17
- "habilidades/aprender-de-git-diff",
18
- "habilidades/aprendizaje-continuo",
19
- "habilidades/async-python",
20
- "habilidades/auth-patrones",
21
- "habilidades/auto-evolucion-protocolo",
22
- "habilidades/autoresearch",
23
- "habilidades/azure-cloud",
24
- "habilidades/backend-async-postgres-testing",
25
- "habilidades/backend-error-design",
26
- "habilidades/backend-mcp-servidor",
27
- "habilidades/backend-production-resilience",
28
- "habilidades/benchmark-memoria",
29
- "habilidades/brainstorming",
30
- "habilidades/browser-interaction-patterns",
31
- "habilidades/browser-research-domains",
32
- "habilidades/build-errors-cpp",
33
- "habilidades/build-errors-csharp",
34
- "habilidades/build-errors-go",
35
- "habilidades/build-errors-java",
36
- "habilidades/build-errors-kotlin",
37
- "habilidades/build-errors-nextjs",
38
- "habilidades/build-errors-php",
39
- "habilidades/build-errors-python",
40
- "habilidades/build-errors-rust",
41
- "habilidades/build-errors-swift",
42
- "habilidades/build-errors-typescript",
43
- "habilidades/changelog-generator",
44
- "habilidades/checklist-calidad",
45
- "habilidades/checklist-seguridad",
46
- "habilidades/checkpoints-verificacion",
47
- "habilidades/ci-cd-pipelines",
48
- "habilidades/cloud-aws",
49
- "habilidades/compactacion-contexto",
50
- "habilidades/contenedores-docker",
51
- "habilidades/context-builder",
52
- "habilidades/control-profundidad",
53
- "habilidades/csharp-experto",
54
- "habilidades/csharp-patrones",
55
- "habilidades/csharp-testing",
56
- "habilidades/css-moderno",
57
- "habilidades/datos-etl",
58
- "habilidades/dbml-experto",
59
- "habilidades/dependencias-auditoria",
60
- "habilidades/deprecacion-migracion",
61
- "habilidades/design-tokens",
62
- "habilidades/devsecops-pipeline-security",
63
- "habilidades/diagrama-arquitectura",
64
- "habilidades/discutir-fase",
65
- "habilidades/diseno-herramientas-agente",
66
- "habilidades/diseno-responsivo",
67
- "habilidades/django-experto",
68
- "habilidades/doc-sync",
69
- "habilidades/doubt-driven-review",
70
- "habilidades/drift-detection",
71
- "habilidades/ejecutar-fase",
72
- "habilidades/ejecutar-task-iterativo",
73
- "habilidades/estilo-sin-ai-isms",
74
- "habilidades/estructura-proyecto-claude",
75
- "habilidades/eval-framework",
76
- "habilidades/evaluacion-agentes",
77
- "habilidades/event-driven",
78
- "habilidades/extraccion-documentos",
79
- "habilidades/extractor-de-aprendizajes",
80
- "habilidades/fastapi-experto",
81
- "habilidades/feynman-auditor-swl",
82
- "habilidades/filament-admin",
83
- "habilidades/frontend-avanzado",
84
- "habilidades/gcp-cloud",
85
- "habilidades/generacion-mermaid",
86
- "habilidades/git-worktrees-paralelo",
87
- "habilidades/go-experto",
88
- "habilidades/go-patrones",
89
- "habilidades/go-testing",
90
- "habilidades/graphql-experto",
91
- "habilidades/guardrail-semantico",
92
- "habilidades/harness-claude-code",
93
- "habilidades/iam-secretos",
94
- "habilidades/infra-github-actions",
95
- "habilidades/instalar-sistema",
96
- "habilidades/java-experto",
97
- "habilidades/java-patrones",
98
- "habilidades/java-testing",
99
- "habilidades/kotlin-compose",
100
- "habilidades/kotlin-experto",
101
- "habilidades/kotlin-testing",
102
- "habilidades/kubernetes-orquestacion",
103
- "habilidades/langchain-langraph",
104
- "habilidades/legacy-code-rescue",
105
- "habilidades/likec4-experto",
106
- "habilidades/manejo-errores",
107
- "habilidades/mapear-codebase",
108
- "habilidades/memoria-busqueda",
109
- "habilidades/meta-skills-estandar",
110
- "habilidades/microservicios",
111
- "habilidades/mobile-flutter",
112
- "habilidades/mobile-react-native",
113
- "habilidades/mongodb-experto",
114
- "habilidades/monitoring-alertas",
115
- "habilidades/nemesis-evaluacion-json",
116
- "habilidades/nemesis-redistribuir",
117
- "habilidades/nestjs-experto",
118
- "habilidades/nextjs-experto",
119
- "habilidades/nextjs-patrones",
120
- "habilidades/nextjs-testing",
121
- "habilidades/node-experto",
122
- "habilidades/notificaciones-multicanal",
123
- "habilidades/nuevo-proyecto",
124
- "habilidades/orquestacion-async",
125
- "habilidades/paid-media-tracking",
126
- "habilidades/patrones-python",
127
- "habilidades/perfil-usuario",
128
- "habilidades/performance-baseline",
129
- "habilidades/php-experto",
130
- "habilidades/php-patrones",
131
- "habilidades/php-testing",
132
- "habilidades/planear-fase",
133
- "habilidades/postgresql-experto",
134
- "habilidades/prevencion-racionalizacion",
135
- "habilidades/prevencion-sobreingenieria",
136
- "habilidades/privacy-memoria",
137
- "habilidades/proceso-autoverificacion-evidencias",
138
- "habilidades/proceso-confianza-pre-implementacion",
139
- "habilidades/proceso-ddia-fundamentos",
140
- "habilidades/proceso-ddia-streaming",
141
- "habilidades/proceso-discovery-machote",
142
- "habilidades/proceso-intent-engineering",
143
- "habilidades/proceso-modular-split",
144
- "habilidades/prompt-engineering",
145
- "habilidades/protocolo-revision-swl",
146
- "habilidades/rag-arquitectura",
147
- "habilidades/rails-experto",
148
- "habilidades/react-experto",
149
- "habilidades/react-optimizacion",
150
- "habilidades/redis-experto",
151
- "habilidades/reducir-entropia",
152
- "habilidades/release-semver",
153
- "habilidades/rust-experto",
154
- "habilidades/rust-patrones",
155
- "habilidades/rust-testing",
156
- "habilidades/seguridad-skills-ia",
157
- "habilidades/sql-optimizacion",
158
- "habilidades/sre-patrones",
159
- "habilidades/state-inconsistency-auditor-swl",
160
- "habilidades/stripe-pagos",
161
- "habilidades/structured-outputs",
162
- "habilidades/swift-experto",
163
- "habilidades/swift-patrones",
164
- "habilidades/swift-testing",
165
- "habilidades/swl-claudemd",
166
- "habilidades/swl-dashboard",
167
- "habilidades/swl-markitdown",
168
- "habilidades/swl-revisar-impacto",
169
- "habilidades/tailwind-experto",
170
- "habilidades/tdd-workflow",
171
- "habilidades/terraform-experto",
172
- "habilidades/testing-python",
173
- "habilidades/threat-model-lite",
174
- "habilidades/tracing-processor",
175
- "habilidades/tracking-measurement",
176
- "habilidades/typescript-avanzado",
177
- "habilidades/typescript-diagnosticos",
178
- "habilidades/ux-diseno",
179
- "habilidades/validacion-ci-sistema",
180
- "habilidades/verificacion-evidencia",
181
- "habilidades/verificar-trabajo",
182
- "habilidades/web-fetcher-routing",
183
- "habilidades/wiki-conocimiento",
184
- "habilidades/wireframes-flujos",
185
- "habilidades/workflow-claude-code"
186
- ],
187
- "agents": [
188
- "agentes/accesibilidad-wcag-swl.md",
189
- "agentes/arquitecto-swl.md",
190
- "agentes/auto-evolucion-swl.md",
191
- "agentes/backend-api-swl.md",
192
- "agentes/backend-csharp-swl.md",
193
- "agentes/backend-go-swl.md",
194
- "agentes/backend-java-swl.md",
195
- "agentes/backend-node-swl.md",
196
- "agentes/backend-python-swl.md",
197
- "agentes/backend-rust-swl.md",
198
- "agentes/backend-workers-swl.md",
199
- "agentes/cloud-infra-swl.md",
200
- "agentes/consolidador-swl.md",
201
- "agentes/datos-swl.md",
202
- "agentes/depurador-swl.md",
203
- "agentes/devops-ci-swl.md",
204
- "agentes/disenador-ui-swl.md",
205
- "agentes/documentador-swl.md",
206
- "agentes/frontend-angular-swl.md",
207
- "agentes/frontend-css-swl.md",
208
- "agentes/frontend-react-swl.md",
209
- "agentes/frontend-swl.md",
210
- "agentes/frontend-tailwind-swl.md",
211
- "agentes/gh-fix-ci-swl.md",
212
- "agentes/implementador-swl.md",
213
- "agentes/investigador-swl.md",
214
- "agentes/investigador-ux-swl.md",
215
- "agentes/llm-apps-swl.md",
216
- "agentes/migrador-swl.md",
217
- "agentes/mobile-android-swl.md",
218
- "agentes/mobile-cross-swl.md",
219
- "agentes/mobile-ios-swl.md",
220
- "agentes/mobile-testing-swl.md",
221
- "agentes/nemesis-auditor-swl.md",
222
- "agentes/notificador-swl.md",
223
- "agentes/observabilidad-swl.md",
224
- "agentes/orquestador-swl.md",
225
- "agentes/pagos-swl.md",
226
- "agentes/perfilador-usuario-swl.md",
227
- "agentes/planificador-swl.md",
228
- "agentes/producto-prd-swl.md",
229
- "agentes/red-team-swl.md",
230
- "agentes/release-manager-swl.md",
231
- "agentes/rendimiento-swl.md",
232
- "agentes/resolutor-build-swl.md",
233
- "agentes/revisor-angular-swl.md",
234
- "agentes/revisor-codigo-swl.md",
235
- "agentes/revisor-csharp-swl.md",
236
- "agentes/revisor-go-swl.md",
237
- "agentes/revisor-java-swl.md",
238
- "agentes/revisor-kotlin-swl.md",
239
- "agentes/revisor-nextjs-swl.md",
240
- "agentes/revisor-php-swl.md",
241
- "agentes/revisor-react-swl.md",
242
- "agentes/revisor-rust-swl.md",
243
- "agentes/revisor-seguridad-swl.md",
244
- "agentes/revisor-swift-swl.md",
245
- "agentes/revisor-typescript-swl.md",
246
- "agentes/sre-swl.md",
247
- "agentes/tdd-qa-swl.md",
248
- "agentes/ux-disenador-swl.md"
249
- ],
250
- "hooks": {
251
- "PreToolUse": [
252
- {
253
- "matcher": "Write|Edit",
254
- "type": "command",
255
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/escaneo-secretos.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
256
- },
257
- {
258
- "matcher": "Write|Edit",
259
- "type": "command",
260
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/proteccion-rutas.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
261
- },
262
- {
263
- "matcher": "Bash",
264
- "type": "command",
265
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/calidad-pre-commit.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
266
- },
267
- {
268
- "type": "command",
269
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/risk-scoring.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
270
- },
271
- {
272
- "matcher": "Bash",
273
- "type": "command",
274
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/calidad-typescript.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
275
- },
276
- {
277
- "matcher": "Glob|Grep|Read",
278
- "type": "command",
279
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/grafo-contexto.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
280
- },
281
- {
282
- "matcher": "Bash",
283
- "type": "command",
284
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/auto-background.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
285
- }
286
- ],
287
- "PostToolUse": [
288
- {
289
- "type": "command",
290
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/linea-estado.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
291
- },
292
- {
293
- "type": "command",
294
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/monitor-contexto.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
295
- },
296
- {
297
- "matcher": "Bash|Write|Edit",
298
- "type": "command",
299
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/extraccion-aprendizajes.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
300
- },
301
- {
302
- "matcher": "Bash|Write|Edit",
303
- "type": "command",
304
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/degradacion-instintos.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
305
- },
306
- {
307
- "type": "command",
308
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/tracking-costos.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
309
- },
310
- {
311
- "type": "command",
312
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/inyeccion-contexto.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
313
- },
314
- {
315
- "matcher": "Write|Edit",
316
- "type": "command",
317
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/graph-update.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
318
- },
319
- {
320
- "type": "command",
321
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/auto-consolidacion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
322
- },
323
- {
324
- "matcher": "Agent",
325
- "type": "command",
326
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/telemetria-agentes.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
327
- },
328
- {
329
- "type": "command",
330
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/audit-trail.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
331
- },
332
- {
333
- "matcher": "Agent",
334
- "type": "command",
335
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/agente-lifecycle.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
336
- }
337
- ],
338
- "UserPromptSubmit": [
339
- {
340
- "type": "command",
341
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/clasificador-mensajes.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
342
- }
343
- ],
344
- "Stop": [
345
- {
346
- "type": "command",
347
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/resumen-sesion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
348
- },
349
- {
350
- "type": "command",
351
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/actualizar-perfil-usuario.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
352
- },
353
- {
354
- "type": "command",
355
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/metricas-evolucion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
356
- }
357
- ],
358
- "SubagentStop": [
359
- {
360
- "type": "command",
361
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/auto-evolucion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
362
- }
363
- ],
364
- "PreCompact": [
365
- {
366
- "type": "command",
367
- "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/preservar-estado-pre-compact.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
368
- }
369
- ]
370
- }
371
- }
1
+ {
2
+ "name": "swl-ses",
3
+ "version": "1.6.7",
4
+ "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot. 61 agentes, 177 habilidades, 44 comandos, 69 reglas y 42 hooks. 62 librerias. 11 lenguajes. Soporta Claude Code, Copilot, OpenCode, Codex y Gemini CLI. Loop evaluator-optimizer en /swl:nemesis (ADR-0021). 3 patrones de awesome-codex-skills (ComposioHQ, MIT) adoptados (ADR-0029) — agent-deep-links + changelog-generator + gh-fix-ci-swl. Promueve 3 evoluciones SIGAF (D1 nemesis SendMessage, D2 verificar smoke frontend, L2 alineacion veredicto).",
5
+ "author": "Saul Wade Leon",
6
+ "license": "MIT",
7
+ "repository": "https://github.com/saul-wade/swl-ses",
8
+ "skills": [
9
+ "habilidades/accesibilidad-a11y",
10
+ "habilidades/agent-browser",
11
+ "habilidades/agent-deep-links",
12
+ "habilidades/agentes-como-servicio",
13
+ "habilidades/ai-runtime-security",
14
+ "habilidades/angular-avanzado",
15
+ "habilidades/angular-moderno",
16
+ "habilidades/api-rest-diseno",
17
+ "habilidades/aprender-de-git-diff",
18
+ "habilidades/aprendizaje-continuo",
19
+ "habilidades/async-python",
20
+ "habilidades/auth-patrones",
21
+ "habilidades/auto-evolucion-protocolo",
22
+ "habilidades/autoresearch",
23
+ "habilidades/azure-cloud",
24
+ "habilidades/backend-async-postgres-testing",
25
+ "habilidades/backend-error-design",
26
+ "habilidades/backend-mcp-servidor",
27
+ "habilidades/backend-production-resilience",
28
+ "habilidades/benchmark-memoria",
29
+ "habilidades/brainstorming",
30
+ "habilidades/browser-interaction-patterns",
31
+ "habilidades/browser-research-domains",
32
+ "habilidades/build-errors-cpp",
33
+ "habilidades/build-errors-csharp",
34
+ "habilidades/build-errors-go",
35
+ "habilidades/build-errors-java",
36
+ "habilidades/build-errors-kotlin",
37
+ "habilidades/build-errors-nextjs",
38
+ "habilidades/build-errors-php",
39
+ "habilidades/build-errors-python",
40
+ "habilidades/build-errors-rust",
41
+ "habilidades/build-errors-swift",
42
+ "habilidades/build-errors-typescript",
43
+ "habilidades/changelog-generator",
44
+ "habilidades/checklist-calidad",
45
+ "habilidades/checklist-seguridad",
46
+ "habilidades/checkpoints-verificacion",
47
+ "habilidades/ci-cd-pipelines",
48
+ "habilidades/cloud-aws",
49
+ "habilidades/compactacion-contexto",
50
+ "habilidades/contenedores-docker",
51
+ "habilidades/context-builder",
52
+ "habilidades/control-profundidad",
53
+ "habilidades/csharp-experto",
54
+ "habilidades/csharp-patrones",
55
+ "habilidades/csharp-testing",
56
+ "habilidades/css-moderno",
57
+ "habilidades/datos-etl",
58
+ "habilidades/dbml-experto",
59
+ "habilidades/dependencias-auditoria",
60
+ "habilidades/deprecacion-migracion",
61
+ "habilidades/design-tokens",
62
+ "habilidades/devsecops-pipeline-security",
63
+ "habilidades/diagrama-arquitectura",
64
+ "habilidades/discutir-fase",
65
+ "habilidades/diseno-herramientas-agente",
66
+ "habilidades/diseno-responsivo",
67
+ "habilidades/django-experto",
68
+ "habilidades/doc-sync",
69
+ "habilidades/doubt-driven-review",
70
+ "habilidades/drift-detection",
71
+ "habilidades/ejecutar-fase",
72
+ "habilidades/ejecutar-task-iterativo",
73
+ "habilidades/estilo-sin-ai-isms",
74
+ "habilidades/estructura-proyecto-claude",
75
+ "habilidades/eval-framework",
76
+ "habilidades/evaluacion-agentes",
77
+ "habilidades/event-driven",
78
+ "habilidades/extraccion-documentos",
79
+ "habilidades/extractor-de-aprendizajes",
80
+ "habilidades/fastapi-experto",
81
+ "habilidades/feynman-auditor-swl",
82
+ "habilidades/filament-admin",
83
+ "habilidades/frontend-avanzado",
84
+ "habilidades/gcp-cloud",
85
+ "habilidades/generacion-mermaid",
86
+ "habilidades/git-worktrees-paralelo",
87
+ "habilidades/go-experto",
88
+ "habilidades/go-patrones",
89
+ "habilidades/go-testing",
90
+ "habilidades/graphql-experto",
91
+ "habilidades/guardrail-semantico",
92
+ "habilidades/harness-claude-code",
93
+ "habilidades/iam-secretos",
94
+ "habilidades/infra-github-actions",
95
+ "habilidades/instalar-sistema",
96
+ "habilidades/java-experto",
97
+ "habilidades/java-patrones",
98
+ "habilidades/java-testing",
99
+ "habilidades/kotlin-compose",
100
+ "habilidades/kotlin-experto",
101
+ "habilidades/kotlin-testing",
102
+ "habilidades/kubernetes-orquestacion",
103
+ "habilidades/langchain-langraph",
104
+ "habilidades/legacy-code-rescue",
105
+ "habilidades/likec4-experto",
106
+ "habilidades/manejo-errores",
107
+ "habilidades/mapear-codebase",
108
+ "habilidades/memoria-busqueda",
109
+ "habilidades/meta-skills-estandar",
110
+ "habilidades/microservicios",
111
+ "habilidades/mobile-flutter",
112
+ "habilidades/mobile-react-native",
113
+ "habilidades/mongodb-experto",
114
+ "habilidades/monitoring-alertas",
115
+ "habilidades/nemesis-evaluacion-json",
116
+ "habilidades/nemesis-redistribuir",
117
+ "habilidades/nestjs-experto",
118
+ "habilidades/nextjs-experto",
119
+ "habilidades/nextjs-patrones",
120
+ "habilidades/nextjs-testing",
121
+ "habilidades/node-experto",
122
+ "habilidades/notificaciones-multicanal",
123
+ "habilidades/nuevo-proyecto",
124
+ "habilidades/orquestacion-async",
125
+ "habilidades/paid-media-tracking",
126
+ "habilidades/patrones-python",
127
+ "habilidades/perfil-usuario",
128
+ "habilidades/performance-baseline",
129
+ "habilidades/php-experto",
130
+ "habilidades/php-patrones",
131
+ "habilidades/php-testing",
132
+ "habilidades/planear-fase",
133
+ "habilidades/postgresql-experto",
134
+ "habilidades/prevencion-racionalizacion",
135
+ "habilidades/prevencion-sobreingenieria",
136
+ "habilidades/privacy-memoria",
137
+ "habilidades/proceso-autoverificacion-evidencias",
138
+ "habilidades/proceso-confianza-pre-implementacion",
139
+ "habilidades/proceso-ddia-fundamentos",
140
+ "habilidades/proceso-ddia-streaming",
141
+ "habilidades/proceso-discovery-machote",
142
+ "habilidades/proceso-intent-engineering",
143
+ "habilidades/proceso-modular-split",
144
+ "habilidades/prompt-engineering",
145
+ "habilidades/protocolo-revision-swl",
146
+ "habilidades/rag-arquitectura",
147
+ "habilidades/rails-experto",
148
+ "habilidades/react-experto",
149
+ "habilidades/react-optimizacion",
150
+ "habilidades/redis-experto",
151
+ "habilidades/reducir-entropia",
152
+ "habilidades/release-semver",
153
+ "habilidades/rust-experto",
154
+ "habilidades/rust-patrones",
155
+ "habilidades/rust-testing",
156
+ "habilidades/seguridad-skills-ia",
157
+ "habilidades/sql-optimizacion",
158
+ "habilidades/sre-patrones",
159
+ "habilidades/state-inconsistency-auditor-swl",
160
+ "habilidades/stripe-pagos",
161
+ "habilidades/structured-outputs",
162
+ "habilidades/swift-experto",
163
+ "habilidades/swift-patrones",
164
+ "habilidades/swift-testing",
165
+ "habilidades/swl-claudemd",
166
+ "habilidades/swl-dashboard",
167
+ "habilidades/swl-markitdown",
168
+ "habilidades/swl-revisar-impacto",
169
+ "habilidades/tailwind-experto",
170
+ "habilidades/tdd-workflow",
171
+ "habilidades/terraform-experto",
172
+ "habilidades/testing-python",
173
+ "habilidades/threat-model-lite",
174
+ "habilidades/tracing-processor",
175
+ "habilidades/tracking-measurement",
176
+ "habilidades/typescript-avanzado",
177
+ "habilidades/typescript-diagnosticos",
178
+ "habilidades/ux-diseno",
179
+ "habilidades/validacion-ci-sistema",
180
+ "habilidades/verificacion-evidencia",
181
+ "habilidades/verificar-trabajo",
182
+ "habilidades/web-fetcher-routing",
183
+ "habilidades/wiki-conocimiento",
184
+ "habilidades/wireframes-flujos",
185
+ "habilidades/workflow-claude-code"
186
+ ],
187
+ "agents": [
188
+ "agentes/accesibilidad-wcag-swl.md",
189
+ "agentes/arquitecto-swl.md",
190
+ "agentes/auto-evolucion-swl.md",
191
+ "agentes/backend-api-swl.md",
192
+ "agentes/backend-csharp-swl.md",
193
+ "agentes/backend-go-swl.md",
194
+ "agentes/backend-java-swl.md",
195
+ "agentes/backend-node-swl.md",
196
+ "agentes/backend-python-swl.md",
197
+ "agentes/backend-rust-swl.md",
198
+ "agentes/backend-workers-swl.md",
199
+ "agentes/cloud-infra-swl.md",
200
+ "agentes/consolidador-swl.md",
201
+ "agentes/datos-swl.md",
202
+ "agentes/depurador-swl.md",
203
+ "agentes/devops-ci-swl.md",
204
+ "agentes/disenador-ui-swl.md",
205
+ "agentes/documentador-swl.md",
206
+ "agentes/frontend-angular-swl.md",
207
+ "agentes/frontend-css-swl.md",
208
+ "agentes/frontend-react-swl.md",
209
+ "agentes/frontend-swl.md",
210
+ "agentes/frontend-tailwind-swl.md",
211
+ "agentes/gh-fix-ci-swl.md",
212
+ "agentes/implementador-swl.md",
213
+ "agentes/investigador-swl.md",
214
+ "agentes/investigador-ux-swl.md",
215
+ "agentes/llm-apps-swl.md",
216
+ "agentes/migrador-swl.md",
217
+ "agentes/mobile-android-swl.md",
218
+ "agentes/mobile-cross-swl.md",
219
+ "agentes/mobile-ios-swl.md",
220
+ "agentes/mobile-testing-swl.md",
221
+ "agentes/nemesis-auditor-swl.md",
222
+ "agentes/notificador-swl.md",
223
+ "agentes/observabilidad-swl.md",
224
+ "agentes/orquestador-swl.md",
225
+ "agentes/pagos-swl.md",
226
+ "agentes/perfilador-usuario-swl.md",
227
+ "agentes/planificador-swl.md",
228
+ "agentes/producto-prd-swl.md",
229
+ "agentes/red-team-swl.md",
230
+ "agentes/release-manager-swl.md",
231
+ "agentes/rendimiento-swl.md",
232
+ "agentes/resolutor-build-swl.md",
233
+ "agentes/revisor-angular-swl.md",
234
+ "agentes/revisor-codigo-swl.md",
235
+ "agentes/revisor-csharp-swl.md",
236
+ "agentes/revisor-go-swl.md",
237
+ "agentes/revisor-java-swl.md",
238
+ "agentes/revisor-kotlin-swl.md",
239
+ "agentes/revisor-nextjs-swl.md",
240
+ "agentes/revisor-php-swl.md",
241
+ "agentes/revisor-react-swl.md",
242
+ "agentes/revisor-rust-swl.md",
243
+ "agentes/revisor-seguridad-swl.md",
244
+ "agentes/revisor-swift-swl.md",
245
+ "agentes/revisor-typescript-swl.md",
246
+ "agentes/sre-swl.md",
247
+ "agentes/tdd-qa-swl.md",
248
+ "agentes/ux-disenador-swl.md"
249
+ ],
250
+ "hooks": {
251
+ "PreToolUse": [
252
+ {
253
+ "matcher": "Write|Edit",
254
+ "type": "command",
255
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/escaneo-secretos.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
256
+ },
257
+ {
258
+ "matcher": "Write|Edit",
259
+ "type": "command",
260
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/proteccion-rutas.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
261
+ },
262
+ {
263
+ "matcher": "Bash",
264
+ "type": "command",
265
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/calidad-pre-commit.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
266
+ },
267
+ {
268
+ "type": "command",
269
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/risk-scoring.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
270
+ },
271
+ {
272
+ "matcher": "Bash",
273
+ "type": "command",
274
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/calidad-typescript.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
275
+ },
276
+ {
277
+ "matcher": "Glob|Grep|Read",
278
+ "type": "command",
279
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/grafo-contexto.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
280
+ },
281
+ {
282
+ "matcher": "Bash",
283
+ "type": "command",
284
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/auto-background.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
285
+ }
286
+ ],
287
+ "PostToolUse": [
288
+ {
289
+ "type": "command",
290
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/linea-estado.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
291
+ },
292
+ {
293
+ "type": "command",
294
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/monitor-contexto.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
295
+ },
296
+ {
297
+ "matcher": "Bash|Write|Edit",
298
+ "type": "command",
299
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/extraccion-aprendizajes.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
300
+ },
301
+ {
302
+ "matcher": "Bash|Write|Edit",
303
+ "type": "command",
304
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/degradacion-instintos.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
305
+ },
306
+ {
307
+ "type": "command",
308
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/tracking-costos.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
309
+ },
310
+ {
311
+ "type": "command",
312
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/inyeccion-contexto.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
313
+ },
314
+ {
315
+ "matcher": "Write|Edit",
316
+ "type": "command",
317
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/graph-update.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
318
+ },
319
+ {
320
+ "type": "command",
321
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/auto-consolidacion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
322
+ },
323
+ {
324
+ "matcher": "Agent",
325
+ "type": "command",
326
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/telemetria-agentes.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
327
+ },
328
+ {
329
+ "type": "command",
330
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/audit-trail.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
331
+ },
332
+ {
333
+ "matcher": "Agent",
334
+ "type": "command",
335
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/agente-lifecycle.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
336
+ }
337
+ ],
338
+ "UserPromptSubmit": [
339
+ {
340
+ "type": "command",
341
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/clasificador-mensajes.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
342
+ }
343
+ ],
344
+ "Stop": [
345
+ {
346
+ "type": "command",
347
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/resumen-sesion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
348
+ },
349
+ {
350
+ "type": "command",
351
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/actualizar-perfil-usuario.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
352
+ },
353
+ {
354
+ "type": "command",
355
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/metricas-evolucion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
356
+ }
357
+ ],
358
+ "SubagentStop": [
359
+ {
360
+ "type": "command",
361
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/auto-evolucion.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
362
+ }
363
+ ],
364
+ "PreCompact": [
365
+ {
366
+ "type": "command",
367
+ "command": "PATH=\"/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH\" node -e \"try{require('./hooks/preservar-estado-pre-compact.js')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}\""
368
+ }
369
+ ]
370
+ }
371
+ }
package/scripts/doctor.js CHANGED
@@ -61,13 +61,25 @@ async function doctor(opciones = {}) {
61
61
  if (fs.existsSync(flagPath)) {
62
62
  const flag = JSON.parse(fs.readFileSync(flagPath, 'utf8'));
63
63
  const horas = ((Date.now() - flag.timestamp) / 3600000).toFixed(1);
64
- const detalle = `local=${flag.local}, remota=${flag.remota || '?'}, hace ${horas}h`;
65
- if (flag.hayNueva) {
66
- console.log(formatearAdvertencia('Hook check-update', `${detalle} hay versión nueva pendiente`));
67
- advertencias++;
68
- } else {
69
- console.log(formatearPaso('Hook check-update', detalle));
64
+ // FIX v1.6.7: distinguir flag escrito por el instalador (postInstall:
65
+ // true) de flag escrito por el hook check-update.js durante operación
66
+ // normal. El postInstall flag es "fresh" y NO indica que el hook haya
67
+ // corrido — solo que la instalación dejó el throttle limpio.
68
+ if (flag.postInstall) {
69
+ console.log(formatearPaso(
70
+ 'Hook check-update',
71
+ `flag post-install fresco (local=${flag.local}, hace ${horas}h) — se regenerará en el primer PostToolUse del hook`
72
+ ));
70
73
  ok++;
74
+ } else {
75
+ const detalle = `local=${flag.local}, remota=${flag.remota || '?'}, hace ${horas}h`;
76
+ if (flag.hayNueva) {
77
+ console.log(formatearAdvertencia('Hook check-update', `${detalle} — hay versión nueva pendiente`));
78
+ advertencias++;
79
+ } else {
80
+ console.log(formatearPaso('Hook check-update', detalle));
81
+ ok++;
82
+ }
71
83
  }
72
84
  } else {
73
85
  console.log(formatearAdvertencia('Hook check-update', 'Sin flag de throttle — el hook nunca se ejecutó en este equipo'));
@@ -42,6 +42,26 @@ const { actualizarGitignore, entradasParaRuntime, limpiarTracked, leerManifest,
42
42
  const RAIZ_PKG = path.resolve(__dirname, '..');
43
43
  const VERSION = require('../package.json').version;
44
44
 
45
+ /**
46
+ * Devuelve un nombre legible para mostrar al usuario en la lista de
47
+ * componentes evolucionados. Cuando el archivo se llama "SKILL.md" (caso
48
+ * canónico de habilidades), usa el nombre del directorio padre para que
49
+ * el output muestre `tdd-workflow/SKILL.md` en lugar de `SKILL.md` repetido
50
+ * N veces sin identificación posible.
51
+ *
52
+ * FIX v1.6.6 — antes el output mostraba 49 `SKILL.md` indistinguibles.
53
+ *
54
+ * @param {string} rutaAbs - Ruta absoluta del archivo evolucionado.
55
+ * @returns {string}
56
+ */
57
+ function nombreLegibleEvolucion(rutaAbs) {
58
+ const base = path.basename(rutaAbs);
59
+ if (base === 'SKILL.md') {
60
+ return path.basename(path.dirname(rutaAbs)) + '/SKILL.md';
61
+ }
62
+ return base;
63
+ }
64
+
45
65
  /**
46
66
  * Contrato adicional: `opciones.onProgress(evento)`
47
67
  *
@@ -201,6 +221,18 @@ async function install(opciones) {
201
221
  stackDetectado = detectarStack(process.cwd());
202
222
  }
203
223
 
224
+ // FIX v1.6.6: si el usuario pasa --all-langs pero el perfil actual no incluye
225
+ // reglas/lenguajes/, el flag se ignora silenciosamente. Antes la única pista
226
+ // era el conteo final de archivos. Ahora emitimos warning explícito.
227
+ if (allLangs && !tieneReglasLenguaje) {
228
+ console.log(
229
+ '\n[stack] Aviso: --all-langs ignorado — el perfil actual (' +
230
+ (resolucion.perfil || 'core') +
231
+ ') no incluye reglas de lenguajes. ' +
232
+ 'Usa --perfil completo o --perfil polyglot para activar las reglas por lenguaje.'
233
+ );
234
+ }
235
+
204
236
  if (tieneReglasLenguaje) {
205
237
  if (allLangs) {
206
238
  console.log('\n[stack] --all-langs activado: se instalan reglas de todos los lenguajes.');
@@ -454,9 +486,28 @@ async function install(opciones) {
454
486
  if (evolved.length > 0) {
455
487
  console.log(`[evolución] ${evolved.length} componente(s) evolucionado(s) detectado(s):`);
456
488
  for (const e of evolved) {
457
- console.log(` ★ ${path.basename(e.path)} (por ${e.evolvedBy || 'auto-evolución'}, desde v${e.evolvedFrom || '?'})`);
489
+ console.log(` ★ ${nombreLegibleEvolucion(e.path)} (por ${e.evolvedBy || 'auto-evolución'}, desde v${e.evolvedFrom || '?'})`);
458
490
  }
459
491
  console.log('');
492
+
493
+ // FIX v1.6.6: avisar al usuario cuando el target copia habilidades como
494
+ // directorio completo (Cursor, Codex). Ese path no pasa por
495
+ // decideUpdateStrategy a nivel de SKILL.md, así que las evoluciones se
496
+ // sobreescriben silenciosamente. Cierre completo del gap = DT-EVOL-DIR
497
+ // documentado en .planning/DEUDA-TECNICA.md.
498
+ const targetCopiaDirectorios = ['cursor', 'codex'].includes(target);
499
+ const tieneSkillEvolucionado = evolved.some((e) => path.basename(e.path) === 'SKILL.md');
500
+ if (targetCopiaDirectorios && tieneSkillEvolucionado) {
501
+ console.log(
502
+ ` ⚠ Aviso: en target "${target}" las habilidades se copian como directorio. Las ` +
503
+ `evoluciones de SKILL.md serán sobreescritas. Backup de seguridad creado en ` +
504
+ `.planning/backups/v${versionAnterior || 'previa'}/.`
505
+ );
506
+ console.log(
507
+ ' (Ver DT-EVOL-DIR en .planning/DEUDA-TECNICA.md para el plan de cierre.)'
508
+ );
509
+ console.log('');
510
+ }
460
511
  }
461
512
  }
462
513
 
@@ -741,10 +792,14 @@ async function install(opciones) {
741
792
  console.log(' ~ Notificaciones Telegram: omitido en modo no-interactivo (usar /swl:notificaciones init para activarlo después).');
742
793
  } else {
743
794
  // TTY → flujo interactivo
795
+ // FIX v1.6.6: si el install corre con --force, pasar asumirReusar
796
+ // para que el prompt "¿Reusar credenciales?" se salte automáticamente.
797
+ // Antes el flujo multi-target generaba un prompt por cada target.
744
798
  const resInteractivo = await notif.init({
745
- esTty: true,
746
- hooksDir: rutas.hooks || null,
747
- dryRun: dryRun,
799
+ esTty: true,
800
+ hooksDir: rutas.hooks || null,
801
+ dryRun: dryRun,
802
+ asumirReusar: force === true,
748
803
  });
749
804
  if (resInteractivo.resultado === 'completado') {
750
805
  console.log(' + Notificaciones Telegram configuradas.');
@@ -831,6 +886,26 @@ async function install(opciones) {
831
886
  }
832
887
  }
833
888
 
889
+ // FIX v1.6.7 (refina v1.6.6): escribir un flag de throttle "post-install
890
+ // fresh" con la versión recién instalada en lugar de borrarlo. El v1.6.6
891
+ // borraba el flag — eso evitaba el mensaje stale "local=X, remota=Y, hace
892
+ // 2.8h" pero el doctor reportaba luego "el hook nunca se ejecutó" porque
893
+ // la ausencia del flag se interpretaba como "primera vez". Ahora dejamos
894
+ // un flag explícitamente marcado postInstall: true para que el doctor
895
+ // distinga "post-install reciente" vs "hook nunca corrió".
896
+ try {
897
+ const os = require('os');
898
+ const flagPath = process.env.SWL_UPDATE_FLAG_PATH || path.join(os.tmpdir(), 'swl-ses-update-check.json');
899
+ const flagFresh = {
900
+ local: VERSION,
901
+ remota: VERSION,
902
+ hayNueva: false,
903
+ timestamp: Date.now(),
904
+ postInstall: true,
905
+ };
906
+ fs.writeFileSync(flagPath, JSON.stringify(flagFresh, null, 2), 'utf8');
907
+ } catch { /* nunca bloquear install por esto */ }
908
+
834
909
  console.log('\nSiguiente paso:');
835
910
  console.log(' npx @saulwade/swl-ses@latest doctor');
836
911
  console.log('');
@@ -446,6 +446,11 @@ async function init(opciones = {}) {
446
446
  sobreescribir: sobreescribir = false,
447
447
  dryRun: dryRun = false,
448
448
  hooksDir: hooksDir = null,
449
+ // FIX v1.6.6: si el caller pasa `asumirReusar: true` (típicamente cuando
450
+ // el install corre con --force), omitir el prompt interactivo "¿Reusar
451
+ // las credenciales existentes?" y asumir sí. Evita el cuelgue en CI y
452
+ // el prompt redundante en multi-target install (3 targets = 3 prompts).
453
+ asumirReusar: asumirReusar = false,
449
454
  // Overrides para tests — permiten inyectar directorios temporales
450
455
  _hooksOrigenOverride: _hooksOrigenOverride = null,
451
456
  _hooksGlobalDirOverride: _hooksGlobalDirOverride = null,
@@ -483,6 +488,15 @@ async function init(opciones = {}) {
483
488
  if (!modoHeadless && esTty) {
484
489
  // Detectar .env preexistente
485
490
  if (fs.existsSync(envPath) && !sobreescribir) {
491
+ // FIX v1.6.6: si el caller pasó asumirReusar=true (e.g. install --force),
492
+ // saltar el prompt y reusar directamente. Evita cuelgue en CI y prompt
493
+ // redundante en multi-target install.
494
+ if (asumirReusar) {
495
+ console.log('');
496
+ console.log(' [notificaciones] Reusando credenciales existentes en ~/.claude/notifications/.env (--force).');
497
+ return _soloMergeSettings(_hooksGlobalDirOverride, dryRun, _settingsPathOverride);
498
+ }
499
+
486
500
  console.log('');
487
501
  console.log(' [notificaciones] Ya existe ~/.claude/notifications/.env con credenciales.');
488
502
  const rl2 = readline.createInterface({ input: process.stdin, output: process.stdout });
@@ -343,6 +343,10 @@ class TransformadorCodex extends TransformadorBase {
343
343
  SWL_MCP_BASE_DIR: process.cwd(),
344
344
  },
345
345
  });
346
+ // FIX v1.6.6: confirmar al usuario que config.toml se actualizó. Antes
347
+ // el efecto de --with-mcp era invisible — sin lanzar Codex era imposible
348
+ // saber si el registro había ocurrido.
349
+ console.log(` + MCP server swl-memory registrado en ${configToml}`);
346
350
  } catch (err) {
347
351
  // No bloquear instalación si el registro del MCP falla — solo loggear
348
352
  // El usuario verá el error y puede registrar manualmente con `codex mcp add`.
@@ -353,6 +353,11 @@ class TransformadorCursor extends TransformadorBase {
353
353
  };
354
354
 
355
355
  atomicWriteSync(rutaMcp, JSON.stringify(existente, null, 2) + '\n', 'utf8', { mode: 0o600 });
356
+
357
+ // FIX v1.6.6: confirmar al usuario que mcp.json se escribió. Antes el
358
+ // efecto de --with-mcp era invisible — sin abrir Cursor era imposible
359
+ // saber si el registro había ocurrido.
360
+ console.log(` + MCP server swl-memory registrado en ${rutaMcp}`);
356
361
  }
357
362
  }
358
363