Skip to content

feat: abrir un expediente exige jurisdiccion y fuero, no los pide despues - #39

Open
leocagli wants to merge 1 commit into
mainfrom
feat/expedientes
Open

feat: abrir un expediente exige jurisdiccion y fuero, no los pide despues#39
leocagli wants to merge 1 commit into
mainfrom
feat/expedientes

Conversation

@leocagli

Copy link
Copy Markdown
Collaborator

argentina-vigia reporta como bloqueado todo caso al que le falta la
jurisdiccion, porque sin ella no se computa ni un plazo. Esos casos no nacen
bloqueados por descuido: nacen asi porque abrir uno era copiar la carpeta a mano
y completar la ficha despues, y el despues a veces no llega.

Un caso con la ficha a medias no se ve como un problema. Se ve como un caso
nuevo. Y mientras tanto sus plazos corren sin que nadie los pueda calcular.

Esta skill hace lo mismo que se hacia a mano, pero pide los dos datos antes de
dejar el caso abierto. Es la unica diferencia, y es toda la diferencia.

Lo que impide

  • abrir sin jurisdiccion o sin fuero
  • abrir con una jurisdiccion que no tiene ficha en jurisdicciones/: sin ella
    el computo no tiene contra que verificarse
  • pisar un caso que ya existe
  • archivar un caso que todavia tiene plazos marcados 🔲, porque un caso
    archivado deja de aparecer en el vigia y cerrarlo asi no lo cierra: lo
    vuelve invisible

Lo que hace

nuevo, listar, validar y cerrar. listar y validar devuelven codigo distinto
de cero si hay fichas incompletas, asi que sirven para los casos que ya existian
antes de esta skill o que alguien copio a mano.

Un bug que encontraron los tests

completar() usaba \s*.* para reemplazar el valor de un campo de la ficha. El
\s incluye el salto de linea, asi que completar "Fecha de inicio" se comia la
linea siguiente entera y borraba "Estado actual" de la ficha.

Quedo acotado a [^\n]* con el porque escrito al lado, que es la clase de
detalle que se vuelve a romper si no se explica.

Verificacion

node test/casos-test.mjs      16 ok, 0 mal

Todo ocurre en /tmp. Nunca se escribe dentro de casos/, ni con datos inventados.


Va junto con #38 (el vigía) y son un par: el vigía detecta las fichas
incompletas, esta evita que se creen. Se pueden mergear en cualquier orden.

Ejemplo

$ node componentes/casos/casos.mjs nuevo 2026-014-x --jurisdiccion Cordoba --fuero penal
  "Cordoba" no es una jurisdicción fichada.
  Hay ficha para: CABA-Nacional, Jujuy, Salta.
  Si trabajás en otra, agregá su ficha en jurisdicciones/ primero:
  sin ella el cómputo de plazos no tiene contra qué verificarse.

…pues

`argentina-vigia` reporta como bloqueado todo caso al que le falta la
jurisdiccion, porque sin ella no se computa ni un plazo. Esos casos no nacen
bloqueados por descuido: nacen asi porque abrir uno era copiar la carpeta a mano
y completar la ficha despues, y el despues a veces no llega.

Un caso con la ficha a medias no se ve como un problema. Se ve como un caso
nuevo. Y mientras tanto sus plazos corren sin que nadie los pueda calcular.

Esta skill hace lo mismo que se hacia a mano, pero pide los dos datos antes de
dejar el caso abierto. Es la unica diferencia, y es toda la diferencia.

## Lo que impide

  - abrir sin jurisdiccion o sin fuero
  - abrir con una jurisdiccion que no tiene ficha en jurisdicciones/: sin ella
    el computo no tiene contra que verificarse
  - pisar un caso que ya existe
  - archivar un caso que todavia tiene plazos marcados 🔲, porque un caso
    archivado deja de aparecer en el vigia y cerrarlo asi no lo cierra: lo
    vuelve invisible

## Lo que hace

nuevo, listar, validar y cerrar. `listar` y `validar` devuelven codigo distinto
de cero si hay fichas incompletas, asi que sirven para los casos que ya existian
antes de esta skill o que alguien copio a mano.

## Un bug que encontraron los tests

`completar()` usaba `\s*.*` para reemplazar el valor de un campo de la ficha. El
`\s` incluye el salto de linea, asi que completar "Fecha de inicio" se comia la
linea siguiente entera y borraba "Estado actual" de la ficha.

Quedo acotado a `[^\n]*` con el porque escrito al lado, que es la clase de
detalle que se vuelve a romper si no se explica.

## Verificacion

    node test/casos-test.mjs      16 ok, 0 mal

Todo ocurre en /tmp. Nunca se escribe dentro de casos/, ni con datos inventados.
Comment on lines +56 to +62
function completar(md, etiqueta, valor) {
// Acotado a una linea a proposito: con `\s*.*` el espacio en blanco incluye
// el salto de linea, asi que completar un campo se comia el siguiente.
// Completar "Fecha de inicio" borraba "Estado actual".
const re = new RegExp(`(\\*\\*${etiqueta}:?\\*\\*)[^\\n]*`, 'i');
return re.test(md) ? md.replace(re, `$1 ${valor}`) : md;
}

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: Carátula con $ puede corromper la ficha en completar()

