ostacky 0.7.0 → 0.7.2

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 CHANGED
@@ -112,10 +112,13 @@ Detecta automáticamente el directorio `.opencode/` del proyecto (o lo crea) y m
112
112
  ### Instalar todo
113
113
 
114
114
  ```bash
115
- npx ostacky install
115
+ npx ostacky install # local por defecto (pregunta si querés global)
116
+ npx ostacky install --scope local # <proyecto>/.opencode
117
+ npx ostacky install --scope global # ~/.config/opencode (XDG/APPDATA en Windows)
118
+ npx ostacky install --scope auto # local si existe .opencode/.git, si no global
116
119
  ```
117
120
 
118
- Descarga todos los agentes y commands definidos en el manifest y los escribe en `.opencode/`.
121
+ Descarga todos los agentes y commands definidos en el manifest y los escribe en `.opencode/` (scope `local`) o en `~/.config/opencode` (`global`). Herramientas (`tools/`) siempre quedan en `<proyecto>/.opencode/tools`.
119
122
 
120
123
  ### Agregar agentes o commands individualmente
121
124
 
@@ -218,33 +221,33 @@ Tras instalar, el proyecto queda así:
218
221
 
219
222
  ```json
220
223
  {
221
- "version": "0.7.0",
224
+ "version": "0.7.2",
222
225
  "lockedAt": "2025-01-01T00:00:00.000Z",
223
226
  "repo": "JaimeHoracio/Ostacky",
224
- "tag": "v0.7.0",
227
+ "tag": "v0.7.2",
225
228
  "agents": {
226
229
  "ostacky": {
227
- "version": "0.7.0",
230
+ "version": "0.7.2",
228
231
  "installedAt": "2025-01-01T00:00:00.000Z",
229
232
  "sha256": "abc123..."
230
233
  }
231
234
  },
232
235
  "commands": {
233
236
  "install-stack": {
234
- "version": "0.7.0",
237
+ "version": "0.7.2",
235
238
  "installedAt": "2025-01-01T00:00:00.000Z",
236
239
  "sha256": "def456..."
237
240
  },
238
241
  "opsx-sync": {
239
- "version": "0.7.0",
242
+ "version": "0.7.2",
240
243
  "installedAt": "2025-01-01T00:00:00.000Z",
241
244
  "sha256": "ghi789..."
242
245
  }
243
246
  },
244
247
  "skills": {
245
- "brainstorming": { "version": "0.7.0", ... },
246
- "execution-mode-evaluation": { "version": "0.7.0", ... },
247
- "openspec-propose": { "version": "0.7.0", ... }
248
+ "brainstorming": { "version": "0.7.2", ... },
249
+ "execution-mode-evaluation": { "version": "0.7.2", ... },
250
+ "openspec-propose": { "version": "0.7.2", ... }
248
251
  }
249
252
  }
250
253
  ```
@@ -274,7 +277,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
274
277
  ## Seguridad
275
278
 
