@ingeniomaps/cauce 0.57.0 → 0.59.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,43 @@ 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.59.0] - 2026-09-03
18
+
19
+ ### Corregido
20
+
21
+ - **Los atajos `team-check` y `team-show` del Makefile pasan a `flow-check` y `flow-show`.** El rename
22
+ de `teams/` a `flows/` llegó al motor y al README en 0.45.0 —esa entrada hasta te pedía renombrar los
23
+ `ops team check|list|show` que tuvieras automatizados— y el Makefile que te entregamos se quedó
24
+ llamando al comando viejo, así que los dos atajos fallaban con el banner de uso en toda instancia.
25
+ La variable ahora es `FLOW=<slug>`, y se suma `flow-list`, que no tenía atajo. **Qué cambia para
26
+ vos**: si automatizaste alguno de los dos, renombralo — hoy no funcionan, así que nada que ande deja
27
+ de andar.
28
+
29
+ - **`automation list` marca instalado lo que está instalado, también en `sidecar`.** Buscaba el wiring
30
+ dentro de la instancia, y en `sidecar` —el modo por defecto— vive en el repo del que abrís tu
31
+ herramienta. Los cuatro adaptadores salían `○` aunque `doctor` los diera operativos dos líneas
32
+ después, así que el glifo no distinguía ningún caso del otro.
33
+
34
+ - **El error de `evaluate --bench` en una instancia dice qué hacer.** Recomendaba adoptar el cargo, y
35
+ adoptarlo no habilita nada: lo que decide es el modo de la instancia. Quien seguía el consejo
36
+ forkeaba, repetía el comando y recibía el mismo mensaje. Ahora nombra la salida real: `ops evaluate
37
+ <cargo>` sin la bandera.
38
+
39
+ ## [0.58.0] - 2026-09-03
40
+
41
+ ### Corregido
42
+
43
+ - **`upgrade` te trae los archivos propios que una versión agrega.** `upgrade` reemplaza lo del toolkit
44
+ y no toca lo tuyo, que es lo correcto — pero cuando una versión **agrega** un archivo del proyecto, la
45
+ instancia que actualiza no lo recibía nunca. Pasó con 0.57.0: `organization/workspace.md` llegaba a
46
+ una instancia nueva y no a una que actualizaba, que quedaba con un `AGENTS.md` nombrándolo tres veces
47
+ y el archivo sin existir. Ahora se crea y se dice: `+ organization/workspace.md: lo agrega esta
48
+ versión, completalo`.
49
+
50
+ **Lo que no hace, a propósito**: reponer cualquier archivo del molde que falte. Borrar uno que no usás
51
+ es legítimo y devolvértelo en cada actualización sería peor que el problema, así que se crea sólo lo
52
+ que cada versión declara que agrega. Lo que ya tenés no se pisa nunca.
53
+
17
54
  ## [0.57.0] - 2026-09-03
18
55
 
19
56
  ### Agregado
@@ -471,4 +471,5 @@ module.exports = {
471
471
  render,
472
472
  listHooks,
473
473
  runnerManifest,
474
+ runnerPaths,
474
475
  }
