@saulwade/swl-ses 2.6.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/CLAUDE.md +197 -197
  2. package/README.md +600 -600
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/accesibilidad-wcag-swl.md +690 -690
  6. package/agentes/arquitecto-swl.md +267 -267
  7. package/agentes/auto-evolucion-swl.md +932 -932
  8. package/agentes/backend-csharp-swl.md +420 -420
  9. package/agentes/backend-go-swl.md +390 -390
  10. package/agentes/backend-java-swl.md +281 -281
  11. package/agentes/backend-rust-swl.md +364 -364
  12. package/agentes/backend-workers-swl.md +482 -482
  13. package/agentes/cloud-infra-swl.md +509 -509
  14. package/agentes/consolidador-swl.md +541 -541
  15. package/agentes/depurador-swl.md +352 -352
  16. package/agentes/devops-ci-swl.md +400 -400
  17. package/agentes/disenador-ui-swl.md +569 -569
  18. package/agentes/documentador-swl.md +345 -345
  19. package/agentes/frontend-angular-swl.md +621 -621
  20. package/agentes/frontend-css-swl.md +716 -716
  21. package/agentes/frontend-react-swl.md +692 -692
  22. package/agentes/frontend-swl.md +496 -496
  23. package/agentes/frontend-tailwind-swl.md +826 -826
  24. package/agentes/investigador-swl.md +432 -432
  25. package/agentes/investigador-ux-swl.md +505 -505
  26. package/agentes/migrador-swl.md +442 -442
  27. package/agentes/mobile-android-swl.md +511 -511
  28. package/agentes/mobile-cross-swl.md +541 -541
  29. package/agentes/mobile-ios-swl.md +502 -502
  30. package/agentes/mobile-testing-swl.md +302 -302
  31. package/agentes/nemesis-auditor-swl.md +285 -285
  32. package/agentes/observabilidad-swl.md +438 -438
  33. package/agentes/pagos-swl.md +310 -310
  34. package/agentes/perfilador-usuario-swl.md +321 -321
  35. package/agentes/planificador-swl.md +399 -399
  36. package/agentes/producto-prd-swl.md +589 -589
  37. package/agentes/red-team-swl.md +218 -218
  38. package/agentes/release-manager-swl.md +590 -590
  39. package/agentes/rendimiento-swl.md +713 -713
  40. package/agentes/revisor-angular-swl.md +278 -278
  41. package/agentes/revisor-csharp-swl.md +264 -264
  42. package/agentes/revisor-go-swl.md +259 -259
  43. package/agentes/revisor-java-swl.md +257 -257
  44. package/agentes/revisor-kotlin-swl.md +273 -273
  45. package/agentes/revisor-nextjs-swl.md +281 -281
  46. package/agentes/revisor-php-swl.md +271 -271
  47. package/agentes/revisor-react-swl.md +278 -278
  48. package/agentes/revisor-rust-swl.md +346 -346
  49. package/agentes/revisor-seguridad-swl.md +399 -399
  50. package/agentes/revisor-swift-swl.md +268 -268
  51. package/agentes/revisor-typescript-swl.md +346 -346
  52. package/agentes/tdd-qa-swl.md +393 -393
  53. package/comandos/swl/actualizar.md +174 -174
  54. package/comandos/swl/adoptar-proyecto.md +265 -265
  55. package/comandos/swl/aprender.md +836 -836
  56. package/comandos/swl/aprobar-plan.md +146 -146
  57. package/comandos/swl/auditar-deps.md +134 -134
  58. package/comandos/swl/autoresearch.md +264 -264
  59. package/comandos/swl/ayuda.md +224 -224
  60. package/comandos/swl/brainstorm.md +51 -51
  61. package/comandos/swl/briefing.md +119 -119
  62. package/comandos/swl/checkpoint.md +325 -325
  63. package/comandos/swl/claudemd.md +234 -234
  64. package/comandos/swl/compactar.md +310 -310
  65. package/comandos/swl/configurar-ci.md +235 -235
  66. package/comandos/swl/contexto.md +110 -110
  67. package/comandos/swl/contribuir.md +233 -233
  68. package/comandos/swl/crear-skill.md +292 -292
  69. package/comandos/swl/cron.md +194 -194
  70. package/comandos/swl/discutir-fase.md +169 -169
  71. package/comandos/swl/ejecutar-fase.md +233 -233
  72. package/comandos/swl/evaluar-skill.md +520 -520
  73. package/comandos/swl/evolucion-continua.md +73 -73
  74. package/comandos/swl/evolucionar.md +267 -267
  75. package/comandos/swl/exportar-vault.md +583 -583
  76. package/comandos/swl/fix.md +118 -118
  77. package/comandos/swl/gateway.md +158 -158
  78. package/comandos/swl/inbox.md +116 -116
  79. package/comandos/swl/instalar.md +220 -220
  80. package/comandos/swl/instintos.md +86 -86
  81. package/comandos/swl/mapear-codebase.md +312 -312
  82. package/comandos/swl/mcp-status.md +175 -175
  83. package/comandos/swl/modelo.md +100 -100
  84. package/comandos/swl/nemesis.md +433 -433
  85. package/comandos/swl/notificaciones.md +299 -299
  86. package/comandos/swl/nuevo-proyecto.md +251 -251
  87. package/comandos/swl/planear-fase.md +263 -263
  88. package/comandos/swl/plugins.md +256 -256
  89. package/comandos/swl/predecir.md +169 -169
  90. package/comandos/swl/reflect-skills.md +125 -125
  91. package/comandos/swl/release.md +450 -450
  92. package/comandos/swl/revisar-impacto.md +201 -201
  93. package/comandos/swl/revisar.md +330 -330
  94. package/comandos/swl/seguridad.md +189 -189
  95. package/comandos/swl/sesiones.md +200 -200
  96. package/comandos/swl/skill-search.md +113 -113
  97. package/comandos/swl/status.md +345 -345
  98. package/comandos/swl/verificar.md +817 -817
  99. package/comandos/swl/wiki.md +620 -620
  100. package/gateway/cron/jobs.example.json +12 -12
  101. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -294
  102. package/habilidades/backend-async-postgres-testing/SKILL.md +2 -1
  103. package/habilidades/changelog-generator/SKILL.md +174 -174
  104. package/habilidades/compactacion-contexto/SKILL.md +2 -1
  105. package/habilidades/contenedores-docker/SKILL.md +4 -2
  106. package/habilidades/doubt-driven-review/SKILL.md +207 -207
  107. package/habilidades/drift-detection/SKILL.md +1 -1
  108. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  109. package/habilidades/extractor-de-aprendizajes/SKILL.md +8 -2
  110. package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
  111. package/habilidades/harness-claude-code/SKILL.md +314 -314
  112. package/habilidades/instalar-sistema/SKILL.md +227 -227
  113. package/habilidades/planear-fase/SKILL.md +358 -358
  114. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  115. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  116. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -147
  117. package/habilidades/release-semver/SKILL.md +2 -2
  118. package/habilidades/tdd-workflow/SKILL.md +749 -749
  119. package/hooks/agente-lifecycle.js +1 -1
  120. package/hooks/audit-trail.js +1 -1
  121. package/hooks/auto-consolidacion.js +1 -1
  122. package/hooks/captura-acciones-post.js +1 -1
  123. package/hooks/captura-acciones-session.js +1 -1
  124. package/hooks/captura-feedback-usuario.js +1 -1
  125. package/hooks/contexto-iteracion.js +1 -1
  126. package/hooks/contexto-subagente.js +68 -68
  127. package/hooks/degradacion-instintos.js +1 -1
  128. package/hooks/grafo-contexto.js +1 -1
  129. package/hooks/guardrail-modelo.js +1 -1
  130. package/hooks/inbox-aviso.js +1 -1
  131. package/hooks/inyeccion-contexto.js +1 -1
  132. package/hooks/lib/agent-matcher.js +1 -1
  133. package/hooks/lib/agent-routing.js +1 -1
  134. package/hooks/lib/captura-acciones.js +1 -1
  135. package/hooks/lib/etapa-metricas.js +1 -1
  136. package/hooks/lib/evolution-tracker.js +1 -1
  137. package/hooks/lib/gateway-notify.js +193 -193
  138. package/hooks/lib/mcp-health.js +1 -1
  139. package/hooks/lib/notificacion-formato.js +58 -0
  140. package/hooks/lib/nudge-tracker.js +1 -1
  141. package/hooks/lib/otlp-exporter.js +1 -1
  142. package/hooks/lib/propose-step.js +1 -1
  143. package/hooks/lib/raiz-proyecto.js +127 -102
  144. package/hooks/lib/run-log.js +1 -1
  145. package/hooks/lib/singleton-guard.js +20 -13
  146. package/hooks/lib/telegram-cliente.js +11 -3
  147. package/hooks/notificacion-telegram.js +13 -3
  148. package/hooks/preservar-estado-pre-compact.js +1 -1
  149. package/hooks/registro-turnos.js +1 -1
  150. package/hooks/resumen-sesion.js +1 -1
  151. package/hooks/risk-scoring.js +1 -1
  152. package/hooks/session-briefing.js +1 -1
  153. package/hooks/spec-gate.js +1 -1
  154. package/hooks/sugerir-regenerar-inventario.js +1 -1
  155. package/hooks/tdd-gate.js +1 -1
  156. package/hooks/telemetria-agentes.js +1 -1
  157. package/hooks/telemetria-skill-routing.js +1 -1
  158. package/hooks/tracking-costos.js +1 -1
  159. package/hooks/validar-formato-post-subagente.js +1 -1
  160. package/hooks/validar-intent-spec.js +1 -1
  161. package/hooks/validar-planning-paths.js +1 -1
  162. package/llms.txt +29 -29
  163. package/manifiestos/canonical-hashes.json +5588 -5257
  164. package/manifiestos/hooks-config.json +469 -469
  165. package/manifiestos/invariantes-criticos.json +30 -30
  166. package/manifiestos/modulos.json +1429 -1428
  167. package/manifiestos/skills-lock.json +1275 -1275
  168. package/package.json +94 -94
  169. package/plugin.json +369 -369
  170. package/scripts/auditar-clases-conocidas.js +134 -134
  171. package/scripts/bootstrap-instintos.js +85 -14
  172. package/scripts/canario-hooks.js +166 -166
  173. package/scripts/cli/autonomia.js +23 -23
  174. package/scripts/cli/benchmark-memoria.js +37 -37
  175. package/scripts/cli/ciclo-autonomo.js +73 -73
  176. package/scripts/cli/ciclo-fase-b.js +102 -102
  177. package/scripts/cli/guardrail-metrics.js +39 -39
  178. package/scripts/cli/memoria-search.js +69 -69
  179. package/scripts/cli/nudge-accionar.js +39 -39
  180. package/scripts/cli/run-eval.js +38 -38
  181. package/scripts/doctor.js +26 -3
  182. package/scripts/evidencia-valor.js +101 -101
  183. package/scripts/field-report.js +16 -16
  184. package/scripts/instalador.js +13 -0
  185. package/scripts/lib/activar-hooks-proyecto.js +116 -116
  186. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -174
  187. package/scripts/lib/ciclo-autonomo/config.js +165 -165
  188. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -174
  189. package/scripts/lib/ciclo-autonomo/fallback.js +77 -77
  190. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -139
  191. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -112
  192. package/scripts/lib/ciclo-autonomo/index.js +301 -301
  193. package/scripts/lib/ciclo-autonomo/lock.js +124 -124
  194. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -122
  195. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -240
  196. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -248
  197. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -190
  198. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -535
  199. package/scripts/lib/evidencia-valor.js +228 -228
  200. package/scripts/lib/expandir-targets.js +71 -71
  201. package/scripts/lib/limpiar-basura-global.js +161 -0
  202. package/scripts/lib/toml-merge.js +204 -204
  203. package/scripts/mcp-server/auth.js +105 -105
  204. package/scripts/mcp-server/cache.js +106 -106
  205. package/scripts/tui/pantallas/install-wizard.js +403 -403
  206. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +0 -53
  207. package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +0 -372
