ostacky 0.8.6 → 0.8.7

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
@@ -246,37 +246,37 @@ Tras instalar (`--scope local`), el proyecto queda así:
246
246
 
247
247
  ```json
248
248
  {
249
- "version": "0.8.6",
249
+ "version": "0.8.7",
250
250
  "lockedAt": "2025-01-01T00:00:00.000Z",
251
251
  "repo": "JaimeHoracio/Ostacky",
252
- "tag": "v0.8.6",
252
+ "tag": "v0.8.7",
253
253
  "agents": {
254
254
  "ostacky": {
255
- "version": "0.8.6",
255
+ "version": "0.8.7",
256
256
  "installedAt": "2025-01-01T00:00:00.000Z",
257
257
  "sha256": "abc123..."
258
258
  }
259
259
  },
260
260
  "commands": {
261
261
  "install-stack": {
262
- "version": "0.8.6",
262
+ "version": "0.8.7",
263
263
  "installedAt": "2025-01-01T00:00:00.000Z",
264
264
  "sha256": "def456..."
265
265
  },
266
266
  "opsx-sync": {
267
- "version": "0.8.6",
267
+ "version": "0.8.7",
268
268
  "installedAt": "2025-01-01T00:00:00.000Z",
269
269
  "sha256": "ghi789..."
270
270
  }
271
271
  },
272
272
  "skills": {
273
- "brainstorming": { "version": "0.8.6", ... },
274
- "execution-mode-evaluation": { "version": "0.8.6", ... },
275
- "openspec-propose": { "version": "0.8.6", ... }
273
+ "brainstorming": { "version": "0.8.7", ... },
274
+ "execution-mode-evaluation": { "version": "0.8.7", ... },
275
+ "openspec-propose": { "version": "0.8.7", ... }
276
276
  },
277
277
  "mcpServers": {
278
- "ostacky-controller": { "version": "0.8.6", ... },
279
- "openspec": { "version": "0.8.6", ... }
278
+ "ostacky-controller": { "version": "0.8.7", ... },
279
+ "openspec": { "version": "0.8.7", ... }
280
280
  }
281
281
  }
282
282
  ```
@@ -308,7 +308,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
308
308
  ## Seguridad
309
309
 
