@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.
Files changed (73) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +1 -0
  3. package/agents/roles/system/accounting-specialist/learning/AUTOMATION.md +2 -2
  4. package/agents/roles/system/ai-governance-lead/learning/AUTOMATION.md +1 -1
  5. package/agents/roles/system/ai-product-manager/learning/AUTOMATION.md +1 -1
  6. package/agents/roles/system/analytics-engineer/learning/AUTOMATION.md +1 -1
  7. package/agents/roles/system/backend-engineer/learning/AUTOMATION.md +2 -2
  8. package/agents/roles/system/business-strategist/learning/AUTOMATION.md +2 -2
  9. package/agents/roles/system/cloud-architect/learning/AUTOMATION.md +1 -1
  10. package/agents/roles/system/community-manager/learning/AUTOMATION.md +1 -1
  11. package/agents/roles/system/content-specialist/learning/AUTOMATION.md +2 -2
  12. package/agents/roles/system/customer-success-manager/learning/AUTOMATION.md +2 -2
  13. package/agents/roles/system/customer-support-specialist/learning/AUTOMATION.md +2 -2
  14. package/agents/roles/system/data-analyst/learning/AUTOMATION.md +2 -2
  15. package/agents/roles/system/data-engineer/learning/AUTOMATION.md +1 -1
  16. package/agents/roles/system/data-governance-steward/learning/AUTOMATION.md +2 -2
  17. package/agents/roles/system/data-scientist/learning/AUTOMATION.md +1 -1
  18. package/agents/roles/system/database-administrator/learning/AUTOMATION.md +1 -1
  19. package/agents/roles/system/developer-relations-engineer/learning/AUTOMATION.md +1 -1
  20. package/agents/roles/system/devops-engineer/learning/AUTOMATION.md +2 -2
  21. package/agents/roles/system/engineering-manager/learning/AUTOMATION.md +1 -1
  22. package/agents/roles/system/financial-controller/learning/AUTOMATION.md +2 -2
  23. package/agents/roles/system/finops-engineer/learning/AUTOMATION.md +2 -2
  24. package/agents/roles/system/fraud-risk-analyst/learning/AUTOMATION.md +2 -2
  25. package/agents/roles/system/frontend-engineer/learning/AUTOMATION.md +2 -2
  26. package/agents/roles/system/growth-marketer/learning/AUTOMATION.md +2 -2
  27. package/agents/roles/system/implementation-manager/learning/AUTOMATION.md +1 -1
  28. package/agents/roles/system/integrations-engineer/learning/AUTOMATION.md +3 -3
  29. package/agents/roles/system/kyc-aml-specialist/learning/AUTOMATION.md +3 -3
  30. package/agents/roles/system/legal-counsel/learning/AUTOMATION.md +1 -1
  31. package/agents/roles/system/logistics-operations-manager/learning/AUTOMATION.md +2 -2
  32. package/agents/roles/system/machine-learning-engineer/learning/AUTOMATION.md +1 -1
  33. package/agents/roles/system/mlops-engineer/learning/AUTOMATION.md +1 -1
  34. package/agents/roles/system/mobile-engineer/learning/AUTOMATION.md +2 -2
  35. package/agents/roles/system/partnerships-manager/learning/AUTOMATION.md +1 -1
  36. package/agents/roles/system/people-operations-manager/learning/AUTOMATION.md +1 -1
  37. package/agents/roles/system/privacy-compliance-specialist/learning/AUTOMATION.md +2 -2
  38. package/agents/roles/system/procurement-manager/learning/AUTOMATION.md +1 -1
  39. package/agents/roles/system/product-manager/learning/AUTOMATION.md +3 -3
  40. package/agents/roles/system/product-marketing-manager/learning/AUTOMATION.md +2 -2
  41. package/agents/roles/system/project-manager/learning/AUTOMATION.md +1 -1
  42. package/agents/roles/system/qa-engineer/learning/AUTOMATION.md +2 -2
  43. package/agents/roles/system/release-manager/learning/AUTOMATION.md +1 -1
  44. package/agents/roles/system/sales-representative/learning/AUTOMATION.md +2 -2
  45. package/agents/roles/system/security-engineer/learning/AUTOMATION.md +2 -2
  46. package/agents/roles/system/site-reliability-engineer/learning/AUTOMATION.md +2 -2
  47. package/agents/roles/system/software-architect/learning/AUTOMATION.md +2 -2
  48. package/agents/roles/system/solutions-engineer/learning/AUTOMATION.md +1 -1
  49. package/agents/roles/system/tech-lead/learning/AUTOMATION.md +2 -2
  50. package/agents/roles/system/technical-program-manager/learning/AUTOMATION.md +1 -1
  51. package/agents/roles/system/technical-writer/learning/AUTOMATION.md +1 -1
  52. package/agents/roles/system/treasury-analyst/learning/AUTOMATION.md +2 -2
  53. package/agents/roles/system/ui-designer/learning/AUTOMATION.md +3 -3
  54. package/agents/roles/system/user-researcher/learning/AUTOMATION.md +3 -3
  55. package/agents/roles/system/ux-designer/learning/AUTOMATION.md +3 -3
  56. package/automatization/hooks/README.md +4 -3
  57. package/automatization/workflows/agent-propose.js +2 -2
  58. package/automatization/workflows/autobuild.js +52 -12
  59. package/engine/agents/learning-files.js +18 -0
  60. package/engine/agents/learning-seal.js +24 -12
  61. package/engine/agents/learning-sources.js +12 -10
  62. package/engine/agents/learning.js +29 -7
  63. package/engine/cli/args.js +2 -2
  64. package/engine/cli/catalog.js +12 -12
  65. package/engine/cli/ops.js +2 -1
  66. package/engine/hooks/approval.js +5 -3
  67. package/engine/hooks/chat.js +19 -7
  68. package/engine/hooks/push.js +3 -2
  69. package/engine/hooks/self-approval.js +2 -2
  70. package/engine/hooks/shell.js +34 -0
  71. package/package.json +1 -1
  72. package/template/AGENTS.md +5 -4
  73. 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 contestando «dale» al bloqueo— 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
- + 'esperá: si contesta «dale», reintentá la misma escritura y pasa.'
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.97.0",
3
+ "version": "0.98.0",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "keywords": [
6
6
  "planning",
@@ -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 la semana
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é: contestá «dale» y pasa exactamente
112
- eso. **Con los gates de un commit se pregunta cada vez**, como con publicar: gobernanza, los gates del
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 aprueba contestando «dale».
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 semanal de AGENT=<slug>
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>