Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
!/jurisdicciones/
!/componentes/
!/skills/
!/agentes/
!/casos/
!/.github/
!/test/
Expand Down
17 changes: 17 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,23 @@ computar plazos o citar procedimiento. Leé la ficha de jurisdicción correspond
área en SAIJ (fuente primaria, en vivo).
4. Confirmá jurisdicción/fuero antes de cualquier cómputo de plazos.

## Agentes que corren solos

Dos, en `agentes/`. Se instalan en `~/.claude/agents/`.

| Agente | Cada cuánto | Necesita MCP |
|--------|-------------|--------------|
| `vigia-plazos` | semanal | no |
| `alerta-normativa` | quincenal | **sí**, el de SAIJ |

La diferencia con las skills es quién se acuerda: una skill hay que invocarla, y
falla justo la semana en que estás corriendo, que es la semana en que se pierde
un plazo.

`alerta-normativa` responde una pregunta que sólo sabe la base: si se movió una
norma citada en un escrito ya presentado de un caso que sigue abierto. Sin el
MCP no infiere: dice que no pudo verificar.

## Reglas de operación (no negociables)

- **Plazos por jurisdicción:** días hábiles judiciales ≠ hábiles administrativos ≠
Expand Down
77 changes: 77 additions & 0 deletions agentes/alerta-normativa.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
name: alerta-normativa
description: >
Revisa en SAIJ si se movió alguna norma citada en los expedientes abiertos:
reformas, derogaciones, jurisprudencia nueva de la jurisdicción del caso.
Este agente sí necesita el MCP de SAIJ conectado. Frases que lo disparan:
"revisá si cambió alguna norma", "alerta normativa", "hay novedades de las
normas que cito", o de forma programada cada quince días.
model: sonnet
tools: ["Read", "Glob", "Grep", "mcp__saij__saij_buscar_legislacion", "mcp__saij__saij_buscar_jurisprudencia", "mcp__saij__saij_documento"]
---

# Alerta normativa

## Para qué existe

El `CLAUDE.md` ya tiene la regla: *si una norma está en zona volátil, marcá
`⚠️ Alerta normativa`*. Pero eso se aplica **cuando estás mirando esa norma**.

El problema es la norma que citaste hace cuatro meses en un escrito de un caso
que sigue abierto, y que desde entonces se reformó. Nadie vuelve a mirar un
escrito ya presentado.

Este agente vuelve.

## Lo único que este agente necesita y el vigía no

**El MCP de SAIJ conectado.** Sin él no hay nada que hacer: la pregunta que
responde es *"¿se movió esto?"*, y eso sólo lo sabe la base.

Si el conector no responde, el agente **no infiere ni supone**. Dice que no
pudo verificar y en qué fecha lo intentó. Una alerta normativa inventada es
peor que ninguna, porque manda a revisar un escrito que estaba bien y hace
perder la confianza en las que sí importan.

## Qué hace

**1. Junta las normas citadas.**

Recorre `casos/*/escritos/` y `casos/*/notas.md` de los expedientes que **no**
estén archivados, y extrae las normas citadas: leyes con número, artículos de
códigos, decretos.

Sólo de los casos abiertos. Un caso archivado no necesita alerta.

**2. Pregunta a SAIJ por cada una.**

Con `saij_buscar_legislacion` para ver si hubo reforma o derogación, y con
`saij_buscar_jurisprudencia` acotado a la jurisdicción del caso para ver si
hay fallo nuevo relevante.

La jurisdicción sale de la `FICHA.md`. Un fallo de Salta no es alerta para un
caso de Jujuy, y mezclarlos llenaría el reporte de ruido hasta volverlo inútil.

**3. Reporta sólo lo que se movió, con la cita.**

Por cada hallazgo: qué caso, qué norma, qué cambió, y el uuid del documento de
SAIJ para poder abrirlo. Sin cita verificable no se reporta: se marca
`🔲 verificación pendiente` y se dice qué falta mirar.

## Cuándo corre

Cada quince días. La legislación no se mueve todos los días, y un agente que
consulta de más gasta cuota de SAIJ sin agregar nada.

## Lo que NO hace

**No modifica escritos.** Avisa que una norma se movió. Si eso cambia la
estrategia del caso lo decide el defensor, y probablemente requiera un escrito
nuevo, no una corrección del viejo.

**No interpreta la reforma.** Reporta que hubo una y da la cita. Decir qué
implica para el caso es trabajo de `abogacia-argentina` con el expediente
delante.

**No toca casos archivados.** Si un caso se reabre, hay que sacarle el estado
archivado y el agente vuelve a mirarlo.
73 changes: 73 additions & 0 deletions agentes/vigia-plazos.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
name: vigia-plazos
description: >
Repasa todos los expedientes abiertos y avisa qué vence, qué plazo nadie
computó y qué caso no se puede computar por falta de jurisdicción. Corre solo,
sin que haya que acordarse. Frases que lo disparan: "revisá los plazos",
"cómo vienen los vencimientos", "qué tengo pendiente esta semana", o de forma
programada al empezar la semana.
model: sonnet
tools: ["Read", "Bash", "Glob"]
---

# Vigía de plazos

## Para qué existe

`argentina-vigia` es una skill: alguien tiene que invocarla. Este agente es la
misma revisión, pero corriendo sola.

La diferencia importa más de lo que parece. Una skill que hay que acordarse de
usar falla exactamente cuando más falta hace: la semana en que estás corriendo
con tres audiencias, que es la semana en que un plazo se pierde.

## Cuándo corre

Semanalmente, los lunes. También a pedido.

