@pasosdejesus/m 0.22.1 → 0.22.3

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 (49) hide show
  1. package/README.md +57 -0
  2. package/dist/CHANGELOG.md +902 -0
  3. package/package.json +3 -4
  4. package/dist/base-model/baseline.generated.d.ts +0 -60
  5. package/dist/base-model/baseline.generated.d.ts.map +0 -1
  6. package/dist/base-model/baseline.generated.js +0 -1110
  7. package/dist/base-model/baseline.generated.js.map +0 -1
  8. package/dist/base-model/check.d.ts +0 -6
  9. package/dist/base-model/check.d.ts.map +0 -1
  10. package/dist/base-model/check.js +0 -195
  11. package/dist/base-model/check.js.map +0 -1
  12. package/dist/base-model/generate.d.ts +0 -37
  13. package/dist/base-model/generate.d.ts.map +0 -1
  14. package/dist/base-model/generate.js +0 -184
  15. package/dist/base-model/generate.js.map +0 -1
  16. package/dist/base-model/guidelines.d.ts +0 -13
  17. package/dist/base-model/guidelines.d.ts.map +0 -1
  18. package/dist/base-model/guidelines.js +0 -61
  19. package/dist/base-model/guidelines.js.map +0 -1
  20. package/dist/base-model/index.d.ts +0 -19
  21. package/dist/base-model/index.d.ts.map +0 -1
  22. package/dist/base-model/index.js +0 -22
  23. package/dist/base-model/index.js.map +0 -1
  24. package/dist/base-model/parse-structure.d.ts +0 -4
  25. package/dist/base-model/parse-structure.d.ts.map +0 -1
  26. package/dist/base-model/parse-structure.js +0 -170
  27. package/dist/base-model/parse-structure.js.map +0 -1
  28. package/dist/base-model/queries.d.ts +0 -41
  29. package/dist/base-model/queries.d.ts.map +0 -1
  30. package/dist/base-model/queries.js +0 -157
  31. package/dist/base-model/queries.js.map +0 -1
  32. package/dist/base-model/references/learn-tg.d.ts +0 -16
  33. package/dist/base-model/references/learn-tg.d.ts.map +0 -1
  34. package/dist/base-model/references/learn-tg.js +0 -60
  35. package/dist/base-model/references/learn-tg.js.map +0 -1
  36. package/dist/base-model/types.d.ts +0 -183
  37. package/dist/base-model/types.d.ts.map +0 -1
  38. package/dist/base-model/types.js +0 -10
  39. package/dist/base-model/types.js.map +0 -1
  40. package/dist/base-model/version.d.ts +0 -12
  41. package/dist/base-model/version.d.ts.map +0 -1
  42. package/dist/base-model/version.js +0 -20
  43. package/dist/base-model/version.js.map +0 -1
  44. package/dist/tasks/base-model.d.ts +0 -3
  45. package/dist/tasks/base-model.d.ts.map +0 -1
  46. package/dist/tasks/base-model.js +0 -177
  47. package/dist/tasks/base-model.js.map +0 -1
  48. package/dist/templates/apps/hardhat/contracts/MockUSDT.sol +0 -47
  49. package/dist/templates/apps/hardhat/test/MockUSDT.test.ts +0 -40