En completar() el valor se pasa como segundo argumento de String.replace: md.replace(re, $1 ${valor}). Los patrones especiales de reemplazo ($&, $, $', $$) que aparezcan en valor no se insertan literalmente. La carátula es texto libre del usuario (--caratula`), así que una carátula con esos caracteres escribiría contenido incorrecto en FICHA.md silenciosamente. Usar una función de reemplazo evita la interpretación de $.

Reemplazo mediante callback: el valor se inserta literal, sin patrones especiales.:

function completar(md, etiqueta, valor) {
  const re = new RegExp(`(\*\*${etiqueta}:?\*\*)[^\n]*`, 'i');
  // Reemplazo con función para que $ en `valor` (carátula libre) no se interprete.
  return re.test(md) ? md.replace(re, (_, p1) => `${p1} ${valor}`) : md;
}
  • Apply fix

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

@gitar-bot

gitar-bot Bot commented Aug 29, 2026

Copy link
Copy Markdown
CI failed: Smoke tests failed because the repository is missing a dependency lock file for npm/yarn caching.

Overview

1 log error found across 1 affected job (smoke-test), caused by a missing dependency lock file needed for package caching during setup-node.

Failures

Missing Dependencies Lock File (confidence: high)

  • Type: configuration
  • Affected jobs: 99026171277
  • Related to change: yes
  • Root cause: The actions/setup-node action failed because no package manager lock file (package-lock.json, npm-shrinkwrap.json, or yarn.lock) exists in the repository.
  • Suggested fix: Generate and commit a valid lock file or update the workflow to disable package caching.

Summary

  • Change-related failures: 1 configuration error due to missing lock file
  • Infrastructure/flaky failures: None
  • Recommended action: Ensure a lock file is tracked in version control so that CI setup actions can successfully locate and use it.
Code Review 👍 Approved with suggestions 0 resolved / 1 findings

Adds case file opening that now requires jurisdiction and court type upfront instead of requesting them later, preventing incomplete case files from being created. Validates jurisdiction against existing templates and includes a regex fix in completar() that was caught by tests.

Consider handling special replacement patterns ($&, $, $', $$) in user-provided caratula text by using a replacement function in String.replace()` instead of passing the value as a string argument, which could silently corrupt FICHA.md if the caratula contains these characters.

💡 Edge Case: Carátula con $ puede corromper la ficha en completar()

📄 componentes/casos/casos.mjs:56-62 📄 componentes/casos/casos.mjs:124-125

En completar() el valor se pasa como segundo argumento de String.replace: md.replace(re, $1 ${valor}). Los patrones especiales de reemplazo ($&, $, $', $$) que aparezcan en valor no se insertan literalmente. La carátula es texto libre del usuario (--caratula`), así que una carátula con esos caracteres escribiría contenido incorrecto en FICHA.md silenciosamente. Usar una función de reemplazo evita la interpretación de $.

Reemplazo mediante callback: el valor se inserta literal, sin patrones especiales.
function completar(md, etiqueta, valor) {
  const re = new RegExp(`(\*\*${etiqueta}:?\*\*)[^\n]*`, 'i');
  // Reemplazo con función para que $ en `valor` (carátula libre) no se interprete.
  return re.test(md) ? md.replace(re, (_, p1) => `${p1} ${valor}`) : md;
}
🤖 Prompt for agents
Code Review: Adds case file opening that now requires jurisdiction and court type upfront instead of requesting them later, preventing incomplete case files from being created. Validates jurisdiction against existing templates and includes a regex fix in `completar()` that was caught by tests.
  
  Consider handling special replacement patterns ($&, $`, $', $$) in user-provided caratula text by using a replacement function in `String.replace()` instead of passing the value as a string argument, which could silently corrupt FICHA.md if the caratula contains these characters.

1. 💡 Edge Case: Carátula con $ puede corromper la ficha en completar()
   Files: componentes/casos/casos.mjs:56-62, componentes/casos/casos.mjs:124-125

   En completar() el valor se pasa como segundo argumento de String.replace: `md.replace(re, `$1 ${valor}`)`. Los patrones especiales de reemplazo ($&, $`, $', $$) que aparezcan en `valor` no se insertan literalmente. La carátula es texto libre del usuario (`--caratula`), así que una carátula con esos caracteres escribiría contenido incorrecto en FICHA.md silenciosamente. Usar una función de reemplazo evita la interpretación de $.

   Fix (Reemplazo mediante callback: el valor se inserta literal, sin patrones especiales.):
   function completar(md, etiqueta, valor) {
     const re = new RegExp(`(\*\*${etiqueta}:?\*\*)[^\n]*`, 'i');
     // Reemplazo con función para que $ en `valor` (carátula libre) no se interprete.
     return re.test(md) ? md.replace(re, (_, p1) => `${p1} ${valor}`) : md;
   }

Tip

Comment Gitar fix CI or enable auto-apply: gitar auto-apply:on

Options

Auto-apply is off → Gitar will not commit updates to this branch.
Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Auto-apply Compact
gitar auto-apply:on         
gitar display:verbose         

Important

Your trial ends in 4 days — upgrade now to keep code review, CI analysis, auto-apply, custom automations, and more.

Was this helpful? React with 👍 / 👎 | Gitar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant