@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 +37 -0
- package/engine/automation/index.js +1 -0
- package/engine/cli/catalog.js +6 -2
- package/engine/cli/instance.js +26 -0
- package/engine/cli/wiring.js +5 -1
- package/engine/core/ownership.js +48 -0
- package/package.json +1 -1
- package/template/Makefile +10 -7
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
|
package/engine/cli/catalog.js
CHANGED
|
@@ -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
|
-
|
|
193
|
-
|
|
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.
|
package/engine/cli/instance.js
CHANGED
|
@@ -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')
|
package/engine/cli/wiring.js
CHANGED
|
@@ -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
|
-
|
|
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)
|
package/engine/core/ownership.js
CHANGED
|
@@ -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
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-
|
|
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-
|
|
63
|
-
@test -n "$(
|
|
62
|
+
require-flow:
|
|
63
|
+
@test -n "$(FLOW)" || (echo "Falta FLOW=<slug>" >&2; exit 2)
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
@node tools/ops.js
|
|
65
|
+
flow-list: ## Lista los recorridos disponibles
|
|
66
|
+
@node tools/ops.js flow list
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
@node tools/ops.js
|
|
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
|