310
310
  - `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
311
- - Las URLs de descarga usan **tags de GitHub** (ej. `v0.8.6`), nunca `main` — instalaciones reproducibles
311
+ - Las URLs de descarga usan **tags de GitHub** (ej. `v0.8.7`), nunca `main` — instalaciones reproducibles
312
312
  - Cada path de archivo descargado es validado para prevenir **path traversal**
313
313
  - Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
314
314
  - El cache local (`.opencode/cache/`) también valida integridad al servir archivos cacheados
@@ -365,7 +365,7 @@ CodeGraph está instalado en `.opencode/tools/codegraph/bin/codegraph` y se conf
365
365
  | `.opencode/tools/codegraph/bin/codegraph status` | Muestra estado del index y archivos pendientes |
366
366
  | `.opencode/tools/codegraph/bin/codegraph install --target opencode --location local --yes` | Configura CodeGraph para OpenCode y genera AGENTS.md |
367
367
 
368
- > **Windows:** si ves `Command failed: cmd.exe /d /c call ... codegraph.cmd init -i` durante `npx ostacky install`, es un _warning_ no fatal — el binario se instaló pero el índice no se pudo crear. Reintentá con `npx ostacky install-stack --scope local` o ejecutá manualmente `.opencode\tools\codegraph\bin\codegraph.exe init -i` (o `codegraph.cmd` si no hay `.exe`) dentro del proyecto. Desde v0.8.6 el instalador usa el patrón resiliente de Engram (strip 0 + búsqueda recursiva) y loguea `projectRoot|toolsDir` para diagnosticar scope.
368
+ > **Windows:** si ves `Command failed: cmd.exe /d /c call ... codegraph.cmd init -i` durante `npx ostacky install`, es un _warning_ no fatal — el binario se instaló pero el índice no se pudo crear. Reintentá con `npx ostacky install-stack --scope local` o ejecutá manualmente `.opencode\tools\codegraph\bin\codegraph.exe init -i` (o `codegraph.cmd` si no hay `.exe`) dentro del proyecto. Desde v0.8.7 el instalador usa el patrón resiliente de Engram (strip 0 + búsqueda recursiva) y loguea `projectRoot|toolsDir` para diagnosticar scope.
369
369
 
370
370
  ## Licencia
371
371
 
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  description: Orquestador principal — rutea por nivel, orquesta CodeGraph + OpenSpec + Superpowers.
3
3
  mode: primary
4
- version: 0.8.6
4
+ version: 0.8.7
5
5
  ---
6
6
 
7
- Sos **Ostacky v0.8.6**, orquestás, no implementás. Interpretás, clasificás (0/0+1/1+), ruteás y coordinás.
7
+ Sos **Ostacky v0.8.7**, orquestás, no implementás. Interpretás, clasificás (0/0+1/1+), ruteás y coordinás.
8
8
 
9
- > **Versión:** `0.8.6` (sincronizada desde `package.json` vía `scripts/sync-version.ts`). Cuando te pregunten qué versión tenés, qué versión sos, o `¿qué versión tenés?` / `version` / `¿en qué versión estás?`, respondé exactamente: **"Ostacky v0.8.6"** (o `v0.8.6` si te piden solo el número). No inventes otra versión.
9
+ > **Versión:** `0.8.7` (sincronizada desde `package.json` vía `scripts/sync-version.ts`). Cuando te pregunten qué versión tenés, qué versión sos, o `¿qué versión tenés?` / `version` / `¿en qué versión estás?`, respondé exactamente: **"Ostacky v0.8.7"** (o `v0.8.7` si te piden solo el número). No inventes otra versión.
10
10
 
11
11
  ## Reglas innegociables
12
12
 
@@ -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.8.6, `npx ostacky install` ya instala automáticamente el stack completo (CodeGraph, OpenSpec, Engram, 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.8.7, `npx ostacky install` ya instala automáticamente el stack completo (CodeGraph, OpenSpec, Engram, 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. 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.8.6)
14
+ ## Scope de instalación — local vs global (desde v0.8.7)
15
15
 
16
16
  `npx ostacky install` soporta `--scope local|global|auto` (también `--scope=...`):
17
17
 
@@ -1349,6 +1349,22 @@ class OstackyController {
1349
1349
  );
1350
1350
  }
1351
1351
  // C2: strict contract — recommendation + reasons required (tiered recovery: fix-execution-analysis-validation)
1352
+ // Normalizar aliases para no bloquear snapshot válido enviado con nombre distinto
1353
+ if (snapshot && typeof snapshot === 'string') {
1354
+ try {
1355
+ snapshot = JSON.parse(snapshot);
1356
+ } catch {}
1357
+ }
1358
+ if (snapshot && !snapshot.recommendation && (snapshot.mode || snapshot.executionMode)) {
1359
+ snapshot.recommendation = snapshot.mode || snapshot.executionMode;
1360
+ }
1361
+ if (snapshot && !snapshot.reasons && snapshot.reason) {
1362
+ snapshot.reasons = Array.isArray(snapshot.reason) ? snapshot.reason : [String(snapshot.reason)];
1363
+ }
1364
+ if (snapshot && Array.isArray(snapshot.reasons) && snapshot.reasons.length === 0) {
1365
+ // vacío se considera missing para no dejar pasar snapshot inválido
1366
+ snapshot.reasons = undefined;
1367
+ }
1352
1368
  let _snapshotDefaulted = false;
1353
1369
  if (snapshot && (!snapshot.recommendation || !snapshot.reasons)) {
1354
1370
  const isDegradedOrEarlyExit =
@@ -1376,22 +1392,46 @@ class OstackyController {
1376
1392
  };
1377
1393
  }
1378
1394
  }
1379
- // 1.7: exigir expectedTaskIds/taskIds/taskCount cuando taskCount>0
1395
+ // 1.7: exigir expectedTaskIds/taskIds/taskCount cuando taskCount>0 — con retryAllowed para no dejar en BLOCKED
1380
1396
  if (snapshot && typeof snapshot.taskCount === 'number' && snapshot.taskCount > 0) {
1381
1397
  const hasExpectedIds = Array.isArray(snapshot.expectedTaskIds) && snapshot.expectedTaskIds.length > 0;
1382
1398
  const hasTaskIds = Array.isArray(snapshot.taskIds) && snapshot.taskIds.length > 0;
1383
1399
  const hasCount = typeof snapshot.taskCount === 'number' && snapshot.taskCount > 0;
1384
1400
  if (!hasExpectedIds && !hasTaskIds && !hasCount) {
1385
- return this.#makeError(
1386
- 'Snapshot missing expectedTaskIds/taskIds/taskCount when taskCount>0',
1387
- 'record_execution_analysis'
1388
- );
1401
+ const available = (TRANSITIONS[this.#state.state] || []).map((t) => {
1402
+ let desc = t.via;
1403
+ if (t.choice) desc += ` (choice=${t.choice})`;
1404
+ if (t.mode) desc += ` (mode=${t.mode})`;
1405
+ return desc;
1406
+ });
1407
+ return {
1408
+ error: 'Snapshot missing expectedTaskIds/taskIds/taskCount when taskCount>0',
1409
+ current_state: this.#state.state,
1410
+ attempted_transition: 'record_execution_analysis',
1411
+ available_transitions: available,
1412
+ retryAllowed: true,
1413
+ suggestion:
1414
+ 'Reintentá con {taskCount, expectedTaskIds:[...]} que matchee tasks.md — ver skill execution-mode-evaluation',
1415
+ timestamp: new Date().toISOString(),
1416
+ };
1389
1417
  }
1390
1418
  if (!hasExpectedIds && !hasTaskIds) {
1391
- return this.#makeError(
1392
- 'Snapshot missing expectedTaskIds or taskIds when taskCount>0',
1393
- 'record_execution_analysis'
1394
- );
1419
+ const available = (TRANSITIONS[this.#state.state] || []).map((t) => {
1420
+ let desc = t.via;
1421
+ if (t.choice) desc += ` (choice=${t.choice})`;
1422
+ if (t.mode) desc += ` (mode=${t.mode})`;
1423
+ return desc;
1424
+ });
1425
+ return {
1426
+ error: 'Snapshot missing expectedTaskIds or taskIds when taskCount>0',
1427
+ current_state: this.#state.state,
1428
+ attempted_transition: 'record_execution_analysis',
1429
+ available_transitions: available,
1430
+ retryAllowed: true,
1431
+ suggestion:
1432
+ 'Reintentá con expectedTaskIds/taskIds que matchee tasks.md — ver skill execution-mode-evaluation',
1433
+ timestamp: new Date().toISOString(),
1434
+ };
1395
1435
  }
1396
1436
  }
1397
1437
  // C2: capture expected tasks for gate — harden-task-integrity: tasks.md canonical
@@ -1408,7 +1448,11 @@ class OstackyController {
1408
1448
  const snapshotIds = Array.isArray(expectedTasks) ? expectedTasks : null;
1409
1449
  const snapshotSet = snapshotIds ? new Set(snapshotIds) : new Set();
1410
1450
  const tasksMdSet = new Set(tasksMdIds);
1411
- const mismatch = !snapshotIds || snapshotIds.length !== tasksMdIds.length || [...snapshotSet].some((id) => !tasksMdSet.has(id)) || [...tasksMdSet].some((id) => !snapshotSet.has(id));
1451
+ const mismatch =
1452
+ !snapshotIds ||
1453
+ snapshotIds.length !== tasksMdIds.length ||
1454
+ [...snapshotSet].some((id) => !tasksMdSet.has(id)) ||
1455
+ [...tasksMdSet].some((id) => !snapshotSet.has(id));
1412
1456
  if (mismatch) taskCountMismatch = true;
1413
1457
  expectedTasks = [...tasksMdIds];
1414
1458
  expectedTaskCount = tasksMdIds.length;
@@ -1476,8 +1520,16 @@ class OstackyController {
1476
1520
  // harden-task-integrity: emit WARN if tasks.md mismatch
1477
1521
  if (taskCountMismatch) {
1478
1522
  const auditId = `aud-${Date.now()}-${this.#state.auditSeq}`;
1479
- log('warn:task_count_mismatch', { auditId, snapshotCount: snapshot?.expectedTaskIds?.length ?? 0, tasksMdCount: tasksMdIds.length });
1480
- await this.#audit('WARN', 'task_count_mismatch', `expectedTasks from snapshot (${snapshot?.expectedTaskIds?.length ?? 0}) differs from tasks.md (${tasksMdIds.length}) - using tasks.md`);
1523
+ log('warn:task_count_mismatch', {
1524
+ auditId,
1525
+ snapshotCount: snapshot?.expectedTaskIds?.length ?? 0,
1526
+ tasksMdCount: tasksMdIds.length,
1527
+ });
1528
+ await this.#audit(
1529
+ 'WARN',
1530
+ 'task_count_mismatch',
1531
+ `expectedTasks from snapshot (${snapshot?.expectedTaskIds?.length ?? 0}) differs from tasks.md (${tasksMdIds.length}) - using tasks.md`
1532
+ );
1481
1533
  }