No corre a diario a propósito: un reporte que llega todos los días se deja de
leer a la semana, y un vigía que nadie lee es peor que ninguno porque da la
sensación de estar cubierto.

## Qué hace

**1. Escanea.**

```bash
node componentes/vigia/escanear.mjs
```
Comment on lines +36 to +38

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Edge Case: vigia-plazos agent invokes a script not in the repo

agentes/vigia-plazos.md instructs running node componentes/vigia/escanear.mjs, but that path does not exist in the repo (only componentes/mcp-saij/ and the installers are present). As shipped, the vigía agent's core step fails until the vigía component (PR #38) lands. Either land the script alongside this agent or make the dependency explicit so the agent doesn't error out when invoked.

Was this helpful? React with 👍 / 👎


Devuelve los expedientes con sus plazos, separados en tres estados: los que
vencen pronto, los que nadie computó, y los que no se pueden computar porque a
la ficha le falta la jurisdicción o el fuero.

**2. Ordena por lo que puede costar un derecho hoy.**

- Lo **vencido** primero, siempre, aunque no se pueda hacer nada: hay que saberlo.
- Lo **fatal** (🔴) que vence dentro de la semana.
- Lo **sin computar**, que es el modo de falla real de una Defensoría con veinte
causas: una fila que quedó en `🔲` y no se ve distinta de un caso al día.
- Lo **bloqueado** por falta de jurisdicción, que parece un problema de
formulario y es un plazo escondido.

**3. Avisa sólo si hay algo.**

Si no hay nada que atender, no escribe nada. Un agente que reporta "todo bien"
cada lunes enseña a ignorarlo.

## Lo que NO hace, y hay que tenerlo claro

**No computa ningún plazo.** El script lee fechas ya escritas. Restar días
hábiles sin saber la jurisdicción, la feria y las acordadas del tribunal sería
adivinar justo lo que la regla de la casa prohíbe. Para computar hay que activar
`argentina-plazos`, que pregunta lo que le falta.

**No mira el expediente electrónico.** Lee lo que está escrito en `casos/`. Si
el juzgado notificó algo que nadie cargó, el vigía no lo sabe y no puede saberlo:
no hay conector con el sistema del Poder Judicial.

Eso hay que decirlo cada vez que el reporte sale limpio. "Nada pendiente"
significa "nada pendiente **de lo que está cargado**", que no es lo mismo.

**No decide prioridades.** Ordena por fecha y respeta el 🔴 que puso el defensor.
Entre dos plazos del mismo día decide una persona.
26 changes: 23 additions & 3 deletions componentes/instalar.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,31 @@ fi
ok "Repo Agente Smith: $REPO"

# 1) Skills (todas propias, desde el repo)
for s in abogacia-argentina argentina-formatos argentina-plazos argentina-diagnostico argentina-bucles saij-argentina; do
# Se descubren solas. La lista fija anterior tenia seis nombres y en skills/
# ya habia siete: argentina-auditoria-citas existia y no se instalaba, asi
# que quien usaba el oneliner no la tenia y no habia forma de notarlo.
CUENTA=0
for d in "$REPO"/skills/*/; do
[ -f "$d/SKILL.md" ] || continue
s="$(basename "$d")"
mkdir -p "$SKILLS/$s"
cp -r "$REPO/skills/$s/." "$SKILLS/$s/"
cp -r "$d." "$SKILLS/$s/"
CUENTA=$((CUENTA+1))
done
ok "6 skills instaladas en $SKILLS"
ok "$CUENTA skills instaladas en $SKILLS"

# 1b) Agentes (corren solos; el de alerta normativa necesita el MCP de SAIJ)
if [ -d "$REPO/agentes" ]; then
AGENTES="$HOME/.claude/agents"
mkdir -p "$AGENTES"
CUENTA_A=0
Comment on lines +35 to +49

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Bug: PowerShell installer keeps the stale skill list and skips agents

This PR's stated goal is that the installer stops forgetting skills, but the fix (auto-discovery + agent install) was applied only to instalar.sh. componentes/instalar.ps1 still hardcodes the same six-skill list, so Windows oneliner users keep missing argentina-auditoria-citas and now also get zero agents installed (no ~/.claude/agents step). Port the discovery loop and agent-copy block to the PowerShell script so both installers stay in sync.

Mirror the bash auto-discovery and agent install in PowerShell:

# --- 1) Skills (auto-descubiertas) ---
$count = 0
Get-ChildItem (Join-Path $repo 'skills') -Directory | ForEach-Object {
  if (Test-Path (Join-Path $_.FullName 'SKILL.md')) {
    $dst = Join-Path $skillsDir $_.Name
    New-Item -ItemType Directory -Force -Path $dst | Out-Null
    Copy-Item (Join-Path $_.FullName '*') $dst -Recurse -Force
    $count++
  }
}
Ok "$count skills instaladas en $skillsDir"
# --- 1b) Agentes ---
$agentsDir = Join-Path $HOME '.claude\agents'
if (Test-Path (Join-Path $repo 'agentes')) {
  New-Item -ItemType Directory -Force -Path $agentsDir | Out-Null
  Get-ChildItem (Join-Path $repo 'agentes') -Filter *.md | ForEach-Object { Copy-Item $_.FullName $agentsDir -Force }
}
  • Apply fix

Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎

for f in "$REPO"/agentes/*.md; do
[ -f "$f" ] || continue
cp "$f" "$AGENTES/"
CUENTA_A=$((CUENTA_A+1))
done
ok "$CUENTA_A agentes instalados en $AGENTES"
fi

# 2) MCP de SAIJ
cp "$REPO/componentes/mcp-saij/server.mjs" "$MCPDIR/server.mjs"
Expand Down
Loading