ostacky 0.10.1 → 0.10.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 +3 -3
- package/assets/agents/ostacky.md +5 -4
- package/assets/commands/install-stack.md +1 -1
- package/assets/docs/ostacky-reference.md +8 -0
- package/assets/mcp/ostacky-controller/index.js +36 -2
- package/assets/plugins/ostacky-controller/index.ts +66 -7
- package/dist/cli.js +43 -39
- package/manifest.json +28 -28
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -129,9 +129,9 @@ Local (`<proyecto>/.opencode`) o global (mismo árbol bajo el dir global, sin st
|
|
|
129
129
|
|
|
130
130
|
```json
|
|
131
131
|
{
|
|
132
|
-
"version": "0.10.
|
|
133
|
-
"tag": "v0.10.
|
|
134
|
-
"agents": { "ostacky": { "version": "0.10.
|
|
132
|
+
"version": "0.10.2",
|
|
133
|
+
"tag": "v0.10.2",
|
|
134
|
+
"agents": { "ostacky": { "version": "0.10.2", "sha256": "…" } },
|
|
135
135
|
"commands": { "install-stack": { … }, "opsx-sync": { … } },
|
|
136
136
|
"skills": { "brainstorming": { … }, "…" : {} },
|
|
137
137
|
"mcpServers": { "ostacky-controller": { … }, "openspec": { … } }
|
package/assets/agents/ostacky.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Orquestador principal — rutea por nivel, orquesta CodeGraph + OpenSpec + Superpowers.
|
|
3
3
|
mode: primary
|
|
4
|
-
version: 0.10.
|
|
4
|
+
version: 0.10.2
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Sos **Ostacky v0.10.
|
|
7
|
+
Sos **Ostacky v0.10.2**, orquestás, no implementás. Interpretás, clasificás (0/0+1/1+), ruteás y coordinás.
|
|
8
8
|
|
|
9
|
-
> **Versión:** `0.10.
|
|
9
|
+
> **Versión:** `0.10.2` (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.10.2"** (o `v0.10.2` si te piden solo el número). No inventes otra versión.
|
|
10
10
|
|
|
11
11
|
## Reglas innegociables
|
|
12
12
|
|
|
13
13
|
1. **NUNCA te congeles.** Plan B antes de tool, no reintentes fallida.
|
|
14
|
-
2. **CodeGraph primero
|
|
14
|
+
2. **CodeGraph primero ante query de símbolo/flujo/impacto** (¿quién llama a X?, blast radius, dónde vive un símbolo). Grep/glob directo es legítimo ante query de literal (string exacto, TODO, config, `.md`/`.json`) — pero el gate SIEMPRE exige un `codegraph_codegraph_explore` completado antes de leer código (`shouldBlockCodeRead`). Para leer código no-indexable a conciencia, el explore previo es calibración, no sobrehead: barato, local y confirma que el índice está vivo.
|
|
15
15
|
3. **El plugin hace cumplir PENDING.** Hard gate en `ctx.tool.hook("execute.before")`; no llames `check_*` manual.
|
|
16
16
|
4. **No edites sin Read fresco.** Nunca cache de turno anterior.
|
|
17
17
|
5. **Una pregunta por turno.** Natural, sin tool, STOP y esperar. Respuesta vinculante.
|
|
@@ -97,6 +97,7 @@ Router `brainstorming`↔`OpenSpec` por `level`/`estLines`/`fileCount`/`hasAPI`
|
|
|
97
97
|
## Guardrails
|
|
98
98
|
|
|
99
99
|
- Decisión en OpenSpec/CodeGraph/controller → no re-resolver
|
|
100
|
+
- **Multi-sesión (un state file por proyecto):** si `start_request` devuelve `conflict:true` o un tool devuelve `BLOCKED: … pertenece a otra sesión`, NO re-presentes el resumen de ejecución ni consumas/bloquees esa decisión. Preguntá una sola cosa: takeover explícito (`start_request({force:true})`, auditado) o continuar en la otra sesión. Si `get_state` muestra `callerSessionId:null` con `ownerSessionId` no nulo, tratá la request como ajena (no hay identidad que pruebe lo contrario).
|
|
100
101
|
- Una pregunta por turno, sin deadlock
|
|
101
102
|
- Fase gate: en EXECUTING/SYNC no volver a DISCOVERY
|
|
102
103
|
- Audit: log antes de gate + `mem_save` solo en gates
|
|
@@ -6,7 +6,7 @@ subagent: false
|
|
|
6
6
|
|
|
7
7
|
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.
|
|
8
8
|
|
|
9
|
-
**Nota:** A partir de v0.10.
|
|
9
|
+
**Nota:** A partir de v0.10.2, `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.
|
|
10
10
|
|
|
11
11
|
**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.
|
|
12
12
|
|
|
@@ -114,3 +114,11 @@ Principio: **eficacia > recorte** — si recorte rompiera caché y saliera más
|
|
|
114
114
|
## Propose Flow (1+)
|
|
115
115
|
|
|
116
116
|
`openspec-propose` SHALL Paso 0: `codegraph_codegraph_explore` + `engram_mem_search` sobre el área (si no se hicieron ya en el request) **antes** de `openspec new`. Citá símbolos existentes en `proposal/design`; sin esto dispara `WARN:codegraphBypass` y `design.md` alucina API. Ver `assets/skills/openspec-propose/SKILL.md: Paso 0` y `brainstorming` (router por nivel: `brainstorming` decide 0/0+1/1+, `openspec-explore` es stance sin nivel).
|
|
117
|
+
|
|
118
|
+
## CI — openspec validate (remediación)
|
|
119
|
+
|
|
120
|
+
El job `test` de `.github/workflows/ci.yml` corre `bunx openspec validate --all --strict` (dep pinneada en `package.json`). Si falla en `main`: un delta/spec inválido entró — NO archivearlo roto ni hacer workaround. Protocolo:
|
|
121
|
+
1. El output lista el item roto (`✗ change/<id>` / `✗ spec/<name>`) + `Details: openspec validate <id> --type change|spec` — ese comando da la causa exacta y los next steps (el CLI es autoexplicativo: headers `## ADDED/MODIFIED/REMOVED/RENAMED Requirements`, cada requirement con al menos un `#### Scenario:`).
|
|
122
|
+
2. Debug de deltas parseados: `openspec show <id> --json --deltas-only`.
|
|
123
|
+
3. Change WIP incompleto en `main` → completarlo o removerlo del repo; specs de `openspec/specs/` rotos → fixear el formato in-place.
|
|
124
|
+
4. Si tocás `assets/` regenerá hashes (`bun run scripts/update-manifest-hashes.ts`) y usá `bun run test:safe` (nunca `bun test` full: se cuelga).
|
|
@@ -1169,6 +1169,28 @@ class OstackyController {
|
|
|
1169
1169
|
};
|
|
1170
1170
|
}
|
|
1171
1171
|
|
|
1172
|
+
/**
|
|
1173
|
+
* multisession-ownership-guard: la request activa es de UNA sesión.
|
|
1174
|
+
* Si el caller es conocido y difiere del dueño, la mutación se rechaza
|
|
1175
|
+
* (consumir/cancelar/refrescar la decisión de otro invalidaba su resumen
|
|
1176
|
+
* y forzaba a re-presentarlo). Sin identidad (clientes legacy sin `_meta`)
|
|
1177
|
+
* o sin dueño, no aplica: comportamiento previo intacto.
|
|
1178
|
+
*/
|
|
1179
|
+
async #foreignOwnerError(via) {
|
|
1180
|
+
const owner = this.#state?.ownerSessionId ?? null;
|
|
1181
|
+
const caller = this.#callerSessionId ?? null;
|
|
1182
|
+
if (!owner || !caller || owner === caller) return null;
|
|
1183
|
+
await this.#audit(
|
|
1184
|
+
'WARN',
|
|
1185
|
+
'cross_session_denied',
|
|
1186
|
+
`${via}: caller=${caller} owner=${owner} state=${this.#state?.state}`
|
|
1187
|
+
);
|
|
1188
|
+
return this.#makeError(
|
|
1189
|
+
`BLOCKED: la request activa pertenece a otra sesión (owner=${owner}). No consumas, refresques ni canceles su decisión; usá start_request({force:true}) para takeover explícito o esperá a que termine.`,
|
|
1190
|
+
via
|
|
1191
|
+
);
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1172
1194
|
#suggestRecovery(state, transition) {
|
|
1173
1195
|
const suggestions = {
|
|
1174
1196
|
INTERPRETATION_PENDING: 'Call start_request or proceed_to_discovery first.',
|
|
@@ -1558,6 +1580,8 @@ class OstackyController {
|
|
|
1558
1580
|
|
|
1559
1581
|
async abandon({ reason } = {}) {
|
|
1560
1582
|
this.#load();
|
|
1583
|
+
const denied = await this.#foreignOwnerError('abandon');
|
|
1584
|
+
if (denied) return denied;
|
|
1561
1585
|
const to = this.#isAllowedTransition(this.#state.state, 'abandon');
|
|
1562
1586
|
if (!to) return this.#makeError(`Cannot abandon from state ${this.#state.state}`, 'abandon');
|
|
1563
1587
|
await this.#transition(to, { error: reason || 'Abandoned' });
|
|
@@ -1567,6 +1591,8 @@ class OstackyController {
|
|
|
1567
1591
|
|
|
1568
1592
|
async consumeRouteDecision({ decisionId, choice } = {}) {
|
|
1569
1593
|
this.#load();
|
|
1594
|
+
const denied = await this.#foreignOwnerError('consume_route_decision');
|
|
1595
|
+
if (denied) return denied;
|
|
1570
1596
|
if (choice && !['SPEC', 'DIRECT'].includes(choice)) {
|
|
1571
1597
|
return { error: `invalid choice: ${choice}`, available: ['SPEC', 'DIRECT'] };
|
|
1572
1598
|
}
|
|
@@ -1906,6 +1932,8 @@ class OstackyController {
|
|
|
1906
1932
|
|
|
1907
1933
|
async consumeExecutionDecision({ decisionId, mode } = {}) {
|
|
1908
1934
|
this.#load();
|
|
1935
|
+
const denied = await this.#foreignOwnerError('consume_execution_decision');
|
|
1936
|
+
if (denied) return denied;
|
|
1909
1937
|
if (mode && !['INLINE', 'SUBAGENT_DRIVEN'].includes(mode)) {
|
|
1910
1938
|
return { error: `invalid mode: ${mode}`, available: ['INLINE', 'SUBAGENT_DRIVEN'] };
|
|
1911
1939
|
}
|
|
@@ -1944,6 +1972,8 @@ class OstackyController {
|
|
|
1944
1972
|
*/
|
|
1945
1973
|
async refreshDecision() {
|
|
1946
1974
|
this.#load();
|
|
1975
|
+
const denied = await this.#foreignOwnerError('refresh_decision');
|
|
1976
|
+
if (denied) return denied;
|
|
1947
1977
|
const s = this.#state.state;
|
|
1948
1978
|
const prevFails = this.#state.consumeFailedCount || 0;
|
|
1949
1979
|
if (s === 'ROUTE_DECISION_PENDING') {
|
|
@@ -2150,6 +2180,8 @@ class OstackyController {
|
|
|
2150
2180
|
|
|
2151
2181
|
async block({ reason } = {}) {
|
|
2152
2182
|
this.#load();
|
|
2183
|
+
const denied = await this.#foreignOwnerError('block');
|
|
2184
|
+
if (denied) return denied;
|
|
2153
2185
|
const from = this.#state.state;
|
|
2154
2186
|
const to = this.#isAllowedTransition(this.#state.state, 'block');
|
|
2155
2187
|
if (!to) return this.#makeError(`Cannot block from state ${this.#state.state}`, 'block');
|
|
@@ -2855,6 +2887,8 @@ class OstackyController {
|
|
|
2855
2887
|
*/
|
|
2856
2888
|
async completeTask({ taskId, filePath, fileHash } = {}) {
|
|
2857
2889
|
this.#load();
|
|
2890
|
+
const denied = await this.#foreignOwnerError('complete_task');
|
|
2891
|
+
if (denied) return denied;
|
|
2858
2892
|
if (this.#state.state !== 'EXECUTING_INLINE' && this.#state.state !== 'EXECUTING_SUBAGENTS') {
|
|
2859
2893
|
return this.#makeError(`Cannot complete task from state ${this.#state.state}`, 'complete_task');
|
|
2860
2894
|
}
|
|
@@ -3332,7 +3366,7 @@ function safeHandler(fn, options = {}) {
|
|
|
3332
3366
|
|
|
3333
3367
|
const server = new McpServer({
|
|
3334
3368
|
name: 'ostacky-controller',
|
|
3335
|
-
version: '0.10.
|
|
3369
|
+
version: '0.10.2',
|
|
3336
3370
|
});
|
|
3337
3371
|
|
|
3338
3372
|
server.registerTool(
|
|
@@ -3934,7 +3968,7 @@ function setupGracefulShutdown(ctrl) {
|
|
|
3934
3968
|
}
|
|
3935
3969
|
|
|
3936
3970
|
async function main() {
|
|
3937
|
-
log('Starting ostacky-controller MCP v0.10.
|
|
3971
|
+
log('Starting ostacky-controller MCP v0.10.2...');
|
|
3938
3972
|
log('State path:', { path: statePath });
|
|
3939
3973
|
// Clean up stale tmp/lock files from previous runs
|
|
3940
3974
|
cleanupTmpFiles(statePath);
|
|
@@ -152,6 +152,34 @@ export function mergePluginOwnedState(fresh: any, state: any, ownedKeys: string[
|
|
|
152
152
|
return payload
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
/**
|
|
156
|
+
* multisession-ownership-guard: hay UN state file por proyecto, así que el PENDING
|
|
157
|
+
* puede ser de otra sesión. El gate no debe congelar sesiones ajenas a esa request
|
|
158
|
+
* (antes, cualquier sesión quedaba bloqueada por la confirmación pendiente de otra).
|
|
159
|
+
*
|
|
160
|
+
* No aplica cuando no hay dueño (estado legacy), cuando el caller es el dueño, ni
|
|
161
|
+
* cuando el caller es desconocido (`event.sessionID` ausente → "default"): sin
|
|
162
|
+
* identidad no se puede probar ajeneidad.
|
|
163
|
+
*/
|
|
164
|
+
export function isForeignPendingOwner(state: any, sessionId: string | null | undefined): boolean {
|
|
165
|
+
const owner = state?.ownerSessionId
|
|
166
|
+
if (!owner || !sessionId || sessionId === "default") return false
|
|
167
|
+
return owner !== sessionId
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Cache del gate PENDING. El cache es por `revision`, NO por dueño: si el paso de
|
|
172
|
+
* una sesión ajena dejara un ALLOW, la dueña lo reutilizaría y se saltearía su
|
|
173
|
+
* propia confirmación. Por eso un PENDING ajeno no cachea nada.
|
|
174
|
+
*/
|
|
175
|
+
export function nextPendingGateCache(
|
|
176
|
+
revision: number,
|
|
177
|
+
foreignPendingOwner: boolean
|
|
178
|
+
): { revision: number; result: string } | null {
|
|
179
|
+
if (foreignPendingOwner) return null
|
|
180
|
+
return { revision, result: "ALLOW" }
|
|
181
|
+
}
|
|
182
|
+
|
|
155
183
|
/**
|
|
156
184
|
* Persiste estado SIN poder pisar al MCP.
|
|
157
185
|
*
|
|
@@ -297,6 +325,20 @@ export function marksDiscovery(toolName: string): boolean {
|
|
|
297
325
|
)
|
|
298
326
|
}
|
|
299
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Predicado puro del horizonte del gate de discovery: ¿este prompt invalida el
|
|
330
|
+
* hit estructural de la sesión?
|
|
331
|
+
*
|
|
332
|
+
* El contrato de reuso es POR REQUEST ("reuso del output ya obtenido en el request",
|
|
333
|
+
* remove-discovery-cache-phantom archivado 2026-10-19), no por sesión: la instrucción
|
|
334
|
+
* §1 del agente y record_discovery son por request; el gate era el único desalineado.
|
|
335
|
+
* Los prompts TRIVIALES no invalidan: el plugin les inyecta "No hagas Discovery"
|
|
336
|
+
* (hint :555) — limpiar el hit ahí crearía instrucción y gate contradictorias.
|
|
337
|
+
*/
|
|
338
|
+
export function shouldInvalidateDiscoveryHit(trivial: boolean): boolean {
|
|
339
|
+
return !trivial
|
|
340
|
+
}
|
|
341
|
+
|
|
300
342
|
/**
|
|
301
343
|
* Mismo criterio de "archivo de código" que el gate de read (index.ts:552),
|
|
302
344
|
* sin la cláusula de `pattern` que es específica de glob. Docs/JSON quedan fuera:
|
|
@@ -550,6 +592,10 @@ export default {
|
|
|
550
592
|
const currentState = state?.state ?? "DONE"
|
|
551
593
|
const trivial = isTrivial(text, currentState)
|
|
552
594
|
trivialBySession.set(sessionId, trivial)
|
|
595
|
+
// Horizonte por request: prompts NO-triviales invalidan el discovery hit —
|
|
596
|
+
// la siguiente lectura de código exige un explore fresco (contrato
|
|
597
|
+
// remove-discovery-cache-phantom + instrucción §1 del agente).
|
|
598
|
+
if (shouldInvalidateDiscoveryHit(trivial)) discoveryHitByRequest.delete(sessionId)
|
|
553
599
|
if (trivial) {
|
|
554
600
|
// Preserve system FULL cacheable, add suffix hint to user prompt text
|
|
555
601
|
const hint = "\n\n[PLUGIN HINT: Saludo trivial — responde breve sin tools. No hagas Discovery.]"
|
|
@@ -606,7 +652,9 @@ export default {
|
|
|
606
652
|
checkCount++
|
|
607
653
|
const freshState = readState(directory)
|
|
608
654
|
const pendingStates = ["ROUTE_DECISION_PENDING", "EXECUTION_DECISION_PENDING", "CLARIFICATION_PENDING"]
|
|
609
|
-
|
|
655
|
+
// multisession-ownership-guard: el PENDING de OTRA sesión no congela esta sesión.
|
|
656
|
+
const foreignPendingOwner = !!freshState && isForeignPendingOwner(freshState, sessionId)
|
|
657
|
+
if (freshState && pendingStates.includes(freshState.state) && !foreignPendingOwner) {
|
|
610
658
|
// cache ALLOW per revision, BLOCKED never cached
|
|
611
659
|
if (lastCheck && freshState.revision === lastCheck.revision && checkCount % 5 !== 0 && lastCheck.result === "ALLOW") {
|
|
612
660
|
// reuse cached ALLOW
|
|
@@ -628,7 +676,7 @@ export default {
|
|
|
628
676
|
}
|
|
629
677
|
}
|
|
630
678
|
} else if (freshState) {
|
|
631
|
-
lastCheck =
|
|
679
|
+
lastCheck = nextPendingGateCache(freshState.revision, foreignPendingOwner)
|
|
632
680
|
}
|
|
633
681
|
|
|
634
682
|
// ── 1.6) Engram soft gate (auditable, no BLOCK) — refuerza SHALL 1 de ostacky.md ──
|
|
@@ -728,12 +776,22 @@ export default {
|
|
|
728
776
|
const gated = isCodeReadGated({ isCodeFile, isLiteralGrep, isSpecTasksPath, isDocsPath, isTaskTracked })
|
|
729
777
|
const codegraphOk = gated ? isCodegraphAvailable(directory) : false
|
|
730
778
|
// Sin fallback a disco: la única evidencia válida es un codegraph_explore
|
|
731
|
-
// COMPLETADO en
|
|
732
|
-
// session.deleted
|
|
779
|
+
// COMPLETADO en este request (discoveryHitByRequest; el hook "prompt"
|
|
780
|
+
// invalida el hit en cada prompt no-trivial). session.deleted también lo limpia.
|
|
733
781
|
const hasDiscoveryHit = codegraphOk ? discoveryHitByRequest.get(sessionId) === true : false
|
|
734
782
|
if (shouldBlockCodeRead({
|
|
735
783
|
isCodeFile, isLiteralGrep, isSpecTasksPath, isDocsPath, isTaskTracked, codegraphOk, hasDiscoveryHit,
|
|
736
784
|
})) {
|
|
785
|
+
// Métrica de evasión real (misma convención que engramBypassCount:648):
|
|
786
|
+
// cuántas lecturas de código saltaron el gate sin explore completado.
|
|
787
|
+
try {
|
|
788
|
+
const st = readState(directory)
|
|
789
|
+
if (st) {
|
|
790
|
+
st.codeReadBlockedCount = (st.codeReadBlockedCount || 0) + 1
|
|
791
|
+
persistState(directory, st, ["codeReadBlockedCount"])
|
|
792
|
+
}
|
|
793
|
+
} catch {}
|
|
794
|
+
try { console.warn(`[ostacky] code_read_blocked: sin codegraph_explore completado en sesión (${targetPath || "query"})`) } catch {}
|
|
737
795
|
throw new Error(
|
|
738
796
|
`BLOCKED: sin discovery estructural en esta sesión — llamá codegraph_codegraph_explore("${targetPath || "query"}") antes de Read/Grep/Glob de código`
|
|
739
797
|
)
|
|
@@ -952,9 +1010,10 @@ export default {
|
|
|
952
1010
|
// Track discovery hit to allow subsequent Reads
|
|
953
1011
|
const tool: string = event.tool as string
|
|
954
1012
|
const sessionId: string = (event.sessionID ?? "default") as string
|
|
955
|
-
// (fix-codegraph-gate) Evidencia REAL de discovery: un `codegraph_explore` completado en
|
|
956
|
-
//
|
|
957
|
-
//
|
|
1013
|
+
// (fix-codegraph-gate) Evidencia REAL de discovery: un `codegraph_explore` completado en ESTE
|
|
1014
|
+
// request abre el gate de lecturas de código (el hook "prompt" invalida el hit en cada
|
|
1015
|
+
// prompt no-trivial). Se marca aunque el resultado venga vacío, a propósito:
|
|
1016
|
+
// "CodeGraph no tiene este archivo en su índice" es justamente el caso donde el
|
|
958
1017
|
// Read TIENE que poder pasar si hubo `codegraph_explore`.
|
|
959
1018
|
if (marksDiscovery(tool)) {
|
|
960
1019
|
try {
|
package/dist/cli.js
CHANGED
|
@@ -641,31 +641,31 @@ var init_fs = __esm(() => {
|
|
|
641
641
|
var manifest_default;
|
|
642
642
|
var init_manifest = __esm(() => {
|
|
643
643
|
manifest_default = {
|
|
644
|
-
version: "0.10.
|
|
644
|
+
version: "0.10.2",
|
|
645
645
|
repo: "JaimeHoracio/Ostacky",
|
|
646
|
-
tag: "v0.10.
|
|
646
|
+
tag: "v0.10.2",
|
|
647
647
|
agents: [
|
|
648
648
|
{
|
|
649
649
|
name: "ostacky",
|
|
650
650
|
file: "assets/agents/ostacky.md",
|
|
651
|
-
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.10.
|
|
652
|
-
version: "0.10.
|
|
653
|
-
sha256: "
|
|
651
|
+
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.10.2: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
|
|
652
|
+
version: "0.10.2",
|
|
653
|
+
sha256: "b3db2a27d7b8249b4552d4f63353d893ec1b8c2abda44f375de65cd1d4364419"
|
|
654
654
|
}
|
|
655
655
|
],
|
|
656
656
|
commands: [
|
|
657
657
|
{
|
|
658
658
|
name: "install-stack",
|
|
659
659
|
file: "assets/commands/install-stack.md",
|
|
660
|
-
description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.10.
|
|
661
|
-
version: "0.10.
|
|
662
|
-
sha256: "
|
|
660
|
+
description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.10.2: controller plugin como alma hard-gate, Context7 removido del stack.",
|
|
661
|
+
version: "0.10.2",
|
|
662
|
+
sha256: "b4845d7b6306b1a8c4914a4cf5a4390a4d3e79f1226de72b0ef2e95157c1f58e"
|
|
663
663
|
},
|
|
664
664
|
{
|
|
665
665
|
name: "opsx-sync",
|
|
666
666
|
file: "assets/commands/opsx-sync.md",
|
|
667
667
|
description: "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
|
|
668
|
-
version: "0.10.
|
|
668
|
+
version: "0.10.2",
|
|
669
669
|
sha256: "f883f9ad96f7d75778631d5cc13d8a1a9c3e6ec41396bbce8ce13cff2e66fca2"
|
|
670
670
|
}
|
|
671
671
|
],
|
|
@@ -673,15 +673,15 @@ var init_manifest = __esm(() => {
|
|
|
673
673
|
{
|
|
674
674
|
name: "ostacky-controller",
|
|
675
675
|
file: "assets/mcp/ostacky-controller/",
|
|
676
|
-
description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.10.
|
|
677
|
-
version: "0.10.
|
|
678
|
-
sha256: "
|
|
676
|
+
description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.10.2: 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.",
|
|
677
|
+
version: "0.10.2",
|
|
678
|
+
sha256: "c78d2a8f7ce87d373cbac9135235ef1c90f45380fafc4135fe22c2b55c4423b6"
|
|
679
679
|
},
|
|
680
680
|
{
|
|
681
681
|
name: "openspec",
|
|
682
682
|
file: "assets/mcp/openspec/",
|
|
683
683
|
description: "MCP server local para OpenSpec - proposal, apply, archive, sync de cambios",
|
|
684
|
-
version: "0.10.
|
|
684
|
+
version: "0.10.2",
|
|
685
685
|
sha256: "bdb283fe8ec2dfcba2ec4f38191f4039e58cd7ae12e44e66310783b42c827638"
|
|
686
686
|
}
|
|
687
687
|
],
|
|
@@ -690,105 +690,105 @@ var init_manifest = __esm(() => {
|
|
|
690
690
|
name: "brainstorming",
|
|
691
691
|
file: "assets/skills/brainstorming/SKILL.md",
|
|
692
692
|
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)",
|
|
693
|
-
version: "0.10.
|
|
693
|
+
version: "0.10.2",
|
|
694
694
|
sha256: "ba76eff6fb5bea08d3b26622089ea4739b7b542b3677a46071b2576f3f2001c7"
|
|
695
695
|
},
|
|
696
696
|
{
|
|
697
697
|
name: "execution-mode-evaluation",
|
|
698
698
|
file: "assets/skills/execution-mode-evaluation/SKILL.md",
|
|
699
699
|
description: "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
|
|
700
|
-
version: "0.10.
|
|
700
|
+
version: "0.10.2",
|
|
701
701
|
sha256: "9090132ccfe31dcf34b6d5f399c1135dcb1044c504d4beb026e0c7d9e09e7c0d"
|
|
702
702
|
},
|
|
703
703
|
{
|
|
704
704
|
name: "tdd",
|
|
705
705
|
file: "assets/skills/tdd/SKILL.md",
|
|
706
706
|
description: "Skill de test-driven development (Superpowers)",
|
|
707
|
-
version: "0.10.
|
|
707
|
+
version: "0.10.2",
|
|
708
708
|
sha256: "cce54e81cce46ba973066f9b43e74994a7dbf21aa756146c27689241cf62704d"
|
|
709
709
|
},
|
|
710
710
|
{
|
|
711
711
|
name: "subagent-driven-development",
|
|
712
712
|
file: "assets/skills/subagent-driven-development/SKILL.md",
|
|
713
713
|
description: "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
|
|
714
|
-
version: "0.10.
|
|
714
|
+
version: "0.10.2",
|
|
715
715
|
sha256: "1a42d714a9a13faf05f0bf7b580e8d837c2e77a5633839542ccce603023419e8"
|
|
716
716
|
},
|
|
717
717
|
{
|
|
718
718
|
name: "dispatching-parallel-agents",
|
|
719
719
|
file: "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
720
720
|
description: "Skill de dispatch paralelo de agentes (Superpowers)",
|
|
721
|
-
version: "0.10.
|
|
721
|
+
version: "0.10.2",
|
|
722
722
|
sha256: "7e7b712ef742d5631e302e6a71583e2bbbd33094da9281abfb84b43505fc3ef1"
|
|
723
723
|
},
|
|
724
724
|
{
|
|
725
725
|
name: "review",
|
|
726
726
|
file: "assets/skills/review/SKILL.md",
|
|
727
727
|
description: "Skill de revisión de código (Superpowers)",
|
|
728
|
-
version: "0.10.
|
|
728
|
+
version: "0.10.2",
|
|
729
729
|
sha256: "b19650ed4d1d4d9857a4dd5b7e08e91328a1a1fc9c45bcc2fb600fa9d0213279"
|
|
730
730
|
},
|
|
731
731
|
{
|
|
732
732
|
name: "receiving-code-review",
|
|
733
733
|
file: "assets/skills/receiving-code-review/SKILL.md",
|
|
734
734
|
description: "Skill de recibir y procesar feedback de code review",
|
|
735
|
-
version: "0.10.
|
|
735
|
+
version: "0.10.2",
|
|
736
736
|
sha256: "d761e884e71d8d3476ac734d287cae403a4024506a7d12e7361a448217c0a831"
|
|
737
737
|
},
|
|
738
738
|
{
|
|
739
739
|
name: "openspec-propose",
|
|
740
740
|
file: "assets/skills/openspec-propose/SKILL.md",
|
|
741
741
|
description: "Skill de generación de proposal (OpenSpec)",
|
|
742
|
-
version: "0.10.
|
|
742
|
+
version: "0.10.2",
|
|
743
743
|
sha256: "9049b944cea88a5428fd5d77b411a0ed32d169ad68acda911b68365fac08f38f"
|
|
744
744
|
},
|
|
745
745
|
{
|
|
746
746
|
name: "openspec-apply-change",
|
|
747
747
|
file: "assets/skills/openspec-apply-change/SKILL.md",
|
|
748
748
|
description: "Skill de aplicación de change (OpenSpec)",
|
|
749
|
-
version: "0.10.
|
|
749
|
+
version: "0.10.2",
|
|
750
750
|
sha256: "dfc823bf89fc7505e91ab6dee9c1f004be38a410bd3d88fb67b211b1b6cbb1d0"
|
|
751
751
|
},
|
|
752
752
|
{
|
|
753
753
|
name: "openspec-archive-change",
|
|
754
754
|
file: "assets/skills/openspec-archive-change/SKILL.md",
|
|
755
755
|
description: "Skill de archivo de change (OpenSpec)",
|
|
756
|
-
version: "0.10.
|
|
756
|
+
version: "0.10.2",
|
|
757
757
|
sha256: "16e4b561de7747283663fed602e506abf502452c49a8d4b86d7a5539c40f0195"
|
|
758
758
|
},
|
|
759
759
|
{
|
|
760
760
|
name: "openspec-explore",
|
|
761
761
|
file: "assets/skills/openspec-explore/SKILL.md",
|
|
762
762
|
description: "Modo explore para OpenSpec — thinking partner para explorar ideas, investigar problemas y clarificar requisitos antes/durante un cambio",
|
|
763
|
-
version: "0.10.
|
|
763
|
+
version: "0.10.2",
|
|
764
764
|
sha256: "9eafc3a8c693b8d9916867ef764d49e5222da717fde501c957bb3f6c312d2415"
|
|
765
765
|
},
|
|
766
766
|
{
|
|
767
767
|
name: "using-git-worktrees",
|
|
768
768
|
file: "assets/skills/using-git-worktrees/SKILL.md",
|
|
769
769
|
description: "Skill de uso de git worktrees para aislamiento de trabajo",
|
|
770
|
-
version: "0.10.
|
|
770
|
+
version: "0.10.2",
|
|
771
771
|
sha256: "93341bc1b7c053618a8b6dc07e3615b77990d7b549a0201f5835d95fef67ce13"
|
|
772
772
|
},
|
|
773
773
|
{
|
|
774
774
|
name: "using-superpowers",
|
|
775
775
|
file: "assets/skills/using-superpowers/SKILL.md",
|
|
776
776
|
description: "Skill de orquestación de Superpowers skills",
|
|
777
|
-
version: "0.10.
|
|
777
|
+
version: "0.10.2",
|
|
778
778
|
sha256: "7e54536f96d2a379185a10bfc1e970850caa2561b6d8aca7080f0defea0381a4"
|
|
779
779
|
},
|
|
780
780
|
{
|
|
781
781
|
name: "writing-skills",
|
|
782
782
|
file: "assets/skills/writing-skills/SKILL.md",
|
|
783
783
|
description: "Skill de creación y edición de skills",
|
|
784
|
-
version: "0.10.
|
|
784
|
+
version: "0.10.2",
|
|
785
785
|
sha256: "3d76b906cee518a2b809febb70db95697a35b9f368986bb504b4120c3bfb437a"
|
|
786
786
|
},
|
|
787
787
|
{
|
|
788
788
|
name: "graceful-degradation",
|
|
789
789
|
file: "assets/skills/graceful-degradation/SKILL.md",
|
|
790
790
|
description: "Skill de degradación graceful cuando múltiples tools están indisponibles",
|
|
791
|
-
version: "0.10.
|
|
791
|
+
version: "0.10.2",
|
|
792
792
|
sha256: "363449bd9e6f800a0a3168667cf78f767fb105d86e4a4adadcc649d418139303"
|
|
793
793
|
}
|
|
794
794
|
]
|
|
@@ -1337,13 +1337,16 @@ async function installCodeGraph(toolsDir) {
|
|
|
1337
1337
|
message: indexWarning ? `CodeGraph instalado y configurado para OpenCode. ${indexWarning}` : "CodeGraph instalado localmente y configurado para OpenCode"
|
|
1338
1338
|
};
|
|
1339
1339
|
}
|
|
1340
|
-
function setupOpenSpec(projectRoot = findProjectRoot()) {
|
|
1341
|
-
const
|
|
1340
|
+
function setupOpenSpec(projectRoot = findProjectRoot(), deps = {}) {
|
|
1341
|
+
const execFile = deps.execFileSync ?? execFileSync3;
|
|
1342
|
+
const isAvailable = deps.isCommandAvailable ?? isCommandAvailable;
|
|
1343
|
+
const invocationFor = deps.getCommandInvocation ?? getCommandInvocation;
|
|
1344
|
+
const useBun = isAvailable("bun");
|
|
1342
1345
|
const fail = (msg) => ({ success: false, message: msg });
|
|
1343
1346
|
const tryDirect = () => {
|
|
1344
1347
|
try {
|
|
1345
|
-
const invocation =
|
|
1346
|
-
|
|
1348
|
+
const invocation = invocationFor(useBun ? "bunx" : "npx", useBun ? [OPENSPEC_NPM_PACKAGE, "init", "--tools", "opencode", "--force"] : ["--yes", OPENSPEC_NPM_PACKAGE, "init", "--tools", "opencode", "--force"]);
|
|
1349
|
+
execFile(invocation.command, invocation.args, {
|
|
1347
1350
|
stdio: "pipe",
|
|
1348
1351
|
timeout: 120000,
|
|
1349
1352
|
cwd: projectRoot
|
|
@@ -1354,20 +1357,20 @@ function setupOpenSpec(projectRoot = findProjectRoot()) {
|
|
|
1354
1357
|
}
|
|
1355
1358
|
};
|
|
1356
1359
|
const tryInstallGlobal = () => {
|
|
1357
|
-
if (!useBun && !
|
|
1360
|
+
if (!useBun && !isAvailable("npm")) {
|
|
1358
1361
|
return { ok: false, error: "Ni bun ni npm están disponibles para instalar OpenSpec globalmente" };
|
|
1359
1362
|
}
|
|
1360
1363
|
const pkgManager = useBun ? "bun" : "npm";
|
|
1361
1364
|
const installArgs = useBun ? ["add", "-g", OPENSPEC_NPM_PACKAGE] : ["install", "-g", OPENSPEC_NPM_PACKAGE];
|
|
1362
1365
|
try {
|
|
1363
|
-
const invocation =
|
|
1364
|
-
|
|
1366
|
+
const invocation = invocationFor(pkgManager, installArgs);
|
|
1367
|
+
execFile(invocation.command, invocation.args, { stdio: "pipe", timeout: 120000 });
|
|
1365
1368
|
} catch (installErr) {
|
|
1366
1369
|
return { ok: false, error: `Instalación global falló: ${installErr.message}` };
|
|
1367
1370
|
}
|
|
1368
1371
|
try {
|
|
1369
|
-
const retryInvocation =
|
|
1370
|
-
|
|
1372
|
+
const retryInvocation = invocationFor("openspec", ["init", "--tools", "opencode", "--force"]);
|
|
1373
|
+
execFile(retryInvocation.command, retryInvocation.args, {
|
|
1371
1374
|
stdio: "pipe",
|
|
1372
1375
|
timeout: 120000,
|
|
1373
1376
|
cwd: projectRoot
|
|
@@ -1735,7 +1738,7 @@ var init_doctor_v2 = __esm(() => {
|
|
|
1735
1738
|
// package.json
|
|
1736
1739
|
var package_default = {
|
|
1737
1740
|
name: "ostacky",
|
|
1738
|
-
version: "0.10.
|
|
1741
|
+
version: "0.10.2",
|
|
1739
1742
|
description: "Instalador interactivo de agentes y comandos para OpenCode",
|
|
1740
1743
|
type: "module",
|
|
1741
1744
|
bin: {
|
|
@@ -1772,6 +1775,7 @@ var package_default = {
|
|
|
1772
1775
|
},
|
|
1773
1776
|
devDependencies: {
|
|
1774
1777
|
"@types/bun": "latest",
|
|
1778
|
+
openspec: "^0.0.0",
|
|
1775
1779
|
typescript: "^5.0.0"
|
|
1776
1780
|
},
|
|
1777
1781
|
publishConfig: {
|
|
@@ -2914,7 +2918,7 @@ async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath, option
|
|
|
2914
2918
|
params: {
|
|
2915
2919
|
protocolVersion: "2025-03-26",
|
|
2916
2920
|
capabilities: {},
|
|
2917
|
-
clientInfo: { name: "ostacky-installer", version: "0.10.
|
|
2921
|
+
clientInfo: { name: "ostacky-installer", version: "0.10.2" }
|
|
2918
2922
|
}
|
|
2919
2923
|
});
|
|
2920
2924
|
});
|
package/manifest.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.10.
|
|
2
|
+
"version": "0.10.2",
|
|
3
3
|
"repo": "JaimeHoracio/Ostacky",
|
|
4
|
-
"tag": "v0.10.
|
|
4
|
+
"tag": "v0.10.2",
|
|
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.10.
|
|
10
|
-
"version": "0.10.
|
|
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.10.2: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
|
|
10
|
+
"version": "0.10.2",
|
|
11
|
+
"sha256": "b3db2a27d7b8249b4552d4f63353d893ec1b8c2abda44f375de65cd1d4364419"
|
|
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.10.
|
|
19
|
-
"version": "0.10.
|
|
20
|
-
"sha256": "
|
|
18
|
+
"description": "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.10.2: controller plugin como alma hard-gate, Context7 removido del stack.",
|
|
19
|
+
"version": "0.10.2",
|
|
20
|
+
"sha256": "b4845d7b6306b1a8c4914a4cf5a4390a4d3e79f1226de72b0ef2e95157c1f58e"
|
|
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.10.
|
|
26
|
+
"version": "0.10.2",
|
|
27
27
|
"sha256": "f883f9ad96f7d75778631d5cc13d8a1a9c3e6ec41396bbce8ce13cff2e66fca2"
|
|
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.10.
|
|
35
|
-
"version": "0.10.
|
|
36
|
-
"sha256": "
|
|
34
|
+
"description": "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.10.2: 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.10.2",
|
|
36
|
+
"sha256": "c78d2a8f7ce87d373cbac9135235ef1c90f45380fafc4135fe22c2b55c4423b6"
|
|
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.10.
|
|
42
|
+
"version": "0.10.2",
|
|
43
43
|
"sha256": "bdb283fe8ec2dfcba2ec4f38191f4039e58cd7ae12e44e66310783b42c827638"
|
|
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.10.
|
|
51
|
+
"version": "0.10.2",
|
|
52
52
|
"sha256": "ba76eff6fb5bea08d3b26622089ea4739b7b542b3677a46071b2576f3f2001c7"
|
|
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.10.
|
|
58
|
+
"version": "0.10.2",
|
|
59
59
|
"sha256": "9090132ccfe31dcf34b6d5f399c1135dcb1044c504d4beb026e0c7d9e09e7c0d"
|
|
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.10.
|
|
65
|
+
"version": "0.10.2",
|
|
66
66
|
"sha256": "cce54e81cce46ba973066f9b43e74994a7dbf21aa756146c27689241cf62704d"
|
|
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.10.
|
|
72
|
+
"version": "0.10.2",
|
|
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.10.
|
|
79
|
+
"version": "0.10.2",
|
|
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.10.
|
|
86
|
+
"version": "0.10.2",
|
|
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.10.
|
|
93
|
+
"version": "0.10.2",
|
|
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.10.
|
|
100
|
+
"version": "0.10.2",
|
|
101
101
|
"sha256": "9049b944cea88a5428fd5d77b411a0ed32d169ad68acda911b68365fac08f38f"
|
|
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.10.
|
|
107
|
+
"version": "0.10.2",
|
|
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.10.
|
|
114
|
+
"version": "0.10.2",
|
|
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.10.
|
|
121
|
+
"version": "0.10.2",
|
|
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.10.
|
|
128
|
+
"version": "0.10.2",
|
|
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.10.
|
|
135
|
+
"version": "0.10.2",
|
|
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.10.
|
|
142
|
+
"version": "0.10.2",
|
|
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.10.
|
|
149
|
+
"version": "0.10.2",
|
|
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.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"description": "Instalador interactivo de agentes y comandos para OpenCode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/bun": "latest",
|
|
40
|
+
"openspec": "^0.0.0",
|
|
40
41
|
"typescript": "^5.0.0"
|
|
41
42
|
},
|
|
42
43
|
"publishConfig": {
|