@ingeniomaps/cauce 0.5.5 → 0.6.1
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 +26 -0
- package/automatization/runners/antigravity/hook.js +15 -0
- package/automatization/runners/antigravity/manifest.json +9 -1
- package/automatization/runners/gemini/GEMINI.md +21 -6
- package/automatization/runners/gemini/manifest.json +4 -3
- package/automatization/runners/gemini/settings.json +35 -1
- package/engine/automation/index.js +17 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,32 @@ esa operación sea confiable en vez de sólo cómoda: acá se lee qué cambió a
|
|
|
8
8
|
un cambio en el protocolo, en las reglas del sistema o en un guard es visible para el usuario y sube
|
|
9
9
|
minor aunque no toque una sola línea de código.
|
|
10
10
|
|
|
11
|
+
## [0.6.1] - 2026-08-15
|
|
12
|
+
|
|
13
|
+
### Corregido
|
|
14
|
+
|
|
15
|
+
- **El bridge de Antigravity negaba cada llamada a herramienta.** Resolvía la raíz ops subiendo por el
|
|
16
|
+
árbol, y en sidecar es un *hermano* de los repos de producto: no la encontraba y, como falla cerrado,
|
|
17
|
+
bloqueaba todo. Ahora `automation install` le deja escrito dónde quedó, con el recorrido hacia arriba
|
|
18
|
+
como respaldo.
|
|
19
|
+
- **`automation install antigravity` copiaba el plugin y lo dejaba inerte.** Antigravity exige un
|
|
20
|
+
registro explícito —`agy plugin install`—, así que los archivos quedaban en su lugar, `doctor` daba
|
|
21
|
+
verde y no se ejecutaba nada. `install` ahora dice el comando exacto y `doctor` avisa si falta, sin
|
|
22
|
+
tocar por su cuenta la configuración global del usuario.
|
|
23
|
+
|
|
24
|
+
## [0.6.0] - 2026-08-15
|
|
25
|
+
|
|
26
|
+
### Cambiado
|
|
27
|
+
|
|
28
|
+
- **Gemini deja de ser el runner sin guards.** Gemini CLI ganó hooks y skills nativas, y el adaptador
|
|
29
|
+
seguía tratándolo como si no los tuviera: los guards se pedían como prechecks manuales —o sea,
|
|
30
|
+
nadie lo detenía— y los 47 cargos no llegaban. Ahora recibe hooks reales en `.gemini/settings.json`
|
|
31
|
+
con sus propios eventos (`BeforeTool`, `AfterAgent`) y variable (`$GEMINI_PROJECT_DIR`), y el
|
|
32
|
+
catálogo completo en `.gemini/skills/`.
|
|
33
|
+
- `GEMINI.md` avisa de dos cosas que sólo se ven usándolo: Gemini **desactiva los hooks si la carpeta
|
|
34
|
+
no es de confianza**, y `gemini hooks migrate --from-claude` reescribe `settings.json` entero y se
|
|
35
|
+
lleva puesta el resto de la configuración.
|
|
36
|
+
|
|
11
37
|
## [0.5.5] - 2026-08-15
|
|
12
38
|
|
|
13
39
|
### Corregido
|
|
@@ -11,7 +11,22 @@ function readInput() {
|
|
|
11
11
|
} catch { return {} }
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Dónde quedó la raíz ops respecto de la carpeta que Antigravity abre. Lo completa
|
|
15
|
+
// `automation install`, que es el único momento en que se sabe: en modo sidecar la raíz ops es un
|
|
16
|
+
// hermano de los repos de producto, y ninguna búsqueda hacia arriba la encuentra. Sin esto el bridge
|
|
17
|
+
// no hallaba `ops.config.json` y, como falla cerrado, negaba cada llamada a herramienta.
|
|
18
|
+
const OPS_DIR = '{{OPS_DIR}}'
|
|
19
|
+
|
|
20
|
+
function declaredRoot() {
|
|
21
|
+
// El plugin vive en <raíz-de-instalación>/.agents/plugins/cauce/.
|
|
22
|
+
const installed = path.resolve(__dirname, '..', '..', '..')
|
|
23
|
+
const root = OPS_DIR.startsWith('{{') ? installed : path.join(installed, OPS_DIR)
|
|
24
|
+
return fs.existsSync(path.join(root, 'ops.config.json')) ? root : ''
|
|
25
|
+
}
|
|
26
|
+
|
|
14
27
|
function findRoot(input) {
|
|
28
|
+
const declared = declaredRoot()
|
|
29
|
+
if (declared) return declared
|
|
15
30
|
const args = input.toolCall && input.toolCall.args || {}
|
|
16
31
|
const starts = [args.Cwd, process.cwd(), ...(input.workspacePaths || [])].filter(Boolean)
|
|
17
32
|
for (const start of starts) {
|
|
@@ -48,5 +48,13 @@
|
|
|
48
48
|
"checkpointing": false,
|
|
49
49
|
"nativeSkills": true
|
|
50
50
|
},
|
|
51
|
-
"roleSkills": ".agents/plugins/cauce/skills"
|
|
51
|
+
"roleSkills": ".agents/plugins/cauce/skills",
|
|
52
|
+
"activation": {
|
|
53
|
+
"hint": "agy plugin install .agents/plugins/cauce",
|
|
54
|
+
"verify": [
|
|
55
|
+
"plugin",
|
|
56
|
+
"list"
|
|
57
|
+
],
|
|
58
|
+
"expect": "cauce"
|
|
59
|
+
}
|
|
52
60
|
}
|
|
@@ -3,10 +3,25 @@
|
|
|
3
3
|
@{{OPS_DIR}}AGENTS.md
|
|
4
4
|
@{{OPS_DIR}}planning/PROTOCOL.md
|
|
5
5
|
|
|
6
|
-
`{{OPS_DIR}}planning/PROTOCOL.md` es la fuente de verdad. Ejecuta `/ops:autobuild` fase por fase; los
|
|
7
|
-
Claude son referencia, no un runtime compatible. `{{OPS_DIR}}planning/WIP.md` es el mutex
|
|
8
|
-
`{{OPS_DIR}}planning/AWAITING_REVIEW.md` bloquea una corrida nueva.
|
|
6
|
+
`{{OPS_DIR}}planning/PROTOCOL.md` es la fuente de verdad. Ejecuta `/ops:autobuild` fase por fase; los
|
|
7
|
+
workflows JS de Claude son referencia, no un runtime compatible. `{{OPS_DIR}}planning/WIP.md` es el mutex
|
|
8
|
+
y `{{OPS_DIR}}planning/AWAITING_REVIEW.md` bloquea una corrida nueva.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
Los hooks de `.gemini/settings.json` son obligatorios y bloquean por su cuenta. **Requieren que la
|
|
11
|
+
carpeta esté marcada como confiable**: si no lo está, Gemini los desactiva y avisa con
|
|
12
|
+
`Project hooks disabled because the folder is not trusted`, y entonces nada te detiene. Confía en la
|
|
13
|
+
carpeta antes de trabajar.
|
|
14
|
+
|
|
15
|
+
Los cargos llegan como skills en `.gemini/skills/`. Cada uno conserva nombre y descripción, y remite al
|
|
16
|
+
contrato completo; leé ese `SKILL.md` antes de actuar en su terreno. Para la lista:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
node {{OPS_DIR}}tools/ops.js agents list
|
|
20
|
+
node {{OPS_DIR}}tools/ops.js team list
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Nunca omitas aprobaciones, inventes credenciales, escribas remoto, hagas push/deploy o promociones
|
|
24
|
+
trabajo desde INBOX.
|
|
25
|
+
|
|
26
|
+
> No corras `gemini hooks migrate --from-claude`: reescribe `.gemini/settings.json` entero y se lleva
|
|
27
|
+
> puesto el resto de la configuración. `cauce automation install . gemini` ya deja los hooks puestos.
|
|
@@ -31,10 +31,11 @@
|
|
|
31
31
|
}
|
|
32
32
|
],
|
|
33
33
|
"capabilities": {
|
|
34
|
-
"nativeHooks":
|
|
34
|
+
"nativeHooks": true,
|
|
35
35
|
"nativeWorkflows": false,
|
|
36
36
|
"projectInstructions": true,
|
|
37
37
|
"checkpointing": true,
|
|
38
|
-
"nativeSkills":
|
|
39
|
-
}
|
|
38
|
+
"nativeSkills": true
|
|
39
|
+
},
|
|
40
|
+
"roleSkills": ".gemini/skills"
|
|
40
41
|
}
|
|
@@ -1,9 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"general": {
|
|
3
|
-
"checkpointing": {
|
|
3
|
+
"checkpointing": {
|
|
4
|
+
"enabled": true
|
|
5
|
+
}
|
|
4
6
|
},
|
|
5
7
|
"context": {
|
|
6
8
|
"fileName": ["AGENTS.md", "GEMINI.md"],
|
|
7
9
|
"loadFromIncludeDirectories": true
|
|
10
|
+
},
|
|
11
|
+
"hooks": {
|
|
12
|
+
"BeforeTool": [
|
|
13
|
+
{
|
|
14
|
+
"matcher": "run_shell_command",
|
|
15
|
+
"hooks": [
|
|
16
|
+
{
|
|
17
|
+
"type": "command",
|
|
18
|
+
"command": "$GEMINI_PROJECT_DIR/{{OPS_DIR}}automatization/hooks/guard-shell.sh"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"matcher": "replace|write_file",
|
|
24
|
+
"hooks": [
|
|
25
|
+
{
|
|
26
|
+
"type": "command",
|
|
27
|
+
"command": "$GEMINI_PROJECT_DIR/{{OPS_DIR}}automatization/hooks/guard-files.sh"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"AfterAgent": [
|
|
33
|
+
{
|
|
34
|
+
"hooks": [
|
|
35
|
+
{
|
|
36
|
+
"type": "command",
|
|
37
|
+
"command": "$GEMINI_PROJECT_DIR/{{OPS_DIR}}automatization/hooks/guard-planning-drift.sh"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
]
|
|
8
42
|
}
|
|
9
43
|
}
|
|
@@ -182,6 +182,15 @@ function installRoleSkills(root, runner, output) {
|
|
|
182
182
|
return roles.length
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
+
// Runners que además de los archivos necesitan un registro propio para que el wiring cuente. Copiar
|
|
186
|
+
// y quedarse ahí deja un plugin inerte: los archivos están, `doctor` da verde y nada se ejecuta.
|
|
187
|
+
function activated(runner) {
|
|
188
|
+
if (!runner.activation) return true
|
|
189
|
+
const result = spawnSync(runner.command, runner.activation.verify, { encoding: 'utf8' })
|
|
190
|
+
if (result.status !== 0) return null
|
|
191
|
+
return `${result.stdout || ''}`.includes(runner.activation.expect)
|
|
192
|
+
}
|
|
193
|
+
|
|
185
194
|
function hasHooks(config) {
|
|
186
195
|
if (config.hooks && Object.keys(config.hooks).length) return true
|
|
187
196
|
const events = [
|
|
@@ -423,6 +432,10 @@ function doctor(root, name, output = console) {
|
|
|
423
432
|
['-c', 'command -v "$1" >/dev/null 2>&1', 'runner-doctor', runner.command],
|
|
424
433
|
)
|
|
425
434
|
if (executable.status !== 0) warnings.push(`${runner.command}: CLI no encontrado en PATH`)
|
|
435
|
+
else if (activated(runner) === false) {
|
|
436
|
+
warnings.push(`el plugin está copiado pero no registrado, así que no se ejecuta. `
|
|
437
|
+
+ `Corré desde ${paths.install}: ${runner.activation.hint}`)
|
|
438
|
+
}
|
|
426
439
|
for (const warning of warnings) output.warn(`⚠ ${name}: ${warning}`)
|
|
427
440
|
for (const error of errors) output.error(`✗ ${name}: ${error}`)
|
|
428
441
|
return { runner, errors, warnings }
|
|
@@ -516,6 +529,10 @@ function install(root, name, output = console, options = {}) {
|
|
|
516
529
|
}
|
|
517
530
|
}
|
|
518
531
|
installRoleSkills(root, runner, output)
|
|
532
|
+
if (runner.activation && activated(runner) !== true) {
|
|
533
|
+
output.log(` ${name}: falta registrarlo para que corra. Desde ${paths.install}:`)
|
|
534
|
+
output.log(` ${runner.activation.hint}`)
|
|
535
|
+
}
|
|
519
536
|
M.write(root, undefined, entregado)
|
|
520
537
|
return runner
|
|
521
538
|
}
|