1482
1534
  // 8.2: reasoning sin plan → WARN (but allow early-exit style)
1483
1535
  if (!execShown && snapshot && !isEarlyExitExec) {
@@ -1726,22 +1778,46 @@ class OstackyController {
1726
1778
  if (providedIds) {
1727
1779
  const setA = new Set(providedIds);
1728
1780
  const setB = new Set(tasksMdIds);
1729
- const mismatch = providedIds.length !== tasksMdIds.length || [...setA].some((id) => !setB.has(id)) || [...setB].some((id) => !setA.has(id));
1781
+ const mismatch =
1782
+ providedIds.length !== tasksMdIds.length ||
1783
+ [...setA].some((id) => !setB.has(id)) ||
1784
+ [...setB].some((id) => !setA.has(id));
1730
1785
  if (mismatch) {
1731
1786
  const auditId = `aud-${Date.now()}-${this.#state.auditSeq}`;
1732
- log('warn:task_count_mismatch', { auditId, provided: providedIds.length, tasksMd: tasksMdIds.length });
1733
- await this.#audit('WARN', 'task_count_mismatch', `expectedTasks from caller (${providedIds.length}) differs from tasks.md (${tasksMdIds.length}) - using tasks.md`);
1787
+ log('warn:task_count_mismatch', {
1788
+ auditId,
1789
+ provided: providedIds.length,
1790
+ tasksMd: tasksMdIds.length,
1791
+ });
1792
+ await this.#audit(
1793
+ 'WARN',
1794
+ 'task_count_mismatch',
1795
+ `expectedTasks from caller (${providedIds.length}) differs from tasks.md (${tasksMdIds.length}) - using tasks.md`
1796
+ );
1734
1797
  }
1735
1798
  } else if (typeof taskCount === 'number' && taskCount !== tasksMdIds.length) {
1736
1799
  const auditId = `aud-${Date.now()}-${this.#state.auditSeq}`;
1737
1800
  log('warn:task_count_mismatch', { auditId, provided: taskCount, tasksMd: tasksMdIds.length });
1738
- await this.#audit('WARN', 'task_count_mismatch', `expectedTaskCount from caller (${taskCount}) differs from tasks.md (${tasksMdIds.length}) - using tasks.md`);
1801
+ await this.#audit(
1802
+ 'WARN',
1803
+ 'task_count_mismatch',
1804
+ `expectedTaskCount from caller (${taskCount}) differs from tasks.md (${tasksMdIds.length}) - using tasks.md`
1805
+ );
1739
1806
  }
1740
1807
  this.#state.expectedTasks = [...tasksMdIds];
1741
1808
  this.#state.expectedTaskCount = tasksMdIds.length;
1742
1809
  await this.#persist();
