@saulwade/swl-ses 1.4.0 → 1.4.2

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.
Files changed (116) hide show
  1. package/CLAUDE.md +4 -3
  2. package/README.md +15 -14
  3. package/agentes/nemesis-auditor-swl.md +161 -0
  4. package/bin/swl-mcp-server.js +187 -187
  5. package/comandos/swl/.evolved.json +22 -22
  6. package/comandos/swl/contribuir.md +233 -233
  7. package/comandos/swl/nemesis.md +122 -0
  8. package/comandos/swl/salud.md +34 -0
  9. package/comandos/swl/verificar.md +45 -0
  10. package/gateway/lib/event-channel.js +191 -191
  11. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  12. package/habilidades/benchmark-memoria/SKILL.md +186 -186
  13. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  14. package/habilidades/doubt-driven-review/SKILL.md +171 -171
  15. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  16. package/habilidades/eval-framework/SKILL.md +212 -212
  17. package/habilidades/feynman-auditor-swl/SKILL.md +123 -0
  18. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -0
  19. package/habilidades/harness-claude-code/SKILL.md +299 -299
  20. package/habilidades/infra-github-actions/SKILL.md +166 -166
  21. package/habilidades/legacy-code-rescue/SKILL.md +267 -267
  22. package/habilidades/manejo-errores/.evolved.json +8 -8
  23. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  24. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
  25. package/habilidades/patrones-python/SKILL.md +229 -229
  26. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  27. package/habilidades/planear-fase/SKILL.md +319 -319
  28. package/habilidades/release-semver/.evolved.json +8 -8
  29. package/habilidades/state-inconsistency-auditor-swl/SKILL.md +166 -0
  30. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -0
  31. package/habilidades/testing-python/SKILL.md +340 -340
  32. package/habilidades/web-fetcher-routing/SKILL.md +75 -0
  33. package/hooks/claudemd-bloat-detector.js +161 -161
  34. package/hooks/lib/agent-routing.js +107 -107
  35. package/hooks/lib/auto-consolidator.js +335 -335
  36. package/hooks/lib/error-classifier.js +308 -308
  37. package/hooks/lib/merkle-audit.js +96 -96
  38. package/hooks/lib/provenance-tracker.js +191 -191
  39. package/hooks/lib/rate-limit-tracker.js +253 -253
  40. package/hooks/lib/resource-quota.js +122 -122
  41. package/hooks/lib/retry-jitter.js +165 -165
  42. package/hooks/lib/security-net.js +201 -0
  43. package/hooks/lib/skill-auditor.js +588 -588
  44. package/hooks/lib/sync-status.js +228 -228
  45. package/hooks/lib/taint-tracker.js +107 -107
  46. package/hooks/lib/text-similarity.js +241 -241
  47. package/hooks/lib/toon-compressor.js +245 -245
  48. package/hooks/registro-turnos.js +209 -209
  49. package/hooks/sugerir-regenerar-inventario.js +170 -170
  50. package/hooks/validar-formato-post-subagente.js +140 -140
  51. package/hooks/validar-memoria-hook.js +218 -218
  52. package/instintos/prompt-appendices.yaml +57 -57
  53. package/manifiestos/agent-output-schemas.json +57 -57
  54. package/manifiestos/modulos.json +41 -6
  55. package/manifiestos/perfiles.json +2 -1
  56. package/manifiestos/skills-lock.json +30 -9
  57. package/package.json +2 -2
  58. package/plantillas/auditor-veto-template.md +105 -105
  59. package/plantillas/github-workflows/README.md +47 -47
  60. package/plantillas/github-workflows/release-please.yml +44 -44
  61. package/plantillas/github-workflows/swl-ci.yml +107 -107
  62. package/plantillas/github-workflows/swl-security.yml +51 -51
  63. package/plugin.json +10 -2
  64. package/reglas/analisis-previo-tareas-grandes.md +172 -172
  65. package/reglas/arreglar-al-detectar.md +147 -147
  66. package/reglas/fragmentos-compartidos.md +152 -152
  67. package/reglas/harness-claude-code.md +213 -213
  68. package/reglas/usar-context7.md +226 -226
  69. package/schemas/diary-entry.schema.json +80 -80
  70. package/scripts/audit-tools/audit-history.js +330 -0
  71. package/scripts/audit-tools/bundle-tracker.js +290 -0
  72. package/scripts/audit-tools/canary-monitor.js +352 -0
  73. package/scripts/audit-tools/code-profiler.js +605 -0
  74. package/scripts/audit-tools/dep-doctor.js +320 -0
  75. package/scripts/audit-tools/env-validator.js +206 -0
  76. package/scripts/audit-tools/lib/fs-walk.js +48 -0
  77. package/scripts/audit-tools/lib/output.js +23 -0
  78. package/scripts/audit-tools/migration-checker.js +392 -0
  79. package/scripts/audit-tools/pentest-scanner.js +1436 -0
  80. package/scripts/benchmark-memoria.js +167 -167
  81. package/scripts/configurar-branch-protection.js +418 -418
  82. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  83. package/scripts/field-report.js +199 -199
  84. package/scripts/generar-checklists-consolidados.js +273 -273
  85. package/scripts/generar-inventario.js +420 -420
  86. package/scripts/generar-matriz-lenguajes.js +271 -271
  87. package/scripts/lib/artefactos-python.js +43 -43
  88. package/scripts/lib/benchmark-metrics.js +160 -160
  89. package/scripts/lib/budget-enforcer.js +252 -252
  90. package/scripts/lib/configurar-ci.js +380 -380
  91. package/scripts/lib/contadores-inventario.js +217 -217
  92. package/scripts/lib/detectar-stack-detallado.js +307 -307
  93. package/scripts/lib/diary-entry.js +234 -234
  94. package/scripts/lib/eval-metrics-store.js +218 -218
  95. package/scripts/lib/eval-quality.js +171 -171
  96. package/scripts/lib/eval-schemas.js +144 -144
  97. package/scripts/lib/eval-self-correct.js +106 -106
  98. package/scripts/lib/eval-validator.js +185 -185
  99. package/scripts/lib/jaccard-similarity.js +98 -98
  100. package/scripts/lib/longmemeval-runner.js +125 -125
  101. package/scripts/lib/manifiestos.js +42 -1
  102. package/scripts/lib/npm-version.js +261 -261
  103. package/scripts/lib/paquetes-conocidos.js +50 -50
  104. package/scripts/lib/prompt-builder.js +264 -264
  105. package/scripts/lib/rrf-fusion.js +175 -175
  106. package/scripts/lib/scoring-instintos.js +277 -277
  107. package/scripts/lib/semantic-search.js +252 -252
  108. package/scripts/limpiar-artefactos-python.js +131 -131
  109. package/scripts/mcp-server/README.md +128 -128
  110. package/scripts/mcp-server/handlers.js +206 -206
  111. package/scripts/migrar-csv-a-array.js +168 -168
  112. package/scripts/migrar-fase-dominio.js +201 -201
  113. package/scripts/publicar.js +511 -511
  114. package/scripts/run-eval.js +141 -141
  115. package/scripts/validar-manifest.js +231 -195
  116. package/scripts/validar-userland-vacio.js +110 -110
