@ingeniomaps/cauce 0.97.0 → 0.98.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 +65 -0
- package/README.md +1 -0
- package/agents/roles/system/accounting-specialist/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/ai-governance-lead/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/ai-product-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/analytics-engineer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/backend-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/business-strategist/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/cloud-architect/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/community-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/content-specialist/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/customer-success-manager/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/customer-support-specialist/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/data-analyst/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/data-engineer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/data-governance-steward/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/data-scientist/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/database-administrator/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/developer-relations-engineer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/devops-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/engineering-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/financial-controller/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/finops-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/fraud-risk-analyst/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/frontend-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/growth-marketer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/implementation-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/integrations-engineer/learning/AUTOMATION.md +3 -3
- package/agents/roles/system/kyc-aml-specialist/learning/AUTOMATION.md +3 -3
- package/agents/roles/system/legal-counsel/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/logistics-operations-manager/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/machine-learning-engineer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/mlops-engineer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/mobile-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/partnerships-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/people-operations-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/privacy-compliance-specialist/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/procurement-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/product-manager/learning/AUTOMATION.md +3 -3
- package/agents/roles/system/product-marketing-manager/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/project-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/qa-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/release-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/sales-representative/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/security-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/site-reliability-engineer/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/software-architect/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/solutions-engineer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/tech-lead/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/technical-program-manager/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/technical-writer/learning/AUTOMATION.md +1 -1
- package/agents/roles/system/treasury-analyst/learning/AUTOMATION.md +2 -2
- package/agents/roles/system/ui-designer/learning/AUTOMATION.md +3 -3
- package/agents/roles/system/user-researcher/learning/AUTOMATION.md +3 -3
- package/agents/roles/system/ux-designer/learning/AUTOMATION.md +3 -3
- package/automatization/hooks/README.md +4 -3
- package/automatization/workflows/agent-propose.js +2 -2
- package/automatization/workflows/autobuild.js +52 -12
- package/engine/agents/learning-files.js +18 -0
- package/engine/agents/learning-seal.js +24 -12
- package/engine/agents/learning-sources.js +12 -10
- package/engine/agents/learning.js +29 -7
- package/engine/cli/args.js +2 -2
- package/engine/cli/catalog.js +12 -12
- package/engine/cli/ops.js +2 -1
- package/engine/hooks/approval.js +5 -3
- package/engine/hooks/chat.js +19 -7
- package/engine/hooks/push.js +3 -2
- package/engine/hooks/self-approval.js +2 -2
- package/engine/hooks/shell.js +34 -0
- package/package.json +1 -1
- package/template/AGENTS.md +5 -4
- package/template/Makefile +1 -1
|
@@ -24,7 +24,7 @@ const CHAT_RECORD = (file) => `${file} es el registro de lo que la persona dijo
|
|
|
24
24
|
+ 'runner, nunca una herramienta.'
|
|
25
25
|
|
|
26
26
|
const SELF = (file) => `${file} es la aprobación de una persona, y escribírsela es aprobarse solo. Si la `
|
|
27
|
-
+ 'persona quiere autorizar algo, que lo diga en el chat —nombrándolo, o
|
|
27
|
+
+ 'persona quiere autorizar algo, que lo diga en el chat —nombrándolo, o confirmando el bloqueo— o '
|
|
28
28
|
+ 'que edite el archivo ella.'
|
|
29
29
|
|
|
30
30
|
// Las líneas van en el mensaje porque son lo que el «dale» va a aprobar: una confirmación que no muestra
|
|
@@ -32,7 +32,7 @@ const SELF = (file) => `${file} es la aprobación de una persona, y escribírsel
|
|
|
32
32
|
const UNASKED = (file, missing) => `${file} es la aprobación de una persona y estas líneas no las pidió:\n`
|
|
33
33
|
+ missing.map((line) => ` ${line}\n`).join('')
|
|
34
34
|
+ 'Escribí sólo lo que ella nombró en su mensaje. Si hacen falta las otras, decile cuáles y por qué, y '
|
|
35
|
-
+ '
|
|
35
|
+
+ 'pedile que lo confirme con sus palabras: si lo que contesta es un sí, reintentá la misma escritura y pasa.'
|
|
36
36
|
|
|
37
37
|
// **Por shell se frena toda escritura.** Es la misma decisión que toma `ops-config`, y por qué un comando
|
|
38
38
|
// no se puede comparar está escrito allá. Lo que la trae hasta acá es que el contenido es lo único que
|
package/engine/hooks/shell.js
CHANGED
|
@@ -193,6 +193,39 @@ function gitAdd(input) {
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
+
// Un `package.json` cambia sin tocar nada de lo que su lockfile registra: un script, una descripción, la
|
|
197
|
+
// configuración de una herramienta. Frenar eso por la sola presencia del archivo en el índice obligaba a
|
|
198
|
+
// pedir permiso por un cambio sin riesgo (caso 181). Se deja pasar sólo lo medido, y lo demás frena como
|
|
199
|
+
// antes, incluido lo que no se puede comparar.
|
|
200
|
+
//
|
|
201
|
+
// La lista salió de correr `npm install --package-lock-only` con npm 11.16.0 cambiando una clave por vez:
|
|
202
|
+
// las claves name, version, license, engines, bin, funding, workspaces, os y cpu, y los scripts preinstall,
|
|
203
|
+
// install y postinstall, sí mueven el lock. Sólo se midió el lock de npm, así que con otro gestor no se
|
|
204
|
+
// afloja nada.
|
|
205
|
+
const INERT_KEYS = new Set([
|
|
206
|
+
'scripts', 'description', 'keywords', 'author', 'repository', 'homepage', 'bugs', 'private', 'type',
|
|
207
|
+
'main', 'files', 'exports', 'config', 'jest', 'eslintConfig', 'prettier',
|
|
208
|
+
])
|
|
209
|
+
const INSTALL_SCRIPTS = ['preinstall', 'install', 'postinstall']
|
|
210
|
+
|
|
211
|
+
function lockUnaffected(dir, file, lockfiles) {
|
|
212
|
+
if (path.basename(file) !== 'package.json' || lockfiles.join() !== 'package-lock.json') return false
|
|
213
|
+
const read = (ref) => {
|
|
214
|
+
const shown = run('git', ['-C', dir, 'show', `${ref}:${file}`], dir)
|
|
215
|
+
if (!shown.ok) return null
|
|
216
|
+
try { return JSON.parse(shown.output) } catch { return null }
|
|
217
|
+
}
|
|
218
|
+
const before = read('HEAD')
|
|
219
|
+
const after = read('')
|
|
220
|
+
if (!before || !after || typeof before !== 'object' || typeof after !== 'object') return false
|
|
221
|
+
const same = (one, other) => JSON.stringify(one) === JSON.stringify(other)
|
|
222
|
+
const changed = [...new Set([...Object.keys(before), ...Object.keys(after)])]
|
|
223
|
+
.filter((key) => !same(before[key], after[key]))
|
|
224
|
+
if (changed.some((key) => !INERT_KEYS.has(key))) return false
|
|
225
|
+
const scripts = (one) => (one && typeof one.scripts === 'object' ? one.scripts : {}) || {}
|
|
226
|
+
return INSTALL_SCRIPTS.every((name) => same(scripts(before)[name], scripts(after)[name]))
|
|
227
|
+
}
|
|
228
|
+
|
|
196
229
|
function dependencies(input) {
|
|
197
230
|
if (process.env.OPS_DEPENDENCIES_OVERRIDE === '1') return
|
|
198
231
|
const command = commandOf(input)
|
|
@@ -250,6 +283,7 @@ function dependencies(input) {
|
|
|
250
283
|
block(`${parent}: hay varios lockfiles (${onDisk.join(', ')}). Conserva uno solo.`)
|
|
251
284
|
}
|
|
252
285
|
const manifests = sinAprobar(parent, state.manifests)
|
|
286
|
+
.filter((name) => !lockUnaffected(dir, name, existingLocks))
|
|
253
287
|
if (state.manifests.length && existingLocks.length && !state.locks.length && manifests.length) {
|
|
254
288
|
block(`${parent}: cambió ${state.manifests.join(', ')} sin actualizar su lockfile.\n`
|
|
255
289
|
+ AP.HOW('OPS_DEPENDENCIES_OVERRIDE', manifests, input))
|
package/package.json
CHANGED
package/template/AGENTS.md
CHANGED
|
@@ -57,7 +57,7 @@ comando, sin cron —activarlo en tu repositorio es decisión tuya—:
|
|
|
57
57
|
|
|
58
58
|
```bash
|
|
59
59
|
node tools/ops.js agents list --own # sólo los tuyos, sin los del catálogo
|
|
60
|
-
node tools/ops.js learn <slug> # arma el informe de
|
|
60
|
+
node tools/ops.js learn <slug> # arma el informe de investigación
|
|
61
61
|
/agent-propose <slug> # escribe el cambio concreto sobre esos informes
|
|
62
62
|
# ↑ firmá «Aprobación humana» en la propuesta antes de seguir
|
|
63
63
|
/agent-promote <slug> # lo aplica, registra y manda a verificar
|
|
@@ -108,8 +108,9 @@ te frena es el peor para elegir bien.
|
|
|
108
108
|
**Si lo pediste vos en el chat, no hace falta nada.** Los guards contienen al agente cuando decide solo o
|
|
109
109
|
cuando trabaja dentro de un recorrido; lo que vos pedís directo no se frena. Nombrá lo que querés que
|
|
110
110
|
toque —«borrá la prueba de altas», «reescribí la migración 004»— y pasa sin preguntarte de nuevo. Si tu
|
|
111
|
-
pedido no lo nombraba y algo se frena, el agente te dice qué y por qué:
|
|
112
|
-
|
|
111
|
+
pedido no lo nombraba y algo se frena, el agente te dice qué y por qué: confirmalo con tus palabras —un
|
|
112
|
+
«dale» alcanza, pero no hace falta esa palabra— y pasa exactamente eso. Si contestás negando, frenando o
|
|
113
|
+
preguntando, no pasa. **Con los gates de un commit se pregunta cada vez**, como con publicar: gobernanza, los gates del
|
|
113
114
|
stack y los lockfiles no heredan lo que autorizaste en un mensaje anterior, porque cada commit es otra
|
|
114
115
|
operación. Y `plan-first` no te pide un plan cuando el cambio lo pediste vos: el plan es para el trabajo que va
|
|
115
116
|
por tareas. Funciona en Claude Code, Codex y Gemini, que le avisan a Cauce cuando mandás un mensaje; en
|
|
@@ -258,7 +259,7 @@ Publicar es lo único de todo eso que este proyecto puede habilitar, y `runner.a
|
|
|
258
259
|
`ops.config.json` es la autorización que R10 pide para las ramas de trabajo. La rama viva —`main`,
|
|
259
260
|
`master` o la rama por defecto del remoto— no la alcanza si el proyecto no la nombra en
|
|
260
261
|
`runner.pushToLiveBranches`, y un subagente no publica con ningún permiso. Sin la llave, pasa el push
|
|
261
|
-
que la persona pide en el chat nombrando el remoto y la rama, o el que ella
|
|
262
|
+
que la persona pide en el chat nombrando el remoto y la rama, o el que ella confirma cuando se frena.
|
|
262
263
|
Reescribir historia publicada no entra en el trato: un `push --force` se frena con la llave prendida o
|
|
263
264
|
apagada.
|
|
264
265
|
|
package/template/Makefile
CHANGED
|
@@ -53,7 +53,7 @@ integration-promote: require-key ## Promueve el draft KEY=<clave> al roadmap
|
|
|
53
53
|
require-agent:
|
|
54
54
|
@test -n "$(AGENT)" || (echo "Falta AGENT=<slug>" >&2; exit 2)
|
|
55
55
|
|
|
56
|
-
agent-learn: require-agent ## Prepara el informe
|
|
56
|
+
agent-learn: require-agent ## Prepara el informe de investigación de AGENT=<slug>
|
|
57
57
|
@node tools/ops.js learn "$(AGENT)"
|
|
58
58
|
|
|
59
59
|
agent-propose: require-agent ## Consolida una propuesta para AGENT=<slug>
|