@ingeniomaps/cauce 0.79.0 → 0.81.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 +132 -0
- package/README.md +6 -3
- package/automatization/hooks/README.md +48 -2
- package/automatization/hooks/guard-chat.sh +5 -0
- package/automatization/hooks/guard-secrets-read.sh +3 -0
- package/automatization/hooks/guard-secrets-shell.sh +3 -0
- package/automatization/runners/claude/README.md +5 -2
- package/automatization/runners/claude/manifest.json +26 -1
- package/automatization/runners/claude/settings.json +13 -0
- package/automatization/runners/codex/README.md +4 -0
- package/automatization/runners/codex/hooks.json +7 -0
- package/automatization/runners/gemini/README.md +6 -2
- package/automatization/runners/gemini/settings.json +19 -0
- package/engine/automation/index.js +9 -1
- package/engine/cli/args.js +1 -0
- package/engine/cli/bootstrap.js +1 -1
- package/engine/cli/ops.js +9 -5
- package/engine/cli/wiring.js +21 -3
- package/engine/config/paths.js +5 -3
- package/engine/hooks/approval.js +42 -8
- package/engine/hooks/chat.js +122 -0
- package/engine/hooks/files.js +94 -35
- package/engine/hooks/input.js +7 -1
- package/engine/hooks/run.js +30 -3
- package/engine/hooks/secrets-shell.js +62 -0
- package/engine/hooks/self-approval.js +31 -0
- package/engine/hooks/shell.js +49 -28
- package/engine/integrations/providers/jira.js +1 -1
- package/engine/integrations/registry.js +28 -5
- package/engine/secrets/index.js +201 -0
- package/package.json +1 -1
- package/template/AGENTS.md +14 -3
- package/template/integrations/README.md +21 -0
- package/template/organization/README.md +52 -0
- package/template/planning/adr/README.md +1 -0
- package/template/planning/adr/system/OPS-007-contrato-de-secretos-compartido.md +62 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# OPS-007 — Un contrato de secretos compartido, sin conocer ningún gestor
|
|
2
|
+
|
|
3
|
+
**Estado:** Aceptado
|
|
4
|
+
**Fecha:** 2026-09-10
|
|
5
|
+
|
|
6
|
+
> Decide qué parte del manejo de secretos es de la base; el gestor, sus scripts y su CI siguen siendo de
|
|
7
|
+
> la empresa.
|
|
8
|
+
|
|
9
|
+
## Contexto
|
|
10
|
+
|
|
11
|
+
Una empresa que adopta un gestor de secretos termina con el mismo modelo copiado en cada repositorio:
|
|
12
|
+
la identidad con que se lee el gestor, un script que compara el gestor contra el contrato de variables y
|
|
13
|
+
los workflows que avisan en el PR. Nada dice qué servicio usa qué cuenta ni qué identidad, y nada detecta
|
|
14
|
+
que una copia se quedó atrás. En una instancia real se contaron dieciséis copias de un mismo script en
|
|
15
|
+
tres variantes, y el arreglo que tenía una sola no había llegado ni al esqueleto del que salen los
|
|
16
|
+
servicios nuevos.
|
|
17
|
+
|
|
18
|
+
`integrations/` no sirve para esto: su ciclo es de contenido de trabajo que baja a planning (OPS-003), y
|
|
19
|
+
su README prohíbe guardar secretos ahí.
|
|
20
|
+
|
|
21
|
+
## Decisión
|
|
22
|
+
|
|
23
|
+
**La base declara y compara; no se conecta, no genera y no conoce ningún gestor.**
|
|
24
|
+
|
|
25
|
+
- La declaración vive en `organization/secrets.json`, que es del proyecto: cuentas, proyectos,
|
|
26
|
+
identidades, servicios y los archivos que comparten. Nunca un valor: una clave con forma de secreto es
|
|
27
|
+
un error.
|
|
28
|
+
- Una identidad es un nivel de acceso, no un repositorio. `source: file` es un archivo **fuera de todo
|
|
29
|
+
repositorio**, que carga una persona; `source: ci-secret` vive en el CI.
|
|
30
|
+
- La copia canónica de cada archivo compartido vive en la instancia. `ops secrets check` compara cada
|
|
31
|
+
copia de cada servicio contra ella por hash, sin red, y dice el `cp` que la pone al día. Cauce no
|
|
32
|
+
escribe en los repositorios de producto.
|
|
33
|
+
- El chequeo compara los servicios de una instancia. Una empresa con varios proyectos los declara como
|
|
34
|
+
raíces de la misma instancia, que es lo que hace que un esqueleto y sus derivados se midan contra lo
|
|
35
|
+
mismo.
|
|
36
|
+
|
|
37
|
+
## Alternativas consideradas
|
|
38
|
+
|
|
39
|
+
- **Un adaptador de la empresa que genere los archivos**: flexible, pero obliga al motor a cargar código
|
|
40
|
+
de la instancia y a versionar una interfaz, para resolver lo mismo que una copia comparada por hash.
|
|
41
|
+
- **El adaptador como paquete versionado que cada instancia instala**: mantiene una instancia por
|
|
42
|
+
proyecto a cambio de publicar y versionar un paquete más.
|
|
43
|
+
- **Un workflow reutilizable compartido**: una sola copia, pero supone GitHub y una organización, y deja
|
|
44
|
+
a la base atada a un proveedor de CI.
|
|
45
|
+
- **Hacerlo un proveedor de `integrations/`**: su staging, reconciliación y promoción no se aplican a
|
|
46
|
+
secretos.
|
|
47
|
+
|
|
48
|
+
## Consecuencias
|
|
49
|
+
|
|
50
|
+
**Ganamos:** la copia que se quedó atrás se ve, con su arreglo al lado; rotar una identidad compartida
|
|
51
|
+
es cambiar un archivo; y la base sigue sin saber de ningún gestor.
|
|
52
|
+
|
|
53
|
+
**Costos que aceptamos:** un arreglo sigue siendo un commit por repositorio —el chequeo los lista, no los
|
|
54
|
+
aplica—. Juntar varios proyectos en una instancia comparte también su `planning/`. Y una credencial
|
|
55
|
+
dentro de un repositorio es un error aunque esté ignorada por git: es la copia por repositorio que esta
|
|
56
|
+
decisión viene a sacar.
|
|
57
|
+
|
|
58
|
+
## Estado de implementación
|
|
59
|
+
|
|
60
|
+
Implementado en 0.80.0: `organization/secrets.json`, `ops secrets check` y el recorrido documentado en
|
|
61
|
+
`organization/README.md`. Cauce no trae adaptadores ni un workflow de ejemplo que corra el chequeo en CI;
|
|
62
|
+
correrlo ahí es un paso de la empresa.
|