package/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- # CLAUDE.md — @saulwade/swl-ses v1.4.0
1
+ # CLAUDE.md — @saulwade/swl-ses v1.4.2
2
2
 
3
3
  ## Reglas de máxima prioridad (aplican SIEMPRE, sin excepción)
4
4
 
@@ -92,7 +92,7 @@ El Read tool sigue siendo correcto para `.pdf` (≤20 páginas), `.md`, `.txt` y
92
92
  ## Qué es este repositorio
93
93
 
94
94
  Sistema de ingeniería de software auto-evolutivo multi-runtime polyglot (SDLC completo).
95
- 11 lenguajes, 5 runtimes, 59 agentes, 155 skills, 43 comandos, 64 reglas, 41 hooks.
95
+ 11 lenguajes, 5 runtimes, 60 agentes, 158 skills, 44 comandos, 65 reglas, 41 hooks.
96
96
 
97
97
  ## Estructura del repositorio
98
98
 
@@ -123,7 +123,8 @@ Para la lista completa con descripción ver `@COMANDOS.md`. Comandos más usados
123
123
  | `/swl:claudemd` | Auditar/refactorizar/inicializar CLAUDE.md (audit, refactor, init-user, check) |
124
124
  | `/swl:aprender` / `/swl:evolucionar` / `/swl:autoresearch` | Aprendizaje y auto-evolución |
125
125
  | `/swl:salud` / `/swl:metricas` / `/swl:dashboard` | Diagnóstico y observabilidad |
126
- | `/swl:revisar` / `/swl:verificar` | Calidad de código (revisión por stack, verificación goal-backward) |
126
+ | `/swl:revisar` / `/swl:verificar` | Calidad de código (revisión por stack, verificación goal-backward). `/swl:verificar --full` activa parallel scorecard con 4 audits paralelos |
127
+ | `/swl:nemesis` | Auditoría iterativa Feynman + State Inconsistency (loop hasta convergencia, ADR-0018). Flags: `--pass1`, `--pass2`, `--continue`, `--modulo <ruta>` |
127
128
  | `/swl:release` | Ciclo de release SemVer |
128
129
  | `/swl:configurar-ci` | Workflows CI/CD para proyectos del usuario |
129
130
  | `/swl:wiki` / `/swl:mapear-codebase` | Conocimiento de proyecto |
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # swl-ses v1.4.0
1
+ # swl-ses v1.4.2
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
 
@@ -6,17 +6,18 @@ Sistema de ingeniería de software auto-evolutivo **multi-runtime** con agentes
6
6
 