276
279
  - `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
277
- - Las URLs de descarga usan **tags de GitHub** (ej. `v0.7.0`), nunca `main` — instalaciones reproducibles
280
+ - Las URLs de descarga usan **tags de GitHub** (ej. `v0.7.2`), nunca `main` — instalaciones reproducibles
278
281
  - Cada path de archivo descargado es validado para prevenir **path traversal**
279
282
  - Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
280
283
  - El cache local (`.opencode/cache/`) también valida integridad al servir archivos cacheados
@@ -311,8 +311,8 @@ Si dos instrucciones se contradicen:
311
311
 
312
312
  1. `engram_mem_context` — recuperá historial reciente. ¿Ya se analizó algo similar?
313
313
  2. Si existe un change activo, leé `proposal.md`, `design.md`, `tasks.md` — solo estos tres, no todo el directorio.
314
- 3. **Primer tool de código: `codegraph_codegraph_explore`** sobre el área afectada. Timeout ~10s.
315
- 4. Si CodeGraph no responde → Engram para contexto → Read archivos directamente. Nunca te quedes esperando.
314
+ 3. **Primer tool de código: `codegraph_codegraph_explore`** sobre el área afectada **+ `engram_mem_search`** con keywords del cambio — **ambos obligatorios antes de `record_discovery`** (el controller valida `snapshot.symbols` no vacío; `_compressed` no cuenta como evidencia). Timeout ~10s.
315
+ 4. Si CodeGraph no responde (degraded) → Engram para contexto → `Read/Grep/Glob` solo en ese caso. Nunca te quedes esperando.
316
316
  5. Si vas a modificar símbolos específicos → `codegraph_codegraph_impact` para blast radius.
317
317
  6. Leé con `Read` **solo** archivos que el grafo no cubrió.
318
318
 
@@ -348,15 +348,16 @@ Si el controller está disponible: `ostacky-controller_consume_route_decision` c
348
348
 
349
349
  ### 4. Execution
350
350
 
351
- 1. Si el controller está disponible: llamá `ostacky-controller_record_execution_analysis` con el snapshot.
352
- 2. **Mostrá el análisis al usuario y preguntá:**
351
+ 1. **Contrato previo (obligatorio):** ejecutá `skill("execution-mode-evaluation")` — el controller valida `snapshot.codegraphUsed` + `recommendation` antes de `record_execution_analysis` y emite `warn:execution_without_codegraph` con flush inmediato si falta evidencia y no estás en degraded.
352
+ 2. Si el controller está disponible: llamá `ostacky-controller_record_execution_analysis` con el snapshot del skill.
353
+ 3. **Mostrá el análisis al usuario y preguntá:**
353
354
  - Mapa de tasks → archivos
354
355
  - Archivos compartidos
355
356
  - Clusters
356
357
  - Recomendación y razón
357
358
  - "¿Cómo preferís ejecutar?" (inline / subagent-driven)
358
- 3. **La confirmación del usuario autoriza la ejecución.** Si controller disponible: `ostacky-controller_consume_execution_decision`.
359
- 4. **Ejecutá las tasks** — para cada una:
359
+ 4. **La confirmación del usuario autoriza la ejecución.** Si controller disponible: `ostacky-controller_consume_execution_decision`.
360
+ 5. **Inicializá `todowrite`** con todas las tasks del change. Luego **ejecutá las tasks** secuencia atómica por task:
360
361
  - **PASO OBLIGATORIO:** Leé el archivo fresco con `Read` y guardá el contenido en una variable (ej: `content`).
361
362
  - **Validación del edit** (orden de preferencia):
362
363
  - ✅ Controller disponible → `ostacky-controller_validate_edit` con `{ oldString, newString, content: <contenido_leído>, taskId }`
@@ -366,9 +367,12 @@ Si el controller está disponible: `ostacky-controller_consume_route_decision` c
366
367
  - ✅ `ALREADY_APPLIED` → **STOP**. No llames `edit`. Pasá a la próxima task.
367
368
  - ❌ `CONFLICT` → reportá al usuario el `reason`. Si el controller no está disponible, intentá con más contexto.
368
369
  - **Si `ostacky-controller_validate_edit` no responde en ~5 segundos** → asumí controller caído, hacé validación inline y editá.
369
- - Después de cada edit exitoso → si controller disponible: `ostacky-controller_complete_task`.
370
- 5. **Superpowers**: `tdd`, `review`, skills de ejecución.
371
- 6. **Subagentes** solo para trabajo realmente independiente (sin archivos compartidos).
370
+ - Después de cada edit exitoso → si controller disponible: `ostacky-controller_complete_task` → marcar `tasks.md - [x]` → `todowrite` complete.
371
+ - Heurística (por conteo): `ostacky-controller_set_handoff` tras ~4 writes sin completar task.
372
+ - Regla durante `EXECUTING_*`: SOLO `set_handoff` antes de preguntar; **PROHIBIDO `block`/`replan` para clarificaciones** (borran `tasks`/`fileFingerprints`).
373
+ - 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).
374
+ 6. **Superpowers**: `tdd`, `review`, skills de ejecución.
375
+ 7. **Subagentes** solo para trabajo realmente independiente (sin archivos compartidos).
372
376
 
373
377
  ### 5. Sync y cierre
374
378
 
@@ -379,7 +383,7 @@ Si el controller está disponible: `ostacky-controller_consume_route_decision` c
379
383
  - **Accomplished:** lista de tareas completadas + archivos modificados
380
384
  - **Discoveries:** hallazgos técnicos no obvios
381
385
  - **Next steps:** qué queda pendiente
382
- 4. Si controller disponible: `ostacky-controller_implementation_complete`.
386
+ 4. Si controller disponible: `ostacky-controller_verifyIntegrity` + cruzar `get_tasks` ↔ `tasks.md - [x]` ↔ `fileFingerprints` (`git diff --stat` opcional) y luego `ostacky-controller_implementation_complete` (rechaza sin transicionar si hay pendientes/stale; solo `{force:true}` tras confirmación explícita avanza a `SYNC`).
383
387
  5. Si fue SPEC: `/opsx-sync` → `/opsx-archive`.
384
388
  6. Si controller disponible: `ostacky-controller_sync_complete`.
385
389
  7. Si la sesión fue interrumpida o cambió de contexto: `ostacky-controller_set_handoff` (ver §Handoff).
@@ -418,6 +422,9 @@ Co-Authored-By: Ostacky <ostacky@agent.local>
418
422
  2. Cambio de contexto a tema completamente diferente
419
423
  3. Block permanente (el agente no puede avanzar)
420
424
  4. Límite de contexto alcanzado
425
+ 5. Cada 3er `complete_task` (checkpoint automático del controller — determinista, sin debounce temporal)
426
+ 6. ~4 writes sin completar una task (heurística por conteo, sin medir tiempo)
427
+ 7. `degraded:true`
421
428
 
422
429
  **Qué incluir en el handoff (vía `ostacky-controller_set_handoff`):**
423
430
  - **summary:** 1–3 oraciones de qué estábamos haciendo
@@ -434,7 +441,7 @@ ostacky-controller_set_handoff({
434
441
  ```
