parche-cli 0.6.7 → 0.6.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  Los cambios de cada versión de `parche-cli` y de la Action `Pepo08/parche@v0`. En npm están la 0.1.1, la 0.5.1 y de la 0.6.0 en adelante. La 0.1.0 y de la 0.2.0 a la 0.5.0 no se publicaron en npm; lo que traían está incluido en la 0.5.1. La fecha de cada versión es la del cambio; la de publicación figura en npm y en los [Releases](https://github.com/Pepo08/parche/releases).
4
4
 
5
+ ## 0.6.8 — 2026-10-22
6
+
7
+ Pack de IA: los alias de Claude que apuntan a un modelo con fecha. Antes de la generación 4.6, la API de Claude acepta alias cortos que apuntan al snapshot fechado más reciente de cada versión (página "Model IDs and versioning", verificada el 22/10/2026). La 0.6.7 avisaba `claude-sonnet-4-5-20250929`, que se retira el 30/11/2026, pero no `claude-sonnet-4-5`, que es el mismo modelo.
8
+
9
+ ### Nuevo
10
+ - **`claude-sonnet-4-5`:** se avisa como su snapshot, con la fecha (30/11/2026) y el reemplazo que recomienda Anthropic (`claude-sonnet-5-5`). El aviso nombra el snapshot: "El modelo `claude-sonnet-4-5` (alias de `claude-sonnet-4-5-20250929`) se retira el 2026-11-30".
11
+ - **`claude-opus-4-5` y `claude-haiku-4-5`:** se avisan con la fecha mínima de retiro de su snapshot, igual que los IDs fechados.
12
+ - Los alias viven en el pack (`model_aliases`), cada uno con la página del modelo como fuente: sumar otro es agregar una línea.
13
+
14
+ ### Sin cambios
15
+ - Los IDs de Amazon Bedrock (`anthropic.claude-…`) y de Google Cloud (`claude-sonnet-4-5@20250929`) no se marcan: esas plataformas tienen su propio calendario de retiros.
16
+
17
+ ### Todavía no cubre
18
+ - Los alias de modelos ya retirados (`claude-3-5-sonnet-latest`, `claude-3-7-sonnet-latest` y otros): la documentación actual de Anthropic ya no los nombra, y sin fuente no se avisan.
19
+
5
20
  ## 0.6.7 — 2026-10-21
6
21
 
7
22
  Pack de IA con la API version `2026-10-21` de Anthropic, que salió el 21/10 junto con el SDK de TypeScript 1.0.0 y el de Python 2.0.0: elimina `temperature`, `top_p` y `top_k` para cualquier modelo, y un pedido que los manda devuelve un error 400 aunque tengan su valor por defecto (guía "Migrating to API version 2026-10-21" y página de deprecaciones, verificadas el 21/10). Los SDK anteriores siguen mandando `2023-06-01`, así que hoy casi nada se rompe: se rompe con la próxima suba del SDK. Como siempre, Parche avisa y no toca el código. Esta versión trae además las bases de confianza del repo (al final).
package/README.md CHANGED
@@ -130,7 +130,7 @@ Cómo contribuir, las reglas para el código y cómo se saca una versión: [`CON
130
130
  |---|---|---|---|---|
131
131
  | `arca.wsfe.condicion-iva-receptor` | ARCA | rompe | 2026-12-01 | sí, en JS (`afip.js`) y PHP (`afipsdk/afip.php` y forks): consumidor final y DNI B/C; con `DocTipo` en una variable, consumidor final al ejecutarse (PR parcial) |
132
132
  | `mercadopago.payments-to-orders` | Mercado Pago | migración | — | sí (creación de pagos en SDK Node v2) |
133
- | `ai.model-retirements` | Anthropic, OpenAI | retiro | varias | solo detección (también modelos fine-tuned de OpenAI, `ft:…`). De OpenAI, los modelos que su página de deprecaciones apaga desde 2026: texto, código, imagen, video, voz, transcripción y realtime; y los productos que cierran: Assistants API, prompts reutilizables (`pmpt_…`, `v1/prompts`), la plataforma de Evals, ChatKit con un workflow de Agent Builder y la Videos API (cerrada el 24/9/2026). De Anthropic, los modelos retirados, `temperature`, `top_p` y `top_k` con un valor que no es el de por defecto en Claude 4.7 y posteriores, que dan error 400 (SDK de JS/TS y de Python, y HTTP directo), y los mismos tres parámetros con cualquier modelo en la API version `2026-10-21`, que usan el SDK de TypeScript 1.0.0 y el de Python 2.0.0 (del 21/10/2026): dice si el pedido ya falla, si falla en una instalación nueva o si va a fallar cuando suban el SDK |
133
+ | `ai.model-retirements` | Anthropic, OpenAI | retiro | varias | solo detección (también modelos fine-tuned de OpenAI, `ft:…`). De OpenAI, los modelos que su página de deprecaciones apaga desde 2026: texto, código, imagen, video, voz, transcripción y realtime; y los productos que cierran: Assistants API, prompts reutilizables (`pmpt_…`, `v1/prompts`), la plataforma de Evals, ChatKit con un workflow de Agent Builder y la Videos API (cerrada el 24/9/2026). De Anthropic, los modelos retirados o con fecha, también por su alias (`claude-sonnet-4-5`, que apunta a `claude-sonnet-4-5-20250929` y se retira el 30/11/2026), `temperature`, `top_p` y `top_k` con un valor que no es el de por defecto en Claude 4.7 y posteriores, que dan error 400 (SDK de JS/TS y de Python, y HTTP directo), y los mismos tres parámetros con cualquier modelo en la API version `2026-10-21`, que usan el SDK de TypeScript 1.0.0 y el de Python 2.0.0 (del 21/10/2026): dice si el pedido ya falla, si falla en una instalación nueva o si va a fallar cuando suban el SDK |
134
134
 
135
135
  ## Verificación
136
136
 
@@ -204,6 +204,7 @@ Cuando `DocTipo` no es un número fijo (`DocTipo: docTipo`), Parche no puede sab
204
204
  - ARCA: cubre `@afipsdk/afip.js` y `afipsdk/afip.php` (con sus forks). Las integraciones SOAP propias (en cualquier lenguaje) se detectan pero no se reescriben.
205
205
  - IA, parámetros de Claude 4.7 y posteriores: avisa solo si el modelo del pedido se lee en el mismo archivo (un literal, una constante asignada una vez o el valor por defecto de una variable de entorno) y el parámetro es un número escrito en el código. Si el modelo llega de otro archivo o de la configuración, no avisa: no se puede saber si el pedido va a fallar.
206
206
  - IA, API version `2026-10-21` de Anthropic: la versión del SDK sale de `package-lock.json`, `node_modules` o el rango de `package.json`, y en Python solo de `requirements.txt` (todavía no de `pyproject.toml`, `poetry.lock` ni `uv.lock`). Un rango sin número (`latest`, `*`) cuenta como versión desconocida. Por HTTP directo avisa solo si el archivo manda `anthropic-version: 2026-10-21`. Los SDKs de Go, Java, .NET, Ruby y PHP no se leen.
207
+ - IA, alias de Anthropic: avisa los de Claude Sonnet 4.5, Opus 4.5 y Haiku 4.5 (`claude-sonnet-4-5`, `claude-opus-4-5`, `claude-haiku-4-5`), escritos enteros entre comillas. Los alias de modelos ya retirados (`claude-3-5-sonnet-latest`, `claude-3-7-sonnet-latest` y otros) todavía no: la documentación actual de Anthropic ya no los nombra.
207
208
  - Mercado Pago: migra la creación de pagos con el SDK v2. Las consultas, capturas y reembolsos de pagos existentes se dejan a propósito en Payments API, como indica la guía oficial.
208
209
  - Se distribuye como CLI (`npx parche-cli`) + GitHub Action (`Pepo08/parche@v0`). La GitHub App (instalación en un click, PRs automáticos al publicarse un pack nuevo) es el próximo paso.
209
210
  - La capa de LLM (redactar packs desde changelogs y resolver casos "falta un dato" leyendo el modelo de datos del cliente) todavía no está incluida; cuando entre, va a pasar por la misma verificación.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parche-cli",
3
- "version": "0.6.7",
3
+ "version": "0.6.8",
4
4
  "description": "Dependabot para APIs: detecta cambios de cualquier API de terceros en tu código (ARCA, Mercado Pago, OpenAI, Anthropic) y abre el PR con el arreglo.",
5
5
  "keywords": [
6
6
  "api",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "ai.model-retirements",
3
- "version": "2026.10.21",
3
+ "version": "2026.10.22",
4
4
  "provider": "Modelos de IA",
5
5
  "title": "Modelos, endpoints y parámetros de IA retirados o por retirarse",
6
6
  "kind": "retirement",
@@ -11,6 +11,10 @@
11
11
  "why_es": "Los proveedores de modelos retiran IDs de modelo y endpoints con algunas semanas o meses de aviso. Después de la fecha, las llamadas fallan. Parche no reemplaza el modelo automáticamente porque cambiar de modelo cambia el comportamiento: te avisa, te dice la fecha y el reemplazo que recomienda el proveedor. También avisa los parámetros que los modelos nuevos rechazan, como `temperature`, `top_p` y `top_k` en Claude 4.7 y posteriores.",
12
12
  "sources": [
13
13
  { "title": "Anthropic: Model deprecations", "url": "https://platform.claude.com/docs/en/about-claude/model-deprecations" },
14
+ { "title": "Anthropic: Model IDs and versioning (antes de la generación 4.6, el alias apunta al snapshot fechado más reciente)", "url": "https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions" },
15
+ { "title": "Anthropic: Claude Sonnet 4.5 (alias claude-sonnet-4-5; se retira el 30/11/2026)", "url": "https://platform.claude.com/docs/en/models/sonnet-4-5/overview" },
16
+ { "title": "Anthropic: Claude Opus 4.5 (alias claude-opus-4-5)", "url": "https://platform.claude.com/docs/en/models/opus-4-5/overview" },
17
+ { "title": "Anthropic: Claude Haiku 4.5 (alias claude-haiku-4-5)", "url": "https://platform.claude.com/docs/en/models/haiku-4-5/overview" },
14
18
  { "title": "Anthropic: Model deprecations, API parameter deprecations (temperature, top_p y top_k en Claude 4.7 y posteriores)", "url": "https://platform.claude.com/docs/en/about-claude/model-deprecations#api-parameter-deprecations" },
15
19
  { "title": "Anthropic: API reference, Messages (valores que se aceptan: temperature 1, top_p desde 0.99, top_k ninguno)", "url": "https://platform.claude.com/docs/en/api/messages/create" },
16
20
  { "title": "Anthropic: Claude Haiku 5.5 migration guide (top_p solo 0.99; temperature y top_p juntos dan 400)", "url": "https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#remove-sampling-parameters" },
@@ -170,6 +174,11 @@
170
174
  "ft-babbage-002": { "date": "2026-10-23", "replacement": "gpt-5.6-terra", "bases": ["babbage-002"] },
171
175
  "ft-davinci-002": { "date": "2026-10-23", "replacement": "gpt-5.6-terra", "bases": ["davinci-002"] }
172
176
  },
177
+ "model_aliases": {
178
+ "claude-sonnet-4-5": "claude-sonnet-4-5-20250929",
179
+ "claude-opus-4-5": "claude-opus-4-5-20251101",
180
+ "claude-haiku-4-5": "claude-haiku-4-5-20251001"
181
+ },
173
182
  "retirement_floors": {
174
183
  "claude-haiku-4-5-20251001": "2026-10-15",
175
184
  "claude-opus-4-5-20251101": "2026-11-24"
@@ -28,6 +28,17 @@ const entry = (v) => (typeof v === 'string' ? { date: v, replacement: null } : v
28
28
  const quoted = (line, id) => line.includes(`'${id}'`) || line.includes(`"${id}"`) || line.includes(`\`${id}\``);
29
29
  const replacementText = ({ replacement, replacement_es: prose, note_es: note }) =>
30
30
  (replacement ? ` Reemplazo recomendado: \`${replacement}\`.` : prose ? ` Reemplazo recomendado: ${prose}.` : '') + (note ? ` ${note}` : '');
31
+ // `aliasOf`: el snapshot al que apunta un alias de Anthropic (`model_aliases` del pack). Sin alias, el texto es el de siempre.
32
+ const retiredMessage = (model, e, inCall, today, aliasOf) => {
33
+ const past = e.date <= today;
34
+ const repl = replacementText(e);
35
+ const when = past ? `fue retirado el ${e.date}` : `se retira el ${e.date}`;
36
+ return inCall
37
+ ? `El modelo \`${model}\`${aliasOf ? ` (alias de \`${aliasOf}\`)` : ''} ${when}${past ? ': las llamadas ya fallan' : ''}.${repl} Corré tus pruebas de prompts antes de cambiarlo.`
38
+ : `Aparece \`${model}\` (${aliasOf ? `alias de \`${aliasOf}\`, ` : ''}${when}) fuera de una llamada: si es una lista o un catálogo de modelos, actualizalo.${repl}`;
39
+ };
40
+ const floorMessage = (model, date, aliasOf) =>
41
+ `El modelo \`${model}\`${aliasOf ? ` (alias de \`${aliasOf}\`)` : ''} puede retirarse a partir del ${date} (fecha mínima publicada; hay 60 días de aviso). Planificá el reemplazo.`;
31
42
  const endpointHit = (ep, l) => {
32
43
  if (ep.pattern) return l.includes(ep.pattern) ? ep.pattern : null;
33
44
  const m = l.match(ep.re);
@@ -41,7 +52,7 @@ const milestonesText = (ep, today) => (ep.milestones || [])
41
52
  export default function detect({ source, file, pack, today = new Date().toISOString().slice(0, 10), context }) {
42
53
  const findings = [];
43
54
  const usages = [];
44
- const { retired_models: retired, retirement_floors: floors, retired_endpoints: endpoints } = pack.detect;
55
+ const { retired_models: retired, retirement_floors: floors, retired_endpoints: endpoints, model_aliases: aliases = {} } = pack.detect;
45
56
  const fineTunes = new Map();
46
57
  for (const [name, e] of Object.entries(pack.detect.retired_fine_tunes || {})) for (const b of e.bases) fineTunes.set(b, { name, ...e });
47
58
  const azure = AZURE.test(source);
@@ -53,17 +64,22 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
53
64
  const inCall = MODEL_CONTEXT.test(l);
54
65
  for (const [model, raw] of Object.entries(retired)) {
55
66
  if (!quoted(l, model)) continue;
56
- const e = entry(raw);
57
- const { date } = e;
58
- const past = date <= today;
59
- const repl = replacementText(e);
60
- const when = past ? `fue retirado el ${date}` : `se retira el ${date}`;
61
- const message = inCall
62
- ? `El modelo \`${model}\` ${when}${past ? ': las llamadas ya fallan' : ''}.${repl} Corré tus pruebas de prompts antes de cambiarlo.`
63
- : `Aparece \`${model}\` (${when}) fuera de una llamada: si es una lista o un catálogo de modelos, actualizalo.${repl}`;
64
- findings.push({ pack: PACK, file, line, status: 'detect-only', message });
67
+ findings.push({ pack: PACK, file, line, status: 'detect-only', message: retiredMessage(model, entry(raw), inCall, today) });
65
68
  usages.push({ provider: 'ia', op: `modelo ${model}`, line });