@@ -0,0 +1,902 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@pasosdejesus/m` are documented in this file.
4
+
5
+ ## [0.22.3] - 2026-09-27
6
+
7
+ ### Added
8
+
9
+ - **`README.md` en el paquete `m`** (npm lo incluye automáticamente) para que la
10
+ página de npm y quien lee `node_modules/@pasosdejesus/m` tengan la descripción,
11
+ la tabla de comandos por área, los subpath exports y los enlaces a
12
+ `ARCHITECTURE.md`, `API.md` y `doc/`.
13
+
14
+ ### Changed
15
+
16
+ - **`dist/CHANGELOG.md`**, generado en el build desde el `CHANGELOG.md` de la raíz
17
+ (fuente única: no queda una copia dentro del paquete que se pueda pudrir).
18
+ - **`files` de `m`** ya no nombra rutas inexistentes (`CHANGELOG.md`, `doc`): npm
19
+ las omitía en silencio. El paquete publica `dist` (con su `CHANGELOG.md`) y los
20
+ `src/*/README.md`.
21
+
22
+ ## [0.22.2] - 2026-09-27
23
+
24
+ ### Fixed
25
+
26
+ - **El paquete publicado ya no lleva archivos de otra rama.** `files: ["dist"]`
27
+ empaqueta el directorio tal cual y `tsc -b` no borra las salidas cuya fuente
28
+ desapareció, así que `@pasosdejesus/m@0.22.1` incluyó **46 archivos obsoletos**
29
+ (516 entradas frente a 470 de 0.22.2): los 44 de `dist/base-model/**` y
30
+ `dist/tasks/base-model.*`, compilados desde la rama `msip1` —código cuyo fuente no
31
+ está en `main` y que el wildcard `./dist/*` dejaba además importable— y 2 de
32
+ `dist/templates/apps/hardhat/{contracts/MockUSDT.sol,test/MockUSDT.test.ts}`,
33
+ que se habían movido al motor `usdt` en v0.21.0. Ahora `build` limpia `dist`
34
+ antes de compilar y `publish` verifica el contenido antes de empaquetar.
35
+
36
+ ### Added
37
+
38
+ - **`scripts/check-dist.mjs`** con `make dist-check` y un paso obligatorio en
39
+ `make publish`: falla si alguna salida en `dist` no tiene fuente en el
40
+ repositorio, que es el caso que dejó pasar `base-model`.
41
+
42
+ ### Changed
43
+
44
+ - **`make clean`** (nuevo) y **`build` de `m`/`mpdj` limpia antes de compilar**:
45
+ `packages/m/dist` y `packages/mpdj/dist` no están en git, de modo que un cambio
46
+ de rama podía dejar código obsoleto listo para publicar. Costo: el build de `m`
47
+ es siempre completo (~23 s) en vez de incremental.
48
+
49
+ ## [0.22.1] - 2026-09-27
50
+
51
+ ### Changed
52
+
53
+ - **Sin emojis en la salida de los comandos ni en la documentación.** Las
54
+ terminales OpenBSD/adJ no renderizan emojis: los mensajes y los documentos usan
55
+ los indicadores de `AGENTS.md` (`[OK]`, `[FAIL]`, `[WARN]`, `[INFO]`) o texto
56
+ plano. Se conservan los dos marcadores que son protocolo del formato de REQ
57
+ (`packages/m/src/tasks/req.ts`: la detección de "Pendiente en" y la etiqueta
58
+ heredada de estado).
59
+ - **`mpdj@0.2.8`:** los 11 instrumentos de `ia/alineacion_*.md` comparten una
60
+ **misma sección de detección de eco** (idéntica línea por línea); lo propio de
61
+ cada instrumento quedó en secciones separadas (`## Eco temático`,
62
+ `## Autoauditoría final`, `## Si no puedes calcular`) y los emojis salieron
63
+ también de `ai:framework`, `ai:principles`, `ai:skill` y `ai:adJ`.
64
+
65
+ ### Added
66
+
67
+ - **`mpdj@0.2.8`:** test de regresión
68
+ (`packages/mpdj/__tests__/ia-alignment.test.ts`) que falla si la sección de eco
69
+ diverge entre instrumentos, si aparece un emoji o si un instrumento deja de
70
+ distinguir la adopción analítica de la afirmación metafísica.
71
+
72
+ ### Fixed
73
+
74
+ - **`ai:context`:** `normalizeStatus()` ignora los marcadores de la nueva
75
+ convención (`[OK]`, `[FAIL]`, ...) al clasificar el estado de un REQ. Sin esto,
76
+ `**Status:** [OK] Closed` dejaba de reconocerse como cerrado y el requerimiento
77
+ seguía apareciendo entre los abiertos.
78
+
79
+ ### Removed
80
+
81
+ - **`mpdj@0.2.8`: `ia/manifiesto.md`.** Su contenido vive en
82
+ `ia/alineacion_*.md` e `ia/principles.md`; `ARCHITECTURE.md` y la lista de
83
+ archivos de `AGENTS.md` ya no lo referencian.
84
+ - **`dist/` de la raíz** (412 archivos): espejo del layout previo al monorepo que
85
+ nadie leía. Sus tres dependientes (`ai.verify.test.ts`, `db.console.test.ts` y
86
+ `scripts/repro-call-dataload-sstore.js`) ahora apuntan a `packages/*/dist`, y
87
+ `/dist/` quedó en `.gitignore` para que no vuelva.
88
+ - **22 archivos compilados sueltos dentro de `packages/m/src/`** (`.js` y `.d.ts`
89
+ con su gemelo `.ts`, ni publicados ni referenciados).
90
+
91
+ ### Documentation
92
+
93
+ - `AGENTS.md`, `ARCHITECTURE.md`, `CONTRIBUTING.md`, `API.md`, `doc/*`, `REQ/*` y
94
+ las plantillas de `templates/` sin emojis; `doc/version-bump.md` con los
95
+ conteos de pruebas al día y `usdt` en la lista de paquetes.
96
+
97
+ ## [usdt 0.1.3] - 2026-09-27
98
+
99
+ ### Fixed
100
+
101
+ - **`usdt@0.1.3`: `useContractPayment` encadena las transferencias.** Un pago a
102
+ curso, clúster o país puede llevar USDT y SLEARN; el hook las mandaba una tras
103
+ otra y la segunda reutilizaba el nonce de la primera —que seguía en el mempool—
104
+ así que el nodo la rechazaba con `replacement transaction underpriced` (reporte
105
+ del operador en learn.tg, 2026-09-27; el patrón de Celo L2 está documentado en
106
+ [`doc/celo-nonce-handling.md`](doc/celo-nonce-handling.md)). Ahora se espera el
107
+ recibo de la anterior antes de enviar la siguiente y una colisión de nonce se
108
+ reintenta (el nodo rechazó esa transacción: no se duplica el pago).
109
+ - **`usdt@0.1.3`: mensajes de error sin emojis** (`lib/parse-wallet-error`), que
110
+ el host muestra tal cual al estudiante.
111
+
112
+ ### Added
113
+
114
+ - **`usdt@0.1.3`: `@pasosdejesus/usdt/lib/send-transfers`** (`sendTransfers`,
115
+ `isNonceCollision`) — envío encadenado de transferencias ERC-20, reutilizable por
116
+ los hosts (learn.tg, sivel3) distintos del hook de pago.
117
+
118
+ ## [0.22.0] - 2026-09-19
119
+
120
+ ### Added
121
+
122
+ - **`ai:context`** reescrito (https://gitlab.com/pasosdeJesus/m/-/work_items/45):
123
+ detección de tipo de proyecto y *workspace roots* (`rails`, `nextjs`,
124
+ `hardhat`, `node`, `monorepo`), perfiles de tarea (`--task nextjs:auth`,
125
+ `rails:auth`, `pwa`, `wallet`, `contracts`, `tests`) cargables desde JSON sin
126
+ tocar código (`ai/context-profiles.json`, `.m/context-profiles.json`,
127
+ `~/.config/m/context-profiles.json`), `--type`, `--root`, `--depth`,
128
+ `--list-tasks`, `--print-config`, `--include`/`--exclude`, `--git`,
129
+ `--git-authors`, `--untracked`, `--reqs`, `--req-max`, `--structure`,
130
+ `--files`, `--stdout`, `--truncate` y `--deterministic`.
131
+ - Lista de secretos con denegación absoluta (`.env*`, `*.pem`, `*.key`,
132
+ `config/master.key`, `config/credentials.yml.enc`, billeteras), aplicada
133
+ después de `--include`, y auto-exclusión del archivo de salida.
134
+ - `parseFlags` acepta banderas repetibles (`type: 'array'`).
135
+
136
+ ### Changed
137
+
138
+ - **`ai:context` formato de salida incompatible (schema 1):** documento estable
139
+ en inglés con secciones `Git state`, `Open requirements`, `Directory
140
+ structure`, `Key files`, `Not found` y `Skipped`; se abandonan los marcadores
141
+ `___INICIO_ARCHIVO_<ts>___` y las cabeceras en español del documento (los
142
+ mensajes de consola siguen localizados). `--limit` pasa a ser un tope **duro**
143
+ del tamaño final del documento, y los archivos binarios se omiten.
144
+ - `DEFAULT_EXCLUDES` (`.contextignore` y `--exclude` ahora **extienden** en vez
145
+ de reemplazar); `node_modules`, `dist`, `build`, `.git`, `coverage`, `.next`,
146
+ `tmp` y `vendor` nunca se recorren, ni con `--include "**/*"`.
147
+ - El árbol de directorios se genera desde la lista de archivos de git, por lo
148
+ que ya no requiere el binario `tree` (ausente en OpenBSD base).
149
+
150
+ ### Fixed
151
+
152
+ - **`--help`:** la categoría `Requirements` y las órdenes `req:*` no aparecían
153
+ desde que `req:*` pasó de plugin a órdenes built-in de `m.ts` (`showHelp()`
154
+ armaba la categoría solo con comandos de plugin). Ahora une las built-in con
155
+ las de plugins (`tests/req.test.ts` 19/19).
156
+
157
+ ### Documentation
158
+
159
+ - **`mpdj@0.2.7`:** `SKILL.md` documenta la superficie completa de `ai:context`
160
+ (flags nuevas, perfiles JSON, esquema del documento).
161
+ - `API.md` (tabla de flags y ejemplos), `README.md` y
162
+ `packages/m/src/tasks/README.md` actualizados para `ai:context`.
163
+
164
+ ## [0.21.1] - 2026-08-28
165
+
166
+ ### Changed
167
+
168
+ - **`usdt@0.1.2`**: `useGasEstimation` — cuando estimar gas falla con un saldo
169
+ de CELO prácticamente cero (< 2^50 wei, ~0.0011 CELO), clasifica `'no-gas'`
170
+ (guía al usuario a obtener CELO) en vez de `'warn'` genérico (redes reales:
171
+ "insufficient funds for gas").
172
+ - **`edr@0.1.2`**: fixes que el `0.1.1` publicado no incluía — `eth_call` usa un
173
+ bloque con `block.timestamp` actual (+ `timestampOffset`), así las view
174
+ functions ven los efectos de `evm_increaseTime`/`evm_mine`; mensajes de
175
+ revert simplificados (reason/revertMsg se pasan por separado).
176
+ - **`usdt@0.1.1`**: imports relativos con `.js` en el source (requisito ESM
177
+ para paquetes publicados; el `0.1.0` sin extensión rompía el consumo desde
178
+ node_modules en vite/Node). learn.tg y sivel3 adoptan la versión publicada
179
+ (`^0.1.0` → caret incluye `0.1.1`) y eliminan `scripts/link-usdt.mjs`.
180
+ - **`doc/engines.md`**: pitfall nuevo — los motores **publicados** (shared,
181
+ ESM) deben usar imports relativos con `.js` (como `mpdj`); sin extensión
182
+ solo para motores locales consumidos por webpack.
183
+
184
+ ## [0.21.0] - 2026-08-28
185
+
186
+ ### Added
187
+
188
+ - **Motor `@pasosdejesus/usdt` (0.1.0)** — primera graduación `local → shared`
189
+ de un motor (REQ/35 Fase 7): infraestructura de pago USDT/SLEARN compartida
190
+ entre learn.tg y sivel3 (`lib/donate-utils`, `lib/parse-wallet-error`,
191
+ `hooks/useGasEstimation`, `hooks/useContractPayment` sin next-auth — deps
192
+ inyectadas, `components/TransactionStatus`) y el contrato `MockUSDT.sol`
193
+ (fuente canónica; los hosts lo copian vía `sync-usdt.mjs` a
194
+ `contracts/_usdt_mock.sol`).
195
+ - **Descubrimiento de motores con grafo de inclusiones**: `scripts/engine-scan.mjs`
196
+ (cohesión, salientes D2, entrantes D3, SDK build-time) + fixture sintético de
197
+ validación (https://gitlab.com/pasosdeJesus/m/-/work_items/35).
198
+ - **Template `m:create`**: los proyectos generados ya no copian `MockUSDT.sol`
199
+ (versión vieja manual); dependen de `@pasosdejesus/usdt` y lo compilan desde
200
+ el paquete.
201
+
202
+ ### Changed
203
+
204
+ - **`contract-test@0.1.4`**: el runner carga artifacts de todo `artifacts/`
205
+ (incluye contratos importados de node_modules) y compila con `hardhat
206
+ compile` directo (sin el typechain del build del proyecto).
207
+ - **Docs**: `doc/engine.md` + `doc/engines.md` unificados en `doc/engines.md`
208
+ (estructura de motor, namespace, D1-D3, playbook, pitfalls, graduación);
209
+ `README.md`, `ARCHITECTURE.md` y `API.md` documentan `@pasosdejesus/usdt`.
210
+ - **`mpdj@0.2.6`**: SKILL.md actualizado (enlace `doc/engines.md`).
211
+
212
+ ## [0.20.1] - 2026-08-26
213
+
214
+ ### Added
215
+
216
+ - **E2E: rotación de billeteras entre specs**: el runner de `test:e2e` asigna
217
+ `WALLET_INDEX` (0,1,2,…) a cada spec e `initTestEnv` elige
218
+ `account = wallets[idx % wallets.length]`. Con `TEST_PRIVATE_KEYS` de N
219
+ billeteras, cada spec usa una distinta y no se tropieza con el rate-limit por
220
+ wallet (429/cooldown) del sitio bajo prueba
221
+ (https://gitlab.com/pasosdeJesus/m/-/issues/35).
222
+
223
+ ### Changed
224
+
225
+ - **`test:e2e`**: pausa configurable entre specs (`E2E_SPEC_DELAY_MS`,
226
+ default 1500) para reducir la flakiness de la suite contra el rate-limit del
227
+ dev site (https://gitlab.com/pasosdeJesus/m/-/issues/35).
228
+
229
+ ## [0.20.0] - 2026-08-26
230
+
231
+ ### Added
232
+
233
+ - **E2E multi-wallet**: `initTestEnv` expone `env.wallets: E2EAccount[]` desde
234
+ `TEST_PRIVATE_KEYS` (lista separada por comas; `account` = primera, retrocompatible).
235
+ Permite flujos de claim que necesitan una billetera de sesión (SIWE) y otra
236
+ claimer con fondos para gas (https://gitlab.com/pasosdeJesus/m/-/issues/35).
237
+
238
+ ### Fixed
239
+
240
+ - **`initTestEnv` lee `apps/.env`**: `loadEnvFile` ahora prueba `../.env`
241
+ (apps/ cuando cwd=apps/<app>), `../../.env` y `.env`. Antes solo `../../.env`
242
+ y `.env`, por lo que los specs E2E desde `apps/nextjs` no encontraban
243
+ `PRIVATE_KEY`/`NEXT_PUBLIC_ADDRESS` y caían a la Hardhat key (SIWE 401)
244
+ (https://gitlab.com/pasosdeJesus/m/-/issues/35).
245
+
246
+ ## [0.19.0] - 2026-08-18
247
+
248
+ ### Added
249
+
250
+ - **`m:create engine <name>`**: scaffolds a new Web3 engine package under
251
+ `packages/<name>/` (`engine.json`, `package.json`, `tsconfig`, kysely config,
252
+ `src/` skeleton) (https://gitlab.com/pasosdeJesus/m/-/issues/35).
253
+ - **Engine discovery wired to the CLI**: `eng:list` now lists engines discovered
254
+ from `packages/*/engine.json`; `eng:check` verifies each engine's migration
255
+ directory (https://gitlab.com/pasosdeJesus/m/-/issues/35).
256
+ - **`db:migrate` runs engine migrations**: core migrations run first, then each
257
+ engine's `db/migrations` (via `kysely --cwd <engine>`)
258
+ (https://gitlab.com/pasosdeJesus/m/-/issues/35).
259
+ - Unit tests for `createRegistry` namespace isolation and engine discovery
260
+ (`engine.test.ts`, `util/engines.test.ts`).
261
+
262
+ ### Changed
263
+
264
+ - **`util/engines.ts`**: added `findPackagesDir()` and `discoverEnginesUpward()`
265
+ for hierarchical engine discovery (mirrors the .env lookup).
266
+
267
+ ## [0.18.6] - 2026-08-17
268
+
269
+ ### Added
270
+
271
+ - **`@pasosdejesus/m/engine`**: primitiva de registro genérica
272
+ `createRegistry<T>(namespace)` (globalThis-backeada) + `EngineManifest`
273
+ (REQ/35, REQ/44). `registerCommands`/`registerHook` ahora son wrappers sobre
274
+ esta primitiva.
275
+ - **`mpdj@0.2.5`**: `next` como `peerDependency` + `devDependency`; ejemplo
276
+ `next-server-probe.ts` que demuestra el mecanismo de peer dep para paquetes
277
+ externos (REQ/35 §11 D1).
278
+
279
+ ### Changed
280
+
281
+ - **`util/engines.ts`**: `discoverEngines(rootDir)`, `loadEnginePackages(pkgFile)`,
282
+ `isEnginePackage`, `resolveEngineEntry` — generalizan el auto-descubrimiento de
283
+ plugins (antes `loadPlugins()` interno de `m.ts`).
284
+
285
+ ## [0.18.5] - 2026-08-17
286
+
287
+ ### Changed
288
+
289
+ - **test-utils**: `setupFsMocks()` (fs-mocks) y `setupMocks()` (rainbowkit-mocks)
290
+ deprecados como no-ops. `vi.mock()` dentro de una función de un módulo
291
+ importado ya no se hoistea en Vitest 3 (REQ/207 en learn.tg): los mocks de
292
+ `fs/promises`/`node:fs/promises` y de auth deben declararse a module scope en
293
+ `vitest.setup.ts`, usando las funciones exportadas (`mockReadFile`,
294
+ `mockNodeReadFile`, `mocks`). Ver `test-utils/README.md` §8.
295
+
296
+ ## [0.18.4] - 2026-08-16
297
+
298
+ ### Fixed
299
+
300
+ - **Dual package hazard** (REQ/42): el registro de comandos/hooks ahora vive en
301
+ `globalThis`, de modo que todas las copias de `@pasosdejesus/m` comparten el
302
+ mismo estado. Antes, si un plugin resolvía una copia distinta de `m` (p.ej. la
303
+ `.pnpm` vs. el `link:` al workspace), los comandos se registraban en una
304
+ instancia y se leían en otra.
305
+
306
+ - **Auto-descubrimiento de plugins** (REQ/34): `loadPlugins()` resuelve el entry
307
+ point de cada plugin desde el `node_modules` del proyecto consumidor (no desde
308
+ la ubicación de `m`). Antes `await import('@pasosdejesus/mpdj')` fallaba en
309
+ silencio.
310
+
311
+ ### Changed
312
+
313
+ - **`contract-test@0.1.3`**: se auto-descubre vía `mEngine: true` (mismo
314
+ mecanismo que `mpdj`); se eliminó el hardcode de `contract:test` en `m.ts`.
315
+
316
+ ## [0.18.3] - 2026-08-16
317
+
318
+ ### Security
319
+
320
+ - **Dependencias vulnerables actualizadas** (REQ/42, `pnpm audit` 0 críticas):
321
+ - Template: `next` `15.5.12` → `15.5.22` (SSRF, DoS, Middleware/Proxy bypass).
322
+ - `next-auth` → `4.24.15` (homoglyph `@` bypass, crítica).
323
+ - `kysely` → `0.28.17` (SQL injection, alta).
324
+ - `vitest` → `3.2.6` (lectura/ejecución arbitraria vía UI server, crítica).
325
+
326
+ ### Changed
327
+
328
+ - **`mpdj@0.2.3`**: `peerDependencies.vitest` → `>=2.1.9` (compatible con vitest 3).
329
+
330
+ ## [0.18.2] - 2026-08-15
331
+
332
+ ### Fixed
333
+
334
+ - **`req:list`/`req:cross` sin `REQ/`:** antes crasheaban con `ENOENT` al
335
+ ejecutarse fuera de un proyecto con `REQ/`. Ahora `loadAllReqs` devuelve
336
+ `[]` si el directorio no existe y se muestra un mensaje informativo.
337
+
338
+ ## [0.18.1] - 2026-08-15
339
+
340
+ ### Fixed
341
+
342
+ - **Modo interactivo**: las órdenes que leen `process.argv.slice(3)` (p.ej.
343
+ `m:create`) ahora reciben los argumentos escritos en el REPL (se emula
344
+ `process.argv`). También se corrigió la lectura del argumento requerido con
345
+ stdin en tubería (se usa el async iterator de `readline` en vez de `question`).
346
+
347
+ ### Added
348
+
349
+ - **Órdenes `req:*` movidas de `mpdj` a `m`**: `req:list`, `req:show`,
350
+ `req:cross`, `req:compare`, `req:sync-from-repo`, `req:sync-to-repo`,
351
+ `req:list-repo`, `req:create`, `req:close` ahora son parte de `m` (no de
352
+ `mpdj`), de modo que `npx @pasosdejesus/m req:list` funciona sin `mpdj`.
353
+
354
+ ### Changed
355
+
356
+ - **`mpdj@0.2.2`**: se eliminaron las órdenes `req:*` (ahora en `m`).
357
+ `mpdj` conserva `ai:*` y `eng:credentials:*`.
358
+
359
+ ## [0.18.0] - 2026-08-14
360
+
361
+ ### Added
362
+
363
+ - **Modo interactivo (`m` sin parámetros):** en lugar de solo imprimir ayuda y
364
+ salir, ahora entra en un REPL con `node:readline`: pide una orden (`m> `), y
365
+ si la orden exige argumento, pide el argumento. Soporta `help`, `--version`,
366
+ `exit`/`quit` y línea vacía.
367
+
368
+ ## [0.17.3] - 2026-08-14
369
+
370
+ ### Changed
371
+
372
+ - **Template `tests/helpers.ts`:** propaga la carga jerárquica de `.env.test`
373
+ (dotenv) que ya tenía `tests/test-project/`, para que el scaffold standalone
374
+ cargue las variables de entorno de test igual que el harness del monorepo.
375
+
376
+ ## [0.17.2] - 2026-08-13
377
+
378
+ ### Fixed
379
+
380
+ - **`setupMocks()` deprecado:** `createMockKysely().setupMocks()` ya no
381
+ ejecuta `vi.mock('kysely'|'pg'|...)` internamente (no funcionaba por
382
+ hoisting de Vitest → `ReferenceError: mockSql is not defined`). Ahora es
383
+ un no-op; los mocks de `kysely`/`pg` deben declararse a module scope en
384
+ el `vitest.setup.ts` del proyecto consumidor (ver README §8).
385
+ - **`make publish PKGS=...`:** el filtro `$(filter ...)` es específico de
386
+ GNU Make; en OpenBSD `make` (BSD make) devolvía vacío y publicaba los 4
387
+ paquetes ignorando `PKGS`. Ahora usa `$(PKGS)` directamente.
388
+ - **`mpdj@0.2.1` dep de `@pasosdejesus/m`:** cambiado de `workspace:*` a
389
+ `workspace:^`. `workspace:*` publica la versión exacta de `m` (p.ej.
390
+ `0.17.0`), lo que hacía que un consumidor con `m@0.17.2` instalara una
391
+ segunda copia de `m` y el registro de comandos (`req:*`, `ai:*`) quedara
392
+ dividido — `bin/m req:list` fallaba con "Orden no encontrada".
393
+
394
+ ## [0.17.1] - 2026-08-13
395
+
396
+ ### Changed
397
+
398
+ - **`db:super:createuser`:** grants `SUPERUSER` to the created role via
399
+ `ALTER USER ... WITH SUPERUSER` (after password setup).
400
+
401
+ ### Fixed
402
+
403
+ - **`MockKysely` wiring:** `createMockKysely` now returns a subclass wired
404
+ to the shared `mockExecute`/`mockExecuteTakeFirst`/`mockSqlExecute`
405
+ spies, so `libDbMocks.mockExecute` reflects actual DB calls.
406
+ - **Monorepo build race:** `pnpm run build` now uses
407
+ `--workspace-concurrency=1` to prevent packages from clobbering each
408
+ other's `dist/` during parallel builds.
409
+ - **Makefile `_link`:** also symlinks `@pasosdejesus/edr`,
410
+ `@pasosdejesus/contract-test`, and `@radix-ui/*` for the test project.
411
+
412
+ ### Documentation
413
+
414
+ - `doc/version-bump.md`: clarified unit vs integration test layers, and
415
+ the commit → tag → publish order.
416
+ - `ia/adJ.md` + `ia/construir_en_adJ_y_celo.md`: `adJ.md` is now the single
417
+ source of truth for OpenBSD quirks; the build guide links to it.
418
+
419
+ ## [0.17.0] - 2026-08-12
420
+
421
+ ### Added
422
+
423
+ - **Hook system:** `registerHook`/`runHooks` in `@pasosdejesus/m/plugin`
424
+ for lightweight, project-specific extension points.
425
+ - **`m-extensions/` loader:** `@pasosdejesus/m` auto-discovers and loads
426
+ `.ts`/`.js` files from a `m-extensions/` directory (searched upward).
427
+ - **Auto plugin discovery:** `m` reads `package.json` and auto-imports
428
+ dependencies matching `@pasosdejesus/m-*`. `bin/m` no longer needs
429
+ manual plugin imports.
430
+ - **Credential hooks:** `credentials:post-register-type` and
431
+ `credentials:post-sync-cache` hooks emitted by mpdj, enabling projects
432
+ like learn.tg to persist project-specific fields (e.g. `course_id`).
433
+ - **`MockKysely` export:** now a standalone class from
434
+ `@pasosdejesus/m/test-utils/kysely-mocks`.
435
+
436
+ ### Changed
437
+
438
+ - **mpdj `credentials:sync-cache`:** reads `tokenIdToCourseId` from the
439
+ contract and passes it to the `post-sync-cache` hook.
440
+ - **hre-mock `getAddress()`:** returns checksummed addresses (matches
441
+ ethers.js v6 behavior) instead of lowercase.
442
+
443
+ ### Fixed
444
+
445
+ - **`@pasosdejesus/m` vitest config:** excludes `templates/` and `dist/`
446
+ to avoid recursive test discovery across the scaffolding templates.
447
+
448
+ ### Documentation
449
+
450
+ - `doc/m-extensions.md`: guide for consumer projects to register hooks.
451
+
452
+ ## [0.16.0] - 2026-08-07
453
+
454
+ ### Fixed
455
+
456
+ - **Storage persistence after `restore()` + `runBlock`:** Replaced
457
+ `MerkleStateManager` (MPT + CheckpointDB) with `SimpleStateManager`
458
+ (plain JS Maps) in `@pasosdejesus/edr`. Eliminates the caching bug
459
+ where `setStateRoot()` left stale data in CheckpointDB layers.
460
+ sivel3: `assignDonation` now passes (6/6).
461
+ - **`ai:adJ` from monorepo root:** `findIaDir` now searches
462
+ `packages/mpdj/ia/` in addition to previous paths.
463
+ - **`MockKysely` export:** Now exported as standalone class from
464
+ `@pasosdejesus/m/test-utils/kysely-mocks`, not only as internal type
465
+ of `createMockKysely`.
466
+ - **Publish as public:** Added `publishConfig.access: public` to all
467
+ four packages (`m`, `mpdj`, `edr`, `contract-test`).
468
+
469
+ ### Changed
470
+
471
+ - **hre-mock `loadFixture`:** Re-takes snapshot after restore to match
472
+ Hardhat 2.x behavior. Exports `clearFixtureCache` for cross-file
473
+ cache isolation.
474
+ - **contract:test runner:** Restores original `Module._load` after each
475
+ test file to avoid override chain across files.
476
+ - **Chai `revertedWith` polyfill:** Returns real Promise instead of
477
+ `Object.assign(this, { then })` which was blocked by chai v4 Proxy.
478
+ - **Chai `revertedWithCustomError`:** Decodes ABI selectors for known
479
+ OpenZeppelin custom errors (OwnableUnauthorizedAccount, etc.).
480
+ - **Chai `emit` + `.withArgs`:** Returns thenable object `{then, catch, withArgs}`
481
+ for proper chaining in node:test.
482
+ - **Chai `reverted` + `.not`:** Handles `__flags.negate` explicitly for
483
+ `.to.not.be.reverted` assertions.
484
+ - **Chai `equal` address normalization:** Compares 0x-addresses
485
+ case-insensitively.
486
+ - **`readFunction` tuple destructuring:** Added `Symbol.iterator` to
487
+ support `const [val, addr] = result` for multi-output functions.
488
+ - **`@nomicfoundation/solidity-analyzer`:** Added OpenBSD binary via
489
+ `prepadJ.sh` (compiles Rust crate for openbsd-x64).
490
+ - **`req:close`:** Now accepts multiple numbers (`req:close 18 21 24`).
491
+ - **`req:sync-to-repo` and `req:close`:** Send issue title with
492
+ `R-#N:`/`F-#N:`/`I-#N:`/`P-#N:`/`E-#N:` prefix to remote.
493
+ - **`req:compare`:** Prefers local REQ type and marks local as more
494
+ recent when it has proper prefix format and remote doesn't.
495
+ Valid prefixes: `R` (Requerimiento), `F` (Falla), `I` (Investigación),
496
+ `P` (Prueba), `E` (Experimento).
497
+ - **`parseReqFile`:** Strips embedded old prefixes from extracted titles.
498
+
499
+ ### Added
500
+
501
+ - **`evm_increaseTime` + `evm_mine`:** EdrProvider now tracks
502
+ `timestampOffset` across blocks and snapshots. `evm_mine` creates
503
+ real empty blocks instead of just incrementing block number.
504
+ - **`network.provider.send()`:** hre-mock exposes `send(method, params)`
505
+ for Hardhat-compatible JSON-RPC calls (evm_increaseTime, evm_mine, etc.).
506
+ - **`time.increase`/`time.increaseTo`:** hardhat3 shims now delegate
507
+ to `EdrProvider.evm_increaseTime` + `evm_mine`.
508
+ - **hardhat3 test suite:** `tests/test-project/apps/hardhat3/` with
509
+ node:test + shim, zero mocking (61/65 tests pass).
510
+
511
+ ### Documentation
512
+
513
+ - `doc/edr.md`: Updated architecture to `SimpleStateManager`, revised
514
+ design decisions.
515
+ - `doc/edr-ethereumjs10.md`: Added resolution note and analysis of the
516
+ MPT/CheckpointDB bug.
517
+ - `doc/edr-debugging.md`: Updated with resolution details.
518
+ - `doc/edr-remix.md`: Analysis of how Remix avoids the `setStateRoot` bug.
519
+
520
+ ## [0.15.0] - 2026-08-06
521
+
522
+ ### Changed — Monorepo split (BREAKING)
523
+
524
+ - **Split into two packages**: `@pasosdejesus/m` (general CLI) and
525
+ `@pasosdejesus/mpdj` (Pasos de Jesús extension).
526
+ - **Plugin system**: `m` exposes `registerCommands()` via `@pasosdejesus/m/plugin`.
527
+ `mpdj` registers PdJ commands (ai:framework, req:*, eng:credentials:*) as a plugin.
528
+ - **New directory structure**: source lives in `packages/m/src/` and `packages/mpdj/src/`.
529
+ - **Template changes**: base scaffolding no longer includes `ia/`, `SKILL.md`,
530
+ or PdJ-specific blockchain modules. Use `@pasosdejesus/mpdj` for those.
531
+ - **`bin/m` must load `mpdj`** to enable PdJ commands. See `doc/monorepo-migration.md`.
532
+
533
+ ### Added
534
+ - `@pasosdejesus/mpdj` package with 24 PdJ commands
535
+ - i18n (en/es) to 11 task files: `principles`, `skill`, `glob`, `grep`,
536
+ `writefile`, `readfile`, `context`, `edit`, `e2e`, `engine`, `wallet`
537
+ - `--help` flag to `env:diff`
538
+ - Tests for `eng:check`, `wallet:call`, `wallet:balance`
539
+
540
+ ### Fixed
541
+ - `ai:edit` regex now accepts `_` and `T` as timestamp separator
542
+ - `env:diff` documented in README, API, SKILL, tasks/README
543
+
544
+ ### Removed
545
+ - Dead code: `packages/m/src/tasks/hardhat.ts`, `packages/m/src/scripts/postinstall.ts`,
546
+ unused exports from `cli-parser.ts`
547
+ - Old `contract:compile`, `contract:node`, `contract:deploy` entries (unused)
548
+
549
+ ### Dependencies
550
+ - pnpm 10.34.1 → 10.34.5
551
+ - vitest 1.6.1 → 2.1.9 (pool `forks` por defecto, mejor isolación en OpenBSD)
552
+ - React ^19.2.6 → 19.2.7 pineado en templates y test-project
553
+
554
+ ### Fixed — Cross-package test resolution (REQ/19)
555
+ - **Vitest config**: aliases explícitos para React, Radix UI (~40 paquetes), lucide-react,
556
+ react-hook-form, CVA, clsx, tailwind-merge y viem en `vitest.config.ts`. Fuerzan
557
+ resolución desde el `node_modules` del test project, eliminando doble instancia de React.
558
+ - **Test fixes**: `slearn-info` (text matchers), `credentials` (mock viem + alias),
559
+ `minimal-erc1155-repro` (fixture local), DB tests (`rolsuper` → `rolcreatedb`)
560
+ - **CI**: `.gitlab-ci.yml` actualizado para monorepo (build ambos paquetes,
561
+ symlinks a `packages/m` y `packages/mpdj`, `SUPERUSER` → `CREATEDB`)
562
+ - **Docs**: `API.md` refleja split m/mpdj, `ARCHITECTURE.md` actualizado,
563
+ `CONTRIBUTING.md` paths corregidos, `monorepo-migration.md` paths corregidos
564
+
565
+ ## [0.14.1] - 2026-07-22
566
+
567
+ ### Fixed
568
+ - `db:migrate`: infinite loop when `stdio` sends stdout to terminal instead of
569
+ capturing it. The "Migration skipped" message from kysely goes to stdout, but
570
+ the check only looked at stderr, so the `while(true)` loop never broke.
571
+ Reverted to `stdio: 'pipe'` with combined stdout+stderr check.
572
+
573
+ ## [0.14.0] - 2026-07-17
574
+
575
+ ### Added
576
+ - `setupSIWEMock` in `@pasosdejesus/m/e2e`: Puppeteer wallet mock with real
577
+ ECDSA signing via `exposeFunction` + viem. Survives page reloads. Handles
578
+ `eth_call` (fake balances), `eth_getBalance` (1 CELO), `eth_sendTransaction`
579
+ (fake hash + receipt), `eth_blockNumber`, `eth_gasPrice`, `eth_estimateGas`.
580
+ Configurable balances via `SIWEMockOptions`.
581
+ - `e2e/specs/full-flow.spec.mjs` in test-project: 10-step full user flow test
582
+ (Connect → Courses → Donate → Profile → Guide → Crossword → UBI → Disconnect).
583
+ - `e2e/smoke/full-journey.spec.mjs` in test-project: HTTP-only endpoint smoke test.
584
+ - 11 unit tests for `AddSlearnButton` component.
585
+
586
+ ### Changed
587
+ - `AddSlearnButton`: removed `wagmi` dependency. Uses `window.ethereum` directly
588
+ via `typeof window !== 'undefined' && !!window.ethereum` instead of `useWalletClient()`.
589
+ - `edr-provider`: `eth_call` now uses `vm.evm.runCall()` directly instead of
590
+ `_executeWithRunBlock` + `runBlock`. Fixes `returnValue` being empty on dry-run
591
+ with `@ethereumjs/vm@10`.
592
+ - Block gas limit in `_executeWithRunBlock` raised to min 30M (was equal to tx
593
+ gas limit). Fixes VM compatibility with `@ethereumjs/vm@10`.
594
+
595
+ ### Fixed
596
+ - Contract tests: `struct/tuple decoding` tests now pass — init code CODECOPY
597
+ had missing `destOffset`, runtime used `PUSH0` (invalid on Chainstart).
598
+ 28/28 contract tests pass (3 skipped = fork).
599
+ - `edr-provider`: `eth_call` with empty calldata now correctly returns contract
600
+ output instead of `0x`.
601
+
602
+ ## [0.13.0] - 2026-07-12
603
+
604
+ ### Fixed
605
+ - `hre-mock`: struct/tuple decoding — `readFunction` now converts viem arrays to
606
+ named objects using ABI `outputs[i].name`. Fixes `preAlerts(id).eventHash` returning
607
+ `undefined` in SIVeL3PreAlertMarket tests (+4 passing in sivel3).
608
+ - `edr-provider`: eth_sendTransaction default gas raised from 3M to 5M (was
609
+ inconsistent with `_executeWithRunBlock`'s 5M default). Fixes `VM Exception: revert`
610
+ on OZ ERC1155 `registerCredentialType` calls via hre-mock.
611
+ - `wallet:keccak`: throws Error instead of silent return.
612
+ - `db:migmake` tests: use absolute path to `bin/m`.
613
+
614
+ ### Changed
615
+ - `req:compare`: content fingerprint comparison (ignores timestamp if content
616
+ identical). Fixes false `rem+` after `sync-to-repo`.
617
+ - `req:list`/`req:cross`: i18n headers (EN when `LANG=en`), status translations,
618
+ aligned column headers.
619
+ - `SlearnInfo`: link labels use translated full text.
620
+
621
+ ### Added
622
+ - `wallet:derive`: HD derivation from parent wallet mnemonic.
623
+ - `wallet:generate`: stores mnemonic for downstream derivation.
624
+ - `doc/edr-remix.md`: full analysis of Remix VM config vs EdrProvider.
625
+ - `scripts/repro-call-dataload-sstore-remix-provider.js`: Remix-style VM + Solidity deploy [OK].
626
+ - 3 contract-test regression tests: address case, eth_call uint256, OZ deploy.
627
+ - 2 bytecode fixtures: `MockUSDT.bytecode.txt`, `Storage.bytecode.txt`.
628
+
629
+ ### Fixed in sivel3 (test corrections)
630
+ - `MockUSDT.test.ts`: constructor args `deploy(owner.address)`, supply corrected.
631
+ - `PasosDeJesusCredentials.test.ts`: +2 args in `registerCredentialType`,
632
+ `mintCourseCompletion` with 2 args (not 4).
633
+
634
+ ## [0.12.0] - 2026-07-10
635
+
636
+ ### Changed
637
+ - `contract:test` — Remix-style VM configuration:
638
+ - State manager: `MerkleStateManager` + `createMPT({ useKeyHashing: true, useRootPersistence: true })`
639
+ - Explicit blockchain: `createBlockchain` with genesis block
640
+ - Explicit EVM: `createEVM({ allowUnlimitedContractSize: true })`
641
+ - `activatePrecompiles: true`
642
+ - `runBlock` replaces `runCall` for all transaction execution (matches Remix IDE pattern)
643
+ - `eth_call`/`eth_estimateGas`: runBlock + stateRoot save/restore (dry-run semantics)
644
+ - Gas default raised from 3M to 5M (OpenZeppelin contracts need more gas)
645
+ - `wallet:derive` implemented — HD derivation from parent wallet mnemonic
646
+ - `wallet:generate` now stores mnemonic for downstream derivation
647
+ - `SlearnInfo`: link labels use translated full text (Take courses on learn.tg, etc.)
648
+ - `req:list`/`req:cross`: column headers aligned with data, i18n (English when LANG=en), status translations
649
+ - `req:list`: cross-project indicator moved to `req:cross` (no overflow)
650
+
651
+ ### Added
652
+ - `ethereumjs-bridge.cjs`: +6 exports (`MerkleStateManager`, `createBlock`, `createBlockchain`, `createEVM`, `createMPT`, `runBlock`)
653
+ - `@ethereumjs/block`, `@ethereumjs/blockchain`, `@ethereumjs/mpt` — new devDependencies
654
+ - `doc/edr-remix.md` — full analysis of Remix VM config vs EdrProvider
655
+ - `scripts/repro-call-dataload-sstore-runblock.js` — runBlock-based reproduction
656
+ - `scripts/repro-call-dataload-sstore-remix-provider.js` — Remix-style VM config + Solidity contract deploy [OK]
657
+ - `tests/fixtures/MockUSDT.bytecode.txt`, `tests/fixtures/Storage.bytecode.txt`
658
+ - 3 new contract-test regression tests (address case, eth_call uint256, OZ deploy)
659
+
660
+ ### Fixed
661
+ - `wallet:keccak` — now throws Error (was silent return)
662
+ - `db:migmake` tests — use absolute path to `bin/m`
663
+ - `contract:test` — 29 tests passing (up from 26)
664
+ - `sivel3-repro`: all 7 tests passing
665
+
666
+ ### Removed
667
+ - CALLDATALOAD+SSTORE as "known bug" — resolved by Remix-style VM config. Upstream issue closed.
668
+ - `runCall` + `checkpoint/commit` pattern — replaced by `runBlock`
669
+
670
+ ## [0.11.0] - 2026-07-10
671
+
672
+ ### Added
673
+ - `contract:test` Phase 4 — Full EVM compatibility:
674
+ - 17 hardforks (chainstart→cancun) with unique block numbers in inline Mainnet config
675
+ - PUSH0 (EIP-3855), MCOPY (EIP-5656), and all intermediate EIPs (berlin, london, paris)
676
+ - `decodeRevertReason()` — human-readable revert messages from `Error(string)` ABI
677
+ - `eth_call` empty data fix — minimal calldata byte triggers contract execution
678
+ - Chai polyfills for Mocha test runner:
679
+ - `.reverted`, `.revertedWith(reason)`, `.revertedWithCustomError(contract, name)`
680
+ - `.emit(contract, event)`, `.changeEtherBalance()`, `.changeTokenBalance()`, `.withArgs()`
681
+ - BigInt-aware `equal` and `eql` (handles BigInt vs Number/String comparisons)
682
+ - 10 Hardhat accounts prefunded in `EdrProvider` (was only 2)
683
+ - `doc/edr-debugging.md` — practical guide for diagnosing hard EVM bugs
684
+ - Minimal repro test suite: `tests/sivel3-repro.test.ts` (7/7 passing)
685
+ - `scripts/repro-call-dataload-sstore.js` — standalone VM bug reproduction
686
+ - `scripts/repro-call-dataload-sstore-issue.md` — upstream issue proposal for `@ethereumjs/vm`
687
+
688
+ ### Fixed
689
+ - **Solidity ≥0.8.20 contracts:** `VM Exception: invalid opcode` on deploy
690
+ - **Contract code storage:** runtime bytecode not persisted after deploy (PUSH32 padding)
691
+ - **`eth_getStorageAt`:** returning unpadded hex instead of 32-byte padded
692
+ - **Address case mismatch:** EIP-55 mixed case vs lowercase in receipts and `getAddress()`
693
+ - **`getAddress()`** not exposed on `HardhatContract`
694
+ - **ABI encoding mismatch:** `encodeFunctionData` receiving wrong arg count
695
+ - **`_chai.Promise is not a constructor`** in chai polyfills
696
+ - **BigInt vs Number/String:** comparison failures in Mocha test assertions
697
+
698
+ ### Changed
699
+ - `src/tasks/contract-test/edr-provider.ts` — inline Mainnet config with full hardfork list
700
+ - `src/tasks/contract-test/ethereumjs-bridge.cjs` — exports `Chain`, `getPresetChainConfig`
701
+ - `src/tasks/contract-test/index.ts` — chai polyfills + BigInt-aware assertions
702
+ - `src/tasks/contract-test/hre-mock.ts` — `getAddress()`, ABI default args
703
+ - `REQ/13.md` — closed (5/5 resolved)
704
+ - `REQ/15.md` — 9/12 resolved, CALLDATALOAD bug reported upstream
705
+ - `doc/edr.md` — roadmap updated, REQ links to GitLab work items
706
+
707
+ ### Known Issues
708
+ - **CALLDATALOAD+SSTORE in init code** does not persist in `@ethereumjs/vm@10`.
709
+ Constructor args stored via `SSTORE` during deployment are lost.
710
+ Reported upstream: https://github.com/ethereumjs/ethereumjs-monorepo/issues/4340
711
+
712
+ ### Added
713
+ - `contract:test` Phase 3 — Test Runner Integration:
714
+ - `hre-mock.ts` — Hardhat Runtime Environment with ethers (`getSigners`, `getContractFactory`, `getContractAt`) + viem (`getWalletClient`, `getPublicClient`)
715
+ - Mocha programmatic runner loads and executes Solidity test files with hre injected
716
+ - `waitForTransactionReceipt` on `EdrProvider`
717
+ - `require('hardhat')` via require.cache for CJS compatibility
718
+ - `req:compare` without arguments — overview table comparing all local REQs vs remote issues
719
+ - `req:create "<título>" [tipo]` — second optional argument for type (R/F/I/P), defaults to R
720
+ - REQ file format: `# TYPE-#N: Title` markdown header instead of YAML frontmatter
721
+ - `SlearnInfo` props: `steps`, `description`, `links` for project-specific customization
722
+ - `AddSlearnButton` component — wallet_watchAsset for SLEARN token (bilingual)
723
+ - `doc/edr.md` — architecture, usage, and design decisions for contract:test
724
+ - `IDEAS/sesiones-crush.md` — multiple session management via data_directory
725
+ - `Makefile` — per-module test targets (`test-req`, `test-ai`, `test-quick`, etc.)
726
+
727
+ ### Changed
728
+ - `src/blockchain/index.ts` barrel — also excludes `deployments` (uses `fs`)
729
+ - `REQ/7.md` — Phase 3 [OK], Phase 4 partial, references updated to issue #7
730
+ - `contract-test` smoke test replaced with full Mocha test runner
731
+ - `src/tasks/contract-test/README.md` reduced to directory index → points to `doc/edr.md`
732
+
733
+ ### Removed
734
+ - `HANDOFF-edr.md` — absorbed into `REQ/7.md` + `doc/edr.md`
735
+ - `SlearnInfoLocal.tsx`, `AddSlearnButton.tsx` from learn.tg-admin (now in shared package)
736
+
737
+ ## [0.9.0] - 2026-06-28
738
+
739
+ ### Added
740
+ - `req:*` commands — 9 commands to manage requirements locally and sync with GitLab/GitHub:
741
+ `req:list`, `req:show`, `req:cross`, `req:compare`, `req:sync-from-repo`,
742
+ `req:sync-to-repo`, `req:list-repo`, `req:create`, `req:close`
743
+ - `req:sync-from-repo N` now creates `REQ/N.md` from remote issue if missing locally
744
+ - `wallet:keccak <string>` — computes Keccak-256 hash, replaces `cast keccak` on OpenBSD
745
+ - `--no-owner` flag in `db:restore` for cross-platform compatibility
746
+ - GitHub token support for req commands (`~/.config/m/github-token` or `GITHUB_TOKEN`)
747
+ - Auto-detect repo config from `git remote get-url origin` as fallback when `req-repos.json` absent
748
+ - Makefile: per-module test targets (`make test-req`, `make test-ai`, `make test-quick`, etc.)
749
+ - `REQ/README.md` — configuration docs for requirement management
750
+
751
+ ### Changed
752
+ - `req:list-repo`, `req:compare`, `req:sync-from-repo` allow public (token-less) read access
753
+ - Server-only modules removed from `src/blockchain/index.ts` barrel:
754
+ `credential-images`, `admin-credentials`, `deployments` — import directly instead
755
+ - `fetchRepoIssues` fixed to not send empty auth headers to GitHub API
756
+ - `req:compare` shows API diagnostic URL for debugging
757
+ - Tests updated: `req.test.ts` (17 tests), test expectations for token-less access
758
+
759
+ ## [0.8.0] - 2026-06-26
760
+
761
+ ### Added
762
+ - `contract:test` — EDR fallback para OpenBSD/adJ usando `@ethereumjs/vm` v10
763
+ - `EdrProvider` en `src/tasks/contract-test/edr-provider.ts` con métodos `eth_*` JSON-RPC
764
+ - Soporte para fork (`--fork-url`, `--fork-block`) con `RPCStateManager`
765
+ - Auto-detección de `chainId` desde RPC en modo fork
766
+ - `src/tasks/contract-test/README.md` — documentación de arquitectura y uso
767
+ - `tests/test-project/apps/nextjs/tests/contract-test.test.ts` — 20 unit + 3 fork tests
768
+ - Dependencias `@ethereumjs/*` v10 como devDependencies
769
+ - `ecosystem-addresses.ts` — shared contract addresses (`SLEARN_ADDRESSES`, `USDT_ADDRESSES`) and EIP-191 signers (`SIGNERS`) with `resolveNetwork()` and `CeloNetwork` type
770
+ - `SlearnInfo.tsx` — bilingual (en/es) React component explaining SLEARN cashback flow in 4 steps
771
+ - Entry points `./blockchain/ecosystem-addresses` and `./blockchain/slearn-info` in `package.json`
772
+ - Tests for `ecosystem-addresses` (14 tests) and `SlearnInfo` (13 tests)
773
+ - `REQ/7.md`, `REQ/8.md`, `REQ/9.md` — nuevos requerimientos cross-project
774
+
775
+ ### Changed
776
+ - `contract:test` ahora usa import dinámico para cargar dependencias pesadas bajo demanda
777
+ - `"test": "vitest"` → `"vitest run"` en `package.json` y template (evita watch mode)
778
+ - `src/tasks/README.md` actualizado con entrada `contract-test`
779
+ - `REQ/` directory included in `package.json` `files` and build (`cp -R REQ/* dist/REQ/`)
780
+
781
+ ## [0.7.1] - 2026-06-07
782
+
783
+ ### Added
784
+ - `prepadJ.sh` en template para Hardhat en OpenBSD/adJ
785
+ - `{{m_version}}` placeholder en README.hbs
786
+
787
+ ### Fixed
788
+ - `create.ts` `getTemplateDir()` busca `dist/templates/` (ruta correcta en paquete npm)
789
+ - `page.tsx`, `layout.tsx`, `apps/nextjs/README.md` renombrados a `.hbs` para reemplazo de `{{name}}`/`{{description}}`
790
+ - `{{m_version}}` placeholder en README.hbs reemplazado por versión actual
791
+ - `wallet:approve --amount max` usa `uint256 max`; `decimals()` con fallback a 6
792
+ - `wallet:call` acepta `(returnType)` en signature (`learnTgReserve()(address)`)
793
+ - `wallet:*` usa `NEXT_PUBLIC_RPC_URL` o `RPC_URL` de `.env`
794
+ - RPC Celo Sepolia corregido: `forno.celo-sepolia.celo-testnet.org`
795
+ - README orientado a OpenBSD/adJ (pnpm, mg, doas pkg_add)
796
+ - `wallet:*` visible solo si `viem` en `package.json`
797
+ - `packageManager: pnpm@10.34.1` en template para fijar versión
798
+
799
+ ## [0.7.0] - 2026-06-06
800
+
801
+ ### Added
802
+ - `bin/m wallet:*` — 10 commands replacing `cast` on OpenBSD (generate, import, list, balance, send, approve, call, sign, broadcast)
803
+ - `bin/m eng:*` — engine management: `eng:wba:setup`, `eng:credentials:setup`, `eng:list`, `eng:check`
804
+ - `bin/m eng:credentials:*` — credential commands under engine namespace (list-types, mint, register-type, recompose-image, sync-cache, revoke-credential, grant-minter, revoke-minter, set-site-uri)
805
+ - `bin/m db:check` — verifies expected DB schemas against actual database
806
+ - `verifyWebEventSchema()`, `verifyCredentialMetadataSchema()` — schema verification functions
807
+ - `mintCourseWithRetry()` — mint course completion SBTs with Celo L2 nonce retry
808
+ - `ai:skill` ahora muestra siempre el SKILL.md de `@pasosdejesus/m` (no busca local)
809
+ - `doc/wallet.md`, `doc/engines.md`, `doc/pnpm.md` — new documentation
810
+
811
+ ### Changed
812
+ - `mintCredentialWithRetry()` extrae lógica genérica a `mintWithRetry(functionName, args)`; wrapper preserva API
813
+ - `getTemplateDir()` busca `dist/templates/` (ruta correcta en paquete npm instalado)
814
+ - `credentials:*` → `eng:credentials:*` (comandos condicionados a `deploymentsExist()`)
815
+ - `bin/m --help` adapta categorías visibles según capacidades del proyecto (kysely, hardhat, deployments)
816
+ - `wallet:send --function` + `--args` computa calldata automáticamente (sin `cast calldata`)
817
+ - `wallet:*` usa `NEXT_PUBLIC_RPC_URL` de `.env` como RPC por defecto
818
+ - RPC Celo Sepolia corregido: `forno.celo-sepolia.celo-testnet.org`
819
+ - `cantidad` → `amount` en queries de summary (alineado con migración a inglés)
820
+ - Removidos queries `donationsByRegion` y `totalLearningPoints` (específicos de sivel3)
821
+ - `package.json`: `pnpm` field movido a `pnpm-workspace.yaml` (compatible pnpm 10+11)
822
+ - pnpm v10 fijado con `packageManagerStrict: true` (v11 rompe tests React 19)
823
+ - `xmlEscape()` en composición de imágenes para `&` y otros caracteres XML
824
+
825
+ ### Fixed
826
+ - `SKILL.md` incluido en `dist/` y `package.json` `files`
827
+ - Candado de credencial movido a esquina superior derecha
828
+ - Nombre de credencial >20 chars usa fuente más pequeña
829
+ - `credentials-cli.test.ts` actualizado a namespace `eng:credentials:*`
830
+
831
+ ## [0.6.2] - 2026-05-28
832
+
833
+ ### Changed
834
+ - Raíz migra a npm: `packageManager` removido, `pnpm.overrides` → `overrides` raíz, `pnpm-workspace.yaml` y `pnpm-lock.yaml` eliminados, `package-lock.json` agregado
835
+ - `mintCredentialWithRetry()`: parámetro `privateKey` → `account: Account` (el caller crea la cuenta)
836
+
837
+ ### Fixed
838
+ - React 18→19 en `templates/apps/nextjs/package.json.hbs` (pineado a `react@19.2.7`, arregla renderizado de shadcn con `react-dom@19`)
839
+ - Vitest 1.6.1→2.1.9 en templates y proyecto (pool `forks` por defecto, mejor isolación en OpenBSD/adJ)
840
+ - `Makefile` `npm --dir` → `cd && pnpm install` (npm 11 en OpenBSD no soporta `--dir`)
841
+
842
+ ## [0.6.1] - 2026-05-23
843
+
844
+ ### Added
845
+ - `mintCredentialWithRetry()` for Celo L2 nonce handling with retry logic
846
+ - `doc/wallet-normalization.md` — wallet address normalization cross-project pattern
847
+ - `doc/celo-nonce-handling.md` — Celo L2 nonce handling scoped to SBTs
848
+ - `kysely-ctl` and `kysely-codegen` as root devDependencies (needed for test environment)
849
+ - `--step N` support for `db:rollback` (runs `migrate down` N times)
850
+ - `db:rollback [--step N]` syntax visible in help display
851
+ - Auto-publish on GitLab commit documented in `ARCHITECTURE.md`, `CONTRIBUTING.md`, `version-bump.md`
852
+
853
+ ### Changed
854
+ - `src/blockchain/README.md` long sections lifted to `doc/` with cross-reference links
855
+ - `chain_id` in credentials commands now uses `net` directly (celoSepolia/baseSepolia — migration pending)
856
+ - `Makefile` node_modules recreation after `refresh-scaffold` uses `rm -rf` + fresh symlinks
857
+ - `Makefile` preserves `apps/hardhat/deployments/` during `refresh-scaffold`
858
+
859
+ ### Fixed
860
+ - `kysely` and `kysely-codegen` binaries available in test project after `refresh-scaffold`
861
+ - `@pasosdejesus/m` symlink recreated correctly after `refresh-scaffold`
862
+ - `db:rollback --step N` works with `kysely-ctl` 0.21.0 (loops instead of `--steps` flag)
863
+ - `CHANGELOG.md` added to `package.json` `files` for npm publication
864
+
865
+ ## [0.6.0] - 2026-05-22
866
+
867
+ ### Added
868
+ - `db:dump` and `db:restore` commands (pg_dump -Fd)
869
+ - `credentials:*` blockchain admin commands (list-types, mint, register-type, recompose-image, set-max-supply, set-site-uri, sync-cache, revoke-credential, grant-minter, revoke-minter)
870
+ - `getCredentialMetadata()` cache function
871
+ - `setCustomTokenURI()` admin function
872
+ - `src/blockchain/img/` with site logos (learntg, sivel, stablesl)
873
+ - `doc/migraciones-db-blockchain.md` — DB+Blockchain migration pattern
874
+ - `doc/version-bump.md` — release checklist
875
+ - `.gitlab-ci.yml` — CI pipeline (build, typecheck, unit, integration)
876
+ - `db:super:createuser` test (OpenBSD only)
877
+ - `db:super:createuser` early diagnostic when PG_SUPERUSER* missing
878
+ - `db:rollback --step N` to revert multiple migrations
879
+
880
+ ### Changed
881
+ - `db:migrate` runs all pending migrations (was: one at a time via `kysely migrate up`)
882
+ - `hasAdminKey()` requires `CREDENTIALS_PRIVATE_KEY` (no fallback to `PRIVATE_KEY`)
883
+ - `set-site-uri` moved to admin-only commands
884
+ - `mintCourseSBT` simplified: 4 params (was 6)
885
+ - `hasCredentialOnChain` uses `balanceOf` instead of `hasCredential`
886
+ - `registerCredentialType` adds `customURI` and `maxSupply_` params
887
+ - Documentation converted to English per policy
888
+ - `SKILL.md` restructured by audience (chat.deepseek.com / CLI agents)
889
+ - `list-types` and `sync-cache` use `NEXT_PUBLIC_NETWORK` as default
890
+ - `package.json` `files` includes all `src/*/README.md` and `doc/`
891
+
892
+ ### Removed
893
+ - Plop.js dependency (replaced with direct recursive copy)
894
+ - `node-plop` and `plop` from dependencies
895
+
896
+ ### Fixed
897
+ - Rollup WASM override for OpenBSD compatibility (`pnpm.overrides` in `package.json`)
898
+ - `.env.test` preserved during `make refresh-scaffold`
899
+ - `credentials:*` commands in `src/m.ts` properly registered with conditional display
900
+ - `db:super:createuser` diagnostic when PG_SUPERUSER* missing
901
+ - `make refresh-scaffold` now recreates node_modules from root
902
+ - `kysely-ctl` and `kysely-codegen` added to root devDependencies for test environment