@ingeniomaps/cauce 0.57.0 → 0.58.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 +15 -0
- package/engine/cli/instance.js +26 -0
- package/engine/core/ownership.js +48 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,21 @@ 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.58.0] - 2026-09-03
|
|
18
|
+
|
|
19
|
+
### Corregido
|
|
20
|
+
|
|
21
|
+
- **`upgrade` te trae los archivos propios que una versión agrega.** `upgrade` reemplaza lo del toolkit
|
|
22
|
+
y no toca lo tuyo, que es lo correcto — pero cuando una versión **agrega** un archivo del proyecto, la
|
|
23
|
+
instancia que actualiza no lo recibía nunca. Pasó con 0.57.0: `organization/workspace.md` llegaba a
|
|
24
|
+
una instancia nueva y no a una que actualizaba, que quedaba con un `AGENTS.md` nombrándolo tres veces
|
|
25
|
+
y el archivo sin existir. Ahora se crea y se dice: `+ organization/workspace.md: lo agrega esta
|
|
26
|
+
versión, completalo`.
|
|
27
|
+
|
|
28
|
+
**Lo que no hace, a propósito**: reponer cualquier archivo del molde que falte. Borrar uno que no usás
|
|
29
|
+
es legítimo y devolvértelo en cada actualización sería peor que el problema, así que se crea sólo lo
|
|
30
|
+
que cada versión declara que agrega. Lo que ya tenés no se pisa nunca.
|
|
31
|
+
|
|
17
32
|
## [0.57.0] - 2026-09-03
|
|
18
33
|
|
|
19
34
|
### Agregado
|
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/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,
|