@ingeniomaps/cauce 0.38.0 → 0.39.0

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
@@ -14,6 +14,18 @@ desde este repositorio no va, porque el que lee no puede actuar sobre eso. Cuand
14
14
  unas pocas líneas casi siempre es porque cuenta cómo se descubrió el problema o por qué se eligió el
15
15
  diseño — eso vive en el commit y en el código.
16
16
 
17
+ ## [0.39.0] - 2026-08-19
18
+
19
+ ### Corregido
20
+
21
+ - **`check` nombra las credenciales que nadie se llevó.** El arranque tiene que dejar una fila por cada
22
+ variable que el proyecto declara, y en cuatro corridas reales se cumplió en proporción a lo que se
23
+ habló: las que sólo estaban en el inventario quedaron afuera —entre ellas el broker por donde entran
24
+ los datos y el servicio al que se le mandan errores—. Ahora `check` nombra las que no aparecen ni en el
25
+ mapa ni en `HUMAN_ACTIONS.md`. Mira sólo cuando la instancia ya tiene contexto escrito, porque antes no
26
+ hay dónde tendrían que estar, y avisa en vez de fallar: una variable sin dueño no rompe nada hoy, rompe
27
+ el día que alguien tiene que desplegar.
28
+
17
29
  ## [0.38.0] - 2026-08-19
18
30
 
19
31
  ### Añadido
package/engine/cli/ops.js CHANGED
@@ -465,6 +465,31 @@ function seccionesPerdidas(root) {
465
465
  return avisos
466
466
  }
467
467
 
468
+ // Credenciales que el proyecto declara y que no aparecen en ningún contrato. El arranque tiene que
469
+ // dejar una fila por cada una —quién la carga y dónde— y en la práctica cubre las que se hablaron en la
470
+ // conversación: las que sólo estaban en el inventario se pierden, y con ellas el servicio externo que
471
+ // hay detrás. Una variable sin dueño no rompe nada hoy; rompe el día que alguien tiene que desplegar.
472
+ //
473
+ // Sólo cuando la instancia ya tiene contexto escrito: antes del arranque no hay dónde estuvieran.
474
+ function credencialesSinDueño(root) {
475
+ if (OB.guide(root).fresh) return []
476
+ const contratos = ['AGENTS.md', path.join('planning', 'HUMAN_ACTIONS.md')]
477
+ .map((file) => { try { return fs.readFileSync(path.join(root, file), 'utf8') } catch { return '' } })
478
+ .join('\n')
479
+ if (!contratos) return []
480
+ const huerfanas = []
481
+ for (const service of inventory(root)) {
482
+ for (const nombre of (service.env || {}).names || []) {
483
+ if (!contratos.includes(nombre)) huerfanas.push(`${nombre} (${service.path})`)
484
+ }
485
+ }
486
+ if (!huerfanas.length) return []
487
+ const lista = huerfanas.length > 4
488
+ ? `${huerfanas.slice(0, 4).join(', ')} y ${huerfanas.length - 4} más`
489
+ : huerfanas.join(', ')
490
+ return [`el proyecto declara ${lista} y no aparecen en el mapa ni en HUMAN_ACTIONS: nadie las carga`]
491
+ }
492
+
468
493
  function check(dir, cli) {
469
494
  const root = path.resolve(dir || '.')
470
495
  const errors = []
@@ -578,6 +603,7 @@ function check(dir, cli) {
578
603
  for (const entry of FK.drift(path.resolve(root, '..'))) warnings.push(FK.driftLine(entry))
579
604
 
580
605
  warnings.push(...seccionesPerdidas(path.resolve(root, '..')))
606
+ warnings.push(...credencialesSinDueño(path.resolve(root, '..')))
581
607
 
582
608
  if (cli.has('--json')) {
583
609
  console.log(JSON.stringify({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.38.0",
3
+ "version": "0.39.0",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "keywords": [
6
6
  "planning",