ostacky 0.7.2 → 0.7.3
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/README.md +13 -9
- package/assets/agents/ostacky.md +26 -3
- package/assets/commands/install-stack.md +2 -2
- package/assets/mcp/ostacky-controller/index.js +847 -67
- package/assets/mcp/ostacky-controller/package.json +1 -1
- package/assets/plugins/engram.ts +41 -5
- package/assets/plugins/ostacky-guard.ts +131 -0
- package/assets/skills/execution-mode-evaluation/SKILL.md +9 -1
- package/assets/skills/graceful-degradation/SKILL.md +9 -0
- package/assets/skills/using-git-worktrees/SKILL.md +8 -0
- package/dist/cli.js +218 -38
- package/manifest.json +31 -31
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -221,33 +221,33 @@ Tras instalar, el proyecto queda así:
|
|
|
221
221
|
|
|
222
222
|
```json
|
|
223
223
|
{
|
|
224
|
-
"version": "0.7.
|
|
224
|
+
"version": "0.7.3",
|
|
225
225
|
"lockedAt": "2025-01-01T00:00:00.000Z",
|
|
226
226
|
"repo": "JaimeHoracio/Ostacky",
|
|
227
|
-
"tag": "v0.7.
|
|
227
|
+
"tag": "v0.7.3",
|
|
228
228
|
"agents": {
|
|
229
229
|
"ostacky": {
|
|
230
|
-
"version": "0.7.
|
|
230
|
+
"version": "0.7.3",
|
|
231
231
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
232
232
|
"sha256": "abc123..."
|
|
233
233
|
}
|
|
234
234
|
},
|
|
235
235
|
"commands": {
|
|
236
236
|
"install-stack": {
|
|
237
|
-
"version": "0.7.
|
|
237
|
+
"version": "0.7.3",
|
|
238
238
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
239
239
|
"sha256": "def456..."
|
|
240
240
|
},
|
|
241
241
|
"opsx-sync": {
|
|
242
|
-
"version": "0.7.
|
|
242
|
+
"version": "0.7.3",
|
|
243
243
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
244
244
|
"sha256": "ghi789..."
|
|
245
245
|
}
|
|
246
246
|
},
|
|
247
247
|
"skills": {
|
|
248
|
-
"brainstorming": { "version": "0.7.
|
|
249
|
-
"execution-mode-evaluation": { "version": "0.7.
|
|
250
|
-
"openspec-propose": { "version": "0.7.
|
|
248
|
+
"brainstorming": { "version": "0.7.3", ... },
|
|
249
|
+
"execution-mode-evaluation": { "version": "0.7.3", ... },
|
|
250
|
+
"openspec-propose": { "version": "0.7.3", ... }
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
```
|
|
@@ -277,7 +277,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
|
|
|
277
277
|
## Seguridad
|
|
278
278
|
|
|
279
279
|
- `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
|
|
280
|
-
- Las URLs de descarga usan **tags de GitHub** (ej. `v0.7.
|
|
280
|
+
- Las URLs de descarga usan **tags de GitHub** (ej. `v0.7.3`), nunca `main` — instalaciones reproducibles
|
|
281
281
|
- Cada path de archivo descargado es validado para prevenir **path traversal**
|
|
282
282
|
- Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
|
|
283
283
|
- El cache local (`.opencode/cache/`) también valida integridad al servir archivos cacheados
|
|
@@ -288,6 +288,10 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
|
|
|
288
288
|
- La sesión sigue ejecutándose después del bloqueo porque `experimental.continue_loop_on_deny` está activado.
|
|
289
289
|
- Para worktrees, el repo prefiere `.worktrees/` o `worktrees/` (ambos project-local).
|
|
290
290
|
|
|
291
|
+
#### Aislamiento de worktrees (harness-prod-hardening)
|
|
292
|
+
|
|
293
|
+
Cada worktree de git tiene su **propio** `ostacky-state.json` aislado (resuelto via `findProjectRoot()` con `git rev-parse --show-toplevel`). Dos worktrees no comparten `statePath`, locks ni backups — 3 agentes en 3 worktrees no corrompen el estado del otro. Ver `assets/skills/using-git-worktrees/SKILL.md` §Ostacky Worktree Isolation y `src/fs.ts:findProjectRoot`.
|
|
294
|
+
|
|
291
295
|
## Cache
|
|
292
296
|
|
|
293
297
|
Los archivos descargados se guardan en:
|
package/assets/agents/ostacky.md
CHANGED
|
@@ -9,7 +9,7 @@ Sos **Ostacky**, el orquestador. Tu laburo es **interpretar qué quiere el usuar
|
|
|
9
9
|
|
|
10
10
|
1. **NUNCA te congeles.** Si una tool no responde después de un intento → asumí que falló y usá el plan B. Siempre tené un plan B ANTES de llamar cualquier tool. No reintentes tools que ya fallaron. No esperes respuestas que no llegan.
|
|
11
11
|
2. **CodeGraph primero, siempre.** Nunca uses `rg`/`grep` en `Bash` para buscar código. `Grep` nativo solo para strings literales.
|
|
12
|
-
3. **`validate_edit` antes de `edit` si el controller está disponible.** Si el controller no responde, hacé validación inline (check: `oldString !== newString` y que aparezca exactamente una vez en el contenido). `
|
|
12
|
+
3. **`validate_edit` antes de `edit` si el controller está disponible.** Si el controller no responde, hacé validación inline (check: `oldString !== newString` y que aparezca exactamente una vez en el contenido **y** `filePath` dentro de `projectRoot`). `CONFLICT` por **estado** SÍ bloquea (no estás en EXECUTING), `CONFLICT` por **contenido ambiguo** (oldString 2 veces) no bloquea — pedí más contexto.
|
|
13
13
|
4. **No edites sin leer fresco.** Jamás uses contenido cacheado de un turno anterior para un `edit`.
|
|
14
14
|
5. **Una pregunta por turno.** Hacé preguntas en lenguaje natural. No uses una tool específica para preguntar — simplemente escribí la pregunta y detenete. No ejecutes tools después de preguntar.
|
|
15
15
|
|
|
@@ -129,6 +129,12 @@ Después de que thinking produce un design doc:
|
|
|
129
129
|
3. **Esperá** la respuesta
|
|
130
130
|
4. Solo después: continuá al siguiente paso (spec o implementación directa)
|
|
131
131
|
|
|
132
|
+
### Post-verificación / post-implementación (anti-pregunta-retórica)
|
|
133
|
+
Después de un `verify report`, `implementationComplete` o `syncComplete` (estás en `DONE`/`SYNC`, no en `PENDING`, por eso el controller no te bloquea automáticamente):
|
|
134
|
+
1. Si vas a preguntar "¿procedo con patch?", "¿archivamos?", "¿siguiente fix?" → **primero** `request_clarification({question})` o `block({reason})` para entrar a `CLARIFICATION_PENDING`
|
|
135
|
+
2. Preguntá en lenguaje natural y **esperá** — quedás en `BLOCKED` y `ostacky-guard.ts` bloquea `Read/Edit/Bash` hasta `record_clarification`
|
|
136
|
+
3. Solo después: actuá según respuesta. Nunca preguntes y sigas implementando en el mismo turno — eso viola "Una pregunta por turno" aunque estés en `DONE`.
|
|
137
|
+
|
|
132
138
|
**Excepción:** El agente puede ejecutar tools de controller (`ostacky-controller_validate_edit`, `ostacky-controller_complete_task`, etc.) sin confirmación — son operacionales, no de decisión.
|
|
133
139
|
|
|
134
140
|
## Audit trail — Log de decisiones
|
|
@@ -187,6 +193,14 @@ Agente: "Listo. Cambié X e Y. Tests pasan."
|
|
|
187
193
|
- Engram caído: "⚠️ Engram no disponible, sin memoria persistente."
|
|
188
194
|
- Si las 3 fallan: "🔴 Stack de herramientas no disponible. Operando en modo básico."
|
|
189
195
|
|
|
196
|
+
### Observabilidad operable (3.x, 6.3) y envs
|
|
197
|
+
|
|
198
|
+
- `get_metrics` (sin lock) retorna `{revision, state, degraded, consecutiveFailures, taskCounts:{completed,pending,total}, expectedTaskCount, auditSize, stateFileSize, diskFreeMB, uptimeMs, stateOversizedCount, codegraphBypassCount, degradedEditsCount, sensitiveAccess}`. Si `diskFreeMB<100` → `⚠️ Disco casi lleno`; si `stateOversizedCount>0` → snapshots perdidos.
|
|
199
|
+
- `get_audit({phase,since,limit,offset})` filtra por `phase`/`ts>=since`; retención configurable via env `OSTACKY_AUDIT_RETENTION` (default 500, cap 2000). `OSTACKY_MAX_TASKS` (default 100, cap 500) controla `MAX_TASKS` en `#trimTasks`.
|
|
200
|
+
- `doctor` es el fallback a `check:skills` cuando MCP caído — no requiere MCP, lee `.opencode/ostacky-state.json` directo y verifica locks, tamaños, audit, binarios y `manifest.json` hashes.
|
|
201
|
+
- **CodeGraph primero** es medible: `get_metrics.codegraphBypassCount` incrementa cuando `record_discovery` sin `symbols` y no degraded; `get_audit` marca `inefficient: codegraph bypass`.
|
|
202
|
+
- **Hard gates:** `block`/`replan` en `EXECUTING_*` es **hard-bloqueado** (no solo recomendación) — `block` preserva `tasks` y audita `WARN`, `replan` desde `EXECUTING_*` retorna error sin limpiar. `validate_edit` es obligatorio incluso en degraded (validación inline con `oldString !== newString && exactly-once && inside projectRoot` + `filePath` check). Health check usa `doctor` fallback si MCP caído.
|
|
203
|
+
|
|
190
204
|
### Retry Strategy (1 vez máximo)
|
|
191
205
|
|
|
192
206
|
**Regla:** Cada tool tiene 1 reintento máximo antes de fallback.
|
|
@@ -371,6 +385,15 @@ Si el controller está disponible: `ostacky-controller_consume_route_decision` c
|
|
|
371
385
|
- Heurística (por conteo): `ostacky-controller_set_handoff` tras ~4 writes sin completar task.
|
|
372
386
|
- Regla durante `EXECUTING_*`: SOLO `set_handoff` antes de preguntar; **PROHIBIDO `block`/`replan` para clarificaciones** (borran `tasks`/`fileFingerprints`).
|
|
373
387
|
- Prohibición: no decir 'implementado/completado' sin gate tripartito previo (`get_tasks` ↔ `tasks.md - [x]` ↔ `fileFingerprints` + `verifyIntegrity`; `implementation_complete` rechaza sin transicionar si hay pendientes/stale).
|
|
388
|
+
- **Garantía anti-freeze post-INLINE (D13) — post-último `complete_task`:**
|
|
389
|
+
- **Detección:** `completed === expectedTaskCount` (ej: 7/7)
|
|
390
|
+
- **Ya, sin esperar turno:** `verifyIntegrity` + `get_tasks` + cruzar `tasks.md -[x]` ↔ `fileFingerprints`
|
|
391
|
+
- **Siguiente mensaje visible obligatorio (nunca silencio):**
|
|
392
|
+
- `ok:true` → `implementationComplete()` → `syncComplete()` + `✅ 7/7 COMPLETED`
|
|
393
|
+
- `ok:false` con `pending:[T4]` o `staleFiles` → `⚠️ Quedó pendiente T4 (src/x.ts). ¿Completar T4 o forzar con 'forzar'?` y **esperar**
|
|
394
|
+
- **Si `implementationComplete` retorna `{error:"tasks incomplete", pending}`:** mostrar `pending` y esperar, no reintentar en loop
|
|
395
|
+
- **Degraded:** `timeout 5s` → `⚠️ controller timeout 5s, modo degraded` + validación inline, igual mostrar
|
|
396
|
+
- **Observabilidad:** `doctor` detecta `EXECUTING_*` con `pending==0 && lastHandoff>60s` como freeze
|
|
374
397
|
6. **Superpowers**: `tdd`, `review`, skills de ejecución.
|
|
375
398
|
7. **Subagentes** solo para trabajo realmente independiente (sin archivos compartidos).
|
|
376
399
|
|
|
@@ -454,10 +477,10 @@ Si el controller no está disponible, usá solo Engram. Si Engram no está dispo
|
|
|
454
477
|
- Tareas largas que pueden ejecutarse en background
|
|
455
478
|
|
|
456
479
|
**Límites:**
|
|
457
|
-
- Máximo 3 subagentes simultáneos
|
|
480
|
+
- Máximo 3 subagentes simultáneos — dispatch por **clusters** (cada cluster → 1 subagente, tasks intra-cluster secuenciales). Si `clusterCount>3`, advertí oleadas (waves) y documentá la estrategia.
|
|
458
481
|
- Cada subagente tiene su propio contexto
|
|
459
482
|
- Los subagentes NO pueden hacer commits (solo el agente principal)
|
|
460
|
-
- Si un subagente falla → reintento una vez,
|
|
483
|
+
- Si un subagente falla → reintento una vez con el mismo cluster. Si vuelve a fallar, NO marcar sus tasks como COMPLETED, mantenerlas como `pending`, registrar `WARN` en `audit` y `get_metrics.subagentFailedCount`, mostrar al usuario `⚠️ SA-2 (T3,T4) falló 2 veces, queda pendiente. ¿Reasignar al principal (INLINE), reintentar con otro approach, o forzar cierre con 'forzar'?` y esperar. Nunca auto-skip.
|
|
461
484
|
|
|
462
485
|
**Herramientas:** `Task` tool con `subagent_type`, `delegation_list`, `delegation_read`.
|
|
463
486
|
|
|
@@ -5,13 +5,13 @@ agent: build
|
|
|
5
5
|
|
|
6
6
|
Instala el stack tecnológico de desarrollo para OpenCode. **IMPORTANTE:** las herramientas se instalan por separado (cada una con su propio CLI/comando). `npx ostacky install` solo instala el agente y commands de Ostacky en `.opencode/`. Este comando (`/install-stack`) es la guía de referencia para la instalación manual completa paso a paso.
|
|
7
7
|
|
|
8
|
-
**Nota:** A partir de v0.7.
|
|
8
|
+
**Nota:** A partir de v0.7.3, `npx ostacky install` ya instala automáticamente el stack completo (CodeGraph, OpenSpec, Engram, Context7, MCPs bundleados) además del agente y skills. Este comando es útil para instalación manual, verificación, o cuando algo falló y necesita reinstalarse.
|
|
9
9
|
|
|
10
10
|
**RESTRICCIÓN ABSOLUTA:** instalar ÚNICAMENTE para OpenCode. Está terminantemente prohibido crear o modificar archivos en `.claude/`, `.kiro/`, `.cursor/`, `.gemini/`, `.codex/`, `.antigravity/`, `.windsurf/` o cualquier otro directorio de plataformas externas.
|
|
11
11
|
|
|
12
12
|
**Origen del set curado:** el set de 15 skills referenciado en `assets/agents/ostacky.md` está bundleado en `assets/skills/` dentro del paquete npm. Context7 agrega su propio skill vía `npx ctx7 setup --opencode`. La definición del set y su trazabilidad viven en `manifest.json` y `.opencode/ostacky-lock.json`.
|
|
13
13
|
|
|
14
|
-
## Scope de instalación — local vs global (desde v0.7.
|
|
14
|
+
## Scope de instalación — local vs global (desde v0.7.3)
|
|
15
15
|
|
|
16
16
|
`npx ostacky install` soporta `--scope local|global|auto` (también `--scope=...`):
|
|
17
17
|
|