66
69
  }
70
+ // Alias de Anthropic de antes de la generación 4.6 (`claude-sonnet-4-5`): apuntan al snapshot fechado más reciente y
71
+ // tienen su fecha (Model IDs and versioning). Se comparan enteros entre comillas: `'claude-sonnet-4-5'` no es
72
+ // `'claude-sonnet-4-5-20250929'` (ese ya se avisa arriba), ni el ID de Bedrock (`anthropic.claude-…`) o el de Google
73
+ // Cloud (`claude-sonnet-4-5@20250929`), que tienen su propio calendario.
74
+ for (const [alias, target] of Object.entries(aliases)) {
75
+ if (!quoted(l, alias)) continue;
76
+ let message;
77
+ if (retired[target]) message = retiredMessage(alias, entry(retired[target]), inCall, today, target);
78
+ else if (floors[target]) message = floorMessage(alias, floors[target], target);
79
+ else continue;
80
+ findings.push({ pack: PACK, file, line, status: 'detect-only', message });
81
+ usages.push({ provider: 'ia', op: `modelo ${alias}`, line });
82
+ }
67
83
  for (const [, base] of l.matchAll(FINE_TUNE)) {
68
84
  const ft = fineTunes.get(base);
69
85
  if (!ft) continue;
@@ -78,8 +94,7 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
78
94
  }
79
95
  for (const [model, date] of Object.entries(floors)) {
80
96
  if (!l.includes(model)) continue;
81
- findings.push({ pack: PACK, file, line, status: 'detect-only',
82
- message: `El modelo \`${model}\` puede retirarse a partir del ${date} (fecha mínima publicada; hay 60 días de aviso). Planificá el reemplazo.` });
97
+ findings.push({ pack: PACK, file, line, status: 'detect-only', message: floorMessage(model, date) });
83
98
  usages.push({ provider: 'ia', op: `modelo ${model}`, line });
84
99
  }
85
100
  for (const ep of eps) {