435
442
 
436
443
  **Doble persistencia (defensa en profundidad):**
437
- - Controller: `lastHandoff` (campo estructurado, recuperación exacta)
444
+ - Controller: `lastHandoff` (campo estructurado, recuperación exacta) + fallback file compaction `dirname(OSTACKY_STATE_PATH)/.ostacky-handoff-compaction.json` (consumido por `get_handoff` si `lastHandoff==null`, limpiado por `clear_handoff`, TTL 24h en `cleanupTmpFiles`)
438
445
  - Engram: `engram_mem_save` con tipo `session_summary` (memoria semántica, búsqueda por similitud)
439
446
 
440
447
  Si el controller no está disponible, usá solo Engram. Si Engram no está disponible, usá solo el controller.
@@ -5,12 +5,31 @@ 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.0, `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.
8
+ **Nota:** A partir de v0.7.2, `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.2)
15
+
16
+ `npx ostacky install` soporta `--scope local|global|auto` (también `--scope=...`):
17
+
18
+ - `local` (recomendado): escribe en `<proyecto>/.opencode` (`opencode.json` local)
19
+ - `global`: escribe en `~/.config/opencode` (Unix/WSL) o `%APPDATA%\opencode` (Windows); respeta `XDG_CONFIG_HOME`
20
+ - `auto`: elige local si existe `.opencode` o `.git` (`.opencode` tiene prioridad), si no global
21
+ - Sin flag: pregunta interactivamente (default local)
22
+
23
+ Herramientas (`tools/`) permanecen siempre en `<proyecto>/.opencode/tools` por reproducibilidad. `npx ostacky install-stack --scope global` bloquea con error claro — el stack debe instalarse por proyecto:
24
+
25
+ ```bash
26
+ npx ostacky install --scope local
27
+ npx ostacky install --scope global
28
+ npx ostacky install-stack --scope auto # stack / proyecto
29
+ ```
30
+
31
+ > **Windows con espacios** (ej. `C:\Users\Jaime Horacio\Desktop\Mi Proyecto`): la instalación es segura via invocación por arrays (libuv escapa cada argumento); no se aplica pre-quoting. `opencode.json` guarda `command` como array JSON.
32
+
14
33
  ---
15
34
 
16
35
  ## Paso 1 — CodeGraph