1743
- await this.#audit('EXECUTING', 'set_expected_tasks', `expected=${this.#state.expectedTaskCount} (from tasks.md)`);
1744
- return { ok: true, expectedTasks: this.#state.expectedTasks, expectedTaskCount: this.#state.expectedTaskCount, source: 'tasks.md' };
1810
+ await this.#audit(
1811
+ 'EXECUTING',
1812
+ 'set_expected_tasks',
1813
+ `expected=${this.#state.expectedTaskCount} (from tasks.md)`
1814
+ );
1815
+ return {
1816
+ ok: true,
1817
+ expectedTasks: this.#state.expectedTasks,
1818
+ expectedTaskCount: this.#state.expectedTaskCount,
1819
+ source: 'tasks.md',
1820
+ };
1745
1821
  }
1746
1822
  if (Array.isArray(taskIds) && taskIds.length > 0) {
1747
1823
  this.#state.expectedTasks = [...taskIds];
@@ -2500,7 +2576,7 @@ function safeHandler(fn, options = {}) {
2500
2576
 
2501
2577
  const server = new McpServer({
2502
2578
  name: 'ostacky-controller',
2503
- version: '0.8.6',
2579
+ version: '0.8.7',
2504
2580
  });
2505
2581
 
2506
2582
  server.registerTool(
@@ -3100,7 +3176,7 @@ function setupGracefulShutdown(ctrl) {
3100
3176
  }
3101
3177
 
3102
3178
  async function main() {
3103
- log('Starting ostacky-controller MCP v0.8.6...');
3179
+ log('Starting ostacky-controller MCP v0.8.7...');
3104
3180
  log('State path:', { path: statePath });
3105
3181
  // Clean up stale tmp/lock files from previous runs
3106
3182
  cleanupTmpFiles(statePath);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ostacky-controller",
3
- "version": "0.8.6",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -176,7 +176,7 @@ Para cada fase de `tasks.md`, evaluar intra-fase:
176
176
 
177
177
  **⚠️ Este skill provee ANÁLISIS, no autorización. Gate ANTES de persistir:** SHALL correr **en memoria primero**, derivar snapshot y **mostrar al usuario** `"Recomendación: INLINE/SUBAGENT por [razón], ~X líneas, clusters [...] ¿Procedo con este plan?"` y esperar. Solo si responde sí → `record_execution_analysis({snapshot, reuseDiscovery:true})` → `EXECUTION_DECISION_PENDING` → `consume_execution_decision`. Si responde no → `block({reason:"usuario rechazó plan"})` sin persistir. Si re-llamó `codegraph_explore` pudiendo reusar → `WARN:redundant_codegraph_call`.
178
178
 
179
- **Recovery de snapshot incompleto (fix-execution-analysis-validation):** Si `record_execution_analysis` retorna `{error:"Snapshot missing recommendation/reasons", retryAllowed:true, suggestion}`, NO hacer `block`. Corregir snapshot añadiendo `recommendation`/`reasons` y **reintentar el mismo `executionDecisionId`** — permanece en `EXECUTION_ANALYSIS` y el retry avanza. Si `state.degraded==true` o `taskCount<=2` el controller defaultea a `INLINE` con `WARN:snapshot_defaulted` y ya transiciona; no reintentar. Verificar con `grep "retryAllowed" assets/mcp/ostacky-controller/index.js`.
179
+ **Recovery de snapshot incompleto (fix-execution-analysis-validation + bugfix 2026-09-18):** Si `record_execution_analysis` retorna `{error:"Snapshot missing ...", retryAllowed:true, suggestion}` (ya sea por `recommendation/reasons` **o** por `expectedTaskIds/taskIds` cuando `taskCount>0`), NO hacer `block` ni `abandon`. Corregir snapshot añadiendo el campo faltante y **reintentar el mismo `executionDecisionId`** — permanece en `EXECUTION_ANALYSIS` y el retry avanza. El controller también normaliza aliases (`mode`→`recommendation`, `reason`→`reasons`, JSON string) y considera `reasons:[]` como missing. Si `state.degraded==true` o `taskCount<=2` el controller defaultea a `INLINE` con `WARN:snapshot_defaulted` y ya transiciona; no reintentar. Verificar con `grep "retryAllowed" assets/mcp/ostacky-controller/index.js`. Snapshot válido (con `recommendation`, `reasons` y `expectedTaskIds`) **nunca** debe disparar `BLOCKED` ni requerir degraded.
180
180
 
181
181
  ## Ejemplo compacto
182
182
 
package/dist/cli.js CHANGED
@@ -621,31 +621,31 @@ var init_fs = __esm(() => {
621
621
  var manifest_default;
622
622
  var init_manifest = __esm(() => {
623
623
  manifest_default = {
624
- version: "0.8.6",
624
+ version: "0.8.7",
625
625
  repo: "JaimeHoracio/Ostacky",
626
- tag: "v0.8.6",
626
+ tag: "v0.8.7",
627
627
  agents: [
628
628
  {
629
629
  name: "ostacky",
630
630
  file: "assets/agents/ostacky.md",
631
- description: "Orquestador con recuperación automática (nunca se congela), ruteo por nivel de impacto, controller MCP con SDK oficial, edición segura con fallback inline, y delegación en OpenSpec + Superpowers. v0.8.6: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
632
- version: "0.8.6",
633
- sha256: "51bb5f57b493791c27e8134c3eb4e8bfb61a7672c40bf648c79f15c7ec2f6319"
631
+ description: "Orquestador con recuperación automática (nunca se congela), ruteo por nivel de impacto, controller MCP con SDK oficial, edición segura con fallback inline, y delegación en OpenSpec + Superpowers. v0.8.7: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
632
+ version: "0.8.7",
633
+ sha256: "191a317be68bde517f6d3877ec3a016720617d7382944fff0d08d31b985a6644"
634
634
  }
635
635
  ],
636
636
  commands: [
637
637
  {
638
638
  name: "install-stack",
639
639
  file: "assets/commands/install-stack.md",
640
- description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.8.6: controller plugin como alma hard-gate, Context7 removido del stack.",
641
- version: "0.8.6",
642
- sha256: "52f7af2a59fb3db19c33dccde7b284afdb3270e68696c721ad3303dcc85a645c"
640
+ description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.8.7: controller plugin como alma hard-gate, Context7 removido del stack.",
641
+ version: "0.8.7",
642
+ sha256: "315d8fcdf2a945cef863bb4576838f95d7eb4a0acca38c12575dc80ecc4724dc"
643
643
  },
644
644
  {
645
645
  name: "opsx-sync",
646
646
  file: "assets/commands/opsx-sync.md",
647
647
  description: "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
648
- version: "0.8.6",
648
+ version: "0.8.7",
649
649
  sha256: "fe0158478f2ca63b315037a85fc1632b77868532e319af6c7384285441767d64"
650
650
  }
651
651
  ],
@@ -653,15 +653,15 @@ var init_manifest = __esm(() => {
653
653
  {
654
654
  name: "ostacky-controller",
655
655
  file: "assets/mcp/ostacky-controller/",
656
- description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.8.6: 22 tools (incluye set_handoff, get_handoff, clear_handoff, get_available_transitions funcional). Bugfixes: consecutiveFailures real, lastHandoff state, defaultChoice persistido. Robustez: degraded mode automático tras 3 fallos, persistence condicional para Nivel 0, prune de skills obsoletas.",
657
- version: "0.8.6",
658
- sha256: "d832bcff83fb6b6334a494ff78029f379a977784b9a93675d1c5ea428f45cbc8"
656
+ description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.8.7: 22 tools (incluye set_handoff, get_handoff, clear_handoff, get_available_transitions funcional). Bugfixes: consecutiveFailures real, lastHandoff state, defaultChoice persistido. Robustez: degraded mode automático tras 3 fallos, persistence condicional para Nivel 0, prune de skills obsoletas.",
657
+ version: "0.8.7",
658
+ sha256: "9de463763ea6538c03b9307e7e36dcd2ae854dcc460bd25981e75f4f70df0e66"
659
659
  },
660
660
  {
661
661
  name: "openspec",
662
662
  file: "assets/mcp/openspec/",
663
663
  description: "MCP server local para OpenSpec - proposal, apply, archive, sync de cambios",
664
- version: "0.8.6",
664
+ version: "0.8.7",
665
665
  sha256: "fa4be28bfc1e75db8f1a037e2580f04a60066c80e8e5934e90e1041020d04609"
666
666
  }
667
667
  ],
@@ -670,105 +670,105 @@ var init_manifest = __esm(() => {
670
670
  name: "brainstorming",
671
671
  file: "assets/skills/brainstorming/SKILL.md",
672
672
  description: "Skill unificado de pensamiento con dos modos: creative-design (producción de diseño → transición a implementación directa o openspec-propose) y open-exploration (exploración libre)",
673
- version: "0.8.6",
673
+ version: "0.8.7",
674
674
  sha256: "f1013a86a8f27914d85a716e23c7fd32db1786d93615e8b0834b13d184308549"
675
675
  },
676
676
  {
677
677
  name: "execution-mode-evaluation",
678
678
  file: "assets/skills/execution-mode-evaluation/SKILL.md",
679
679
  description: "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
680
- version: "0.8.6",
681
- sha256: "7a670f8ae9d5479840d9fc4a54fa6ae75809b2c8883414d39300fa6289b82e9a"
680
+ version: "0.8.7",
681
+ sha256: "2158a6864c0912e868a9d720db7fd79441e6cc298e3320833d2527c9727c852e"
682
682
  },
683
683
  {
684
684
  name: "tdd",
685
685
  file: "assets/skills/tdd/SKILL.md",
686
686
  description: "Skill de test-driven development (Superpowers)",
687
- version: "0.8.6",
687
+ version: "0.8.7",
688
688
  sha256: "aa412298980b7826165c211145c1b8e9135f68f36247bb3cb96d0a0eae274486"
689
689
  },
690
690
  {
691
691
  name: "subagent-driven-development",
692
692
  file: "assets/skills/subagent-driven-development/SKILL.md",
693
693
  description: "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
694
- version: "0.8.6",
694
+ version: "0.8.7",
695
695
  sha256: "1a42d714a9a13faf05f0bf7b580e8d837c2e77a5633839542ccce603023419e8"
696
696
  },
697
697
  {
698
698
  name: "dispatching-parallel-agents",
699
699
  file: "assets/skills/dispatching-parallel-agents/SKILL.md",
700
700
  description: "Skill de dispatch paralelo de agentes (Superpowers)",
701
- version: "0.8.6",
701
+ version: "0.8.7",
702
702
  sha256: "3c8a66d51ae2e719e877d02c3dac32bd804722c3bb9227c258ecae78252a20ab"
703
703
  },
704
704
  {
705
705
  name: "review",
706
706
  file: "assets/skills/review/SKILL.md",
707
707
  description: "Skill de revisión de código (Superpowers)",
708
- version: "0.8.6",
708
+ version: "0.8.7",
709
709
  sha256: "b19650ed4d1d4d9857a4dd5b7e08e91328a1a1fc9c45bcc2fb600fa9d0213279"
710
710
  },
711
711
  {
712
712
  name: "receiving-code-review",
713
713
  file: "assets/skills/receiving-code-review/SKILL.md",
714
714
  description: "Skill de recibir y procesar feedback de code review",
715
- version: "0.8.6",
715
+ version: "0.8.7",
716
716
  sha256: "d761e884e71d8d3476ac734d287cae403a4024506a7d12e7361a448217c0a831"
717
717
  },
718
718
  {
719
719
  name: "openspec-propose",
720
720
  file: "assets/skills/openspec-propose/SKILL.md",
721
721
  description: "Skill de generación de proposal (OpenSpec)",
722
- version: "0.8.6",
722
+ version: "0.8.7",
723
723
  sha256: "bb59100b9fd3c9f9a1ec6509fa975ec55bf7fc737df4fe73bb3e9bbc217b83f7"
724
724
  },
725
725
  {
726
726
  name: "openspec-apply-change",
727
727
  file: "assets/skills/openspec-apply-change/SKILL.md",
728
728
  description: "Skill de aplicación de change (OpenSpec)",
729
- version: "0.8.6",
729
+ version: "0.8.7",
730
730
  sha256: "dfc823bf89fc7505e91ab6dee9c1f004be38a410bd3d88fb67b211b1b6cbb1d0"
731
731
  },
732
732
  {
733
733
  name: "openspec-archive-change",
734
734
  file: "assets/skills/openspec-archive-change/SKILL.md",
735
735
  description: "Skill de archivo de change (OpenSpec)",
736
- version: "0.8.6",
736
+ version: "0.8.7",
737
737
  sha256: "16e4b561de7747283663fed602e506abf502452c49a8d4b86d7a5539c40f0195"
738
738
  },
739
739
  {
740
740
  name: "openspec-explore",
741
741
  file: "assets/skills/openspec-explore/SKILL.md",
742
742
  description: "Modo explore para OpenSpec — thinking partner para explorar ideas, investigar problemas y clarificar requisitos antes/durante un cambio",
743
- version: "0.8.6",
743
+ version: "0.8.7",
744
744
  sha256: "37ae4aaf17ea71a395bab6dc4d9d61b9a49d7910f6692535ae8553244c46880b"
745
745
  },
746
746
  {
747
747
  name: "using-git-worktrees",
748
748
  file: "assets/skills/using-git-worktrees/SKILL.md",
749
749
  description: "Skill de uso de git worktrees para aislamiento de trabajo",
750
- version: "0.8.6",
750
+ version: "0.8.7",
751
751
  sha256: "93341bc1b7c053618a8b6dc07e3615b77990d7b549a0201f5835d95fef67ce13"
752
752
  },
753
753
  {
754
754
  name: "using-superpowers",
755
755
  file: "assets/skills/using-superpowers/SKILL.md",
756
756
  description: "Skill de orquestación de Superpowers skills",
757
- version: "0.8.6",
757
+ version: "0.8.7",
758
758
  sha256: "7e54536f96d2a379185a10bfc1e970850caa2561b6d8aca7080f0defea0381a4"
759
759
  },
760
760
  {
761
761
  name: "writing-skills",
762
762
  file: "assets/skills/writing-skills/SKILL.md",
763
763
  description: "Skill de creación y edición de skills",
764
- version: "0.8.6",
764
+ version: "0.8.7",
765
765
  sha256: "3d76b906cee518a2b809febb70db95697a35b9f368986bb504b4120c3bfb437a"
766
766
  },
767
767
  {
768
768
  name: "graceful-degradation",
769
769
  file: "assets/skills/graceful-degradation/SKILL.md",
770
770
  description: "Skill de degradación graceful cuando múltiples tools están indisponibles",
771
- version: "0.8.6",
771
+ version: "0.8.7",
772
772
  sha256: "363449bd9e6f800a0a3168667cf78f767fb105d86e4a4adadcc649d418139303"
773
773
  }
774
774
  ]
@@ -1492,7 +1492,7 @@ var init_stack = __esm(() => {
1492
1492
  // package.json
1493
1493
  var package_default = {
1494
1494
  name: "ostacky",
1495
- version: "0.8.6",
1495
+ version: "0.8.7",
1496
1496
  description: "Instalador interactivo de agentes y comandos para OpenCode",
1497
1497
  type: "module",
1498
1498
  bin: {
@@ -2669,7 +2669,7 @@ async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath, option
2669
2669
  params: {
2670
2670
  protocolVersion: "2025-03-26",
2671
2671
  capabilities: {},
2672
- clientInfo: { name: "ostacky-installer", version: "0.8.6" }
2672
+ clientInfo: { name: "ostacky-installer", version: "0.8.7" }
2673
2673
  }
2674
2674
  });
2675
2675
  });
package/manifest.json CHANGED
@@ -1,29 +1,29 @@
1
1
  {
2
- "version": "0.8.6",
2
+ "version": "0.8.7",
3
3
  "repo": "JaimeHoracio/Ostacky",
4
- "tag": "v0.8.6",
4
+ "tag": "v0.8.7",
5
5
  "agents": [
6
6
  {
7
7
  "name": "ostacky",
8
8
  "file": "assets/agents/ostacky.md",
9
- "description": "Orquestador con recuperación automática (nunca se congela), ruteo por nivel de impacto, controller MCP con SDK oficial, edición segura con fallback inline, y delegación en OpenSpec + Superpowers. v0.8.6: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
10
- "version": "0.8.6",
11
- "sha256": "51bb5f57b493791c27e8134c3eb4e8bfb61a7672c40bf648c79f15c7ec2f6319"
9
+ "description": "Orquestador con recuperación automática (nunca se congela), ruteo por nivel de impacto, controller MCP con SDK oficial, edición segura con fallback inline, y delegación en OpenSpec + Superpowers. v0.8.7: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
10
+ "version": "0.8.7",
11
+ "sha256": "191a317be68bde517f6d3877ec3a016720617d7382944fff0d08d31b985a6644"
12
12
  }
13
13
  ],
14
14
  "commands": [
15
15
  {
16
16
  "name": "install-stack",
17
17
  "file": "assets/commands/install-stack.md",
18
- "description": "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.8.6: controller plugin como alma hard-gate, Context7 removido del stack.",
19
- "version": "0.8.6",
20
- "sha256": "52f7af2a59fb3db19c33dccde7b284afdb3270e68696c721ad3303dcc85a645c"
18
+ "description": "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.8.7: controller plugin como alma hard-gate, Context7 removido del stack.",
19
+ "version": "0.8.7",
20
+ "sha256": "315d8fcdf2a945cef863bb4576838f95d7eb4a0acca38c12575dc80ecc4724dc"
21
21
  },
22
22
  {
23
23
  "name": "opsx-sync",
24
24
  "file": "assets/commands/opsx-sync.md",
25
25
  "description": "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
26
- "version": "0.8.6",
26
+ "version": "0.8.7",
27
27
  "sha256": "fe0158478f2ca63b315037a85fc1632b77868532e319af6c7384285441767d64"
28
28
  }
29
29
  ],
@@ -31,15 +31,15 @@
31
31
  {
32
32
  "name": "ostacky-controller",
33
33
  "file": "assets/mcp/ostacky-controller/",
34
- "description": "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.8.6: 22 tools (incluye set_handoff, get_handoff, clear_handoff, get_available_transitions funcional). Bugfixes: consecutiveFailures real, lastHandoff state, defaultChoice persistido. Robustez: degraded mode automático tras 3 fallos, persistence condicional para Nivel 0, prune de skills obsoletas.",
35
- "version": "0.8.6",
36
- "sha256": "d832bcff83fb6b6334a494ff78029f379a977784b9a93675d1c5ea428f45cbc8"
34
+ "description": "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.8.7: 22 tools (incluye set_handoff, get_handoff, clear_handoff, get_available_transitions funcional). Bugfixes: consecutiveFailures real, lastHandoff state, defaultChoice persistido. Robustez: degraded mode automático tras 3 fallos, persistence condicional para Nivel 0, prune de skills obsoletas.",
35
+ "version": "0.8.7",
36
+ "sha256": "9de463763ea6538c03b9307e7e36dcd2ae854dcc460bd25981e75f4f70df0e66"
37
37
  },
38
38
  {
39
39
  "name": "openspec",
40
40
  "file": "assets/mcp/openspec/",
41
41
  "description": "MCP server local para OpenSpec - proposal, apply, archive, sync de cambios",
42
- "version": "0.8.6",
42
+ "version": "0.8.7",
43
43
  "sha256": "fa4be28bfc1e75db8f1a037e2580f04a60066c80e8e5934e90e1041020d04609"
44
44
  }
45
45
  ],
@@ -48,105 +48,105 @@
48
48
  "name": "brainstorming",
49
49
  "file": "assets/skills/brainstorming/SKILL.md",
50
50
  "description": "Skill unificado de pensamiento con dos modos: creative-design (producción de diseño → transición a implementación directa o openspec-propose) y open-exploration (exploración libre)",
51
- "version": "0.8.6",
51
+ "version": "0.8.7",
52
52
  "sha256": "f1013a86a8f27914d85a716e23c7fd32db1786d93615e8b0834b13d184308549"
53
53
  },
54
54
  {
55
55
  "name": "execution-mode-evaluation",
56
56
  "file": "assets/skills/execution-mode-evaluation/SKILL.md",
57
57
  "description": "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
58
- "version": "0.8.6",
59
- "sha256": "7a670f8ae9d5479840d9fc4a54fa6ae75809b2c8883414d39300fa6289b82e9a"
58
+ "version": "0.8.7",
59
+ "sha256": "2158a6864c0912e868a9d720db7fd79441e6cc298e3320833d2527c9727c852e"
60
60
  },
61
61
  {
62
62
  "name": "tdd",
63
63
  "file": "assets/skills/tdd/SKILL.md",
64
64
  "description": "Skill de test-driven development (Superpowers)",
65
- "version": "0.8.6",
65
+ "version": "0.8.7",
66
66
  "sha256": "aa412298980b7826165c211145c1b8e9135f68f36247bb3cb96d0a0eae274486"
67
67
  },
68
68
  {
69
69
  "name": "subagent-driven-development",
70
70
  "file": "assets/skills/subagent-driven-development/SKILL.md",
71
71
  "description": "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
72
- "version": "0.8.6",
72
+ "version": "0.8.7",
73
73
  "sha256": "1a42d714a9a13faf05f0bf7b580e8d837c2e77a5633839542ccce603023419e8"
74
74
  },
75
75
  {
76
76
  "name": "dispatching-parallel-agents",
77
77
  "file": "assets/skills/dispatching-parallel-agents/SKILL.md",
78
78
  "description": "Skill de dispatch paralelo de agentes (Superpowers)",
79
- "version": "0.8.6",
79
+ "version": "0.8.7",
80
80
  "sha256": "3c8a66d51ae2e719e877d02c3dac32bd804722c3bb9227c258ecae78252a20ab"
81
81
  },
82
82
  {
83
83
  "name": "review",
84
84
  "file": "assets/skills/review/SKILL.md",
85
85
  "description": "Skill de revisión de código (Superpowers)",
86
- "version": "0.8.6",
86
+ "version": "0.8.7",
87
87
  "sha256": "b19650ed4d1d4d9857a4dd5b7e08e91328a1a1fc9c45bcc2fb600fa9d0213279"
88
88
  },
89
89
  {
90
90
  "name": "receiving-code-review",
91
91
  "file": "assets/skills/receiving-code-review/SKILL.md",
92
92
  "description": "Skill de recibir y procesar feedback de code review",
93
- "version": "0.8.6",
93
+ "version": "0.8.7",
94
94
  "sha256": "d761e884e71d8d3476ac734d287cae403a4024506a7d12e7361a448217c0a831"
95
95
  },
96
96
  {
97
97
  "name": "openspec-propose",
98
98
  "file": "assets/skills/openspec-propose/SKILL.md",
99
99
  "description": "Skill de generación de proposal (OpenSpec)",
100
- "version": "0.8.6",
100
+ "version": "0.8.7",
101
101
  "sha256": "bb59100b9fd3c9f9a1ec6509fa975ec55bf7fc737df4fe73bb3e9bbc217b83f7"
102
102
  },
103
103
  {
104
104
  "name": "openspec-apply-change",
105
105
  "file": "assets/skills/openspec-apply-change/SKILL.md",
106
106
  "description": "Skill de aplicación de change (OpenSpec)",
107
- "version": "0.8.6",
107
+ "version": "0.8.7",
108
108
  "sha256": "dfc823bf89fc7505e91ab6dee9c1f004be38a410bd3d88fb67b211b1b6cbb1d0"
109
109
  },
110
110
  {
111
111
  "name": "openspec-archive-change",
112
112
  "file": "assets/skills/openspec-archive-change/SKILL.md",
113
113
  "description": "Skill de archivo de change (OpenSpec)",
114
- "version": "0.8.6",
114
+ "version": "0.8.7",
115
115
  "sha256": "16e4b561de7747283663fed602e506abf502452c49a8d4b86d7a5539c40f0195"
116
116
  },
117
117
  {
118
118
  "name": "openspec-explore",
119
119
  "file": "assets/skills/openspec-explore/SKILL.md",
120
120
  "description": "Modo explore para OpenSpec — thinking partner para explorar ideas, investigar problemas y clarificar requisitos antes/durante un cambio",
121
- "version": "0.8.6",
121
+ "version": "0.8.7",
122
122
  "sha256": "37ae4aaf17ea71a395bab6dc4d9d61b9a49d7910f6692535ae8553244c46880b"
123
123
  },
124
124
  {
125
125
  "name": "using-git-worktrees",
126
126
  "file": "assets/skills/using-git-worktrees/SKILL.md",
127
127
  "description": "Skill de uso de git worktrees para aislamiento de trabajo",
128
- "version": "0.8.6",
128
+ "version": "0.8.7",
129
129
  "sha256": "93341bc1b7c053618a8b6dc07e3615b77990d7b549a0201f5835d95fef67ce13"
130
130
  },
131
131
  {
132
132
  "name": "using-superpowers",
133
133
  "file": "assets/skills/using-superpowers/SKILL.md",
134
134
  "description": "Skill de orquestación de Superpowers skills",
135
- "version": "0.8.6",
135
+ "version": "0.8.7",
136
136
  "sha256": "7e54536f96d2a379185a10bfc1e970850caa2561b6d8aca7080f0defea0381a4"
137
137
  },
138
138
  {
139
139
  "name": "writing-skills",
140
140
  "file": "assets/skills/writing-skills/SKILL.md",
141
141
  "description": "Skill de creación y edición de skills",
142
- "version": "0.8.6",
142
+ "version": "0.8.7",
143
143
  "sha256": "3d76b906cee518a2b809febb70db95697a35b9f368986bb504b4120c3bfb437a"
144
144
  },
145
145
  {
146
146
  "name": "graceful-degradation",
147
147
  "file": "assets/skills/graceful-degradation/SKILL.md",
148
148
  "description": "Skill de degradación graceful cuando múltiples tools están indisponibles",
149
- "version": "0.8.6",
149
+ "version": "0.8.7",
150
150
  "sha256": "363449bd9e6f800a0a3168667cf78f767fb105d86e4a4adadcc649d418139303"
151
151
  }
152
152
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ostacky",
3
- "version": "0.8.6",
3
+ "version": "0.8.7",
4
4
  "description": "Instalador interactivo de agentes y comandos para OpenCode",
5
5
  "type": "module",
6
6
  "bin": {