@@ -189,8 +189,12 @@ function evaluate(agent, caso, cli) {
189
189
  // adoptado— y su `planning/` ya es el lugar legítimo donde trabajar.
190
190
  if (cli.has('--bench')) {
191
191
  if (O.mode(root) !== 'toolkit') {
192
- fail('--bench es del toolkit. En una instancia, el cargo trabaja sobre tu planning/: si es del '
193
- + `catálogo, adoptalo primero con "ops agents fork ${agent}".`, 2)
192
+ // Lo que decide es el modo de la instancia, así que el consejo tiene que ser una salida y no una
193
+ // condición: mandaba a adoptar el cargo, y adoptarlo no habilita nada —quien seguía el consejo
194
+ // forkeaba, repetía el comando y recibía el mismo mensaje diciéndole que forkeara—.
195
+ fail('--bench es del toolkit. En una instancia, el cargo trabaja sobre tu planning/: corré '
196
+ + `"ops evaluate ${agent}" sin la bandera, que valida sus controles, casos y propuestas `
197
+ + 'contra este proyecto.', 2)
194
198
  }
195
199
  // El caso es el posicional que sigue al cargo: `evaluate <cargo> --bench <caso>`. Sin él se arma
196
200
  // un banco suelto, para mirarlo a mano; una corrida real pide uno por caso.
@@ -381,6 +381,29 @@ function upgrade(dir, cli) {
381
381
  )
382
382
  }
383
383
 
384
+ // Lo que una versión agrega y es del proyecto: se crea si falta y nunca se pisa. `systemPaths` no lo
385
+ // incluye a propósito —lo reemplazaría en cada actualización, que es lo que un archivo del proyecto
386
+ // no debe sufrir— así que sin este paso no llega por ninguna vía, y la instancia queda leyendo una
387
+ // instrucción que apunta a un archivo que no tiene.
388
+ const settings = JSON.parse(fs.readFileSync(path.join(root, 'ops.config.json'), 'utf8'))
389
+ const added = []
390
+ for (const relative of O.addedPaths()) {
391
+ const target = path.join(root, relative)
392
+ if (fs.existsSync(target)) continue
393
+ const origin = path.join(PROJECT_ROOT, O.sourceOf(relative))
394
+ if (!fs.existsSync(origin)) continue
395
+ F.assertNoSymlinkPath(root, target)
396
+ fs.mkdirSync(path.dirname(target), { recursive: true })
397
+ let content = fs.readFileSync(origin, 'utf8')
398
+ for (const [key, value] of Object.entries({
399
+ '{{PROJECT_NAME}}': settings.project || path.basename(root),
400
+ '{{MODE}}': O.mode(root),
401
+ '{{WORKSPACE_PATH}}': O.mode(root) === 'embedded' ? '.' : '..',
402
+ })) content = content.replaceAll(key, value)
403
+ F.atomicWrite(target, content)
404
+ added.push(relative)
405
+ }
406
+
384
407
  for (const relative of [...system, ...O.RUNTIME_PATHS]) {
385
408
  const origin = path.join(PROJECT_ROOT, O.sourceOf(relative))
386
409
  if (!fs.existsSync(origin)) continue
@@ -433,6 +456,9 @@ function upgrade(dir, cli) {
433
456
  // que es la evidencia que el protocolo pide para cualquier cambio.
434
457
  for (const file of changed) console.log(`− descartado tu cambio en ${file}`)
435
458
  for (const relative of retired) console.log(`− retirado ${relative}: Cauce ya no lo distribuye`)
459
+ // Nombrarlos importa tanto como crearlos: existen para que los completes, y uno que aparece sin
460
+ // aviso no lo completa nadie.
461
+ for (const relative of added) console.log(`+ ${relative}: lo agrega esta versión, completalo`)
436
462
  // Se dice porque explica un diff en un archivo que la empresa versiona, y que si no aparecería sin
437
463
  // autor.
438
464
  if (pinned === 'ilegible') console.log(' ⚠ package.json no se pudo leer: su versión quedó como estaba')
@@ -214,7 +214,11 @@ function automation(action, rootArg, runnerName, cli) {
214
214
  if (action === 'list') {
215
215
  for (const name of A.RUNNER_NAMES) {
216
216
  const runner = A.runnerManifest(root, name)
217
- const installed = fs.existsSync(path.join(root, runner.config.target))
217
+ // La misma resolución que usan `install`, `doctor` y `uninstall`: en `sidecar` el wiring vive
218
+ // en el padre, donde el dev abre su herramienta. Componer la ruta contra la instancia sólo
219
+ // acierta en `embedded`, y dejaba a los cuatro adaptadores marcados como no instalados en el
220
+ // modo por defecto, con `doctor` diciendo lo contrario dos líneas después.
221
+ const installed = fs.existsSync(A.runnerPaths(root, name, runner).configTarget)
218
222
  const capabilities = Object.entries(runner.capabilities)
219
223
  .filter(([, enabled]) => enabled)
220
224
  .map(([capability]) => capability)
@@ -171,6 +171,52 @@ function overrides(root) {
171
171
 
172
172
  // Rutas que el toolkit dejó de materializar. Sin esto una instancia arrastra para siempre lo que
173
173
  // alguna versión suya copió: `upgrade` agrega y reemplaza, pero nunca quitaba nada.
174
+ // Cada archivo propio del molde, con cómo llega a una instancia que **ya existe**. `upgrade` sólo
175
+ // reemplaza lo del sistema y el runtime, así que un archivo del proyecto no llega por ninguna otra vía:
176
+ // o toda instancia lo tiene desde su `init` —`init`— o una versión lo agrega y hay que crearlo
177
+ // —`upgrade`—. Es el simétrico de `RETIRED`, que dice qué dejamos de distribuir.
178
+ //
179
+ // Se declara archivo por archivo en vez de copiar del molde todo lo que falte, y la diferencia importa:
180
+ // borrar un archivo del molde que no se usa es legítimo —`check` da verde sin él— y reponerlo en cada
181
+ // actualización sería la fricción recurrente que sacar `AGENTS.md` de las manos del proyecto vino a
182
+ // evitar. En disco «lo borré» y «nunca llegó» se ven igual, y para un archivo del proyecto no hay
183
+ // registro que los separe: el manifiesto anota lo que entrega el toolkit.
184
+ //
185
+ // La puerta compara estas claves contra el árbol del molde, así que agregar un archivo allá obliga a
186
+ // decidir acá. Una entrada pasa de `upgrade` a `init` cuando ninguna versión soportada puede no
187
+ // tenerlo; que se quede de más no rompe nada, porque el archivo ya está y se conserva.
188
+ const TEMPLATE_OWN = {
189
+ 'README.md': 'init',
190
+ 'gitignore': 'init',
191
+ 'integrations/config.json': 'init',
192
+ 'integrations/jira/README.md': 'init',
193
+ 'integrations/jira/config.json': 'init',
194
+ 'integrations/jira/proposed/README.md': 'init',
195
+ 'integrations/jira/staging/.gitkeep': 'init',
196
+ 'integrations/jira/staging/README.md': 'init',
197
+ 'ops.config.json': 'init',
198
+ 'organization/company.md': 'init',
199
+ 'organization/domains.md': 'init',
200
+ 'organization/product.md': 'init',
201
+ // 0.57.0. `AGENTS.md` lo nombra tres veces y se reemplaza en cada actualización, así que sin esto
202
+ // una instancia que actualiza queda leyendo una instrucción que apunta a un archivo que no tiene.
203
+ 'organization/workspace.md': 'upgrade',
204
+ 'planning/BACKLOG.md': 'init',
205
+ 'planning/DONE.md': 'init',
206
+ 'planning/HUMAN_ACTIONS.md': 'init',
207
+ 'planning/INBOX.md': 'init',
208
+ 'planning/WIP.md': 'init',
209
+ 'planning/delivery/project.md': 'init',
210
+ 'planning/done/.gitkeep': 'init',
211
+ 'planning/reports/README.md': 'init',
212
+ }
213
+
214
+ // Lo que `upgrade` crea si falta, derivado de la declaración de arriba para que no haya dos listas que
215
+ // puedan decir cosas distintas.
216
+ function addedPaths() {
217
+ return Object.entries(TEMPLATE_OWN).filter(([, via]) => via === 'upgrade').map(([file]) => file)
218
+ }
219
+
174
220
  const RETIRED = [
175
221
  'agents/roles/system',
176
222
  'flows/system',
@@ -248,6 +294,8 @@ function localChanges(root) {
248
294
 
249
295
  module.exports = {
250
296
  RETIRED,
297
+ TEMPLATE_OWN,
298
+ addedPaths,
251
299
  trackedPaths,
252
300
  packageDir,
253
301
  RUNTIME_PATHS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.57.0",
3
+ "version": "0.59.0",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "keywords": [
6
6
  "planning",
package/template/Makefile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  .PHONY: help check tree context upgrade destroy automation-check
4
4
  .PHONY: integration-check integration-sync require-key integration-promote
5
- .PHONY: require-agent agent-learn agent-propose agent-evaluate require-team team-check team-show
5
+ .PHONY: require-agent agent-learn agent-propose agent-evaluate require-flow flow-list flow-check flow-show
6
6
  .PHONY: install-claude install-codex install-gemini install-antigravity
7
7
  .PHONY: uninstall-claude uninstall-codex uninstall-gemini uninstall-antigravity
8
8
  .PHONY: doctor-claude doctor-codex doctor-gemini doctor-antigravity
@@ -59,14 +59,17 @@ agent-propose: require-agent ## Consolida una propuesta para AGENT=<slug>
59
59
  agent-evaluate: require-agent ## Evalúa controles y casos de AGENT=<slug>
60
60
  @node tools/ops.js evaluate "$(AGENT)"
61
61
 
62
- require-team:
63
- @test -n "$(TEAM)" || (echo "Falta TEAM=<slug>" >&2; exit 2)
62
+ require-flow:
63
+ @test -n "$(FLOW)" || (echo "Falta FLOW=<slug>" >&2; exit 2)
64
64
 
65
- team-check: require-team ## Valida contrato, agentes y etapas de TEAM=<slug>
66
- @node tools/ops.js team check "$(TEAM)"
65
+ flow-list: ## Lista los recorridos disponibles
66
+ @node tools/ops.js flow list
67
67
 
68
- team-show: require-team ## Muestra el recorrido de TEAM=<slug>
69
- @node tools/ops.js team show "$(TEAM)"
68
+ flow-check: require-flow ## Valida contrato, agentes y etapas de FLOW=<slug>
69
+ @node tools/ops.js flow check "$(FLOW)"
70
+
71
+ flow-show: require-flow ## Muestra el recorrido de FLOW=<slug>
72
+ @node tools/ops.js flow show "$(FLOW)"
70
73
 
71
74
  install-claude: ## Instala hooks y workflows para Claude
72
75
  @node tools/ops.js automation install . claude