7
7
  Soporta 6 runtimes de IA: Claude Code, OpenClaude, OpenCode y Gemini CLI (soporte completo), GitHub Copilot y Codex CLI (soporte parcial: agentes, reglas, hooks experimentales y MCP). Incluye sistema de transformadores que adapta el formato canónico SWL al formato nativo de cada runtime.
8
8
 
9
- Cubre el SDLC completo: discovery, requisitos, arquitectura, UX/UI, frontend, backend, mobile, datos, testing, seguridad, CI/CD, observabilidad, releases, documentación, notificaciones y auto-evolución. Incluye sistema de notificaciones Telegram opt-in: hook saliente al terminar cada turno, bot bidireccional con 15 comandos y autostart en Windows, Linux y macOS sin privilegios elevados.
9
+ Cubre el SDLC completo: discovery, requisitos, arquitectura, UX/UI, frontend, backend, mobile, datos, testing, seguridad, CI/CD, observabilidad, releases, documentación, notificaciones y auto-evolución. Incluye sistema de notificaciones Telegram opt-in (hook saliente, bot bidireccional con 15 comandos, autostart cross-platform) y **auditoría profunda Nemesis** (loop iterativo Feynman + State Inconsistency hasta convergencia) con 8 tools ejecutables JSON-output para code-profiler, pentest-scanner, dep-doctor, bundle-tracker y más (ADR-0018, v1.4.1).
10
10
 
11
11
  ## Inventario
12
12
 
13
13
  | Componente | Cantidad |
14
14
  |-----------|----------|
15
- | Agentes SWL | 59 |
16
- | Habilidades | 151 (todas <=300 líneas, con divulgación progresiva a recursos/) |
17
- | Comandos (/swl:*) | 42 (todos <=300 líneas, delegan a skills) |
18
- | Reglas | 20 base + 40 por lenguaje (8 lenguajes x 5) |
19
- | Hooks | 37 + 60 librerías en hooks/lib/ |
15
+ | Agentes SWL | 60 |
16
+ | Habilidades | 158 (todas <=300 líneas, con divulgación progresiva a recursos/) |
17
+ | Comandos (/swl:*) | 44 (todos <=300 líneas, delegan a skills) |
18
+ | Reglas | 25 base + 40 por lenguaje (8 lenguajes x 5) |
19
+ | Hooks | 41 + 66 librerías en hooks/lib/ |
20
+ | Tools ejecutables (audit-tools) | 8 (code-profiler, pentest-scanner, dep-doctor, bundle-tracker, env-validator, migration-checker, canary-monitor, audit-history) |
20
21
  | Schemas | 15 |
21
22
  | Perfiles de instalación | 17 |
22
23
  | Contextos | 3 (dev, review, research) |
@@ -177,7 +178,7 @@ claude
177
178
  | `mobile` | Android + iOS + React Native/Flutter + UX |
178
179
  | `devops` | CI/CD + cloud + observabilidad + releases + seguridad |
179
180
  | `polyglot` | Todos los lenguajes: 11 lenguajes + revisores + build resolvers |
180
- | `completo` | Todo: 59 agentes + 155 habilidades + 43 comandos + 64 reglas + 41 hooks |
181
+ | `completo` | Todo: 60 agentes + 158 habilidades + 44 comandos + 65 reglas + 41 hooks |
181
182
 
182
183
  ### Targets soportados
183
184
 
@@ -477,12 +478,12 @@ swl-ses/
477
478
  manifiestos.js # Resolución de perfiles/módulos
478
479
  seguridad.js # Validaciones de seguridad
479
480
  manifiestos/ # Perfiles y módulos de instalación
480
- agentes/ # 59 agentes especializados
481
- habilidades/ # 155 habilidades modulares
482
- comandos/swl/ # 43 comandos slash
483
- reglas/ # 20 reglas base + 40 por lenguaje
484
- hooks/ # 39 hooks + 62 librerías en hooks/lib/
485
- schemas/ # 14 JSON Schemas
481
+ agentes/ # 60 agentes especializados
482
+ habilidades/ # 158 habilidades modulares
483
+ comandos/swl/ # 44 comandos slash
484
+ reglas/ # 25 reglas base + 40 por lenguaje
485
+ hooks/ # 41 hooks + 66 librerías en hooks/lib/
486
+ schemas/ # 15 JSON Schemas
486
487
  contextos/ # 3 modos de desarrollo
487
488
  instintos/ # Instintos YAML con confianza
488
489
  plantillas/ # Templates para .planning/