@@ -1,620 +1,620 @@
1
- ---
2
- name: swl:wiki
3
- description: >
4
- Gestiona el wiki de conocimiento del proyecto. Implementa el patrón de
5
- knowledge base persistente y compounding de Andrej Karpathy: tres capas
6
- separadas (raw/wiki/outputs) con index.md y log.md para navegación y
7
- trazabilidad. Subcomandos: init, ingest, query, lint.
8
- allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
9
- ---
10
-
11
- # /swl:wiki — Wiki de conocimiento del proyecto
12
-
13
- Gestiona el knowledge base persistente del proyecto. A diferencia de
14
- `.planning/APRENDIZAJES.md` (patrones técnicos de implementación), el wiki
15
- almacena conocimiento de dominio, decisiones de investigación, arquitectura
16
- conceptual y análisis que deben sobrevivir indefinidamente sin purgarse.
17
-
18
- ## Arquitectura del wiki
19
-
20
- ```
21
- .planning/knowledge/
22
- raw/ ← fuentes crudas INMUTABLES (artículos, docs, notas, outputs de agentes)
23
- wiki/ ← síntesis mantenida por IA (una página .md por topic)
24
- INDEX.md ← catálogo de todas las páginas (actualizado en cada ingest)
25
- log.md ← historial cronológico append-only (parseable con grep)
26
- [topic].md ← página por topic/agente/tecnología/decisión
27
- outputs/ ← respuestas a queries, análisis, comparativas (referencias al wiki)
28
- ```
29
-
30
- **Separación de responsabilidades**:
31
- - `raw/` → NUNCA modificar. Es la fuente de verdad. El LLM solo lee.
32
- - `wiki/` → El LLM escribe y mantiene. El usuario lee.
33
- - `outputs/` → El LLM escribe al responder queries. Se pueden reutilizar como fuentes.
34
-
35
- ---
36
-
37
- ## Subcomando: `init`
38
-
39
- **Uso**: `/swl:wiki init`
40
-
41
- Inicializa la estructura del wiki para el proyecto actual.
42
-
43
- ### Pasos
44
-
45
- 1. **Crear estructura de directorios**:
46
-
47
- ```bash
48
- mkdir -p .planning/knowledge/raw
49
- mkdir -p .planning/knowledge/wiki
50
- mkdir -p .planning/knowledge/outputs
51
- echo "✓ Estructura de directorios creada"
52
- ```
53
-
54
- 2. **Crear INDEX.md** — catálogo inicial:
55
-
56
- ```bash
57
- cat > .planning/knowledge/wiki/INDEX.md << 'EOF'
58
- ---
59
- tipo: indice
60
- actualizado: YYYY-MM-DD
61
- total_paginas: 0
62
- ---
63
-
64
- # Índice del Wiki — [nombre del proyecto]
65
-
66
- > Catálogo de todas las páginas del wiki. Actualizado automáticamente en cada ingest.
67
- > Para navegar: leer esta página primero, luego profundizar en las páginas relevantes.
68
-
69
- ## Páginas por categoría
70
-
71
- ### Arquitectura y decisiones
72
- _(vacío — agregar páginas vía `/swl:wiki ingest`)_
73
-
74
- ### Tecnologías y frameworks
75
- _(vacío)_
76
-
77
- ### Investigaciones y análisis
78
- _(vacío)_
79
-
80
- ### Procesos y metodología
81
- _(vacío)_
82
-
83
- ---
84
- _Wiki inicializado: [FECHA]. Usar `/swl:wiki ingest <archivo>` para agregar contenido._
85
- EOF
86
- ```
87
-
88
- Reemplazar `YYYY-MM-DD` y `[nombre del proyecto]` con los valores reales.
89
-
90
- 3. **Crear log.md** — historial cronológico:
91
-
92
- ```bash
93
- cat > .planning/knowledge/wiki/log.md << 'EOF'
94
- # Log del Wiki — Historial cronológico
95
-
96
- > Registro append-only de operaciones. Parseable:
97
- > `grep "^## \[" .planning/knowledge/wiki/log.md | tail -10`
98
- > `grep "ingest" .planning/knowledge/wiki/log.md`
99
-
100
- EOF
101
- echo "## [$(date +%Y-%m-%d)] init | Wiki inicializado para el proyecto" >> .planning/knowledge/wiki/log.md
102
- ```
103
-
104
- 4. **Crear schema.md** — reglas del wiki para este proyecto:
105
-
106
- ```bash
107
- cat > .planning/knowledge/schema.md << 'EOF'
108
- # Schema del Wiki — Reglas y convenciones
109
-
110
- ## Qué es este wiki
111
- Knowledge base del proyecto [NOMBRE]. Captura conocimiento de dominio,
112
- decisiones técnicas, investigaciones y análisis que deben persistir
113
- indefinidamente como memoria institucional del proyecto.
114
-
115
- ## Diferencia con APRENDIZAJES.md
116
- - APRENDIZAJES.md → patrones de implementación técnica (código, bugs, anti-patrones)
117
- - wiki/ → conocimiento de dominio, arquitectura conceptual, investigación (negocio, decisiones)
118
-
119
- ## Estructura de cada página wiki (patrón Compiled Truth)
120
-
121
- Cada página wiki sigue el patrón **Compiled Truth**: síntesis curada arriba,
122
- evidencia cronológica abajo. La síntesis es el conocimiento compilado y
123
- actualizado; la timeline es el registro inmutable de cómo se llegó ahí.
124
-
125
- Cada archivo en wiki/ debe seguir este formato:
126
-
127
- ```
128
- ---
129
- topic: [nombre del topic]
130
- categoria: arquitectura | tecnologia | investigacion | proceso
131
- actualizado: YYYY-MM-DD
132
- fuentes: [N archivos en raw/ que respaldan esta página]
133
- confianza: alta | media | baja
134
- ---
135
-
136
- # [Título]
137
-
138
- ## Compiled Truth (síntesis curada)
139
-
140
- ### Resumen
141
- [Un párrafo que resume el topic — usado en INDEX.md]
142
-
143
- ### Estado actual
144
- [Qué se sabe HOY sobre este topic. Afirmaciones verificadas con fuentes.
145
- Cada afirmación clave marcada con [F:N] donde N refiere a la fuente en la
146
- sección Timeline.]
147
-
148
- ### Decisiones vigentes
149
- [Decisiones activas sobre este topic, con justificación breve.]
150
-
151
- ### Relaciones
152
- - Relacionado con: [[otro-topic]], [[otro-topic-2]]
153
- - Depende de: [[prerequisito]]
154
- - Referenciado por: [[topic-que-lo-usa]]
155
-
156
- ## Timeline (evidencia cronológica)
157
-
158
- ### [YYYY-MM-DD] [F:1] — [nombre de la fuente]
159
- - Aportó: [qué conocimiento agregó]
160
- - Fuente: raw/YYYYMMDD-nombre-fuente.md
161
-
162
- ### [YYYY-MM-DD] [F:2] — [nombre de la fuente]
163
- - Aportó: [qué conocimiento agregó]
164
- - Cambió: [qué afirmación anterior se actualizó o contradijo]
165
- - Fuente: raw/YYYYMMDD-nombre-fuente.md
166
- ```
167
-
168
- **Reglas del patrón Compiled Truth**:
169
- - La sección **Compiled Truth** es la fuente de verdad actual — se reescribe con cada ingest.
170
- - La sección **Timeline** es append-only — nunca modificar entradas anteriores.
171
- - Si una fuente nueva contradice una anterior, actualizar Compiled Truth Y agregar en Timeline con `Cambió:`.
172
- - El campo `confianza` refleja cuántas fuentes independientes respaldan las afirmaciones: alta (3+), media (2), baja (1).
173
-
174
- ## Convenciones
175
- - Links entre páginas: `[[nombre-archivo-sin-extension]]`
176
- - Una página por topic, no por fuente
177
- - El LLM actualiza wiki/ — el humano lee y valida
178
- - raw/ es inmutable — nunca modificar archivos existentes
179
- - outputs/ contiene respuestas completas — referenciar wiki/ para síntesis
180
- - log.md es append-only — nunca editar entradas existentes
181
-
182
- ## Topics prioritarios para este proyecto
183
- [Completar con los dominios específicos del proyecto — ej: "autenticación", "facturación", "arquitectura de microservicios"]
184
- EOF
185
- ```
186
-
187
- 5. **Confirmación al usuario**:
188
-
189
- ```
190
- ✓ Wiki inicializado en .planning/knowledge/
191
-
192
- Estructura creada:
193
- raw/ → depositar fuentes crudas aquí
194
- wiki/ → el LLM mantiene las páginas
195
- outputs/ → respuestas y análisis guardados
196
- INDEX.md → catálogo de páginas (actualizado automáticamente)
197
- log.md → historial cronológico de operaciones
198
- schema.md → reglas del wiki (editar para personalizar al proyecto)
199
-
200
- Próximos pasos:
201
- /swl:wiki ingest <archivo> → ingerir primera fuente
202
- /swl:wiki query "<pregunta>" → consultar el wiki
203
- /swl:wiki lint → health check periódico
204
- ```
205
-
206
- ---
207
-
208
- ## Subcomando: `ingest`
209
-
210
- **Uso**: `/swl:wiki ingest <ruta-o-url>`
211
-
212
- Ingiere una fuente en el wiki: lee, extrae knowledge, actualiza páginas relevantes,
213
- actualiza INDEX.md y agrega entrada al log.
214
-
215
- ### Tipos de fuente soportados
216
-
217
- | Tipo | Ejemplo | Herramienta |
218
- |------|---------|-------------|
219
- | `.md`, `.txt` (local) | `ingest ./notas/reunion.md` | Read |
220
- | `.pdf` ≤ 20 páginas (local) | `ingest ./docs/guia.pdf` | Read con `pages:` |
221
- | `.pdf` > 20 págs o con tablas | `ingest ./docs/reporte.pdf` | swl-markitdown |
222
- | `.docx`, `.pptx` (local) | `ingest ./docs/arquitectura.docx` | swl-markitdown |
223
- | `.xlsx`, `.xls` (local) | `ingest ./datos/metricas.xlsx` | swl-markitdown |
224
- | `.ipynb` Jupyter (local) | `ingest ./notebooks/analisis.ipynb` | swl-markitdown |
225
- | `.zip` con documentos | `ingest ./docs/documentacion.zip` | swl-markitdown |
226
- | URL estática (HTML simple) | `ingest https://blog.domain.com/post` | WebFetch |
227
- | URL dinámica (SPA, JS heavy) | `ingest https://spa-site.com/docs` | agent-browser |
228
- | URL de YouTube | `ingest https://www.youtube.com/watch?v=...` | swl-markitdown |
229
- | Output de agente previo | `ingest .planning/knowledge/outputs/2026-04-09-investigacion.md` | Read |
230
-
231
- ### Pasos del ingest
232
-
233
- **Paso I.1 — Leer la fuente** (detección automática de herramienta):
234
-
235
- ```bash
236
- PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
237
- CLI_MKD="$PROJECT_ROOT/scripts/vendor/markitdown/cli.py"
238
- FUENTE="[RUTA_O_URL]"
239
-
240
- # Detectar tipo de fuente y elegir herramienta
241
- if echo "$FUENTE" | grep -qE "^https?://"; then
242
- # Fuente web
243
- if echo "$FUENTE" | grep -qE "youtube\.com|youtu\.be"; then
244
- # YouTube: usar swl-markitdown para transcripción
245
- CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
246
- else
247
- # HTML: WebFetch primero, agent-browser como fallback
248
- CONTENIDO=$(# usar WebFetch tool aquí)
249
- PALABRAS=$(echo "$CONTENIDO" | wc -w)
250
- if [ "$PALABRAS" -lt 500 ]; then
251
- CONTENIDO=$(# usar agent-browser como fallback)
252
- fi
253
- fi
254
- else
255
- # Archivo local: elegir según extensión
256
- EXT="${FUENTE##*.}"
257
- case "$EXT" in
258
- md|txt|markdown)
259
- # Read tool directamente
260
- ;;
261
- pdf)
262
- # Read para PDFs cortos; swl-markitdown para PDFs con tablas o > 20 págs
263
- CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
264
- ;;
265
- docx|pptx|xlsx|xls|ipynb|epub|zip|csv)
266
- # swl-markitdown para formatos que Read no soporta
267
- CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
268
- if [ -z "$CONTENIDO" ]; then
269
- echo "Error: swl-markitdown no pudo convertir $FUENTE"
270
- echo "Verificar: python $CLI_MKD --check"
271
- exit 1
272
- fi
273
- ;;
274
- *)
275
- # Intentar con swl-markitdown; si falla, reportar
276
- CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
277
- ;;
278
- esac
279
- fi
280
- ```
281
-
282
- **Paso I.2 — Guardar copia en raw/** (si la fuente es externa o fue convertida):
283
-
284
- ```bash
285
- FECHA=$(date +%Y%m%d)
286
- NOMBRE_LIMPIO=$(echo "[FUENTE]" | sed 's|https://||' | sed 's|[/. ]|-|g' | cut -c1-60)
287
-
288
- # Para archivos Markdown/texto ya en formato correcto
289
- cp "[FUENTE_LOCAL]" ".planning/knowledge/raw/${FECHA}-${NOMBRE_LIMPIO}.md"
290
-
291
- # Para archivos convertidos con swl-markitdown (DOCX, XLSX, PPTX, etc.)
292
- python "$CLI_MKD" "[FUENTE_LOCAL]" > ".planning/knowledge/raw/${FECHA}-${NOMBRE_LIMPIO}.md" 2>/dev/null
293
-
294
- # Para URLs (WebFetch o agent-browser)
295
- # agent-browser get text "article" > ".planning/knowledge/raw/${FECHA}-${NOMBRE_LIMPIO}.md"
296
- ```
297
-
298
- **Paso I.3 — Extraer knowledge de la fuente**:
299
-
300
- Leer la fuente completa e identificar:
301
- - Topics principales cubiertos
302
- - Entidades mencionadas (tecnologías, patrones, decisiones, personas)
303
- - Afirmaciones verificables con su fuente
304
- - Relaciones con topics que ya existen en el wiki
305
-
306
- **Paso I.4 — Actualizar páginas wiki existentes**:
307
-
308
- Para cada topic cubierto en la fuente que ya tiene página en `wiki/`:
309
- - Leer la página existente
310
- - **Compiled Truth**: Reescribir la sección "Estado actual" integrando la información nueva con la existente. No eliminar afirmaciones válidas — solo actualizarlas o expandirlas.
311
- - **Timeline**: Agregar nueva entrada cronológica append-only con `[F:N]` y lo que la fuente aportó. Si contradice algo, incluir `Cambió:` en la entrada.
312
- - Actualizar la fecha `actualizado` y el campo `fuentes` (incrementar) en el frontmatter
313
- - Actualizar `confianza`: baja (1 fuente) → media (2) → alta (3+)
314
- - Si la nueva info contradice la anterior: actualizar Compiled Truth con la versión correcta Y registrar el cambio en Timeline con `Cambió:`
315
-
316
- **Paso I.5 — Crear páginas wiki nuevas** (para topics que no tienen página):
317
-
318
- Para cada topic nuevo identificado que justifique su propia página (criterio: ≥3 afirmaciones distintas sobre el mismo topic):
319
-
320
- ```bash
321
- cat > ".planning/knowledge/wiki/[nombre-topic].md" << 'EOF'
322
- ---
323
- topic: [nombre]
324
- categoria: [arquitectura|tecnologia|investigacion|proceso]
325
- actualizado: YYYY-MM-DD
326
- fuentes: 1
327
- confianza: baja
328
- ---
329
-
330
- # [Título del topic]
331
-
332
- ## Compiled Truth (síntesis curada)
333
-
334
- ### Resumen
335
- [Un párrafo conciso — este texto va al INDEX.md]
336
-
337
- ### Estado actual
338
- [Afirmaciones verificadas, marcadas con [F:1] referenciando la timeline.]
339
-
340
- ### Decisiones vigentes
341
- [Decisiones activas si aplica, o eliminar sección si no hay.]
342
-
343
- ### Relaciones
344
- - Relacionado con: [otros topics del wiki si aplica]
345
-
346
- ## Timeline (evidencia cronológica)
347
-
348
- ### [YYYY-MM-DD] [F:1] — [nombre de la fuente]
349
- - Aportó: [qué conocimiento agregó]
350
- - Fuente: raw/YYYYMMDD-nombre-fuente.md
351
- EOF
352
- ```
353
-
354
- **Paso I.6 — Actualizar INDEX.md**:
355
-
356
- Agregar o actualizar la entrada del topic nuevo en INDEX.md:
357
-
358
- ```bash
359
- # Agregar al INDEX.md bajo la categoría correspondiente:
360
- # | [[nombre-topic]] | [resumen de una línea] | [YYYY-MM-DD] |
361
- ```
362
-
363
- Estructura de la tabla en INDEX.md:
364
- ```markdown
365
- | Página | Resumen | Actualizado |
366
- |--------|---------|-------------|
367
- | [[nombre-topic]] | Resumen de una línea | YYYY-MM-DD |
368
- ```
369
-
370
- **Paso I.7 — Agregar al log**:
371
-
372
- ```bash
373
- echo "## [$(date +%Y-%m-%d)] ingest | [nombre de la fuente] → [N páginas tocadas]" \
374
- >> .planning/knowledge/wiki/log.md
375
- echo " Fuentes en raw: $(ls .planning/knowledge/raw/ | wc -l) total" \
376
- >> .planning/knowledge/wiki/log.md
377
- ```
378
-
379
- **Paso I.8 — Reporte al usuario**:
380
-
381
- ```
382
- Ingest completado: [nombre de la fuente]
383
-
384
- Páginas actualizadas: [N]
385
- - wiki/[topic1].md — [qué se actualizó]
386
- - wiki/[topic2].md — [qué se actualizó]
387
-
388
- Páginas nuevas creadas: [N]
389
- - wiki/[nuevo-topic].md — [descripción]
390
-
391
- INDEX.md actualizado: [N] entradas
392
- log.md: entrada agregada
393
-
394
- [Si hay contradicciones detectadas:]
395
- ⚠ Contradicciones detectadas — revisar antes de continuar:
396
- - wiki/[topic].md contradice raw/[fuente-anterior].md en: [claim]
397
- ```
398
-
399
- ---
400
-
401
- ## Subcomando: `query`
402
-
403
- **Uso**: `/swl:wiki query "<pregunta>"`
404
-
405
- Responde una pregunta usando el knowledge base del wiki. Guarda la respuesta
406
- en `outputs/` para que componga en el knowledge base.
407
-
408
- ### Pasos del query
409
-
410
- **Paso Q.1 — Leer INDEX.md primero**:
411
-
412
- ```bash
413
- cat .planning/knowledge/wiki/INDEX.md
414
- ```
415
-
416
- Identificar qué páginas del wiki son relevantes para la pregunta.
417
- **No cargar todo el wiki** — solo las páginas identificadas en el índice.
418
-
419
- **Paso Q.2 — Leer páginas relevantes**:
420
-
421
- Para cada página identificada como relevante:
422
- ```bash
423
- cat .planning/knowledge/wiki/[topic].md
424
- ```
425
-
426
- Máximo 5-7 páginas por query para mantener el costo bajo.
427
- Si la pregunta requiere más páginas, descomponerla en sub-preguntas.
428
-
429
- **Paso Q.3 — Sintetizar respuesta**:
430
-
431
- Responder la pregunta basándose SOLO en el contenido del wiki.
432
- Si la pregunta no puede responderse con el wiki actual, indicarlo explícitamente:
433
- ```
434
- ⚠ El wiki actual no tiene suficiente información sobre [aspecto].
435
- Fuentes faltantes sugeridas:
436
- - [tipo de fuente que respondería esto]
437
-
438
- ¿Ejecutar investigación con investigador-swl para completar el wiki?
439
- ```
440
-
441
- **Paso Q.4 — Guardar output**:
442
-
443
- ```bash
444
- FECHA=$(date +%Y-%m-%d)
445
- PREGUNTA_SLUG=$(echo "[PREGUNTA]" | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | cut -c1-50)
446
- OUTPUT_PATH=".planning/knowledge/outputs/${FECHA}-query-${PREGUNTA_SLUG}.md"
447
-
448
- cat > "$OUTPUT_PATH" << 'EOF'
449
- ---
450
- fecha: YYYY-MM-DD
451
- tipo: query
452
- pregunta: "[PREGUNTA]"
453
- paginas_consultadas: [LISTA]
454
- ---
455
-
456
- # Respuesta: [PREGUNTA]
457
-
458
- [RESPUESTA COMPLETA]
459
-
460
- ## Fuentes wiki consultadas
461
- - [[topic1]]
462
- - [[topic2]]
463
- EOF
464
-
465
- echo "✓ Respuesta guardada en: $OUTPUT_PATH"
466
- ```
467
-
468
- **Paso Q.5 — Proponer si el output debe incorporarse al wiki**:
469
-
470
- ```
471
- Output guardado en outputs/[archivo].md
472
-
473
- ¿Incorporar esta respuesta al wiki?
474
- [S] Sí — es un análisis valioso que debería estar en wiki/
475
- [N] No — es una respuesta puntual que no suma al wiki
476
- ```
477
-
478
- Si el usuario dice Sí: ejecutar ingest sobre el output para integrarlo al wiki.
479
-
480
- ---
481
-
482
- ## Subcomando: `lint`
483
-
484
- **Uso**: `/swl:wiki lint`
485
-
486
- Health check del wiki. Detecta problemas de calidad antes de que se acumulen.
487
- Ejecutar mensualmente o después de ingestas masivas.
488
-
489
- ### Verificaciones del lint
490
-
491
- **L.1 — Páginas huérfanas** (sin referencias desde otras páginas):
492
-
493
- ```bash
494
- echo "=== Páginas huérfanas ==="
495
- for PAGE in .planning/knowledge/wiki/*.md; do
496
- NOMBRE=$(basename "$PAGE" .md)
497
- [ "$NOMBRE" = "INDEX" ] || [ "$NOMBRE" = "log" ] && continue
498
- REFS=$(grep -r "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/ 2>/dev/null | \
499
- grep -v "^$PAGE:" | wc -l)
500
- INDEX_REF=$(grep "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/INDEX.md 2>/dev/null | wc -l)
501
- TOTAL=$((REFS + INDEX_REF))
502
- [ "$TOTAL" -eq 0 ] && echo " HUERFANA: $NOMBRE"
503
- done
504
- ```
505
-
506
- **L.2 — Páginas fuera del INDEX.md**:
507
-
508
- ```bash
509
- echo "=== Páginas no indexadas ==="
510
- for PAGE in .planning/knowledge/wiki/*.md; do
511
- NOMBRE=$(basename "$PAGE" .md)
512
- [ "$NOMBRE" = "INDEX" ] || [ "$NOMBRE" = "log" ] && continue
513
- INDEXED=$(grep "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/INDEX.md 2>/dev/null | wc -l)
514
- [ "$INDEXED" -eq 0 ] && echo " NO INDEXADA: $NOMBRE"
515
- done
516
- ```
517
-
518
- **L.3 — Páginas con frontmatter desactualizado** (no actualizadas en >60 días):
519
-
520
- ```bash
521
- echo "=== Páginas posiblemente desactualizadas (>60 días) ==="
522
- HACE_60=$(date -d "60 days ago" +%Y-%m-%d 2>/dev/null || \
523
- date -v-60d +%Y-%m-%d 2>/dev/null) # macOS fallback
524
- grep -r "actualizado:" .planning/knowledge/wiki/*.md 2>/dev/null | \
525
- awk -F: '{if ($2 < "'$HACE_60'") print " VIEJA: " $1 " (" $2 ")"}'
526
- ```
527
-
528
- **L.4 — Contradicciones marcadas pendientes**:
529
-
530
- ```bash
531
- echo "=== Contradicciones marcadas sin resolver ==="
532
- grep -r "\[CONTRADICE:" .planning/knowledge/wiki/*.md 2>/dev/null | \
533
- sed 's/:.*//' | sort -u
534
- ```
535
-
536
- **L.5 — Claims sin fuente en raw/**:
537
-
538
- ```bash
539
- echo "=== Páginas wiki sin fuentes en raw/ ==="
540
- for PAGE in .planning/knowledge/wiki/*.md; do
541
- NOMBRE=$(basename "$PAGE" .md)
542
- [ "$NOMBRE" = "INDEX" ] || [ "$NOMBRE" = "log" ] && continue
543
- FUENTES=$(grep "^- raw/" "$PAGE" 2>/dev/null | wc -l)
544
- [ "$FUENTES" -eq 0 ] && echo " SIN FUENTE: $NOMBRE"
545
- done
546
- ```
547
-
548
- **L.6 — Tamaño del wiki** (métricas de salud):
549
-
550
- ```bash
551
- echo "=== Métricas del wiki ==="
552
- echo " Páginas totales: $(ls .planning/knowledge/wiki/*.md 2>/dev/null | grep -v "INDEX\|log" | wc -l)"
553
- echo " Fuentes en raw/: $(ls .planning/knowledge/raw/ 2>/dev/null | wc -l)"
554
- echo " Outputs guardados: $(ls .planning/knowledge/outputs/ 2>/dev/null | wc -l)"
555
- echo " Último ingest: $(grep "^## \[" .planning/knowledge/wiki/log.md 2>/dev/null | tail -1)"
556
- echo " Entradas en log: $(grep "^## \[" .planning/knowledge/wiki/log.md 2>/dev/null | wc -l)"
557
- ```
558
-
559
- ### Acciones recomendadas post-lint
560
-
561
- Basándose en los resultados:
562
-
563
- | Hallazgo | Acción recomendada |
564
- |----------|-------------------|
565
- | Páginas huérfanas | Agregar links desde páginas relacionadas O eliminar si el topic ya no es relevante |
566
- | Páginas sin indexar | Agregar al INDEX.md bajo la categoría correcta |
567
- | Páginas >60 días sin actualizar | Revisar si el contenido sigue siendo válido; marcar como `[REVISAR]` si hay dudas |
568
- | Contradicciones pendientes | Resolver antes del próximo ingest — ver protocolo en `/swl:aprender` Paso 5.5 |
569
- | Páginas sin fuente | Agregar la fuente a `raw/` O marcar el contenido como `[SIN-FUENTE: verificar]` |
570
-
571
- ### Reporte del lint
572
-
573
- ```bash
574
- # Agregar al log
575
- echo "## [$(date +%Y-%m-%d)] lint | health check completado" >> .planning/knowledge/wiki/log.md
576
- echo " Hallazgos: [N huérfanas] huérfanas, [N] sin indexar, [N] contradicciones" \
577
- >> .planning/knowledge/wiki/log.md
578
- ```
579
-
580
- Mostrar al usuario:
581
- ```
582
- Wiki health check completado:
583
-
584
- ✓ Páginas totales: [N]
585
- ✓ Fuentes en raw/: [N]
586
-
587
- Hallazgos:
588
- Páginas huérfanas: [N] → [lista]
589
- Páginas sin indexar: [N] → [lista]
590
- Páginas desactualizadas: [N] → [lista]
591
- Contradicciones: [N] → [lista]
592
- Páginas sin fuente: [N] → [lista]
593
-
594
- [Si todo OK:]
595
- ✓ Wiki en buen estado — sin problemas críticos detectados.
596
-
597
- [Si hay hallazgos:]
598
- ¿Quieres que resuelva los hallazgos ahora? [S/N]
599
- ```
600
-
601
- ---
602
-
603
- ## Integración con otros comandos SWL
604
-
605
- | Comando | Integración con wiki |
606
- |---------|---------------------|
607
- | `/swl:aprender` | Paso 5.5 verifica consistencia con wiki antes de persistir; Fase 4.5 ejecuta lint del wiki |
608
- | `/swl:mapear-codebase` | El mapa del codebase puede ingresarse al wiki como fuente inicial |
609
- | `investigador-swl` | Guarda outputs en `outputs/` y fuentes en `raw/` automáticamente |
610
- | `arquitecto-swl` | Los ADRs pueden ingresarse al wiki como páginas de decisión |
611
- | `/swl:checkpoint` | Puede hacer referencia al INDEX.md del wiki para contexto de sesión |
612
-
613
- ## Reglas del sistema
614
-
615
- - `raw/` es **INMUTABLE** — nunca modificar archivos existentes; solo agregar nuevos.
616
- - `wiki/` es **responsabilidad del LLM** — el humano lee, el LLM escribe y mantiene.
617
- - `log.md` es **append-only** — nunca editar entradas existentes.
618
- - Cada ingest debe tocar entre 1 y 15 páginas wiki como máximo. Si una fuente toca más de 15 temas distintos, dividir en múltiples ingests.
619
- - Un topic que aparece en <3 fuentes no justifica su propia página — agregarlo a una página relacionada.
620
- - Los outputs en `outputs/` son legibles pero no se indexan automáticamente en INDEX.md — solo si el usuario confirma que deben incorporarse al wiki.
1
+ ---
2
+ name: swl:wiki
3
+ description: >
4
+ Gestiona el wiki de conocimiento del proyecto. Implementa el patrón de
5
+ knowledge base persistente y compounding de Andrej Karpathy: tres capas
6
+ separadas (raw/wiki/outputs) con index.md y log.md para navegación y
7
+ trazabilidad. Subcomandos: init, ingest, query, lint.
8
+ allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
9
+ ---
10
+
11
+ # /swl:wiki — Wiki de conocimiento del proyecto
12
+
13
+ Gestiona el knowledge base persistente del proyecto. A diferencia de
14
+ `.planning/APRENDIZAJES.md` (patrones técnicos de implementación), el wiki
15
+ almacena conocimiento de dominio, decisiones de investigación, arquitectura
16
+ conceptual y análisis que deben sobrevivir indefinidamente sin purgarse.
17
+
18
+ ## Arquitectura del wiki
19
+
20
+ ```
21
+ .planning/knowledge/
22
+ raw/ ← fuentes crudas INMUTABLES (artículos, docs, notas, outputs de agentes)
23
+ wiki/ ← síntesis mantenida por IA (una página .md por topic)
24
+ INDEX.md ← catálogo de todas las páginas (actualizado en cada ingest)
25
+ log.md ← historial cronológico append-only (parseable con grep)
26
+ [topic].md ← página por topic/agente/tecnología/decisión
27
+ outputs/ ← respuestas a queries, análisis, comparativas (referencias al wiki)
28
+ ```
29
+
30
+ **Separación de responsabilidades**:
31
+ - `raw/` → NUNCA modificar. Es la fuente de verdad. El LLM solo lee.
32
+ - `wiki/` → El LLM escribe y mantiene. El usuario lee.
33
+ - `outputs/` → El LLM escribe al responder queries. Se pueden reutilizar como fuentes.
34
+
35
+ ---
36
+
37
+ ## Subcomando: `init`
38
+
39
+ **Uso**: `/swl:wiki init`
40
+
41
+ Inicializa la estructura del wiki para el proyecto actual.
42
+
43
+ ### Pasos
44
+
45
+ 1. **Crear estructura de directorios**:
46
+
47
+ ```bash
48
+ mkdir -p .planning/knowledge/raw
49
+ mkdir -p .planning/knowledge/wiki
50
+ mkdir -p .planning/knowledge/outputs
51
+ echo "✓ Estructura de directorios creada"
52
+ ```
53
+
54
+ 2. **Crear INDEX.md** — catálogo inicial:
55
+
56
+ ```bash
57
+ cat > .planning/knowledge/wiki/INDEX.md << 'EOF'
58
+ ---
59
+ tipo: indice
60
+ actualizado: YYYY-MM-DD
61
+ total_paginas: 0
62
+ ---
63
+
64
+ # Índice del Wiki — [nombre del proyecto]
65
+
66
+ > Catálogo de todas las páginas del wiki. Actualizado automáticamente en cada ingest.
67
+ > Para navegar: leer esta página primero, luego profundizar en las páginas relevantes.
68
+
69
+ ## Páginas por categoría
70
+
71
+ ### Arquitectura y decisiones
72
+ _(vacío — agregar páginas vía `/swl:wiki ingest`)_
73
+
74
+ ### Tecnologías y frameworks
75
+ _(vacío)_
76
+
77
+ ### Investigaciones y análisis
78
+ _(vacío)_
79
+
80
+ ### Procesos y metodología
81
+ _(vacío)_
82
+
83
+ ---
84
+ _Wiki inicializado: [FECHA]. Usar `/swl:wiki ingest <archivo>` para agregar contenido._
85
+ EOF
86
+ ```
87
+
88
+ Reemplazar `YYYY-MM-DD` y `[nombre del proyecto]` con los valores reales.
89
+
90
+ 3. **Crear log.md** — historial cronológico:
91
+
92
+ ```bash
93
+ cat > .planning/knowledge/wiki/log.md << 'EOF'
94
+ # Log del Wiki — Historial cronológico
95
+
96
+ > Registro append-only de operaciones. Parseable:
97
+ > `grep "^## \[" .planning/knowledge/wiki/log.md | tail -10`
98
+ > `grep "ingest" .planning/knowledge/wiki/log.md`
99
+
100
+ EOF
101
+ echo "## [$(date +%Y-%m-%d)] init | Wiki inicializado para el proyecto" >> .planning/knowledge/wiki/log.md
102
+ ```
103
+
104
+ 4. **Crear schema.md** — reglas del wiki para este proyecto:
105
+
106
+ ```bash
107
+ cat > .planning/knowledge/schema.md << 'EOF'
108
+ # Schema del Wiki — Reglas y convenciones
109
+
110
+ ## Qué es este wiki
111
+ Knowledge base del proyecto [NOMBRE]. Captura conocimiento de dominio,
112
+ decisiones técnicas, investigaciones y análisis que deben persistir
113
+ indefinidamente como memoria institucional del proyecto.
114
+
115
+ ## Diferencia con APRENDIZAJES.md
116
+ - APRENDIZAJES.md → patrones de implementación técnica (código, bugs, anti-patrones)
117
+ - wiki/ → conocimiento de dominio, arquitectura conceptual, investigación (negocio, decisiones)
118
+
119
+ ## Estructura de cada página wiki (patrón Compiled Truth)
120
+
121
+ Cada página wiki sigue el patrón **Compiled Truth**: síntesis curada arriba,
122
+ evidencia cronológica abajo. La síntesis es el conocimiento compilado y
123
+ actualizado; la timeline es el registro inmutable de cómo se llegó ahí.
124
+
125
+ Cada archivo en wiki/ debe seguir este formato:
126
+
127
+ ```
128
+ ---
129
+ topic: [nombre del topic]
130
+ categoria: arquitectura | tecnologia | investigacion | proceso
131
+ actualizado: YYYY-MM-DD
132
+ fuentes: [N archivos en raw/ que respaldan esta página]
133
+ confianza: alta | media | baja
134
+ ---
135
+
136
+ # [Título]
137
+
138
+ ## Compiled Truth (síntesis curada)
139
+
140
+ ### Resumen
141
+ [Un párrafo que resume el topic — usado en INDEX.md]
142
+
143
+ ### Estado actual
144
+ [Qué se sabe HOY sobre este topic. Afirmaciones verificadas con fuentes.
145
+ Cada afirmación clave marcada con [F:N] donde N refiere a la fuente en la
146
+ sección Timeline.]
147
+
148
+ ### Decisiones vigentes
149
+ [Decisiones activas sobre este topic, con justificación breve.]
150
+
151
+ ### Relaciones
152
+ - Relacionado con: [[otro-topic]], [[otro-topic-2]]
153
+ - Depende de: [[prerequisito]]
154
+ - Referenciado por: [[topic-que-lo-usa]]
155
+
156
+ ## Timeline (evidencia cronológica)
157
+
158
+ ### [YYYY-MM-DD] [F:1] — [nombre de la fuente]
159
+ - Aportó: [qué conocimiento agregó]
160
+ - Fuente: raw/YYYYMMDD-nombre-fuente.md
161
+
162
+ ### [YYYY-MM-DD] [F:2] — [nombre de la fuente]
163
+ - Aportó: [qué conocimiento agregó]
164
+ - Cambió: [qué afirmación anterior se actualizó o contradijo]
165
+ - Fuente: raw/YYYYMMDD-nombre-fuente.md
166
+ ```
167
+
168
+ **Reglas del patrón Compiled Truth**:
169
+ - La sección **Compiled Truth** es la fuente de verdad actual — se reescribe con cada ingest.
170
+ - La sección **Timeline** es append-only — nunca modificar entradas anteriores.
171
+ - Si una fuente nueva contradice una anterior, actualizar Compiled Truth Y agregar en Timeline con `Cambió:`.
172
+ - El campo `confianza` refleja cuántas fuentes independientes respaldan las afirmaciones: alta (3+), media (2), baja (1).
173
+
174
+ ## Convenciones
175
+ - Links entre páginas: `[[nombre-archivo-sin-extension]]`
176
+ - Una página por topic, no por fuente
177
+ - El LLM actualiza wiki/ — el humano lee y valida
178
+ - raw/ es inmutable — nunca modificar archivos existentes
179
+ - outputs/ contiene respuestas completas — referenciar wiki/ para síntesis
180
+ - log.md es append-only — nunca editar entradas existentes
181
+
182
+ ## Topics prioritarios para este proyecto
183
+ [Completar con los dominios específicos del proyecto — ej: "autenticación", "facturación", "arquitectura de microservicios"]
184
+ EOF
185
+ ```
186
+
187
+ 5. **Confirmación al usuario**:
188
+
189
+ ```
190
+ ✓ Wiki inicializado en .planning/knowledge/
191
+
192
+ Estructura creada:
193
+ raw/ → depositar fuentes crudas aquí
194
+ wiki/ → el LLM mantiene las páginas
195
+ outputs/ → respuestas y análisis guardados
196
+ INDEX.md → catálogo de páginas (actualizado automáticamente)
197
+ log.md → historial cronológico de operaciones
198
+ schema.md → reglas del wiki (editar para personalizar al proyecto)
199
+
200
+ Próximos pasos:
201
+ /swl:wiki ingest <archivo> → ingerir primera fuente
202
+ /swl:wiki query "<pregunta>" → consultar el wiki
203
+ /swl:wiki lint → health check periódico
204
+ ```
205
+
206
+ ---
207
+
208
+ ## Subcomando: `ingest`
209
+
210
+ **Uso**: `/swl:wiki ingest <ruta-o-url>`
211
+
212
+ Ingiere una fuente en el wiki: lee, extrae knowledge, actualiza páginas relevantes,
213
+ actualiza INDEX.md y agrega entrada al log.
214
+
215
+ ### Tipos de fuente soportados
216
+
217
+ | Tipo | Ejemplo | Herramienta |
218
+ |------|---------|-------------|
219
+ | `.md`, `.txt` (local) | `ingest ./notas/reunion.md` | Read |
220
+ | `.pdf` ≤ 20 páginas (local) | `ingest ./docs/guia.pdf` | Read con `pages:` |
221
+ | `.pdf` > 20 págs o con tablas | `ingest ./docs/reporte.pdf` | swl-markitdown |
222
+ | `.docx`, `.pptx` (local) | `ingest ./docs/arquitectura.docx` | swl-markitdown |
223
+ | `.xlsx`, `.xls` (local) | `ingest ./datos/metricas.xlsx` | swl-markitdown |
224
+ | `.ipynb` Jupyter (local) | `ingest ./notebooks/analisis.ipynb` | swl-markitdown |
225
+ | `.zip` con documentos | `ingest ./docs/documentacion.zip` | swl-markitdown |
226
+ | URL estática (HTML simple) | `ingest https://blog.domain.com/post` | WebFetch |
227
+ | URL dinámica (SPA, JS heavy) | `ingest https://spa-site.com/docs` | agent-browser |
228
+ | URL de YouTube | `ingest https://www.youtube.com/watch?v=...` | swl-markitdown |
229
+ | Output de agente previo | `ingest .planning/knowledge/outputs/2026-04-09-investigacion.md` | Read |
230
+
231
+ ### Pasos del ingest
232
+
233
+ **Paso I.1 — Leer la fuente** (detección automática de herramienta):
234
+
235
+ ```bash
236
+ PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
237
+ CLI_MKD="$PROJECT_ROOT/scripts/vendor/markitdown/cli.py"
238
+ FUENTE="[RUTA_O_URL]"
239
+
240
+ # Detectar tipo de fuente y elegir herramienta
241
+ if echo "$FUENTE" | grep -qE "^https?://"; then
242
+ # Fuente web
243
+ if echo "$FUENTE" | grep -qE "youtube\.com|youtu\.be"; then
244
+ # YouTube: usar swl-markitdown para transcripción
245
+ CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
246
+ else
247
+ # HTML: WebFetch primero, agent-browser como fallback
248
+ CONTENIDO=$(# usar WebFetch tool aquí)
249
+ PALABRAS=$(echo "$CONTENIDO" | wc -w)
250
+ if [ "$PALABRAS" -lt 500 ]; then
251
+ CONTENIDO=$(# usar agent-browser como fallback)
252
+ fi
253
+ fi
254
+ else
255
+ # Archivo local: elegir según extensión
256
+ EXT="${FUENTE##*.}"
257
+ case "$EXT" in
258
+ md|txt|markdown)
259
+ # Read tool directamente
260
+ ;;
261
+ pdf)
262
+ # Read para PDFs cortos; swl-markitdown para PDFs con tablas o > 20 págs
263
+ CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
264
+ ;;
265
+ docx|pptx|xlsx|xls|ipynb|epub|zip|csv)
266
+ # swl-markitdown para formatos que Read no soporta
267
+ CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
268
+ if [ -z "$CONTENIDO" ]; then
269
+ echo "Error: swl-markitdown no pudo convertir $FUENTE"
270
+ echo "Verificar: python $CLI_MKD --check"
271
+ exit 1
272
+ fi
273
+ ;;
274
+ *)
275
+ # Intentar con swl-markitdown; si falla, reportar
276
+ CONTENIDO=$(python "$CLI_MKD" "$FUENTE" 2>/dev/null)
277
+ ;;
278
+ esac
279
+ fi
280
+ ```
281
+
282
+ **Paso I.2 — Guardar copia en raw/** (si la fuente es externa o fue convertida):
283
+
284
+ ```bash
285
+ FECHA=$(date +%Y%m%d)
286
+ NOMBRE_LIMPIO=$(echo "[FUENTE]" | sed 's|https://||' | sed 's|[/. ]|-|g' | cut -c1-60)
287
+
288
+ # Para archivos Markdown/texto ya en formato correcto
289
+ cp "[FUENTE_LOCAL]" ".planning/knowledge/raw/${FECHA}-${NOMBRE_LIMPIO}.md"
290
+
291
+ # Para archivos convertidos con swl-markitdown (DOCX, XLSX, PPTX, etc.)
292
+ python "$CLI_MKD" "[FUENTE_LOCAL]" > ".planning/knowledge/raw/${FECHA}-${NOMBRE_LIMPIO}.md" 2>/dev/null
293
+
294
+ # Para URLs (WebFetch o agent-browser)
295
+ # agent-browser get text "article" > ".planning/knowledge/raw/${FECHA}-${NOMBRE_LIMPIO}.md"
296
+ ```
297
+
298
+ **Paso I.3 — Extraer knowledge de la fuente**:
299
+
300
+ Leer la fuente completa e identificar:
301
+ - Topics principales cubiertos
302
+ - Entidades mencionadas (tecnologías, patrones, decisiones, personas)
303
+ - Afirmaciones verificables con su fuente
304
+ - Relaciones con topics que ya existen en el wiki
305
+
306
+ **Paso I.4 — Actualizar páginas wiki existentes**:
307
+
308
+ Para cada topic cubierto en la fuente que ya tiene página en `wiki/`:
309
+ - Leer la página existente
310
+ - **Compiled Truth**: Reescribir la sección "Estado actual" integrando la información nueva con la existente. No eliminar afirmaciones válidas — solo actualizarlas o expandirlas.
311
+ - **Timeline**: Agregar nueva entrada cronológica append-only con `[F:N]` y lo que la fuente aportó. Si contradice algo, incluir `Cambió:` en la entrada.
312
+ - Actualizar la fecha `actualizado` y el campo `fuentes` (incrementar) en el frontmatter
313
+ - Actualizar `confianza`: baja (1 fuente) → media (2) → alta (3+)
314
+ - Si la nueva info contradice la anterior: actualizar Compiled Truth con la versión correcta Y registrar el cambio en Timeline con `Cambió:`
315
+
316
+ **Paso I.5 — Crear páginas wiki nuevas** (para topics que no tienen página):
317
+
318
+ Para cada topic nuevo identificado que justifique su propia página (criterio: ≥3 afirmaciones distintas sobre el mismo topic):
319
+
320
+ ```bash
321
+ cat > ".planning/knowledge/wiki/[nombre-topic].md" << 'EOF'
322
+ ---
323
+ topic: [nombre]
324
+ categoria: [arquitectura|tecnologia|investigacion|proceso]
325
+ actualizado: YYYY-MM-DD
326
+ fuentes: 1
327
+ confianza: baja
328
+ ---
329
+
330
+ # [Título del topic]
331
+
332
+ ## Compiled Truth (síntesis curada)
333
+
334
+ ### Resumen
335
+ [Un párrafo conciso — este texto va al INDEX.md]
336
+
337
+ ### Estado actual
338
+ [Afirmaciones verificadas, marcadas con [F:1] referenciando la timeline.]
339
+
340
+ ### Decisiones vigentes
341
+ [Decisiones activas si aplica, o eliminar sección si no hay.]
342
+
343
+ ### Relaciones
344
+ - Relacionado con: [otros topics del wiki si aplica]
345
+
346
+ ## Timeline (evidencia cronológica)
347
+
348
+ ### [YYYY-MM-DD] [F:1] — [nombre de la fuente]
349
+ - Aportó: [qué conocimiento agregó]
350
+ - Fuente: raw/YYYYMMDD-nombre-fuente.md
351
+ EOF
352
+ ```
353
+
354
+ **Paso I.6 — Actualizar INDEX.md**:
355
+
356
+ Agregar o actualizar la entrada del topic nuevo en INDEX.md:
357
+
358
+ ```bash
359
+ # Agregar al INDEX.md bajo la categoría correspondiente:
360
+ # | [[nombre-topic]] | [resumen de una línea] | [YYYY-MM-DD] |
361
+ ```
362
+
363
+ Estructura de la tabla en INDEX.md:
364
+ ```markdown
365
+ | Página | Resumen | Actualizado |
366
+ |--------|---------|-------------|
367
+ | [[nombre-topic]] | Resumen de una línea | YYYY-MM-DD |
368
+ ```
369
+
370
+ **Paso I.7 — Agregar al log**:
371
+
372
+ ```bash
373
+ echo "## [$(date +%Y-%m-%d)] ingest | [nombre de la fuente] → [N páginas tocadas]" \
374
+ >> .planning/knowledge/wiki/log.md
375
+ echo " Fuentes en raw: $(ls .planning/knowledge/raw/ | wc -l) total" \
376
+ >> .planning/knowledge/wiki/log.md
377
+ ```
378
+
379
+ **Paso I.8 — Reporte al usuario**:
380
+
381
+ ```
382
+ Ingest completado: [nombre de la fuente]
383
+
384
+ Páginas actualizadas: [N]
385
+ - wiki/[topic1].md — [qué se actualizó]
386
+ - wiki/[topic2].md — [qué se actualizó]
387
+
388
+ Páginas nuevas creadas: [N]
389
+ - wiki/[nuevo-topic].md — [descripción]
390
+
391
+ INDEX.md actualizado: [N] entradas
392
+ log.md: entrada agregada
393
+
394
+ [Si hay contradicciones detectadas:]
395
+ ⚠ Contradicciones detectadas — revisar antes de continuar:
396
+ - wiki/[topic].md contradice raw/[fuente-anterior].md en: [claim]
397
+ ```
398
+
399
+ ---
400
+
401
+ ## Subcomando: `query`
402
+
403
+ **Uso**: `/swl:wiki query "<pregunta>"`
404
+
405
+ Responde una pregunta usando el knowledge base del wiki. Guarda la respuesta
406
+ en `outputs/` para que componga en el knowledge base.
407
+
408
+ ### Pasos del query
409
+
410
+ **Paso Q.1 — Leer INDEX.md primero**:
411
+
412
+ ```bash
413
+ cat .planning/knowledge/wiki/INDEX.md
414
+ ```
415
+
416
+ Identificar qué páginas del wiki son relevantes para la pregunta.
417
+ **No cargar todo el wiki** — solo las páginas identificadas en el índice.
418
+
419
+ **Paso Q.2 — Leer páginas relevantes**:
420
+
421
+ Para cada página identificada como relevante:
422
+ ```bash
423
+ cat .planning/knowledge/wiki/[topic].md
424
+ ```
425
+
426
+ Máximo 5-7 páginas por query para mantener el costo bajo.
427
+ Si la pregunta requiere más páginas, descomponerla en sub-preguntas.
428
+
429
+ **Paso Q.3 — Sintetizar respuesta**:
430
+
431
+ Responder la pregunta basándose SOLO en el contenido del wiki.
432
+ Si la pregunta no puede responderse con el wiki actual, indicarlo explícitamente:
433
+ ```
434
+ ⚠ El wiki actual no tiene suficiente información sobre [aspecto].
435
+ Fuentes faltantes sugeridas:
436
+ - [tipo de fuente que respondería esto]
437
+
438
+ ¿Ejecutar investigación con investigador-swl para completar el wiki?
439
+ ```
440
+
441
+ **Paso Q.4 — Guardar output**:
442
+
443
+ ```bash
444
+ FECHA=$(date +%Y-%m-%d)
445
+ PREGUNTA_SLUG=$(echo "[PREGUNTA]" | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | cut -c1-50)
446
+ OUTPUT_PATH=".planning/knowledge/outputs/${FECHA}-query-${PREGUNTA_SLUG}.md"
447
+
448
+ cat > "$OUTPUT_PATH" << 'EOF'
449
+ ---
450
+ fecha: YYYY-MM-DD
451
+ tipo: query
452
+ pregunta: "[PREGUNTA]"
453
+ paginas_consultadas: [LISTA]
454
+ ---
455
+
456
+ # Respuesta: [PREGUNTA]
457
+
458
+ [RESPUESTA COMPLETA]
459
+
460
+ ## Fuentes wiki consultadas
461
+ - [[topic1]]
462
+ - [[topic2]]
463
+ EOF
464
+
465
+ echo "✓ Respuesta guardada en: $OUTPUT_PATH"
466
+ ```
467
+
468
+ **Paso Q.5 — Proponer si el output debe incorporarse al wiki**:
469
+
470
+ ```
471
+ Output guardado en outputs/[archivo].md
472
+
473
+ ¿Incorporar esta respuesta al wiki?
474
+ [S] Sí — es un análisis valioso que debería estar en wiki/
475
+ [N] No — es una respuesta puntual que no suma al wiki
476
+ ```
477
+
478
+ Si el usuario dice Sí: ejecutar ingest sobre el output para integrarlo al wiki.
479
+
480
+ ---
481
+
482
+ ## Subcomando: `lint`
483
+
484
+ **Uso**: `/swl:wiki lint`
485
+
486
+ Health check del wiki. Detecta problemas de calidad antes de que se acumulen.
487
+ Ejecutar mensualmente o después de ingestas masivas.
488
+
489
+ ### Verificaciones del lint
490
+
491
+ **L.1 — Páginas huérfanas** (sin referencias desde otras páginas):
492
+
493
+ ```bash
494
+ echo "=== Páginas huérfanas ==="
495
+ for PAGE in .planning/knowledge/wiki/*.md; do
496
+ NOMBRE=$(basename "$PAGE" .md)
497
+ [ "$NOMBRE" = "INDEX" ] || [ "$NOMBRE" = "log" ] && continue
498
+ REFS=$(grep -r "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/ 2>/dev/null | \
499
+ grep -v "^$PAGE:" | wc -l)
500
+ INDEX_REF=$(grep "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/INDEX.md 2>/dev/null | wc -l)
501
+ TOTAL=$((REFS + INDEX_REF))
502
+ [ "$TOTAL" -eq 0 ] && echo " HUERFANA: $NOMBRE"
503
+ done
504
+ ```
505
+
506
+ **L.2 — Páginas fuera del INDEX.md**:
507
+
508
+ ```bash
509
+ echo "=== Páginas no indexadas ==="
510
+ for PAGE in .planning/knowledge/wiki/*.md; do
511
+ NOMBRE=$(basename "$PAGE" .md)
512
+ [ "$NOMBRE" = "INDEX" ] || [ "$NOMBRE" = "log" ] && continue
513
+ INDEXED=$(grep "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/INDEX.md 2>/dev/null | wc -l)
514
+ [ "$INDEXED" -eq 0 ] && echo " NO INDEXADA: $NOMBRE"
515
+ done
516
+ ```
517
+
518
+ **L.3 — Páginas con frontmatter desactualizado** (no actualizadas en >60 días):
519
+
520
+ ```bash
521
+ echo "=== Páginas posiblemente desactualizadas (>60 días) ==="
522
+ HACE_60=$(date -d "60 days ago" +%Y-%m-%d 2>/dev/null || \
523
+ date -v-60d +%Y-%m-%d 2>/dev/null) # macOS fallback
524
+ grep -r "actualizado:" .planning/knowledge/wiki/*.md 2>/dev/null | \
525
+ awk -F: '{if ($2 < "'$HACE_60'") print " VIEJA: " $1 " (" $2 ")"}'
526
+ ```
527
+
528
+ **L.4 — Contradicciones marcadas pendientes**:
529
+
530
+ ```bash
531
+ echo "=== Contradicciones marcadas sin resolver ==="
532
+ grep -r "\[CONTRADICE:" .planning/knowledge/wiki/*.md 2>/dev/null | \
533
+ sed 's/:.*//' | sort -u
534
+ ```
535
+
536
+ **L.5 — Claims sin fuente en raw/**:
537
+
538
+ ```bash
539
+ echo "=== Páginas wiki sin fuentes en raw/ ==="
540
+ for PAGE in .planning/knowledge/wiki/*.md; do
541
+ NOMBRE=$(basename "$PAGE" .md)
542
+ [ "$NOMBRE" = "INDEX" ] || [ "$NOMBRE" = "log" ] && continue
543
+ FUENTES=$(grep "^- raw/" "$PAGE" 2>/dev/null | wc -l)
544
+ [ "$FUENTES" -eq 0 ] && echo " SIN FUENTE: $NOMBRE"
545
+ done
546
+ ```
547
+
548
+ **L.6 — Tamaño del wiki** (métricas de salud):
549
+
550
+ ```bash
551
+ echo "=== Métricas del wiki ==="
552
+ echo " Páginas totales: $(ls .planning/knowledge/wiki/*.md 2>/dev/null | grep -v "INDEX\|log" | wc -l)"
553
+ echo " Fuentes en raw/: $(ls .planning/knowledge/raw/ 2>/dev/null | wc -l)"
554
+ echo " Outputs guardados: $(ls .planning/knowledge/outputs/ 2>/dev/null | wc -l)"
555
+ echo " Último ingest: $(grep "^## \[" .planning/knowledge/wiki/log.md 2>/dev/null | tail -1)"
556
+ echo " Entradas en log: $(grep "^## \[" .planning/knowledge/wiki/log.md 2>/dev/null | wc -l)"
557
+ ```
558
+
559
+ ### Acciones recomendadas post-lint
560
+
561
+ Basándose en los resultados:
562
+
563
+ | Hallazgo | Acción recomendada |
564
+ |----------|-------------------|
565
+ | Páginas huérfanas | Agregar links desde páginas relacionadas O eliminar si el topic ya no es relevante |
566
+ | Páginas sin indexar | Agregar al INDEX.md bajo la categoría correcta |
567
+ | Páginas >60 días sin actualizar | Revisar si el contenido sigue siendo válido; marcar como `[REVISAR]` si hay dudas |
568
+ | Contradicciones pendientes | Resolver antes del próximo ingest — ver protocolo en `/swl:aprender` Paso 5.5 |
569
+ | Páginas sin fuente | Agregar la fuente a `raw/` O marcar el contenido como `[SIN-FUENTE: verificar]` |
570
+
571
+ ### Reporte del lint
572
+
573
+ ```bash
574
+ # Agregar al log
575
+ echo "## [$(date +%Y-%m-%d)] lint | health check completado" >> .planning/knowledge/wiki/log.md
576
+ echo " Hallazgos: [N huérfanas] huérfanas, [N] sin indexar, [N] contradicciones" \
577
+ >> .planning/knowledge/wiki/log.md
578
+ ```
579
+
580
+ Mostrar al usuario:
581
+ ```
582
+ Wiki health check completado:
583
+
584
+ ✓ Páginas totales: [N]
585
+ ✓ Fuentes en raw/: [N]
586
+
587
+ Hallazgos:
588
+ Páginas huérfanas: [N] → [lista]
589
+ Páginas sin indexar: [N] → [lista]
590
+ Páginas desactualizadas: [N] → [lista]
591
+ Contradicciones: [N] → [lista]
592
+ Páginas sin fuente: [N] → [lista]
593
+
594
+ [Si todo OK:]
595
+ ✓ Wiki en buen estado — sin problemas críticos detectados.
596
+
597
+ [Si hay hallazgos:]
598
+ ¿Quieres que resuelva los hallazgos ahora? [S/N]
599
+ ```
600
+
601
+ ---
602
+
603
+ ## Integración con otros comandos SWL
604
+
605
+ | Comando | Integración con wiki |
606
+ |---------|---------------------|
607
+ | `/swl:aprender` | Paso 5.5 verifica consistencia con wiki antes de persistir; Fase 4.5 ejecuta lint del wiki |
608
+ | `/swl:mapear-codebase` | El mapa del codebase puede ingresarse al wiki como fuente inicial |
609
+ | `investigador-swl` | Guarda outputs en `outputs/` y fuentes en `raw/` automáticamente |
610
+ | `arquitecto-swl` | Los ADRs pueden ingresarse al wiki como páginas de decisión |
611
+ | `/swl:checkpoint` | Puede hacer referencia al INDEX.md del wiki para contexto de sesión |
612
+
613
+ ## Reglas del sistema
614
+
615
+ - `raw/` es **INMUTABLE** — nunca modificar archivos existentes; solo agregar nuevos.
616
+ - `wiki/` es **responsabilidad del LLM** — el humano lee, el LLM escribe y mantiene.
617
+ - `log.md` es **append-only** — nunca editar entradas existentes.
618
+ - Cada ingest debe tocar entre 1 y 15 páginas wiki como máximo. Si una fuente toca más de 15 temas distintos, dividir en múltiples ingests.
619
+ - Un topic que aparece en <3 fuentes no justifica su propia página — agregarlo a una página relacionada.
620
+ - Los outputs en `outputs/` son legibles pero no se indexan automáticamente en INDEX.md — solo si el usuario confirma que deben incorporarse al wiki.