ostacky 0.9.2 → 0.9.4
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 +14 -12
- package/assets/agents/ostacky.md +5 -4
- package/assets/commands/install-stack.md +2 -2
- package/assets/mcp/ostacky-controller/index.js +107 -12
- package/assets/mcp/ostacky-controller/package.json +1 -1
- package/assets/plugins/ostacky-controller/index.ts +10 -3
- package/dist/cli.js +31 -31
- package/manifest.json +28 -28
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -145,6 +145,8 @@ Actualizaciones disponibles
|
|
|
145
145
|
|
|
146
146
|
Solo descarga los items que cambiaron de versión.
|
|
147
147
|
|
|
148
|
+
> **Nota:** `@latest` y `update` son cosas distintas. `npx ostacky@latest` fuerza a descargar la **última versión publicada** del instalador (el `@latest` es el tag de npm) y, sin subcomando, abre el menú interactivo. `npx ostacky update` corre la **acción de actualizar** (trae el manifest remoto y actualiza lo instalado según el lockfile) con la versión del instalador que npx resuelva (puede ser cacheada). Para ambas garantías, combinalos: `npx ostacky@latest update`.
|
|
149
|
+
|
|
148
150
|
### Desinstalar
|
|
149
151
|
|
|
150
152
|
```bash
|
|
@@ -246,37 +248,37 @@ Tras instalar (`--scope local`), el proyecto queda así:
|
|
|
246
248
|
|
|
247
249
|
```json
|
|
248
250
|
{
|
|
249
|
-
"version": "0.9.
|
|
251
|
+
"version": "0.9.4",
|
|
250
252
|
"lockedAt": "2025-01-01T00:00:00.000Z",
|
|
251
253
|
"repo": "JaimeHoracio/Ostacky",
|
|
252
|
-
"tag": "v0.9.
|
|
254
|
+
"tag": "v0.9.4",
|
|
253
255
|
"agents": {
|
|
254
256
|
"ostacky": {
|
|
255
|
-
"version": "0.9.
|
|
257
|
+
"version": "0.9.4",
|
|
256
258
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
257
259
|
"sha256": "abc123..."
|
|
258
260
|
}
|
|
259
261
|
},
|
|
260
262
|
"commands": {
|
|
261
263
|
"install-stack": {
|
|
262
|
-
"version": "0.9.
|
|
264
|
+
"version": "0.9.4",
|
|
263
265
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
264
266
|
"sha256": "def456..."
|
|
265
267
|
},
|
|
266
268
|
"opsx-sync": {
|
|
267
|
-
"version": "0.9.
|
|
269
|
+
"version": "0.9.4",
|
|
268
270
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
269
271
|
"sha256": "ghi789..."
|
|
270
272
|
}
|
|
271
273
|
},
|
|
272
274
|
"skills": {
|
|
273
|
-
"brainstorming": { "version": "0.9.
|
|
274
|
-
"execution-mode-evaluation": { "version": "0.9.
|
|
275
|
-
"openspec-propose": { "version": "0.9.
|
|
275
|
+
"brainstorming": { "version": "0.9.4", ... },
|
|
276
|
+
"execution-mode-evaluation": { "version": "0.9.4", ... },
|
|
277
|
+
"openspec-propose": { "version": "0.9.4", ... }
|
|
276
278
|
},
|
|
277
279
|
"mcpServers": {
|
|
278
|
-
"ostacky-controller": { "version": "0.9.
|
|
279
|
-
"openspec": { "version": "0.9.
|
|
280
|
+
"ostacky-controller": { "version": "0.9.4", ... },
|
|
281
|
+
"openspec": { "version": "0.9.4", ... }
|
|
280
282
|
}
|
|
281
283
|
}
|
|
282
284
|
```
|
|
@@ -308,7 +310,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
|
|
|
308
310
|
## Seguridad
|
|
309
311
|
|
|
310
312
|
- `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.9.
|
|
313
|
+
- Las URLs de descarga usan **tags de GitHub** (ej. `v0.9.4`), nunca `main` — instalaciones reproducibles
|
|
312
314
|
- Cada path de archivo descargado es validado para prevenir **path traversal**
|
|
313
315
|
- Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
|
|
314
316
|
- El cache local (`.opencode/cache/`) también valida integridad al servir archivos cacheados
|
|
@@ -365,7 +367,7 @@ CodeGraph está instalado en `.opencode/tools/codegraph/bin/codegraph` y se conf
|
|
|
365
367
|
| `.opencode/tools/codegraph/bin/codegraph status` | Muestra estado del index y archivos pendientes |
|
|
366
368
|
| `.opencode/tools/codegraph/bin/codegraph install --target opencode --location local --yes` | Configura CodeGraph para OpenCode y genera AGENTS.md |
|
|
367
369
|
|
|
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.9.
|
|
370
|
+
> **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.9.4 el instalador usa el patrón resiliente de Engram (strip 0 + búsqueda recursiva) y loguea `projectRoot|toolsDir` para diagnosticar scope.
|
|
369
371
|
|
|
370
372
|
## Licencia
|
|
371
373
|
|
package/assets/agents/ostacky.md
CHANGED
|
@@ -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.9.
|
|
4
|
+
version: 0.9.4
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Sos **Ostacky v0.9.
|
|
7
|
+
Sos **Ostacky v0.9.4**, orquestás, no implementás. Interpretás, clasificás (0/0+1/1+), ruteás y coordinás.
|
|
8
8
|
|
|
9
|
-
> **Versión:** `0.9.
|
|
9
|
+
> **Versión:** `0.9.4` (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.9.4"** (o `v0.9.4` si te piden solo el número). No inventes otra versión.
|
|
10
10
|
|
|
11
11
|
## Reglas innegociables
|
|
12
12
|
|
|
@@ -23,6 +23,7 @@ Sos **Ostacky v0.9.2**, orquestás, no implementás. Interpretás, clasificás (
|
|
|
23
23
|
> **Regla de oro:** Nunca escribas instrucciones genéricas tipo `“sé cuidadoso / no introduzcas errores / no inventes”`. Son no-verificables y el LLM las ignora (instruction fatigue). Cada SHALL abajo es **verificable** (comando, evidencia o artefacto). `tasks.md` también SHALL ser verificable — no behavioral.
|
|
24
24
|
|
|
25
25
|
1. **Engram contradiction check SHALL.** Antes de proponer o discutir cambios (Nivel 0+1/1+, **eximido si `isTrivial && DONE`** — ej: "cambiar título" no paga `mem_search`), SHALL `mem_search` por keywords del pedido (max 5 keywords = sustantivos del pedido + `topic_key` del change activo si lo hay); si hit `type:decision|architecture` con contradicción semántica (ej: pide Zustand y hay #571 “usar Redux por X”), SHALL mostrar diff `“Antes decidimos X el <fecha> por Z (topic_key), ahora pedís ¬X”`, llamar `request_clarification` y esperar. Si Engram `degraded`/timeout → SHALL advertir “sin memoria” y continuar (no block). Si usuario confirma override → SHALL `mem_save` mismo `topic_key` + `mem_compare supersedes` + `record_user_confirmation`.
|
|
26
|
+
1b. **Code-contradiction check SHALL.** Antes de ejecutar (Nivel 0+1/1+, **eximido si `isTrivial && DONE`**), si `codegraph_impact`/evidencia del código contradice el pedido (API pública con N callers afectada, invariante verificado roto): SHALL mostrar evidencia con cita (`símbolo, archivo:línea`), advertir el riesgo concreto, hacer UNA pregunta y esperar. Si el usuario insiste → SHALL `record_user_confirmation` + ejecutar. Nunca termina en bloqueo: el protocolo siempre cierra en acatamiento si insiste.
|
|
26
27
|
2. **Solo propuestas que ayudan SHALL.** Toda propuesta SHALL incluir `por qué ayuda + tradeoff + evidencia` (CodeGraph symbol, Engram hit) o literal `“no verificado”` + best practice 2026. No sugerir por sugerir.
|
|
27
28
|
3. **Pocas honestas > muchas de relleno SHALL.** Si solo hay una opción honesta, dar una. Si hay 2-3, tabla `coste|riesgo|complejidad`. No inventar para llenar.
|
|
28
29
|
4. **Si no hay propuesta honesta SHALL decirlo.** Literal: `“No hay propuesta honesta que aporte vs no hacer nada en este contexto.”`
|
|
@@ -84,7 +85,7 @@ Router `brainstorming`↔`OpenSpec` por `level`/`estLines`/`fileCount`/`hasAPI`
|
|
|
84
85
|
### 4. Execution
|
|
85
86
|
|
|
86
87
|
1. `skill(execution-mode-evaluation)` en memoria, reusa discovery.
|
|
87
|
-
2.
|
|
88
|
+
2. Gate ÚNICO (sin segunda pregunta): presentar resumen único `Nivel + DIRECT/SPEC + INLINE/SUBAGENT + archivos + ~líneas` (+ comparativa tokens|tiempo si `1+` multi-archivo) → UNA sola pregunta `¿Procedo?` (el usuario puede modificar). Si hay Riesgo concreto verificable aunque sea 0+1, el resumen incluye `Riesgo concreto: … → Mitigación: …`; sin riesgo verificable no se inventa ninguno. Todo override a advertencia del agente (de memoria o técnica) SHALL pasar por `record_user_confirmation`. Si confirma → `record_execution_analysis` + `consume_execution_decision` seguidos sin volver a preguntar. `Nivel 0` y mismo-archivo → recomendación fija `INLINE/DIRECT` sin alternativa. `1+` multi-archivo → tabla `INLINE (1x contexto, más lento) vs SUBAGENT (Nx contexto, más rápido, reglas 2b/3c intactas)` + recomendación; nunca forzar `INLINE`.
|
|
88
89
|
3. Por task: `Read` fresco → plugin valida edición in-process → `edit` → `verifyTask` (genérico: `codegraph:<Symbol>` con `codegraph_codegraph_explore`, `file:<path> contiene <string>` con `Read`/`Grep`, `test:<cmd>` con `shell` acotado — según `— verificar:` de `tasks.md`) → solo si `verifyTask.ok` → `complete_task`. **NUNCA marques `complete_task` a ojo**; si `verifyTask` falla, reintentá el fix. Vale para SPEC y DIRECT, INLINE y SUBAGENTS.
|
|
89
90
|
|
|
90
91
|
### 5. Sync y cierre
|
|
@@ -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.9.
|
|
8
|
+
**Nota:** A partir de v0.9.4, `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.9.
|
|
14
|
+
## Scope de instalación — local vs global (desde v0.9.4)
|
|
15
15
|
|
|
16
16
|
`npx ostacky install` soporta `--scope local|global|auto` (también `--scope=...`):
|
|
17
17
|
|
|
@@ -42,6 +42,13 @@ import {
|
|
|
42
42
|
getMaxTasks,
|
|
43
43
|
} from './controller-core.js';
|
|
44
44
|
|
|
45
|
+
// --- approved-but-blocked recovery (sin timers) ---
|
|
46
|
+
// El PENDING que espera confirmación del usuario puede esperar indefinidamente (por diseño):
|
|
47
|
+
// acá NO hay timeouts ni watchdogs de idle (ver tests/controller-source.test.ts).
|
|
48
|
+
// Esto solo cuenta consumes fallidos cuando el usuario YA aprobó pero el consume no completa,
|
|
49
|
+
// y al umbral habilita recovery (refresh_decision) sin ejecutar nada por sí mismo.
|
|
50
|
+
const CONSUME_FAIL_THRESHOLD = 3;
|
|
51
|
+
|
|
45
52
|
// --- Audit JSONL (D5) — single source: src/audit-jsonl.ts ---
|
|
46
53
|
function getAuditPath(projectRoot) {
|
|
47
54
|
return join(projectRoot, '.opencode', 'ostacky-audit.jsonl');
|
|
@@ -1042,6 +1049,27 @@ class OstackyController {
|
|
|
1042
1049
|
return suggestions[state] || `Unexpected state: ${state}`;
|
|
1043
1050
|
}
|
|
1044
1051
|
|
|
1052
|
+
// --- approved-but-blocked: contador de consumes fallidos + hint de recovery ---
|
|
1053
|
+
async #noteConsumeFailure(via, reason) {
|
|
1054
|
+
const count = (this.#state.consumeFailedCount || 0) + 1;
|
|
1055
|
+
this.#state.consumeFailedCount = count;
|
|
1056
|
+
await this.#audit(
|
|
1057
|
+
'WARN',
|
|
1058
|
+
'consume_failed',
|
|
1059
|
+
`${via}: ${reason} (attempt ${count}/${CONSUME_FAIL_THRESHOLD})${count >= CONSUME_FAIL_THRESHOLD ? ' — recovery available: call refresh_decision for fresh IDs, then retry' : ''}`
|
|
1060
|
+
);
|
|
1061
|
+
// Durability: el fallo y su evidencia nunca deben perderse en un restart
|
|
1062
|
+
await this.#flushAudit(true);
|
|
1063
|
+
return count;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
#consumeRecoveryHint(count) {
|
|
1067
|
+
if (count >= CONSUME_FAIL_THRESHOLD) {
|
|
1068
|
+
return 'Recovery: call refresh_decision for fresh decision IDs, then retry the consume. The user approval still stands — only the IDs are repaired.';
|
|
1069
|
+
}
|
|
1070
|
+
return undefined;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1045
1073
|
// --- 3.3: Degraded mode ---
|
|
1046
1074
|
#enterDegradedMode(reason) {
|
|
1047
1075
|
this.#degraded = true;
|
|
@@ -1100,6 +1128,7 @@ class OstackyController {
|
|
|
1100
1128
|
fileFingerprints: {},
|
|
1101
1129
|
expectedTasks: null,
|
|
1102
1130
|
expectedTaskCount: null,
|
|
1131
|
+
consumeFailedCount: 0,
|
|
1103
1132
|
error: null,
|
|
1104
1133
|
});
|
|
1105
1134
|
await this.#audit(
|
|
@@ -1138,6 +1167,7 @@ class OstackyController {
|
|
|
1138
1167
|
);
|
|
1139
1168
|
await this.#transition(to, { error: null });
|
|
1140
1169
|
await this.#audit('DISCOVERY', 'record_clarification');
|
|
1170
|
+
await this.#flushAudit(true);
|
|
1141
1171
|
return { state: this.#state.state, revision: this.#state.revision };
|
|
1142
1172
|
}
|
|
1143
1173
|
|
|
@@ -1221,6 +1251,7 @@ class OstackyController {
|
|
|
1221
1251
|
lastProposal,
|
|
1222
1252
|
});
|
|
1223
1253
|
await this.#audit('ROUTE_DECISION_PENDING', 'record_discovery', `level=${level}, default=${defaultChoice}`);
|
|
1254
|
+
await this.#flushAudit(true);
|
|
1224
1255
|
// 8.2: reasoning sin plan → WARN
|
|
1225
1256
|
if (!shownToUser && !isTrivial) {
|
|
1226
1257
|
const auditId = `aud-${Date.now()}-${this.#state.auditSeq}`;
|
|
@@ -1352,13 +1383,25 @@ class OstackyController {
|
|
|
1352
1383
|
'consume_route_decision'
|
|
1353
1384
|
);
|
|
1354
1385
|
}
|
|
1355
|
-
if (this.#state.routeDecisionId !== decisionId)
|
|
1356
|
-
|
|
1386
|
+
if (this.#state.routeDecisionId !== decisionId) {
|
|
1387
|
+
const fails = await this.#noteConsumeFailure('consume_route_decision', 'Decision ID mismatch');
|
|
1388
|
+
const err = this.#makeError('Decision ID mismatch', 'consume_route_decision');
|
|
1389
|
+
const hint = this.#consumeRecoveryHint(fails);
|
|
1390
|
+
return hint ? { ...err, recovery: hint } : err;
|
|
1391
|
+
}
|
|
1357
1392
|
const to = this.#isAllowedTransition(this.#state.state, 'consume_route_decision', choice);
|
|
1358
|
-
if (!to)
|
|
1359
|
-
|
|
1360
|
-
|
|
1393
|
+
if (!to) {
|
|
1394
|
+
const fails = await this.#noteConsumeFailure('consume_route_decision', `choice ${choice} not allowed`);
|
|
1395
|
+
const err = this.#makeError(
|
|
1396
|
+
`Route ${choice} not allowed from ${this.#state.state}`,
|
|
1397
|
+
'consume_route_decision'
|
|
1398
|
+
);
|
|
1399
|
+
const hint = this.#consumeRecoveryHint(fails);
|
|
1400
|
+
return hint ? { ...err, recovery: hint } : err;
|
|
1401
|
+
}
|
|
1402
|
+
await this.#transition(to, { routeChoice: choice, consumeFailedCount: 0 });
|
|
1361
1403
|
await this.#audit(to, 'consume_route_decision', `choice=${choice}`);
|
|
1404
|
+
await this.#flushAudit(true);
|
|
1362
1405
|
return { state: this.#state.state, revision: this.#state.revision, routeChoice: choice };
|
|
1363
1406
|
}
|
|
1364
1407
|
|
|
@@ -1562,6 +1605,7 @@ class OstackyController {
|
|
|
1562
1605
|
lastProposal: execLastProposal,
|
|
1563
1606
|
});
|
|
1564
1607
|
await this.#audit('EXECUTION_DECISION_PENDING', 'record_execution_analysis');
|
|
1608
|
+
await this.#flushAudit(true);
|
|
1565
1609
|
// fix-execution-analysis-validation: degraded/early-exit defaulted snapshot → WARN
|
|
1566
1610
|
if (_snapshotDefaulted) {
|
|
1567
1611
|
const auditId = `aud-${Date.now()}-${this.#state.auditSeq}`;
|
|
@@ -1678,16 +1722,54 @@ class OstackyController {
|
|
|
1678
1722
|
'consume_execution_decision'
|
|
1679
1723
|
);
|
|
1680
1724
|
}
|
|
1681
|
-
if (this.#state.executionDecisionId !== decisionId)
|
|
1682
|
-
|
|
1725
|
+
if (this.#state.executionDecisionId !== decisionId) {
|
|
1726
|
+
const fails = await this.#noteConsumeFailure('consume_execution_decision', 'Decision ID mismatch');
|
|
1727
|
+
const err = this.#makeError('Decision ID mismatch', 'consume_execution_decision');
|
|
1728
|
+
const hint = this.#consumeRecoveryHint(fails);
|
|
1729
|
+
return hint ? { ...err, recovery: hint } : err;
|
|
1730
|
+
}
|
|
1683
1731
|
const to = this.#isAllowedTransition(this.#state.state, 'consume_execution_decision', mode);
|
|
1684
|
-
if (!to)
|
|
1685
|
-
|
|
1686
|
-
|
|
1732
|
+
if (!to) {
|
|
1733
|
+
const fails = await this.#noteConsumeFailure('consume_execution_decision', `mode ${mode} not allowed`);
|
|
1734
|
+
const err = this.#makeError(
|
|
1735
|
+
`Mode ${mode} not allowed from ${this.#state.state}`,
|
|
1736
|
+
'consume_execution_decision'
|
|
1737
|
+
);
|
|
1738
|
+
const hint = this.#consumeRecoveryHint(fails);
|
|
1739
|
+
return hint ? { ...err, recovery: hint } : err;
|
|
1740
|
+
}
|
|
1741
|
+
await this.#transition(to, { executionMode: mode, consumeFailedCount: 0 });
|
|
1687
1742
|
await this.#audit(to, 'consume_execution_decision', `mode=${mode}`);
|
|
1743
|
+
await this.#flushAudit(true);
|
|
1688
1744
|
return { state: this.#state.state, revision: this.#state.revision, executionMode: mode };
|
|
1689
1745
|
}
|
|
1690
1746
|
|
|
1747
|
+
/**
|
|
1748
|
+
* Regenera decision IDs frescos dentro del PENDING actual.
|
|
1749
|
+
* Recovery para "usuario aprobó pero el consume no completa" (IDs viejos tras
|
|
1750
|
+
* restart/compactación). No ejecuta nada: solo repara el tubo, la aprobación sigue valiendo.
|
|
1751
|
+
*/
|
|
1752
|
+
async refreshDecision() {
|
|
1753
|
+
this.#load();
|
|
1754
|
+
const s = this.#state.state;
|
|
1755
|
+
const prevFails = this.#state.consumeFailedCount || 0;
|
|
1756
|
+
if (s === 'ROUTE_DECISION_PENDING') {
|
|
1757
|
+
const routeDecisionId = 'route-' + Date.now();
|
|
1758
|
+
await this.#transition(s, { routeDecisionId, consumeFailedCount: 0 });
|
|
1759
|
+
await this.#audit(s, 'refresh_decision', `fresh routeDecisionId after ${prevFails} failed consume(s)`);
|
|
1760
|
+
await this.#flushAudit(true);
|
|
1761
|
+
return { state: this.#state.state, revision: this.#state.revision, routeDecisionId };
|
|
1762
|
+
}
|
|
1763
|
+
if (s === 'EXECUTION_DECISION_PENDING') {
|
|
1764
|
+
const executionDecisionId = 'exec-' + Date.now();
|
|
1765
|
+
await this.#transition(s, { executionDecisionId, consumeFailedCount: 0 });
|
|
1766
|
+
await this.#audit(s, 'refresh_decision', `fresh executionDecisionId after ${prevFails} failed consume(s)`);
|
|
1767
|
+
await this.#flushAudit(true);
|
|
1768
|
+
return { state: this.#state.state, revision: this.#state.revision, executionDecisionId };
|
|
1769
|
+
}
|
|
1770
|
+
return this.#makeError(`No decision to refresh from state ${s}`, 'refresh_decision');
|
|
1771
|
+
}
|
|
1772
|
+
|
|
1691
1773
|
async implementationComplete({ force } = {}) {
|
|
1692
1774
|
this.#load();
|
|
1693
1775
|
const to = this.#isAllowedTransition(this.#state.state, 'implementation_complete');
|
|
@@ -2853,7 +2935,7 @@ function safeHandler(fn, options = {}) {
|
|
|
2853
2935
|
|
|
2854
2936
|
const server = new McpServer({
|
|
2855
2937
|
name: 'ostacky-controller',
|
|
2856
|
-
version: '0.9.
|
|
2938
|
+
version: '0.9.4',
|
|
2857
2939
|
});
|
|
2858
2940
|
|
|
2859
2941
|
server.registerTool(
|
|
@@ -2971,6 +3053,19 @@ server.registerTool(
|
|
|
2971
3053
|
})
|
|
2972
3054
|
);
|
|
2973
3055
|
|
|
3056
|
+
server.registerTool(
|
|
3057
|
+
'refresh_decision',
|
|
3058
|
+
{
|
|
3059
|
+
description:
|
|
3060
|
+
'Regenerate fresh decision IDs within the current PENDING state (recovery when the user approved but consume keeps failing with stale IDs; executes nothing)',
|
|
3061
|
+
inputSchema: z.object({}),
|
|
3062
|
+
},
|
|
3063
|
+
safeHandler(async () => {
|
|
3064
|
+
log('tool:refresh_decision');
|
|
3065
|
+
return await controller.refreshDecision();
|
|
3066
|
+
})
|
|
3067
|
+
);
|
|
3068
|
+
|
|
2974
3069
|
server.registerTool(
|
|
2975
3070
|
'implementation_complete',
|
|
2976
3071
|
{
|
|
@@ -3442,7 +3537,7 @@ function setupGracefulShutdown(ctrl) {
|
|
|
3442
3537
|
}
|
|
3443
3538
|
|
|
3444
3539
|
async function main() {
|
|
3445
|
-
log('Starting ostacky-controller MCP v0.9.
|
|
3540
|
+
log('Starting ostacky-controller MCP v0.9.4...');
|
|
3446
3541
|
log('State path:', { path: statePath });
|
|
3447
3542
|
// Clean up stale tmp/lock files from previous runs
|
|
3448
3543
|
cleanupTmpFiles(statePath);
|
|
@@ -304,9 +304,16 @@ export default {
|
|
|
304
304
|
lastCheck = { revision: freshState.revision, result: pendingStates.includes(freshState.state) ? "BLOCKED" : "ALLOW" }
|
|
305
305
|
}
|
|
306
306
|
if (lastCheck.result === "BLOCKED") {
|
|
307
|
-
const allowed = ["consume_route_decision", "consume_execution_decision", "record_clarification", "abandon", "check_file_access", "consume_file_access_decision", "record_user_confirmation"]
|
|
308
|
-
|
|
309
|
-
|
|
307
|
+
const allowed = ["consume_route_decision", "consume_execution_decision", "refresh_decision", "record_clarification", "abandon", "check_file_access", "consume_file_access_decision", "record_user_confirmation"]
|
|
308
|
+
// Observabilidad read-only: leer estado/auditoría para obtener decisionId no debe deadloquear
|
|
309
|
+
const observable = ["get_state", "get_audit", "get_metrics", "get_handoff", "get_available_transitions", "get_tasks"]
|
|
310
|
+
const isControllerTool = tool.startsWith("ostacky-controller_") || tool.startsWith("ostacky_") || allowed.some(t => tool.includes(t)) || observable.some(t => tool.includes(t))
|
|
311
|
+
// Code Mode deadlock fix: `execute` es wrapper cuyo outer siempre es "execute" — inspeccionar intent interno
|
|
312
|
+
const codeStr = typeof (args as any)?.code === "string" ? (args as any).code : typeof (args as any)?.input === "string" ? (args as any).input : ""
|
|
313
|
+
const isExecuteWithAllowed = tool === "execute" && codeStr && allowed.some(t => codeStr.includes(t))
|
|
314
|
+
// Observabilidad via execute wrapper: get_state/get_audit para obtener decisionId no deben bloquearse en PENDING
|
|
315
|
+
const isExecuteWithObservable = tool === "execute" && codeStr && observable.some(t => codeStr.includes(t))
|
|
316
|
+
if (!isControllerTool && !isExecuteWithAllowed && !isExecuteWithObservable) {
|
|
310
317
|
throw new Error(`BLOCKED: call consume_* first — controller is in ${freshState.state}`)
|
|
311
318
|
}
|
|
312
319
|
}
|
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.9.
|
|
624
|
+
version: "0.9.4",
|
|
625
625
|
repo: "JaimeHoracio/Ostacky",
|
|
626
|
-
tag: "v0.9.
|
|
626
|
+
tag: "v0.9.4",
|
|
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.9.
|
|
632
|
-
version: "0.9.
|
|
633
|
-
sha256: "
|
|
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.9.4: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
|
|
632
|
+
version: "0.9.4",
|
|
633
|
+
sha256: "7bd37a5fb4c451a8ac8dc75a727a295835a72651a31f3df6a4b639c902160d70"
|
|
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.9.
|
|
641
|
-
version: "0.9.
|
|
642
|
-
sha256: "
|
|
640
|
+
description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.9.4: controller plugin como alma hard-gate, Context7 removido del stack.",
|
|
641
|
+
version: "0.9.4",
|
|
642
|
+
sha256: "f6b3f09519f4c0d5be7db2a0ec715cd962bc7bb12b1c14eb69baaa033086103c"
|
|
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.9.
|
|
648
|
+
version: "0.9.4",
|
|
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.9.
|
|
657
|
-
version: "0.9.
|
|
658
|
-
sha256: "
|
|
656
|
+
description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.9.4: 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.9.4",
|
|
658
|
+
sha256: "c6321b265fa9ff5cf3b4a0438f71c9c7ca7012f683a30f11f1c44c36063684b9"
|
|
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.9.
|
|
664
|
+
version: "0.9.4",
|
|
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.9.
|
|
673
|
+
version: "0.9.4",
|
|
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.9.
|
|
680
|
+
version: "0.9.4",
|
|
681
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.9.
|
|
687
|
+
version: "0.9.4",
|
|
688
688
|
sha256: "f0ebfbbc43a8868d31a3fd2df37ae7f60fe8add09c6475862395a68269e5ff7f"
|
|
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.9.
|
|
694
|
+
version: "0.9.4",
|
|
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.9.
|
|
701
|
+
version: "0.9.4",
|
|
702
702
|
sha256: "7e7b712ef742d5631e302e6a71583e2bbbd33094da9281abfb84b43505fc3ef1"
|
|
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.9.
|
|
708
|
+
version: "0.9.4",
|
|
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.9.
|
|
715
|
+
version: "0.9.4",
|
|
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.9.
|
|
722
|
+
version: "0.9.4",
|
|
723
723
|
sha256: "6a517f750f24c008208156a2d653e97ed30b1e53878aeac5ce394e573db0678f"
|
|
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.9.
|
|
729
|
+
version: "0.9.4",
|
|
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.9.
|
|
736
|
+
version: "0.9.4",
|
|
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.9.
|
|
743
|
+
version: "0.9.4",
|
|
744
744
|
sha256: "9eafc3a8c693b8d9916867ef764d49e5222da717fde501c957bb3f6c312d2415"
|
|
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.9.
|
|
750
|
+
version: "0.9.4",
|
|
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.9.
|
|
757
|
+
version: "0.9.4",
|
|
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.9.
|
|
764
|
+
version: "0.9.4",
|
|
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.9.
|
|
771
|
+
version: "0.9.4",
|
|
772
772
|
sha256: "363449bd9e6f800a0a3168667cf78f767fb105d86e4a4adadcc649d418139303"
|
|
773
773
|
}
|
|
774
774
|
]
|
|
@@ -1674,7 +1674,7 @@ var init_doctor_v2 = __esm(() => {
|
|
|
1674
1674
|
// package.json
|
|
1675
1675
|
var package_default = {
|
|
1676
1676
|
name: "ostacky",
|
|
1677
|
-
version: "0.9.
|
|
1677
|
+
version: "0.9.4",
|
|
1678
1678
|
description: "Instalador interactivo de agentes y comandos para OpenCode",
|
|
1679
1679
|
type: "module",
|
|
1680
1680
|
bin: {
|
|
@@ -1702,7 +1702,7 @@ var package_default = {
|
|
|
1702
1702
|
],
|
|
1703
1703
|
license: "MIT",
|
|
1704
1704
|
dependencies: {
|
|
1705
|
-
"@clack/prompts": "^0.9.
|
|
1705
|
+
"@clack/prompts": "^0.9.1"
|
|
1706
1706
|
},
|
|
1707
1707
|
devDependencies: {
|
|
1708
1708
|
"@types/bun": "latest",
|
|
@@ -2847,7 +2847,7 @@ async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath, option
|
|
|
2847
2847
|
params: {
|
|
2848
2848
|
protocolVersion: "2025-03-26",
|
|
2849
2849
|
capabilities: {},
|
|
2850
|
-
clientInfo: { name: "ostacky-installer", version: "0.9.
|
|
2850
|
+
clientInfo: { name: "ostacky-installer", version: "0.9.4" }
|
|
2851
2851
|
}
|
|
2852
2852
|
});
|
|
2853
2853
|
});
|
package/manifest.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.9.
|
|
2
|
+
"version": "0.9.4",
|
|
3
3
|
"repo": "JaimeHoracio/Ostacky",
|
|
4
|
-
"tag": "v0.9.
|
|
4
|
+
"tag": "v0.9.4",
|
|
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.9.
|
|
10
|
-
"version": "0.9.
|
|
11
|
-
"sha256": "
|
|
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.9.4: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
|
|
10
|
+
"version": "0.9.4",
|
|
11
|
+
"sha256": "7bd37a5fb4c451a8ac8dc75a727a295835a72651a31f3df6a4b639c902160d70"
|
|
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.9.
|
|
19
|
-
"version": "0.9.
|
|
20
|
-
"sha256": "
|
|
18
|
+
"description": "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.9.4: controller plugin como alma hard-gate, Context7 removido del stack.",
|
|
19
|
+
"version": "0.9.4",
|
|
20
|
+
"sha256": "f6b3f09519f4c0d5be7db2a0ec715cd962bc7bb12b1c14eb69baaa033086103c"
|
|
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.9.
|
|
26
|
+
"version": "0.9.4",
|
|
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.9.
|
|
35
|
-
"version": "0.9.
|
|
36
|
-
"sha256": "
|
|
34
|
+
"description": "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.9.4: 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.9.4",
|
|
36
|
+
"sha256": "c6321b265fa9ff5cf3b4a0438f71c9c7ca7012f683a30f11f1c44c36063684b9"
|
|
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.9.
|
|
42
|
+
"version": "0.9.4",
|
|
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.9.
|
|
51
|
+
"version": "0.9.4",
|
|
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.9.
|
|
58
|
+
"version": "0.9.4",
|
|
59
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.9.
|
|
65
|
+
"version": "0.9.4",
|
|
66
66
|
"sha256": "f0ebfbbc43a8868d31a3fd2df37ae7f60fe8add09c6475862395a68269e5ff7f"
|
|
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.9.
|
|
72
|
+
"version": "0.9.4",
|
|
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.9.
|
|
79
|
+
"version": "0.9.4",
|
|
80
80
|
"sha256": "7e7b712ef742d5631e302e6a71583e2bbbd33094da9281abfb84b43505fc3ef1"
|
|
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.9.
|
|
86
|
+
"version": "0.9.4",
|
|
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.9.
|
|
93
|
+
"version": "0.9.4",
|
|
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.9.
|
|
100
|
+
"version": "0.9.4",
|
|
101
101
|
"sha256": "6a517f750f24c008208156a2d653e97ed30b1e53878aeac5ce394e573db0678f"
|
|
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.9.
|
|
107
|
+
"version": "0.9.4",
|
|
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.9.
|
|
114
|
+
"version": "0.9.4",
|
|
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.9.
|
|
121
|
+
"version": "0.9.4",
|
|
122
122
|
"sha256": "9eafc3a8c693b8d9916867ef764d49e5222da717fde501c957bb3f6c312d2415"
|
|
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.9.
|
|
128
|
+
"version": "0.9.4",
|
|
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.9.
|
|
135
|
+
"version": "0.9.4",
|
|
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.9.
|
|
142
|
+
"version": "0.9.4",
|
|
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.9.
|
|
149
|
+
"version": "0.9.4",
|
|
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.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "Instalador interactivo de agentes y comandos para OpenCode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
],
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@clack/prompts": "^0.9.
|
|
31
|
+
"@clack/prompts": "^0.9.1"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/bun": "latest",
|