@@ -0,0 +1,161 @@
1
+ ---
2
+ name: nemesis-auditor-swl
3
+ description: >
4
+ Auditor de doble paso iterativo (Feynman + State Inconsistency) que encuentra
5
+ bugs en la intersección que ningún paso individual detecta. Language-agnostic
6
+ (Python, TypeScript, Go, Rust, Java, C#). Invocar tras revisor-codigo-swl y
7
+ revisor-seguridad-swl cuando la fase toca lógica de negocio compleja con
8
+ estado acoplado.
9
+ tools: [Read, Grep, Glob, Bash, Write]
10
+ model: claude-sonnet-4-6
11
+ version: 1.0.0
12
+ nivelRiesgo: MEDIO
13
+ skillsInvocables: [feynman-auditor-swl, state-inconsistency-auditor-swl]
14
+ permisosRed: false
15
+ permisosEscritura: true
16
+ permisosComandos: true
17
+ maxTurnos: 20
18
+ evolvable: true
19
+ exclusiones:
20
+ - "No invocar para pattern-matching de CVEs conocidos — usar revisor-seguridad-swl."
21
+ - "No invocar para refactor o implementación — solo audita, no modifica código."
22
+ - "No invocar como sustituto de tests — Nemesis complementa, no reemplaza testing."
23
+ - "No invocar para análisis de blockchain — el agente fue generalizado a Python/TS/Go/Rust/Java/C#."
24
+ ---
25
+
26
+ # Cuándo NO invocarme
27
+
28
+ - Para búsqueda de vulnerabilidades conocidas (CVE, OWASP Top 10) — usar `revisor-seguridad-swl`.
29
+ - Para refactor, limpiar deuda técnica o implementar funcionalidad nueva — Nemesis audita, no toca código.
30
+ - Para reemplazar un suite de tests — la cobertura de Nemesis es profundidad, no amplitud.
31
+ - Para código sin estado acoplado (scripts de utilería, transformaciones funcionales puras).
32
+
33
+ ---
34
+
35
+ # Nemesis Auditor
36
+
37
+ Dos auditores en bucle de retroalimentación. Cada uno alimenta al siguiente con sus hallazgos. El ciclo continúa hasta que ninguno encuentre algo nuevo (convergencia) o se alcancen 6 pasadas.
38
+
39
+ ```
40
+ PASADA 1: Feynman Auditor (corrida completa)
41
+ Cuestiona cada línea. Expone asunciones. Marca sospechosos.
42
+
43
+ | feed forward |
44
+
45
+ PASADA 2: State Inconsistency Auditor (corrida completa, enriquecido por Pasada 1)
46
+ Mapea estado acoplado. Encuentra gaps de mutación. Usa sospechosos de Feynman como objetivos.
47
+
48
+ | feed forward |
49
+
50
+ PASADA 3+: Pasadas alternantes dirigidas hasta convergencia
51
+ Cada pasada interroga los nuevos hallazgos de la anterior.
52
+ Máximo 6 pasadas. Nada sobrevive.
53
+ ```
54
+
55
+ ---
56
+
57
+ ## Proceso — Fase 0: Contexto
58
+
59
+ Antes de la Pasada 1, establecer:
60
+
61
+ 1. ¿Qué archivos o módulos están en scope? (sin scope → el auditor infiere desde el directorio de trabajo)
62
+ 2. ¿Hay un comando específico (`/nemesis`, `/nemesis --pass1`, `/nemesis --pass2`, `/nemesis --continue`)?
63
+ 3. ¿Hay un target de un solo módulo (`/nemesis --contract <nombre>`)?
64
+ 4. ¿Existen hallazgos previos en `.audit/findings/`?
65
+
66
+ ---
67
+
68
+ ## Proceso — Fase 1: Pasada Feynman
69
+
70
+ Cargar `Skill("feynman-auditor-swl")` y ejecutar la auditoría completa.
71
+
72
+ - Salida cruda: `.audit/findings/feynman-pass1.md`
73
+ - Registrar sospechosos de alta confianza para alimentar la Pasada 2.
74
+
75
+ ---
76
+
77
+ ## Proceso — Fase 2: Pasada State Inconsistency
78
+
79
+ Cargar `Skill("state-inconsistency-auditor-swl")` con los sospechosos de Feynman como contexto adicional.
80
+
81
+ - Los sospechosos de Feynman se convierten en **objetivos dirigidos** para el mapeo de estado acoplado.
82
+ - Salida cruda: `.audit/findings/state-pass1.md`
83
+
84
+ ---
85
+
86
+ ## Proceso — Fases 3+: Convergencia
87
+
88
+ Continuar alternando pasadas mientras alguna encuentre hallazgos nuevos:
89
+
90
+ ```
91
+ Pasada N (Feynman dirigida):
92
+ Objetivos: funciones que rodean los hallazgos de State de la pasada anterior.
93
+ ¿Nuevos hallazgos? → Pasada N+1
94
+
95
+ Pasada N+1 (State dirigida):
96
+ Objetivos: funciones que rodean los hallazgos de Feynman de la pasada anterior.
97
+ ¿Nuevos hallazgos? → Pasada N+2
98
+
99
+ Convergencia: ninguna pasada produce hallazgos nuevos.
100
+ Límite duro: 6 pasadas totales (3 Feynman + 3 State).
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Proceso — Fase 7: Reporte Final
106
+
107
+ Consolidar todos los hallazgos verificados en `.audit/findings/nemesis-verified.md`.
108
+
109
+ Cada hallazgo etiquetado con su ruta de descubrimiento:
110
+
111
+ - `[Feynman-solo]` — detectado solo por la técnica Feynman
112
+ - `[State-solo]` — detectado solo por el mapeado de estado
113
+ - `[Cross-feed]` — el hallazgo emergió de la retroalimentación entre ambas pasadas
114
+
115
+ ### Tabla de severidad
116
+
117
+ | Severidad | Criterio |
118
+ |-----------|----------|
119
+ | CRÍTICO | Corrupción de datos inmediata, pérdida de información, escalada de privilegios |
120
+ | ALTO | Fallo condicional de funcionalidad crítica, contabilidad incorrecta en paths comunes |
121
+ | MEDIO | Contabilidad degradada, griefing, errores en casos de borde frecuentes |
122
+ | BAJO | Problemas cosméticos, inaccuracy de eventos/logs, errores de casos de borde raros |
123
+
124
+ ---
125
+
126
+ ## Comandos
127
+
128
+ | Comando | Acción |
129
+ |---------|--------|
130
+ | `/nemesis` | Auditoría completa iterativa |
131
+ | `/nemesis --pass1` | Solo Pasada 1 — Feynman completo |
132
+ | `/nemesis --pass2` | Solo Pasada 2 — State sobre output existente de Pasada 1 |
133
+ | `/nemesis --continue` | Continuar desde la última pasada |
134
+ | `/nemesis --contract <nombre>` | Auditoría completa sobre un módulo específico |
135
+
136
+ ---
137
+
138
+ ## Adaptación por lenguaje
139
+
140
+ Detectar el lenguaje del codebase y adaptar:
141
+
142
+ | Concepto | Python | TypeScript | Go | Rust | Java | C# |
143
+ |---------|--------|------------|-----|------|------|-----|
144
+ | Estado mutable | atributos de clase / variables de módulo | propiedades de clase / estado de módulo | campos de struct / variables globales | campos de struct | campos de clase | propiedades |
145
+ | Almacenamiento persistente | BD / Redis / archivo | BD / Redis / localStorage | BD / Redis | BD / archivos | BD / caché | BD / caché |
146
+ | Actor de la operación | `request.user` / `actor_id` | `req.user` / `userId` | `ctx.UserID` | `actor_id` | `principal` | `User.Identity` |
147
+ | Mutación interna | método privado | método privado | función interna | `pub(crate) fn` | método privado | método privado |
148
+
149
+ ---
150
+
151
+ ## Protocolo anti-alucinación
152
+
153
+ Nunca reportar un hallazgo sin evidencia textual concreta:
154
+
155
+ - La función que rompe el invariante, con su path completo
156
+ - La secuencia de triggers que produce el bug
157
+ - El estado inconsistente resultante y su consecuencia observable
158
+
159
+ Toda hallazgo verificado incluye: par de estado acoplado, operación que rompe, secuencia de triggers, consecuencia concreta.
160
+
161
+ <!-- Adaptado de nemesis-auditor-main bajo MIT License (https://github.com/0xiehnnkta/nemesis-auditor) -->
@@ -1,187 +1,187 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- /**
5
- * swl-mcp-server — Servidor MCP **EXPERIMENTAL** para exponer la memoria
6
- * de swl-ses a clientes MCP externos (Cursor, Gemini CLI, OpenCode, etc.).
7
- *
8
- * **NO PRODUCCIÓN — STUB EXPERIMENTAL**.
9
- * Ver `scripts/mcp-server/README.md` para limitaciones detalladas.
10
- *
11
- * Modo de transporte: stdio (JSON-RPC sobre stdin/stdout).
12
- * No HTTP, no auth, no rate limiting.
13
- *
14
- * Uso (cliente MCP):
15
- * - Configurar el cliente para ejecutar `node /path/to/swl-ses/bin/swl-mcp-server.js`
16
- * con stdio.
17
- * - Los handlers leen el cwd del proceso para localizar `.planning/`,
18
- * `instintos/`, `APRENDIZAJES.md`. Por defecto usa `process.cwd()`.
19
- * - Override con env var `SWL_MCP_BASE_DIR` si el cliente arranca el server
20
- * desde otro directorio.
21
- *
22
- * Protocolo MCP soportado (subset):
23
- * - initialize / initialized
24
- * - tools/list
25
- * - tools/call
26
- *
27
- * NO soporta:
28
- * - resources/list, prompts/list
29
- * - logging, sampling
30
- * - cancellation, progress
31
- * - HTTP transport
32
- *
33
- * Trigger documentado para implementación completa: "uso ≥2 runtimes
34
- * diferentes (Cursor + Claude Code o similar) consistentemente por
35
- * ≥1 mes". Hoy: 0 instalaciones reportadas.
36
- */
37
-
38
- const path = require('path');
39
-
40
- const { HANDLERS } = require('../scripts/mcp-server/handlers');
41
-
42
- const SERVER_NAME = 'swl-mcp-server';
43
- const SERVER_VERSION = '0.1.0-experimental';
44
- const PROTOCOL_VERSION = '2024-11-05';
45
-
46
- const baseDir = process.env.SWL_MCP_BASE_DIR || process.cwd();
47
-
48
- // ── logging ───────────────────────────────────────────────────────────────────
49
-
50
- // Stderr para evitar contaminar stdout (que es JSON-RPC).
51
- function log(level, msg, data) {
52
- const linea = JSON.stringify({
53
- timestamp: new Date().toISOString(),
54
- level,
55
- msg,
56
- ...(data ? { data } : {}),
57
- });
58
- process.stderr.write(linea + '\n');
59
- }
60
-
61
- // ── JSON-RPC helpers ──────────────────────────────────────────────────────────
62
-
63
- function respuesta(id, result) {
64
- return JSON.stringify({ jsonrpc: '2.0', id, result });
65
- }
66
-
67
- function errorResp(id, code, message) {
68
- return JSON.stringify({ jsonrpc: '2.0', id, error: { code, message } });
69
- }
70
-
71
- // ── routing ───────────────────────────────────────────────────────────────────
72
-
73
- function manejarInitialize(request) {
74
- return respuesta(request.id, {
75
- protocolVersion: PROTOCOL_VERSION,
76
- capabilities: {
77
- tools: { listChanged: false },
78
- },
79
- serverInfo: {
80
- name: SERVER_NAME,
81
- version: SERVER_VERSION,
82
- },
83
- });
84
- }
85
-
86
- function manejarToolsList(request) {
87
- const tools = Object.entries(HANDLERS).map(([name, def]) => ({
88
- name,
89
- description: def.description,
90
- inputSchema: def.inputSchema,
91
- }));
92
- return respuesta(request.id, { tools });
93
- }
94
-
95
- function manejarToolsCall(request) {
96
- const { name, arguments: args } = request.params || {};
97
- const def = HANDLERS[name];
98
- if (!def) {
99
- return errorResp(request.id, -32601, `Tool no encontrado: ${name}`);
100
- }
101
- try {
102
- const result = def.handler(baseDir, args || {});
103
- return respuesta(request.id, {
104
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
105
- });
106
- } catch (err) {
107
- log('error', `Excepción en handler ${name}`, { error: err.message });
108
- return errorResp(request.id, -32603, `Error interno: ${err.message}`);
109
- }
110
- }
111
-
112
- function rutear(request) {
113
- switch (request.method) {
114
- case 'initialize':
115
- return manejarInitialize(request);
116
- case 'initialized':
117
- case 'notifications/initialized':
118
- return null; // notification — sin respuesta
119
- case 'tools/list':
120
- return manejarToolsList(request);
121
- case 'tools/call':
122
- return manejarToolsCall(request);
123
- case 'ping':
124
- return respuesta(request.id, {});
125
- default:
126
- return errorResp(request.id, -32601, `Método no soportado: ${request.method}`);
127
- }
128
- }
129
-
130
- // ── loop principal ────────────────────────────────────────────────────────────
131
-
132
- function arrancar() {
133
- log('warn', '⚠ swl-mcp-server stub experimental — NO usar en producción');
134
- log('info', `Server iniciando`, { name: SERVER_NAME, version: SERVER_VERSION, baseDir });
135
-
136
- let buffer = '';
137
-
138
- process.stdin.setEncoding('utf8');
139
- process.stdin.on('data', (chunk) => {
140
- buffer += chunk;
141
-
142
- // Cada mensaje JSON-RPC termina con \n
143
- let nlIndex;
144
- while ((nlIndex = buffer.indexOf('\n')) >= 0) {
145
- const linea = buffer.slice(0, nlIndex).trim();
146
- buffer = buffer.slice(nlIndex + 1);
147
-
148
- if (!linea) continue;
149
-
150
- let request;
151
- try {
152
- request = JSON.parse(linea);
153
- } catch (err) {
154
- log('error', 'JSON inválido recibido', { error: err.message, linea: linea.slice(0, 100) });
155
- process.stdout.write(errorResp(null, -32700, 'Parse error') + '\n');
156
- continue;
157
- }
158
-
159
- const respuestaStr = rutear(request);
160
- if (respuestaStr) {
161
- process.stdout.write(respuestaStr + '\n');
162
- }
163
- }
164
- });
165
-
166
- process.stdin.on('end', () => {
167
- log('info', 'stdin cerrado, server termina');
168
- process.exit(0);
169
- });
170
-
171
- // Manejo de errores no capturados — nunca crashear silenciosamente
172
- process.on('uncaughtException', (err) => {
173
- log('error', 'uncaughtException', { error: err.message, stack: err.stack });
174
- });
175
- }
176
-
177
- if (require.main === module) {
178
- arrancar();
179
- }
180
-
181
- module.exports = {
182
- rutear,
183
- arrancar,
184
- SERVER_NAME,
185
- SERVER_VERSION,
186
- PROTOCOL_VERSION,
187
- };
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * swl-mcp-server — Servidor MCP **EXPERIMENTAL** para exponer la memoria
6
+ * de swl-ses a clientes MCP externos (Cursor, Gemini CLI, OpenCode, etc.).
7
+ *
8
+ * **NO PRODUCCIÓN — STUB EXPERIMENTAL**.
9
+ * Ver `scripts/mcp-server/README.md` para limitaciones detalladas.
10
+ *
11
+ * Modo de transporte: stdio (JSON-RPC sobre stdin/stdout).
12
+ * No HTTP, no auth, no rate limiting.
13
+ *
14
+ * Uso (cliente MCP):
15
+ * - Configurar el cliente para ejecutar `node /path/to/swl-ses/bin/swl-mcp-server.js`
16
+ * con stdio.
17
+ * - Los handlers leen el cwd del proceso para localizar `.planning/`,
18
+ * `instintos/`, `APRENDIZAJES.md`. Por defecto usa `process.cwd()`.
19
+ * - Override con env var `SWL_MCP_BASE_DIR` si el cliente arranca el server
20
+ * desde otro directorio.
21
+ *
22
+ * Protocolo MCP soportado (subset):
23
+ * - initialize / initialized
24
+ * - tools/list
25
+ * - tools/call
26
+ *
27
+ * NO soporta:
28
+ * - resources/list, prompts/list
29
+ * - logging, sampling
30
+ * - cancellation, progress
31
+ * - HTTP transport
32
+ *
33
+ * Trigger documentado para implementación completa: "uso ≥2 runtimes
34
+ * diferentes (Cursor + Claude Code o similar) consistentemente por
35
+ * ≥1 mes". Hoy: 0 instalaciones reportadas.
36
+ */
37
+
38
+ const path = require('path');
39
+
40
+ const { HANDLERS } = require('../scripts/mcp-server/handlers');
41
+
42
+ const SERVER_NAME = 'swl-mcp-server';
43
+ const SERVER_VERSION = '0.1.0-experimental';
44
+ const PROTOCOL_VERSION = '2024-11-05';
45
+
46
+ const baseDir = process.env.SWL_MCP_BASE_DIR || process.cwd();
47
+
48
+ // ── logging ───────────────────────────────────────────────────────────────────
49
+
50
+ // Stderr para evitar contaminar stdout (que es JSON-RPC).
51
+ function log(level, msg, data) {
52
+ const linea = JSON.stringify({
53
+ timestamp: new Date().toISOString(),
54
+ level,
55
+ msg,
56
+ ...(data ? { data } : {}),
57
+ });
58
+ process.stderr.write(linea + '\n');
59
+ }
60
+
61
+ // ── JSON-RPC helpers ──────────────────────────────────────────────────────────
62
+
63
+ function respuesta(id, result) {
64
+ return JSON.stringify({ jsonrpc: '2.0', id, result });
65
+ }
66
+
67
+ function errorResp(id, code, message) {
68
+ return JSON.stringify({ jsonrpc: '2.0', id, error: { code, message } });
69
+ }
70
+
71
+ // ── routing ───────────────────────────────────────────────────────────────────
72
+
73
+ function manejarInitialize(request) {
74
+ return respuesta(request.id, {
75
+ protocolVersion: PROTOCOL_VERSION,
76
+ capabilities: {
77
+ tools: { listChanged: false },
78
+ },
79
+ serverInfo: {
80
+ name: SERVER_NAME,
81
+ version: SERVER_VERSION,
82
+ },
83
+ });
84
+ }
85
+
86
+ function manejarToolsList(request) {
87
+ const tools = Object.entries(HANDLERS).map(([name, def]) => ({
88
+ name,
89
+ description: def.description,
90
+ inputSchema: def.inputSchema,
91
+ }));
92
+ return respuesta(request.id, { tools });
93
+ }
94
+
95
+ function manejarToolsCall(request) {
96
+ const { name, arguments: args } = request.params || {};
97
+ const def = HANDLERS[name];
98
+ if (!def) {
99
+ return errorResp(request.id, -32601, `Tool no encontrado: ${name}`);
100
+ }
101
+ try {
102
+ const result = def.handler(baseDir, args || {});
103
+ return respuesta(request.id, {
104
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
105
+ });
106
+ } catch (err) {
107
+ log('error', `Excepción en handler ${name}`, { error: err.message });
108
+ return errorResp(request.id, -32603, `Error interno: ${err.message}`);
109
+ }
110
+ }
111
+
112
+ function rutear(request) {
113
+ switch (request.method) {
114
+ case 'initialize':
115
+ return manejarInitialize(request);
116
+ case 'initialized':
117
+ case 'notifications/initialized':
118
+ return null; // notification — sin respuesta
119
+ case 'tools/list':
120
+ return manejarToolsList(request);
121
+ case 'tools/call':
122
+ return manejarToolsCall(request);
123
+ case 'ping':
124
+ return respuesta(request.id, {});
125
+ default:
126
+ return errorResp(request.id, -32601, `Método no soportado: ${request.method}`);
127
+ }
128
+ }
129
+
130
+ // ── loop principal ────────────────────────────────────────────────────────────
131
+
132
+ function arrancar() {
133
+ log('warn', '⚠ swl-mcp-server stub experimental — NO usar en producción');
134
+ log('info', `Server iniciando`, { name: SERVER_NAME, version: SERVER_VERSION, baseDir });
135
+
136
+ let buffer = '';
137
+
138
+ process.stdin.setEncoding('utf8');
139
+ process.stdin.on('data', (chunk) => {
140
+ buffer += chunk;
141
+
142
+ // Cada mensaje JSON-RPC termina con \n
143
+ let nlIndex;
144
+ while ((nlIndex = buffer.indexOf('\n')) >= 0) {
145
+ const linea = buffer.slice(0, nlIndex).trim();
146
+ buffer = buffer.slice(nlIndex + 1);
147
+
148
+ if (!linea) continue;
149
+
150
+ let request;
151
+ try {
152
+ request = JSON.parse(linea);
153
+ } catch (err) {
154
+ log('error', 'JSON inválido recibido', { error: err.message, linea: linea.slice(0, 100) });
155
+ process.stdout.write(errorResp(null, -32700, 'Parse error') + '\n');
156
+ continue;
157
+ }
158
+
159
+ const respuestaStr = rutear(request);
160
+ if (respuestaStr) {
161
+ process.stdout.write(respuestaStr + '\n');
162
+ }
163
+ }
164
+ });
165
+
166
+ process.stdin.on('end', () => {
167
+ log('info', 'stdin cerrado, server termina');
168
+ process.exit(0);
169
+ });
170
+
171
+ // Manejo de errores no capturados — nunca crashear silenciosamente
172
+ process.on('uncaughtException', (err) => {
173
+ log('error', 'uncaughtException', { error: err.message, stack: err.stack });
174
+ });
175
+ }
176
+
177
+ if (require.main === module) {
178
+ arrancar();
179
+ }
180
+
181
+ module.exports = {
182
+ rutear,
183
+ arrancar,
184
+ SERVER_NAME,
185
+ SERVER_VERSION,
186
+ PROTOCOL_VERSION,
187
+ };
@@ -1,23 +1,23 @@
1
- {
2
- "release.md": {
3
- "evolved": true,
4
- "evolvedFrom": "5.4.0",
5
- "evolvedAt": "2026-04-11",
6
- "evolvedBy": "aprender",
7
- "evolvedNote": "mejora de metodología: checklist obligatoria de archivos de versión en paso 6"
8
- },
9
- "aprender.md": {
10
- "evolved": true,
11
- "evolvedFrom": "5.12.3",
12
- "evolvedAt": "2026-04-25",
13
- "evolvedBy": "aprender",
14
- "evolvedNote": "Paso 2 — filtro crítico obligatorio sobre reportes de sub-agentes Explore para evitar sobre-ingeniería al analizar papers académicos"
15
- },
16
- "verificar.md": {
17
- "evolved": true,
18
- "evolvedFrom": "5.12.3",
19
- "evolvedAt": "2026-04-26",
20
- "evolvedBy": "evolucionar",
21
- "evolvedNote": "flag --until-converge para iterar verificar→corregir→re-verificar hasta 0 hallazgos CRÍTICO+ALTO+MAYOR (max-iter=5, --no-prompt CI, detección adversarial ≥5 hallazgos nuevos)"
22
- }
1
+ {
2
+ "release.md": {
3
+ "evolved": true,
4
+ "evolvedFrom": "5.4.0",
5
+ "evolvedAt": "2026-04-11",
6
+ "evolvedBy": "aprender",
7
+ "evolvedNote": "mejora de metodología: checklist obligatoria de archivos de versión en paso 6"
8
+ },
9
+ "aprender.md": {
10
+ "evolved": true,
11
+ "evolvedFrom": "5.12.3",
12
+ "evolvedAt": "2026-04-25",
13
+ "evolvedBy": "aprender",
14
+ "evolvedNote": "Paso 2 — filtro crítico obligatorio sobre reportes de sub-agentes Explore para evitar sobre-ingeniería al analizar papers académicos"
15
+ },
16
+ "verificar.md": {
17
+ "evolved": true,
18
+ "evolvedFrom": "5.12.3",
19
+ "evolvedAt": "2026-04-26",
20
+ "evolvedBy": "evolucionar",
21
+ "evolvedNote": "flag --until-converge para iterar verificar→corregir→re-verificar hasta 0 hallazgos CRÍTICO+ALTO+MAYOR (max-iter=5, --no-prompt CI, detección adversarial ≥5 hallazgos nuevos)"
22
+ }
23
23
  }