@saulwade/swl-ses 1.6.1 → 1.6.5
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 +3 -3
- package/README.md +4 -4
- package/agentes/_intent-spec.md +73 -0
- package/agentes/auto-evolucion-swl.md +24 -0
- package/agentes/cloud-infra-swl.md +25 -0
- package/agentes/datos-swl.md +23 -0
- package/agentes/devops-ci-swl.md +24 -0
- package/agentes/gh-fix-ci-swl.md +275 -0
- package/agentes/migrador-swl.md +22 -0
- package/agentes/nemesis-auditor-swl.md +90 -1
- package/agentes/pagos-swl.md +25 -0
- package/agentes/release-manager-swl.md +24 -0
- package/agentes/sre-swl.md +24 -0
- package/comandos/swl/exportar-vault.md +106 -14
- package/comandos/swl/nemesis.md +70 -3
- package/comandos/swl/planear-fase.md +16 -0
- package/comandos/swl/release.md +62 -2
- package/comandos/swl/salud.md +32 -0
- package/comandos/swl/verificar.md +116 -2
- package/habilidades/agent-browser/SKILL.md +111 -4
- package/habilidades/agent-deep-links/SKILL.md +148 -0
- package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
- package/habilidades/backend-async-postgres-testing/SKILL.md +215 -0
- package/habilidades/backend-error-design/SKILL.md +221 -0
- package/habilidades/browser-interaction-patterns/SKILL.md +514 -0
- package/habilidades/browser-research-domains/SKILL.md +635 -0
- package/habilidades/changelog-generator/SKILL.md +172 -0
- package/habilidades/changelog-generator/scripts/parse-commits.js +354 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +3 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +17 -1
- package/habilidades/fastapi-experto/SKILL.md +49 -4
- package/habilidades/harness-claude-code/SKILL.md +4 -1
- package/habilidades/meta-skills-estandar/SKILL.md +6 -0
- package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
- package/habilidades/postgresql-experto/SKILL.md +80 -4
- package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
- package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -0
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
- package/habilidades/proceso-modular-split/SKILL.md +256 -0
- package/habilidades/reducir-entropia/SKILL.md +219 -0
- package/habilidades/tdd-workflow/SKILL.md +12 -5
- package/hooks/extraccion-aprendizajes.js +8 -0
- package/hooks/lib/deep-links.js +185 -0
- package/hooks/lib/evolution-tracker.js +115 -18
- package/hooks/lib/gateway-notify.js +70 -7
- package/hooks/lib/task-budget.js +218 -0
- package/hooks/validar-intent-spec.js +222 -0
- package/manifiestos/hooks-config.json +9 -0
- package/manifiestos/modulos.json +22 -3
- package/manifiestos/skills-lock.json +1247 -1142
- package/package.json +3 -3
- package/plugin.json +18 -2
- package/reglas/arquitectura.md +38 -0
- package/reglas/arreglar-al-detectar.md +93 -0
- package/reglas/auditorias-documentales-estructurales.md +38 -0
- package/reglas/fragmentos-compartidos.md +26 -0
- package/reglas/intent-engineering.md +214 -0
- package/reglas/registro-componentes-nuevos.md +52 -0
- package/reglas/tests-cleanup.md +220 -0
- package/schemas/agent-frontmatter.schema.json +294 -167
- package/schemas/agent-message.schema.json +73 -53
- package/schemas/agent-output-implementacion.schema.json +114 -85
- package/schemas/agent-output-planificacion.schema.json +150 -113
- package/schemas/agent-output-review.schema.json +98 -78
- package/schemas/diary-entry.schema.json +42 -10
- package/schemas/hook-profiles.schema.json +54 -39
- package/schemas/hooks-config.schema.json +89 -74
- package/schemas/instinct.schema.json +152 -115
- package/schemas/modulos.schema.json +38 -29
- package/schemas/perfiles.schema.json +36 -28
- package/schemas/plugin.schema.json +77 -64
- package/schemas/skill-evals.schema.json +119 -95
- package/schemas/skill-frontmatter.schema.json +245 -170
- package/scripts/generar-inventario.js +3 -1
- package/scripts/lib/mcp_config.py +29 -14
- package/scripts/lib/schema-version.js +164 -0
- package/scripts/mcp-orchestrator.py +153 -131
- package/scripts/mcp-pool-manager.py +132 -107
- package/scripts/mcp-telemetry.py +139 -120
- package/scripts/validar-manifest.js +1 -1
- package/scripts/validar.js +3 -2
- package/scripts/verificar-release.js +199 -1
package/comandos/swl/salud.md
CHANGED
|
@@ -347,6 +347,38 @@ Documentación completa en `@docs/variables-entorno.md`.
|
|
|
347
347
|
Este paso siempre se ejecuta (no es opt-in) — la calidad de CLAUDE.md
|
|
348
348
|
es métrica continua del sistema.
|
|
349
349
|
|
|
350
|
+
## Paso 5g — Smoke test de servidores MCP (opt-in)
|
|
351
|
+
|
|
352
|
+
Si el proyecto declara servidores MCP en `.claude/settings.json` o en
|
|
353
|
+
`~/.cursor/mcp.json` o `~/.claude/settings.json` (global), ejecutar un smoke
|
|
354
|
+
test rápido para detectar configuraciones rotas antes de que fallen en uso
|
|
355
|
+
interactivo:
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
python scripts/mcp-orchestrator.py status --json 2>/dev/null
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
El orchestrator levanta un proceso MCP fresh por cada server configurado y
|
|
362
|
+
reporta:
|
|
363
|
+
|
|
364
|
+
- `status: "OK"` — handshake completo + lista de tools devuelta correctamente
|
|
365
|
+
- `status: "ERROR"` — fallo de handshake, autenticación o spawn
|
|
366
|
+
|
|
367
|
+
Casos detectables que `/swl:salud` debe reportar:
|
|
368
|
+
|
|
369
|
+
| Síntoma | Causa probable | Acción sugerida |
|
|
370
|
+
|---|---|---|
|
|
371
|
+
| `40101 Authorization required` | apiKey desincronizada entre cliente y plugin | Verificar `HKCU\Environment` (Windows) o variable de entorno del shell coincide con apiKey del plugin |
|
|
372
|
+
| `Server failed to start` | Binario no encontrado en `command` | Verificar path absoluto del binario |
|
|
373
|
+
| `Connection refused` | Plugin/servicio destino no corriendo | Iniciar plugin (ej. Obsidian con Local REST API activo) |
|
|
374
|
+
| `env=None passed` | Config tiene `"env": {}` literal — rompe herencia | Omitir clave `env` por completo en JSON (no dejar vacía) |
|
|
375
|
+
|
|
376
|
+
Si no hay servers configurados, este paso se omite silenciosamente.
|
|
377
|
+
|
|
378
|
+
Este smoke test detecta drift de apiKeys ANTES de que el usuario interactivo
|
|
379
|
+
encuentre 40101 en una invocación crítica. Recomendado ejecutar como parte del
|
|
380
|
+
flujo `/swl:salud` periódico mensual.
|
|
381
|
+
|
|
350
382
|
## Paso 5e — Verificación de drift de skills (skills-lock)
|
|
351
383
|
|
|
352
384
|
Si existe `manifiestos/skills-lock.json`, comparar el hash actual de cada
|
|
@@ -21,6 +21,7 @@ Eres el coordinador de verificación SWL. Tu trabajo es asegurar la calidad del
|
|
|
21
21
|
| `--until-converge` | Itera el ciclo verificar → corregir → re-verificar hasta convergencia (0 hallazgos CRÍTICO + ALTO + MAYOR en una pasada nueva) o hasta alcanzar `--max-iter`. Compatible con `--ultra` y `--solo-codigo`/`--solo-seguridad`. Ver sección "Modo `--until-converge`". |
|
|
22
22
|
| `--max-iter=N` | Límite de iteraciones para `--until-converge`. Default: `5`. Rango válido: 1-10. |
|
|
23
23
|
| `--no-prompt` | Suprime la confirmación interactiva entre pasadas (para CI). Solo aplica con `--until-converge`. |
|
|
24
|
+
| `--ci-aware` | Antes de declarar convergencia natural en `--until-converge`, espera el estado terminal del CI sobre el HEAD pushed. Convergencia confirmada solo si CI verde + revisores APROBADO. CI rojo reabre el loop con los hallazgos del workflow como pasada N+1. Útil cuando el alcance modifica migraciones, seeds o tests E2E que el CI valida pero los revisores locales no. Ver sección 4.6.7. |
|
|
24
25
|
|
|
25
26
|
### Cuándo usar `--ultra`
|
|
26
27
|
|
|
@@ -286,9 +287,18 @@ El loop se detiene cuando se cumple **cualquiera** de estas señales (la primera
|
|
|
286
287
|
| **A — éxito** | La pasada N produce 0 hallazgos nuevos de severidad `CRÍTICO`, `ALTO` o `MAYOR` | Convergencia natural — la fase está limpia |
|
|
287
288
|
| **B — adversarial** | La pasada N+1 introduce ≥5 hallazgos NUEVOS sobre el código corregido en la pasada N | Las correcciones están introduciendo regresión; escalar al usuario |
|
|
288
289
|
| **C — máximo** | Se alcanza `--max-iter=N` (default 5) sin converger | No-convergente; reportar al usuario |
|
|
290
|
+
| **D — CI verde** (solo con `--ci-aware`) | Tras Señal A, el CI sobre el HEAD pushed termina en estado `success` para todos los workflows aplicables al SHA | Convergencia confirmada cross-stack (revisores + tests locales + CI con migraciones/seeds/E2E) |
|
|
289
291
|
|
|
290
292
|
Los hallazgos `MEDIO`, `BAJO` y `SUGERENCIA` no rompen convergencia — se acumulan como deuda técnica documentada.
|
|
291
293
|
|
|
294
|
+
**Importante sobre la Señal D**: sin `--ci-aware`, la convergencia natural se evalúa SOLO contra revisores + suite local. Esto NO detecta bugs que solo emergen en CI:
|
|
295
|
+
- Migraciones aplicadas a BD limpia (CI fresh) vs BD productiva (donde seeds ya corrieron).
|
|
296
|
+
- Seeds dependientes que fallan en cadena por orden migración↔seed invertido.
|
|
297
|
+
- Tests E2E que requieren datos demo.
|
|
298
|
+
- Partial unique indexes con `WHERE` que no son predicado puro (rompen en CI fresh).
|
|
299
|
+
|
|
300
|
+
Origen del flag: SIGAF 2026-05-15 declaró convergencia natural en Pasada 3 (commit `4d2fb23`) basado en revisores APROBADO + 2161 pytest passed. 3 commits posteriores el CI Playwright reveló 3 tests E2E fallando por bug introducido en la propia Pasada 2 (migración 0061 con índice `WHERE` que rompía seeds en BD limpia). El loop cerró sin validar la integración E2E.
|
|
301
|
+
|
|
292
302
|
### 4.6.2 — Control de pausa entre iteraciones
|
|
293
303
|
|
|
294
304
|
Antes de invocar al implementador para aplicar correcciones de la pasada N, el comando muestra un resumen y permite al usuario decidir:
|
|
@@ -381,9 +391,63 @@ El VERIFICACION.md reportado al usuario al final del loop incluye una sección a
|
|
|
381
391
|
- Estado persistido: `.planning/fases/0N-converge-run-[timestamp].json`
|
|
382
392
|
```
|
|
383
393
|
|
|
384
|
-
### 4.6.7 —
|
|
394
|
+
### 4.6.7 — Protocolo `--ci-aware` (Señal D)
|
|
395
|
+
|
|
396
|
+
Cuando `--ci-aware` está activo, el bucle de convergencia se extiende con un gate adicional ANTES de declarar Señal A como cierre definitivo:
|
|
397
|
+
|
|
398
|
+
**Precondición**: el último commit de la pasada N debe estar pusheado a la rama remota. Si no:
|
|
399
|
+
|
|
400
|
+
```
|
|
401
|
+
Pasada N converge natural pero --ci-aware requiere CI sobre HEAD pushed.
|
|
402
|
+
|
|
403
|
+
HEAD local: abc1234 (no pusheado)
|
|
404
|
+
[p] push automático + monitor CI
|
|
405
|
+
[c] continuar sin --ci-aware (convergencia solo local)
|
|
406
|
+
[q] abortar — pushear manualmente y re-invocar
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Con `--no-prompt`: default es `p` (push automático).
|
|
410
|
+
|
|
411
|
+
**Algoritmo de espera**:
|
|
412
|
+
|
|
413
|
+
1. Tras Señal A, obtener SHA actual de `HEAD` y ejecutar `git ls-remote origin <rama>` para confirmar que está sincronizado.
|
|
414
|
+
2. Listar workflows aplicables al SHA con:
|
|
415
|
+
```bash
|
|
416
|
+
gh run list --branch <rama> --limit 10 \
|
|
417
|
+
--json status,conclusion,name,headSha \
|
|
418
|
+
--jq '.[] | select(.headSha == "<SHA>")'
|
|
419
|
+
```
|
|
420
|
+
3. Esperar usando la regla global `monitor-ci.md` (patrón Monitor con `gh --jq`, NO `| jq`).
|
|
421
|
+
4. Clasificar resultado:
|
|
422
|
+
- **Todos `completed`+`success`** → Señal D confirmada, convergencia válida.
|
|
423
|
+
- **Algún workflow en `failure` o `cancelled`** → reabrir loop. Los hallazgos se extraen del log con `gh run view <run-id> --log-failed` y se procesan como pasada N+1.
|
|
424
|
+
- **Algún workflow `skipped` legítimo** (no se disparó por `paths:` filter) → NO suma al gate; convergencia válida si los aplicables están `success`.
|
|
425
|
+
- **Workflows aún en `in_progress` después del timeout configurado en monitor-ci** → escalar al usuario, no cerrar convergencia.
|
|
426
|
+
|
|
427
|
+
**Workflows aplicables vs no aplicables**:
|
|
428
|
+
|
|
429
|
+
`gh run list` puede listar workflows que NO se dispararon en el SHA actual por filtros `paths:` en el `on:` del workflow (ej. cambio solo en frontend no dispara Backend CI). Esos son **legítimamente ausentes**, no fallos.
|
|
430
|
+
|
|
431
|
+
El gate solo evalúa workflows que **sí se dispararon en el SHA**. La verificación es:
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
gh run list --branch <rama> --limit 10 --json headSha,name,status,conclusion \
|
|
435
|
+
--jq '[.[] | select(.headSha | startswith("<sha-corto>"))] | all(.[]; .status == "completed" and .conclusion == "success")'
|
|
436
|
+
```
|
|
385
437
|
|
|
386
|
-
|
|
438
|
+
Output `true` → Señal D. `false` con detalle → reabrir loop.
|
|
439
|
+
|
|
440
|
+
**Anti-patrones explícitos**:
|
|
441
|
+
|
|
442
|
+
- **Tratar timeout del monitor como "verde por default"**: el timeout significa "estado desconocido", NO `success`. Re-armar monitor o escalar al usuario.
|
|
443
|
+
- **Sumar skipped legítimo como pass sin matizar**: si el workflow X no se disparó porque el commit solo tocó docs, está bien, pero el reporte final debe enumerarlo: "Frontend CI: skipped por filtro paths (commit toca solo backend/)".
|
|
444
|
+
- **Asumir verde porque `git push` retornó exit 0**: push exitoso ≠ CI verde. push solo confirma que GitHub aceptó el push.
|
|
445
|
+
|
|
446
|
+
Origen: regla global `monitor-ci.md` cubre este protocolo en detalle. Esta sección lo activa específicamente para `/swl:verificar`.
|
|
447
|
+
|
|
448
|
+
### 4.6.8 — Backward compatibility
|
|
449
|
+
|
|
450
|
+
Sin `--until-converge`, el comportamiento del comando es idéntico al actual: una sola pasada, ofrece correcciones tras el veredicto, sale. Los flags `--until-converge` y `--ci-aware` son 100% aditivos.
|
|
387
451
|
|
|
388
452
|
## Paso 5 — Verificación de criterios de aceptación
|
|
389
453
|
|
|
@@ -401,6 +465,56 @@ Ejemplo de tabla de verificación:
|
|
|
401
465
|
| El usuario puede crear una cuenta | Test e2e / manual | PASA / FALLA / PENDIENTE |
|
|
402
466
|
```
|
|
403
467
|
|
|
468
|
+
### Smoke test manual obligatorio para módulos frontend grandes
|
|
469
|
+
|
|
470
|
+
Origen: SIGAF sesión 2026-05-21 (mejora D2). Cuando el alcance de la
|
|
471
|
+
verificación toca un **componente frontend > 2,000 LOC** (típicamente módulos
|
|
472
|
+
como `/catalogos`, `/contratos`, `/expedientes` que crecen orgánicamente), la
|
|
473
|
+
verificación automática NO es suficiente. Los tests unitarios pueden pasar y
|
|
474
|
+
el linter quedar limpio mientras el componente está **roto en el render
|
|
475
|
+
real** (estado inicial mal calculado, evento que no propaga, route guard que
|
|
476
|
+
redirige en loop, error de hidratación SSR que solo aparece en producción).
|
|
477
|
+
|
|
478
|
+
Reglas duras para esta sub-categoría:
|
|
479
|
+
|
|
480
|
+
1. **Detección automática del trigger**: si el revisor de código reporta
|
|
481
|
+
≥1 archivo en `frontend/` con LOC > 2000, OR la suma de LOC de archivos
|
|
482
|
+
modificados en el último commit en `frontend/` excede 1500, activar este
|
|
483
|
+
sub-paso.
|
|
484
|
+
|
|
485
|
+
2. **Smoke test manual obligatorio**: el VERIFICACION.md DEBE incluir un
|
|
486
|
+
bloque `## Smoke test manual (módulo frontend grande)` con los siguientes
|
|
487
|
+
checks que el usuario humano marca PASA/FALLA antes del merge:
|
|
488
|
+
|
|
489
|
+
```markdown
|
|
490
|
+
## Smoke test manual — frontend/<modulo> (X LOC)
|
|
491
|
+
|
|
492
|
+
- [ ] Arranca el dev server sin errores en consola
|
|
493
|
+
- [ ] Renderiza la pantalla principal del módulo sin pantalla blanca
|
|
494
|
+
- [ ] Navegación a cada sub-ruta funciona (listar nombres)
|
|
495
|
+
- [ ] Acciones CRUD principales completan flujo end-to-end
|
|
496
|
+
- [ ] No hay warnings de hidratación en consola (SSR si aplica)
|
|
497
|
+
- [ ] Layout responsive funciona en viewport mobile + desktop
|
|
498
|
+
- [ ] [Si aplica] Web vitals sin regresión vs commit anterior
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
3. **NO marcar verificación como APROBADA** hasta que el bloque esté completo
|
|
502
|
+
o el usuario explícitamente exente checks específicos con justificación.
|
|
503
|
+
|
|
504
|
+
4. **El comando NO ejecuta el smoke automáticamente** (requiere browser
|
|
505
|
+
humano); su responsabilidad es **incluir el bloque en VERIFICACION.md** y
|
|
506
|
+
marcar la decisión de verificación como `APROBADO_CON_OBSERVACIONES`
|
|
507
|
+
hasta que el bloque se cierre.
|
|
508
|
+
|
|
509
|
+
**Cuándo NO aplicar este sub-paso**:
|
|
510
|
+
|
|
511
|
+
- Módulos backend puros (cobertura suficiente con tests de integración).
|
|
512
|
+
- Cambios cosméticos a componentes frontend grandes (typo en texto, ajuste
|
|
513
|
+
de color de un botón) — la heurística LOC sigue disparándose pero el
|
|
514
|
+
usuario puede exentar con `[exento: cambio cosmético en X líneas]`.
|
|
515
|
+
- Módulos con cobertura E2E > 70% probada (webapp-testing, Playwright,
|
|
516
|
+
Cypress) — el smoke automático cubre la necesidad.
|
|
517
|
+
|
|
404
518
|
## Paso 6 — Consolidación y generación del VERIFICACION.md
|
|
405
519
|
|
|
406
520
|
Consolida todos los hallazgos en `.planning/fases/0N-VERIFICACION.md`:
|
|
@@ -8,10 +8,15 @@ description: >
|
|
|
8
8
|
cuando WebFetch devuelve contenido incompleto. También alimenta directamente
|
|
9
9
|
el wiki de proyecto (raw/) con fuentes verificadas.
|
|
10
10
|
user-invocable: false
|
|
11
|
-
version: "1.
|
|
12
|
-
herramientasPermitidas: [Read, Bash, WebFetch]
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
version: "1.2.0"
|
|
12
|
+
herramientasPermitidas: [Read, Bash, WebFetch, Skill]
|
|
13
|
+
skillsInvocables: [browser-interaction-patterns, browser-research-domains]
|
|
14
|
+
evolved: true
|
|
15
|
+
evolved-from: "1.6.3"
|
|
16
|
+
evolved-at: "2026-05-18"
|
|
17
|
+
evolved-by: "aprender"
|
|
18
|
+
evolved-note: "Adoptar patrones CDP de browser-harness (MIT) — coordinate clicks, wait_for_network_idle, dialogs auto-detect; añadir skillsInvocables a 2 skills nuevos consolidados"
|
|
19
|
+
fuente: "Vercel Labs agent-browser — 26K+ GitHub stars (2026-04); patrones CDP avanzados adaptados de browser-use/browser-harness (MIT, 2026)"
|
|
15
20
|
evolvable: true # default para skill estandar
|
|
16
21
|
exclusiones:
|
|
17
22
|
- "No cargar para scraping de páginas estáticas simples — usar WebFetch directamente, es más rápido y sin overhead."
|
|
@@ -216,3 +221,105 @@ puede consumir 50K tokens solo en overhead de scraping. Con agent-browser: ~9K t
|
|
|
216
221
|
**Usar `agent-browser` en un loop con 10+ URLs causa que el proceso Chrome se quede sin memoria y falle silenciosamente**: el Chrome controlado no libera memoria entre páginas del mismo proceso. Causa: cada `open` reutiliza el mismo proceso Chrome sin reiniciarlo. Fix: para loops de investigación intensiva (>10 URLs), dividir en sub-lotes y reiniciar `agent-browser` entre grupos, o procesar en secuencia con pausa de 500ms entre páginas.
|
|
217
222
|
|
|
218
223
|
**`agent-browser navigate` a una página de login redirecciona a la URL original sin error**: si el sitio detecta el browser headless y redirecciona al login, el agente no recibe señal de fallo — simplemente extrae el contenido del formulario de login en lugar de la página deseada. Causa: sites como LinkedIn, Cloudflare-protected pages bloquean headless browsers. Fix: verificar que el output extraído contiene el contenido esperado (>200 palabras reales), no un formulario. Usar `--headed` para hacer el login visible y manual cuando el sitio requiere autenticación humana.
|
|
224
|
+
|
|
225
|
+
## Patrones avanzados de CDP (adoptados de browser-harness MIT)
|
|
226
|
+
|
|
227
|
+
Cuatro patrones que mejoran robustez y reducen tokens, adaptados del runtime
|
|
228
|
+
`browser-use/browser-harness`. Aplican aunque agent-browser sea otra
|
|
229
|
+
implementación (npm CLI vs Python CDP) — son patrones agnósticos al runtime.
|
|
230
|
+
|
|
231
|
+
### 1. Coordinate clicks > selector clicks
|
|
232
|
+
|
|
233
|
+
Cuando la página tiene iframes cross-origin, shadow DOM, o componentes
|
|
234
|
+
complejos, los selectors CSS son frágiles. La alternativa robusta es operar
|
|
235
|
+
a nivel **compositor** de Chrome con eventos de mouse por coordenadas.
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# MAL — selector frágil cuando hay iframe o shadow DOM
|
|
239
|
+
agent-browser click "button.submit-btn"
|
|
240
|
+
|
|
241
|
+
# BIEN — leer coordenadas del screenshot y click por XY
|
|
242
|
+
agent-browser screenshot /tmp/page.png
|
|
243
|
+
# (visual: el botón está en ~ x=420, y=380)
|
|
244
|
+
agent-browser click-xy 420 380
|
|
245
|
+
agent-browser screenshot /tmp/after.png # verificar
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
El click coordinate atraviesa iframes cross-origin y shadow DOM sin trabajo
|
|
249
|
+
extra porque sucede en el compositor antes de llegar al árbol DOM. Solo bajar
|
|
250
|
+
a DOM-level cuando el elemento NO tiene geometría visible.
|
|
251
|
+
|
|
252
|
+
### 2. `wait_for_network_idle` > `wait` fijo
|
|
253
|
+
|
|
254
|
+
Esperar timeouts fijos (`wait 2000`) es ciego — desperdicia tiempo en páginas
|
|
255
|
+
rápidas y falla en páginas lentas. El patrón correcto es esperar evento-driven
|
|
256
|
+
hasta que NO haya requests pendientes por N ms.
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# MAL — timeout ciego
|
|
260
|
+
agent-browser open https://app-spa.com
|
|
261
|
+
agent-browser wait 2000
|
|
262
|
+
agent-browser get text "main"
|
|
263
|
+
|
|
264
|
+
# BIEN — esperar idle de red (event-driven)
|
|
265
|
+
agent-browser open https://app-spa.com
|
|
266
|
+
agent-browser wait-network-idle --timeout 10000 --idle-ms 500
|
|
267
|
+
agent-browser get text "main"
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Si tu agent-browser CLI no expone este helper, fallback razonable: `wait` con
|
|
271
|
+
verificación posterior (screenshot + assert que el contenido renderizó).
|
|
272
|
+
|
|
273
|
+
### 3. Screenshots primero para verificación
|
|
274
|
+
|
|
275
|
+
Tras CUALQUIER acción que modifica estado (click, navigate, form submit), la
|
|
276
|
+
única señal confiable de éxito es re-capturar screenshot. El DOM puede
|
|
277
|
+
mentir durante transiciones; `page_info()` puede tener race conditions.
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
# MAL — asumir que el click funcionó
|
|
281
|
+
agent-browser click-xy 420 380
|
|
282
|
+
agent-browser get text ".confirmation-msg" # puede estar vacío
|
|
283
|
+
|
|
284
|
+
# BIEN — screenshot intermedio verifica visualmente
|
|
285
|
+
agent-browser click-xy 420 380
|
|
286
|
+
agent-browser screenshot /tmp/after-click.png
|
|
287
|
+
# Inspeccionar visualmente o cargar a vision LLM para verificar
|
|
288
|
+
agent-browser get text ".confirmation-msg"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### 4. Auto-detección de dialogs antes de actuar
|
|
292
|
+
|
|
293
|
+
Los dialogs nativos (`alert`, `confirm`, `prompt`, `beforeunload`) **congelan
|
|
294
|
+
el thread de JS** del page. Cualquier acción siguiente cuelga hasta que el
|
|
295
|
+
dialog se resuelva. Patrón seguro: verificar `page_info()` antes de cada
|
|
296
|
+
acción tras navegación o form submit.
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
agent-browser open https://site.com/form
|
|
300
|
+
agent-browser submit-form
|
|
301
|
+
# Antes del siguiente click, verificar
|
|
302
|
+
agent-browser page-info
|
|
303
|
+
# Si retorna {"dialog": {"type": "beforeunload", "message": "..."}},
|
|
304
|
+
# dismissar con accept o cancel antes de continuar
|
|
305
|
+
agent-browser dismiss-dialog --accept
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Si el CLI de agent-browser no expone helper de dialog, la opción CDP raw es
|
|
309
|
+
`Page.handleJavaScriptDialog`. Inyectar stubs JS (`window.alert = ...`) es
|
|
310
|
+
alternativa solo cuando NO hay `beforeunload` involucrado.
|
|
311
|
+
|
|
312
|
+
## Cuándo cargar skills complementarios
|
|
313
|
+
|
|
314
|
+
Cuando este skill base no resuelve el caso:
|
|
315
|
+
|
|
316
|
+
- **`browser-interaction-patterns`** — escalas a un tropiezo específico:
|
|
317
|
+
iframes cross-origin, shadow DOM, dropdown que no responde, upload bloqueado,
|
|
318
|
+
cookies HttpOnly, network requests que no producen DOM change. 14 patrones
|
|
319
|
+
con código MAL/BIEN.
|
|
320
|
+
- **`browser-research-domains`** — el research toca github, arxiv, hackernews,
|
|
321
|
+
stackoverflow, pubmed, openalex o sec edgar. Para esos dominios, **NUNCA
|
|
322
|
+
abras un browser** — todo está en API. Reduce tokens 20-50× y latencia 5-20×.
|
|
323
|
+
|
|
324
|
+
Cargar con `Skill("browser-interaction-patterns")` o
|
|
325
|
+
`Skill("browser-research-domains")` según necesidad.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-deep-links
|
|
3
|
+
description: >
|
|
4
|
+
Constructor y validador de deep links para abrir archivos, líneas, carpetas y
|
|
5
|
+
ajustes directamente en IDEs y editores desde notificaciones, mensajes del
|
|
6
|
+
gateway o output de agentes. Cubre VS Code (vscode://), VS Code Insiders,
|
|
7
|
+
Cursor (cursor://), JetBrains (jetbrains://), Codex Desktop (codex://) y
|
|
8
|
+
fallbacks para apps sin esquema oficial. Cargar cuando un agente o hook deba
|
|
9
|
+
emitir referencias a archivo:línea que el usuario pueda abrir con un clic
|
|
10
|
+
desde Telegram, desktop notifications, Discord, Slack o e-mail.
|
|
11
|
+
version: 1.0.0
|
|
12
|
+
nivelRiesgo: BAJO
|
|
13
|
+
herramientasPermitidas: [Read]
|
|
14
|
+
exclusiones:
|
|
15
|
+
- "No invocar para generar URLs HTTP/HTTPS de navegación web — esto es solo para deep links a apps de escritorio."
|
|
16
|
+
- "No invocar para integraciones con servicios externos (Linear, Notion, Jira); este skill solo cubre IDEs y editores locales del desarrollador."
|
|
17
|
+
- "No invocar para enlaces a sesiones de Claude Code en la nube — esos son URLs claude.ai/code/..., no deep links."
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# /habilidades/agent-deep-links — Deep links a IDEs
|
|
21
|
+
|
|
22
|
+
## Cuándo cargar
|
|
23
|
+
|
|
24
|
+
- Antes de emitir una notificación que incluya referencias a archivos del proyecto
|
|
25
|
+
desde `notificador-swl`, `hooks/lib/gateway-notify.js`, `inbox-aviso.js`,
|
|
26
|
+
`notificacion-sesion-stop.js` o cualquier hook que mencione `archivo:línea`.
|
|
27
|
+
- Al diseñar nuevos hooks o agentes que produzcan output con referencias a código
|
|
28
|
+
que el usuario pueda querer abrir directamente.
|
|
29
|
+
- Antes de generar mensajes desde el `documentador-swl` cuyo destino sea un canal
|
|
30
|
+
externo (Telegram, Discord, e-mail) y el receptor probablemente esté en su
|
|
31
|
+
IDE.
|
|
32
|
+
|
|
33
|
+
## Cuándo NO cargar
|
|
34
|
+
|
|
35
|
+
- Cuando la notificación es solo texto plano sin referencias a archivos
|
|
36
|
+
(mensajes de status, métricas agregadas).
|
|
37
|
+
- Cuando el receptor es un agente, no un humano (los agentes no abren IDEs).
|
|
38
|
+
- Cuando estás generando URLs de navegación web (HTTP/HTTPS) — usa generación
|
|
39
|
+
estándar.
|
|
40
|
+
- Cuando el proyecto no expone su path absoluto al gateway (los deep links de
|
|
41
|
+
IDE requieren absolute paths).
|
|
42
|
+
|
|
43
|
+
## Helper programático
|
|
44
|
+
|
|
45
|
+
La lógica del skill está implementada en `hooks/lib/deep-links.js`. El skill
|
|
46
|
+
documenta **qué** generar; el helper genera **cómo**. Para uso desde código:
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
const { construirDeepLink, soportaDeepLinks } = require('./lib/deep-links');
|
|
50
|
+
|
|
51
|
+
const url = construirDeepLink({
|
|
52
|
+
ide: 'cursor', // 'vscode' | 'vscode-insiders' | 'cursor' | 'codex' | 'jetbrains' | 'visualstudio'
|
|
53
|
+
rutaAbsoluta: '/abs/path/a/archivo.js',
|
|
54
|
+
linea: 42,
|
|
55
|
+
columna: 8,
|
|
56
|
+
});
|
|
57
|
+
// → 'cursor://file//abs/path/a/archivo.js:42:8'
|
|
58
|
+
|
|
59
|
+
if (!url) {
|
|
60
|
+
// El IDE solicitado no soporta deep links — usar fallback en texto plano
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Matriz de soporte por IDE
|
|
65
|
+
|
|
66
|
+
| IDE / App | Esquema | Soporte | Patrón canónico | Notas |
|
|
67
|
+
|---|---|---|---|---|
|
|
68
|
+
| **VS Code** | `vscode://` | Total | `vscode://file/<absoluteFile>:<line>:<column>` | Requiere VS Code instalado en máquina del receptor. |
|
|
69
|
+
| **VS Code Insiders** | `vscode-insiders://` | Total | `vscode-insiders://file/<absoluteFile>:<line>:<column>` | Esquema específico Insiders. |
|
|
70
|
+
| **Cursor** | `cursor://` | Total | `cursor://file/<absoluteFile>:<line>:<column>` | Fork de VS Code; misma forma. |
|
|
71
|
+
| **Codex Desktop** | `codex://` | Total | `codex://threads/<thread-uuid>`, `codex://settings` | Para hilos y settings; no archivos. |
|
|
72
|
+
| **JetBrains (IntelliJ/PyCharm/WebStorm/...)** | `jetbrains://` | Total | `jetbrains://<ide-id>/navigate/reference?project=<name>&path=<relPath>` | Requiere nombre del proyecto. Ver fila JetBrains abajo. |
|
|
73
|
+
| **JetBrains Toolbox URL** | `idea://` (deprecado), `jetbrains://idea/...` | Parcial | `jetbrains://idea/navigate/reference?project=<name>&path=<rel>:<line>` | Cada IDE tiene su `<ide-id>`: idea, pycharm, webstorm, goland, rubymine, etc. |
|
|
74
|
+
| **Visual Studio (Windows)** | (no estándar) | Sin esquema oficial | Usar CLI fallback: `devenv /edit <rutaAbsoluta>` | Solo Windows. |
|
|
75
|
+
| **Xcode** | `xcode://` | Parcial | `xcode://...` | Esquema existe; rutas de archivo no bien documentadas. NO confiable. |
|
|
76
|
+
| **Claude Desktop** | `claude://` | Desconocido | `claude://...` | Esquema registrado, rutas no documentadas. |
|
|
77
|
+
| **Codex CLI** (terminal) | n/a | No aplica | n/a | Es CLI; no abre archivos en IDE. Usar fallback texto plano. |
|
|
78
|
+
| **Cualquier app web** | n/a | No aplica | n/a | Si el destino es navegador, usar URL HTTP estándar. |
|
|
79
|
+
|
|
80
|
+
## Reglas de construcción
|
|
81
|
+
|
|
82
|
+
1. **Path absoluto obligatorio**. Deep links con rutas relativas no funcionan.
|
|
83
|
+
El helper rechaza `path.relative` y retorna `null`.
|
|
84
|
+
2. **Encoding de paths con espacios**: aplicar `encodeURI` al path completo (no
|
|
85
|
+
solo al filename). El helper lo hace automáticamente.
|
|
86
|
+
3. **Línea y columna son opcionales**: si no se especifican, el IDE abre al
|
|
87
|
+
inicio del archivo. Línea 1, columna 1 es válido pero redundante.
|
|
88
|
+
4. **JetBrains requiere `proyecto`**: sin el nombre del proyecto, el deep link
|
|
89
|
+
no resuelve. Si no se conoce, usar `vscode://` como fallback (la mayoría de
|
|
90
|
+
los desarrolladores tienen VS Code instalado).
|
|
91
|
+
5. **NUNCA inventar esquemas**: si la matriz dice "No aplica" o "Desconocido",
|
|
92
|
+
el helper retorna `null` y el caller debe usar texto plano.
|
|
93
|
+
|
|
94
|
+
## Formato según receptor
|
|
95
|
+
|
|
96
|
+
| Receptor | Forma del enlace |
|
|
97
|
+
|---|---|
|
|
98
|
+
| **Telegram** (Markdown V2) | `[abrir en IDE](cursor://file//abs/path:42:8)` |
|
|
99
|
+
| **Discord** | `[abrir en IDE](cursor://file//abs/path:42:8)` |
|
|
100
|
+
| **Slack** | `<cursor://file//abs/path:42:8\|abrir en Cursor>` (pipe-separado) |
|
|
101
|
+
| **Desktop notification** (Linux/macOS) | URL plana sin label; el notificador maneja el clic |
|
|
102
|
+
| **E-mail HTML** | `<a href="cursor://file//abs/path:42:8">abrir en Cursor</a>` |
|
|
103
|
+
| **Texto plano / fallback** | `archivo.js:42 (abrir manualmente)` |
|
|
104
|
+
|
|
105
|
+
## Gotchas observables
|
|
106
|
+
|
|
107
|
+
- **El receptor debe tener el IDE instalado**: un enlace `cursor://` no funciona
|
|
108
|
+
si el receptor no tiene Cursor instalado. NO hay forma de detectarlo desde
|
|
109
|
+
el emisor; documentar al usuario que el deep link es opt-in.
|
|
110
|
+
- **Slack tiene su propia sintaxis** `<url|label>`, no Markdown estándar. Mezclar
|
|
111
|
+
los formatos rompe el clic.
|
|
112
|
+
- **Windows usa backslashes**: el path absoluto en Windows es
|
|
113
|
+
`C:\Users\...\archivo.js`. El esquema `vscode://file/C:\\Users\\...` requiere
|
|
114
|
+
doble-backslash en algunos casos; el helper normaliza con `path.resolve` +
|
|
115
|
+
`encodeURI` para producir `vscode://file/C:/Users/...` (slashes forward) que
|
|
116
|
+
VS Code/Cursor sí aceptan correctamente.
|
|
117
|
+
- **JetBrains URL Handler debe estar habilitado**: en JetBrains está bajo
|
|
118
|
+
Settings → Tools → Web Browsers and Preview → "Use JetBrains as a
|
|
119
|
+
redirect..." NO está activado por defecto en todas las distribuciones.
|
|
120
|
+
|
|
121
|
+
## Integración con SWL
|
|
122
|
+
|
|
123
|
+
Hoy se integra en `hooks/lib/gateway-notify.js` (opt-in): cuando un caller pasa
|
|
124
|
+
`payload.fileRef = { archivo, linea, columna }` Y existe `payload.idePreferido`,
|
|
125
|
+
el helper enriquece el mensaje con el deep link en el formato del adaptador
|
|
126
|
+
destino (Telegram / Discord / etc.).
|
|
127
|
+
|
|
128
|
+
Extensiones futuras (no implementadas hoy):
|
|
129
|
+
|
|
130
|
+
- `notificador-swl` (Telegram nativo): pasar `idePreferido` desde
|
|
131
|
+
`instintos/perfil-usuario.yaml § ide_preferido`.
|
|
132
|
+
- `documentador-swl`: enlaces a archivos citados en docs generados.
|
|
133
|
+
- `revisor-codigo-swl`: enlaces a archivo:línea en reportes de hallazgos.
|
|
134
|
+
|
|
135
|
+
## Origen
|
|
136
|
+
|
|
137
|
+
Adaptado del skill `agent-deep-links` de
|
|
138
|
+
`temp/awesome-codex-skills-master/agent-deep-links/` (ComposioHQ, MIT) con:
|
|
139
|
+
|
|
140
|
+
- Frontmatter al estándar SWL (es-MX, `nivelRiesgo`, `exclusiones`,
|
|
141
|
+
`herramientasPermitidas`).
|
|
142
|
+
- Matriz extendida con JetBrains (no estaba) y Visual Studio fallback.
|
|
143
|
+
- Sección "Formato según receptor" agregada para Telegram/Discord además del
|
|
144
|
+
Slack original.
|
|
145
|
+
- Helper Node.js (`hooks/lib/deep-links.js`) que el repo origen no tenía.
|
|
146
|
+
- Sección "Integración con SWL" agregada.
|
|
147
|
+
|
|
148
|
+
Documentado en ADR-0029 (integración parcial awesome-codex-skills, Opción B).
|