ostacky 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -193,20 +193,20 @@ Tras instalar, el proyecto queda así:
193
193
 
194
194
  ```json
195
195
  {
196
- "version": "0.3.0",
196
+ "version": "0.3.2",
197
197
  "lockedAt": "2025-01-01T00:00:00.000Z",
198
198
  "repo": "JaimeHoracio/Ostacky",
199
- "tag": "v0.3.0",
199
+ "tag": "v0.3.2",
200
200
  "agents": {
201
201
  "ostacky": {
202
- "version": "0.3.0",
202
+ "version": "0.3.2",
203
203
  "installedAt": "2025-01-01T00:00:00.000Z",
204
204
  "sha256": "abc123..."
205
205
  }
206
206
  },
207
207
  "commands": {
208
208
  "install-stack": {
209
- "version": "0.3.0",
209
+ "version": "0.3.2",
210
210
  "installedAt": "2025-01-01T00:00:00.000Z",
211
211
  "sha256": "def456..."
212
212
  }
@@ -239,7 +239,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
239
239
  ## Seguridad
240
240
 
241
241
  - `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
242
- - Las URLs de descarga usan **tags de GitHub** (ej. `v0.3.0`), nunca `main` — instalaciones reproducibles
242
+ - Las URLs de descarga usan **tags de GitHub** (ej. `v0.3.2`), nunca `main` — instalaciones reproducibles
243
243
  - Cada path de archivo descargado es validado para prevenir **path traversal**
244
244
  - Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
245
245
  - El cache local (`~/.opencode/cache/`) también valida integridad al servir archivos cacheados
@@ -104,6 +104,8 @@ Los pasos que ejecuta el skill una vez cargado:
104
104
  │ ┌─────────────────────────────────────────────────────┐ │
105
105
  │ │ taskCount: cantidad total de tasks │ │
106
106
  │ │ sharedFiles: { archivo → [tasks que lo modifican] }│ │
107
+ │ │ fileClusters: [ [taskA,taskB], [taskC], ... ] │ │
108
+ │ │ clusterCount: cantidad de clusters │ │
107
109
  │ │ sequentialDeps: [taskA → taskB] │ │
108
110
  │ │ filesPerTask: { task → [archivos] } │ │
109
111
  │ │ estLines: líneas estimadas de cambio │ │
@@ -114,13 +116,25 @@ Los pasos que ejecuta el skill una vez cargado:
114
116
  ┌──────────────────────────────────────────────────────────────┐
115
117
  │ 5. PASO 3a — MODO GLOBAL │
116
118
  │ │
117
- 5 reglas en orden. La PRIMERA que se cumple decide.
119
+ PRIMERO: CONSTRUIR CLUSTERS (componentes conectados)
120
+ │ - sharedFiles agrupa tareas que modifican los mismos archs │
121
+ │ - Cierre transitivo: A comparte archivo con B, B con C │
122
+ │ → A, B, C están en el mismo cluster │
123
+ │ - clusterCount: cantidad total de clusters │
118
124
  │ │
119
- 1. ¿sharedFiles > 0? → INLINE
120
- 2. ¿sequentialDeps sin contrato? → INLINE
121
- 3. ¿taskCount < 4? → INLINE │
122
- 4. ¿estLines < 30? → INLINE
123
- 5. Ninguna de las anteriores → SUBAGENT-DRIVEN
125
+ LUEGO: evaluar en orden:
126
+
127
+ 1. clusterCount==1 y tamaño>1? → INLINE │
128
+ (todo comparte archivos, no se puede paralelizar)
129
+
130
+ │ 2. clusterCount>=2, clusters con tamaño>1? │
131
+ │ a. ¿deps ENTRE clusters sin contrato? → INLINE │
132
+ │ b. ¿NO? → SUBAGENT-DRIVEN (cada cluster=1 subagente) │
133
+ │ │
134
+ │ 3. Sin archivos compartidos (clusterCount==taskCount): │
135
+ │ a. ¿taskCount < 3? → INLINE │
136
+ │ b. ¿estLines < 30? → INLINE │
137
+ │ c. ¿ninguna? → SUBAGENT-DRIVEN (cada task=1 subagente) │
124
138
  │ │
125
139
  │ Si el usuario dio instrucciones explícitas: │
126
140
  │ → anulan todas las reglas, todas las fases heredan el modo │
@@ -130,7 +144,8 @@ Los pasos que ejecuta el skill una vez cargado:
130
144
  │ 6. PASO 3b — EVALUACIÓN POR FASES │
131
145
  │ (solo si el modo global es INLINE) │
132
146
  │ │
133
- │ Si el modo global es SUBAGENT-DRIVEN saltar este paso
147
+ │ Si el modo global es SUBAGENT-DRIVEN (Rule 2b o 3c)
148
+ │ → saltar este paso (ya hay granularidad por cluster/task) │
134
149
  │ │
135
150
  │ Por cada fase en tasks.md: │
136
151
  │ │
@@ -153,12 +168,18 @@ Los pasos que ejecuta el skill una vez cargado:
153
168
  │ "mode": "inline" | "subagent-driven", │
154
169
  │ "confidence": 0.95, │
155
170
  │ "reasons": ["..."], │
156
- │ "globalRuleTriggered": 1,
157
- │ "taskAnalysis": { ... },
158
- │ "phaseRecommendations": [
159
- { "phase": "2. Core", "mode": "inline", ... },
160
- { "phase": "4. Tests", "mode": "subagent-driven", ... }
161
- ]
171
+ │ "codegraphUsed": ["codegraph_context"],
172
+ │ "globalRuleTriggered": "2b",
173
+ │ "taskAnalysis": {
174
+ │ "taskCount": 5,
175
+ │ "sharedFiles": {...},
176
+ "fileClusters": [["t1","t2"], ["t3","t4"], ["t5"]],
177
+ │ "clusterCount": 3, │
178
+ │ "sequentialDeps": [], │
179
+ │ "estLines": 85, │
180
+ │ "hasExplicitContract": false │
181
+ │ }, │
182
+ │ "phaseRecommendations": [...] │
162
183
  │ } │
163
184
  └──────────────────────────┬───────────────────────────────────┘
164
185
 
@@ -168,12 +189,15 @@ Los pasos que ejecuta el skill una vez cargado:
168
189
  │ Agent definition usa el output: │
169
190
  │ │
170
191
  │ - mode "inline" → el agente ejecuta todo en su sesión │
171
- │ - mode "subagent-driven" → carga subagent-driven-development
192
+ │ - mode "subagent-driven" (Rule 3c) → subagent-driven-dev
193
+ │ - mode "subagent-driven" (Rule 2b) → cluster dispatch: │
194
+ │ cada cluster se asigna a un subagente │
172
195
  │ - phaseRecommendations: inline PRIMERO, subagent DESPUÉS │
173
196
  │ │
174
197
  │ Orden de fases: │
175
198
  │ 1º Fases inline (establecen contratos) │
176
199
  │ 2º Fases subagent-driven (consumen contratos) │
200
+ │ 3º Cluster dispatch → subagentes en paralelo │
177
201
  └──────────────────────────────────────────────────────────────┘
178
202
  ```
179
203
 
@@ -181,15 +205,16 @@ Los pasos que ejecuta el skill una vez cargado:
181
205
 
182
206
  ## Reglas que gobiernan la decisión
183
207
 
184
- ### Modo global (Paso 3a)
208
+ ### Modo global (Paso 3a) — basado en clusters
185
209
 
186
- | Regla | Condición | Decisión |
187
- |-------|-----------|----------|
188
- | 1 | Archivos compartidos entre tasks | INLINE |
189
- | 2 | Dependencias secuenciales sin contrato explícito | INLINE |
190
- | 3 | Menos de 4 tasks | INLINE |
191
- | 4 | Menos de 30 líneas estimadas | INLINE |
192
- | 5 | Ninguna condición anterior | SUBAGENT-DRIVEN |
210
+ | Regla | Condición | Decisión | Detalle |
211
+ |-------|-----------|----------|---------|
212
+ | 1 | clusterCount == 1 Y tamaño > 1 | **INLINE** | Todo conectado por archivos compartidos. Imposible paralelizar. |
213
+ | 2a | clusterCount >= 2, hay clusters con tamaño > 1, deps ENTRE clusters SIN contrato | **INLINE** | Clusters independientes pero relacionados sin contrato explícito. |
214
+ | 2b | clusterCount >= 2, hay clusters con tamaño > 1, SIN deps entre clusters (O contrato existe) | **SUBAGENT-DRIVEN** | Clusters independientes. Cada cluster = 1 subagente. Tasks intra-cluster secuenciales. |
215
+ | 3a | Sin archivos compartidos (clusterCount == taskCount), taskCount < 3 | **INLINE** | Muy pocas tasks para amortizar subagentes. |
216
+ | 3b | Sin archivos compartidos, estLines < 30 | **INLINE** | Cambio pequeño, inline más eficiente. |
217
+ | 3c | Sin archivos compartidos, ninguna condición anterior | **SUBAGENT-DRIVEN** | Tasks independientes. Cada task = 1 subagente. |
193
218
 
194
219
  ### Modo por fase (Paso 3b)
195
220
 
@@ -211,14 +236,22 @@ Los pasos que ejecuta el skill una vez cargado:
211
236
 
212
237
  ## Orden de ejecución recomendado
213
238
 
239
+ ### Si el modo global es "inline" (con phaseRecommendations):
214
240
  1. **Primero** fases con `mode: "inline"` — establecen interfaces, tipos y módulos
215
241
  2. **Después** fases con `mode: "subagent-driven"` — consumen lo establecido
216
242
  3. Si hay dependencias entre fases subagent-driven, respetar el orden de `tasks.md`
217
243
 
244
+ ### Si el modo global es "subagent-driven" por clusters (Rule 2b):
245
+ 1. Cada cluster del `fileClusters` se asigna a un subagente
246
+ 2. Los subagentes se ejecutan en **paralelo** (los clusters no comparten archivos)
247
+ 3. Tasks dentro del mismo cluster se ejecutan **secuencialmente** dentro del subagente
248
+ 4. Si hay dependencias ENTRE clusters, deben ejecutarse en orden respetando la dependencia
249
+
218
250
  ---
219
251
 
220
252
  ## Limitaciones
221
253
 
222
254
  - El skill depende de CodeGraph para los datos. Si CodeGraph no está disponible, decide inline por defecto.
223
255
  - Si `tasks.md` no está organizado en fases, `phaseRecommendations` será un array vacío.
256
+ - El clustering asume que dos tasks que modifican el mismo archivo SIEMPRE van a conflictuar si se ejecutan en paralelo. Esto es conservador pero correcto para subagentes independientes.
224
257
  - La decisión es point-in-time: si se agregan tasks a mitad de cambio, re-ejecutar el skill.
@@ -82,6 +82,7 @@ Con tasks.md + datos de CodeGraph, construí este mapa:
82
82
  taskCount: número total de tasks (solo las de implementación)
83
83
  sharedFiles: { archivo -> [tasks que lo modifican] }
84
84
  sequentialDeps: [ [taskA, taskB], ... ] // B necesita que A esté hecho
85
+ fileClusters: [ ["taskA", "taskB"], ["taskC"], ... ] // componentes conectados por archivos compartidos
85
86
  filesPerTask: { task -> [archivos que modifica] }
86
87
  estLines: estimación conservadora de líneas totales de cambio
87
88
  hasExplicitContract: true/false // design.md especifica contratos entre tasks?
@@ -96,6 +97,16 @@ hasExplicitContract: true/false // design.md especifica contratos entre tasks?
96
97
  - Si task B dice "Update [X] to handle [Y]" y task A dice "Add [Y] to [X]" → dependencia secuencial.
97
98
  - Si el diseño (design.md) explicita contratos (interfaces, tipos compartidos), la dependencia es manejable con subagentes.
98
99
 
100
+ **Para construir fileClusters (clusters por archivos compartidos):**
101
+ - Usar `sharedFiles` para agrupar tareas en clusters (componentes conectados del grafo).
102
+ - Inicializar: cada tarea es su propio cluster.
103
+ - Para cada archivo en `sharedFiles`: todas las tasks que modifican ese archivo → mismo cluster.
104
+ - Aplicar cierre transitivo: si taskA comparte archivo con taskB, y taskB con taskC, entonces A/B/C están en el mismo cluster.
105
+ - El resultado son los grupos de tareas que comparten archivos entre sí.
106
+ - Un cluster de tamaño 1 significa que esa task NO comparte archivos con ninguna otra.
107
+ - `clusterCount == taskCount` → no hay archivos compartidos en absoluto.
108
+ - `clusterCount == 1` → todas las tareas están conectadas por archivos compartidos.
109
+
99
110
  **Para estimar estLines:**
100
111
  - Tasks de configuración/setup: ~2-3 líneas
101
112
  - Tasks de implementación simple (agregar un enum, un flag): ~5-10 líneas
@@ -107,49 +118,110 @@ No es necesario ser exacto. Una estimación conservadora alcanza.
107
118
 
108
119
  ---
109
120
 
110
- ### Paso 3a: Modo global del cambio
121
+ ### Paso 3a: Modo global del cambio — basado en clusters
122
+
123
+ Antes de aplicar reglas, construir CLUSTERS de tareas por archivos compartidos usando `sharedFiles` y `fileClusters` del Paso 2.
111
124
 
112
- Aplicar ESTRICTAMENTE en este orden. Evaluar cada condición. En la PRIMERA que se cumpla, esa es la decisión global.
125
+ **Construcción de clusters (componentes conectados):**
126
+ 1. Inicializar: cada tarea es su propio cluster de tamaño 1.
127
+ 2. Para cada archivo en `sharedFiles`: todas las tasks que modifican ese archivo → mismo cluster.
128
+ 3. Cierre transitivo: si taskA comparte archivo con taskB, y taskB comparte archivo con taskC, entonces A/B/C están en el mismo cluster.
129
+ 4. Resultado: componentes conectados del grafo "tareas que comparten archivos".
113
130
 
114
131
  ```
115
- 1. SI sharedFiles tiene 1+ archivos compartidos entre 2+ tasks
116
- INLINE (global)
117
- Razón: "Archivos compartidos: {archivos}. Subagentes causarían conflictos de merge."
118
-
119
- 2. SI sequentialDeps tiene 1+ dependencias Y hasExplicitContract == false
120
- INLINE (global)
121
- Razón: "Dependencias secuenciales sin contrato explícito en design.md.
122
- Subagentes podrían definir contratos inconsistentes."
123
-
124
- EXCEPCIÓN: sequentialDeps pero hasExplicitContract == true
125
- → NO aplicar esta regla. Continuar a la siguiente.
126
-
127
- 3. SI taskCount < 4
128
- → INLINE (global)
129
- → Razón: "{taskCount} tasks. El overhead de dispatchear subagentes supera el beneficio."
130
-
131
- 4. SI estLines < 30
132
- → INLINE (global)
133
- → Razón: "Cambio pequeño (~{estLines} líneas). Inline es más eficiente en tokens."
134
-
135
- 5. SI NINGUNA condición anterior se cumplió
136
- → SUBAGENT-DRIVEN (global)
137
- → Razón: "{taskCount} tasks independientes sin archivos compartidos.
138
- Subagentes aíslan contexto y evitan saturación."
132
+ Ejemplo:
133
+ task1 y task2 modifican workflow-factories.ts cluster [task1, task2]
134
+ task3 y task4 modifican structured-call.ts → cluster [task3, task4]
135
+ task5 modifica tests/unit.test.ts → cluster [task5]
136
+
137
+ clusterCount: 3
138
+ clusters independientes entre sí: (cada uno en sus archivos)
139
139
  ```
140
140
 
141
- **Importante:** a diferencia de antes, NO saltear las reglas restantes al encontrar la primera. Anotar cuál regla se cumplió y por qué, pero CONTINUAR al Paso 3b para evaluar por fases. Solo si el modo global es SUBAGENT-DRIVEN (regla 5), saltear el Paso 3b porque no hay fases que optimizar.
141
+ Luego aplicar estas reglas en orden. La PRIMERA que se cumpla decide el modo global:
142
+
143
+ ```
144
+ ┌─────────────────────────────────────────────────────────────────┐
145
+ │ │
146
+ │ 1. clusterCount == 1 Y cluster tiene tamaño > 1 │
147
+ │ → INLINE (global) │
148
+ │ → globalRuleTriggered: "1" │
149
+ │ → Razón: "Todas las tareas comparten archivos en un único │
150
+ │ cluster ({N} tasks). Imposible paralelizar sin │
151
+ │ conflictos de merge." │
152
+ │ → Continuar al Paso 3b para evaluar por fases. │
153
+ │ │
154
+ ├─────────────────────────────────────────────────────────────────┤
155
+ │ │
156
+ │ 2. clusterCount >= 2 Y hay clusters con tamaño > 1 │
157
+ │ (hay archivos compartidos, pero en grupos independientes) │
158
+ │ │
159
+ │ → Verificar dependencias secuenciales ENTRE clusters: │
160
+ │ Si sequentialDeps contiene [taskA, taskB] donde A∈clusterX,│
161
+ │ B∈clusterY, X≠Y → hay deps entre clusters. │
162
+ │ Deps INTRA-cluster (A y B en mismo cluster) no afectan. │
163
+ │ │
164
+ │ a. SI hay deps entre clusters Y hasExplicitContract == false │
165
+ │ → INLINE (global) │
166
+ │ → globalRuleTriggered: "2a" │
167
+ │ → Razón: "{clusterCount} clusters pero con dependencias │
168
+ │ secuenciales entre clusters sin contrato │
169
+ │ explícito en design.md." │
170
+ │ → Continuar al Paso 3b para evaluar por fases. │
171
+ │ │
172
+ │ b. SI NO (clusters sin deps entre sí, O contrato explícito) │
173
+ │ → SUBAGENT-DRIVEN (global), CADA CLUSTER como unidad │
174
+ │ de subagente. Tasks dentro del mismo cluster se │
175
+ │ ejecutan secuencialmente (comparten archivos). │
176
+ │ → globalRuleTriggered: "2b" │
177
+ │ → Razón: "{clusterCount} clusters independientes sin │
178
+ │ archivos compartidos entre clusters. Cada │
179
+ │ cluster → 1 subagente." │
180
+ │ → Saltar Paso 3b (granularidad ya está por cluster). │
181
+ │ │
182
+ ├─────────────────────────────────────────────────────────────────┤
183
+ │ │
184
+ │ 3. NO hay archivos compartidos (clusterCount == taskCount, │
185
+ │ todos los clusters son de tamaño 1) │
186
+ │ │
187
+ │ a. SI taskCount < 3 │
188
+ │ → INLINE (global) │
189
+ │ → globalRuleTriggered: "3a" │
190
+ │ → Razón: "{taskCount} tasks independientes pero muy │
191
+ │ pocas para amortizar overhead de subagentes." │
192
+ │ → Continuar al Paso 3b para evaluar por fases. │
193
+ │ │
194
+ │ b. SI estLines < 30 │
195
+ │ → INLINE (global) │
196
+ │ → globalRuleTriggered: "3b" │
197
+ │ → Razón: "Cambio pequeño (~{estLines} líneas). Inline │
198
+ │ más eficiente en tokens." │
199
+ │ → Continuar al Paso 3b para evaluar por fases. │
200
+ │ │
201
+ │ c. SI NINGUNA condición anterior │
202
+ │ → SUBAGENT-DRIVEN (global), cada task como subagente │
203
+ │ → globalRuleTriggered: "3c" │
204
+ │ → Razón: "{taskCount} tasks independientes sin archivos │
205
+ │ compartidos. Subagentes aíslan contexto." │
206
+ │ → Saltar Paso 3b. │
207
+ │ │
208
+ └─────────────────────────────────────────────────────────────────┘
209
+ ```
142
210
 
143
211
  **Excepción global:** si el usuario dio instrucciones EXPLÍCITAS sobre el modo de ejecución
144
212
  ("hacé todo inline", "usá subagentes"), esas instrucciones tienen PRIORIDAD TOTAL sobre estas reglas. En ese caso, todas las fases heredan el modo del usuario.
145
213
 
214
+ **Nota sobre subagentes con clusters (Rule 2b):** Cuando el modo global es SUBAGENT-DRIVEN por clusters, cada cluster se convierte en una unidad de trabajo atómica para un subagente. El subagente NO recibe tasks individuales sino el CLUSTER COMPLETO, y las resuelve secuencialmente (porque comparten archivos). Diferentes clusters se ejecutan en paralelo porque NO comparten archivos entre sí.
215
+
216
+ **Nota sobre deps entre clusters (Rule 2a):** Es raro pero posible. Por ejemplo, task1 en archivo A, task2 en archivo B, task3 en archivo A (hereda/depende de task1). Los clusters son [task1, task3] y [task2]. clusterCount=2 pero task3 depende de task1. Si no hay contrato explícito en design.md, el riesgo es alto → inline.
217
+
146
218
  ---
147
219
 
148
220
  ### Paso 3b: Evaluación por fases (solo si el modo global es inline)
149
221
 
150
- Si el modo global es SUBAGENT-DRIVEN (regla 5), saltear este paso — todas las fases van como subagentes.
222
+ Si el modo global es SUBAGENT-DRIVEN, saltear este paso — todas las fases van como subagentes (o clusters completos como subagentes si aplica Rule 2b).
151
223
 
152
- Si el modo global es INLINE (reglas 1-4), evaluar CADA FASE de `tasks.md` por separado para determinar si alguna puede ejecutarse como subagentes independientes.
224
+ Si el modo global es INLINE, evaluar CADA FASE de `tasks.md` por separado para determinar si alguna puede ejecutarse como subagentes independientes.
153
225
 
154
226
  **Para cada fase en tasks.md:**
155
227
 
@@ -198,12 +270,19 @@ El output DEBE ser un JSON válido en este formato:
198
270
  "confidence": 0.0 - 1.0,
199
271
  "reasons": ["razón principal", "razón secundaria"],
200
272
  "codegraphUsed": ["codegraph_context"],
201
- "globalRuleTriggered": 1,
273
+ "globalRuleTriggered": "1",
202
274
  "taskAnalysis": {
203
275
  "taskCount": 13,
204
276
  "sharedFiles": {
205
277
  "src/logging.ts": ["2.2", "2.4", "2.5"]
206
278
  },
279
+ "fileClusters": [
280
+ ["2.2", "2.4", "2.5"],
281
+ ["2.1"],
282
+ ["2.3"],
283
+ ["3.1"]
284
+ ],
285
+ "clusterCount": 4,
207
286
  "sequentialDeps": [],
208
287
  "estLines": 45,
209
288
  "hasExplicitContract": false
@@ -231,21 +310,34 @@ El output DEBE ser un JSON válido en este formato:
231
310
  | `confidence` | Qué tan seguro estás de la decisión (0.0 = nada, 1.0 = totalmente). Bajar si CodeGraph no se pudo usar. |
232
311
  | `reasons` | Array de strings. La primera razón es la principal (por qué se gatilló la regla global). |
233
312
  | `codegraphUsed` | Lista de tool calls de CodeGraph que se ejecutaron. Vacío si el Paso 0 encontró datos suficientes. |
234
- | `globalRuleTriggered` | Número de la regla que decidió el modo global (1-5). Para trazabilidad. |
313
+ | `globalRuleTriggered` | Código de la regla que decidió el modo global ("1", "2a", "2b", "3a", "3b", "3c"). Para trazabilidad. |
235
314
  | `taskAnalysis` | Mapa global construido en el Paso 2. Incluir siempre para trazabilidad. |
315
+ | `taskAnalysis.fileClusters` | Array de arrays: cada sub-array es un cluster de tareas que comparten archivos. Fundamental para la decisión. |
316
+ | `taskAnalysis.clusterCount` | Número total de clusters. `clusterCount == 1` → todo conectado. `clusterCount == taskCount` → todo independiente. |
236
317
  | `phaseRecommendations` | Array con el modo recomendado por fase. Cada entrada tiene `phase`, `mode` y `reason`. Vacío si el modo global es subagent-driven o si tasks.md no tiene fases separadas. |
237
318
 
238
319
  ---
239
320
 
240
321
  ## Ejemplos
241
322
 
242
- ### Ejemplo 1: Multicapa — archivos compartidos, fases independientes
323
+ ### Ejemplo 1: Multicapa — clusters conectados, dependencias entre clusters
243
324
 
244
325
  **Input:** change `update-ostacky-5-levels`
245
- - Fase 2: 5 tasks de implementación (algunas comparten `src/logging.ts`)
326
+ - Fase 2: 5 tasks de implementación
327
+ - Tasks 2.2, 2.4, 2.5 comparten `src/logging.ts` → cluster A
328
+ - Tasks 2.3 y 3.1 comparten `src/cli.ts` → cluster B (cross-fase)
329
+ - Task 2.1 tiene archivo propio
330
+ - Dependencias: 2.1→2.2→2.4/2.5, 2.1→2.3 (deps ENTRE clusters)
246
331
  - Fase 4: 4 tests independientes en `tests/*.ts`
247
332
  - ~143 líneas totales
248
333
 
334
+ **Análisis de clusters:**
335
+ - cluster [2.2, 2.4, 2.5] (comparten logging.ts)
336
+ - cluster [2.3, 3.1] (comparten cli.ts)
337
+ - cluster [2.1], cluster resto de tests, etc.
338
+ - Hay dependencias secuenciales ENTRE clusters (2.1→cluster A, 2.1→cluster B) sin contrato explícito
339
+ - → Rule 2a: INLINE global (deps entre clusters sin contrato)
340
+
249
341
  **Decisión:**
250
342
 
251
343
  ```json
@@ -253,17 +345,30 @@ El output DEBE ser un JSON válido en este formato:
253
345
  "mode": "inline",
254
346
  "confidence": 0.95,
255
347
  "reasons": [
256
- "Archivos compartidos: src/logging.ts (tasks 2.2, 2.4, 2.5). Subagentes causarían conflictos de merge.",
257
- "Dependencias secuenciales: 2.1→2.2→2.4/2.5 sin contrato explícito en design.md."
348
+ "5 clusters pero con dependencias secuenciales entre clusters sin contrato explícito en design.md.",
349
+ "Archivos compartidos dentro de clusters: src/logging.ts, src/cli.ts."
258
350
  ],
259
351
  "codegraphUsed": ["codegraph_context", "codegraph_search"],
260
- "globalRuleTriggered": 1,
352
+ "globalRuleTriggered": "2a",
261
353
  "taskAnalysis": {
262
354
  "taskCount": 13,
263
355
  "sharedFiles": {
264
356
  "src/logging.ts": ["2.2", "2.4", "2.5"],
265
357
  "src/cli.ts": ["2.3", "3.1"]
266
358
  },
359
+ "fileClusters": [
360
+ ["2.2", "2.4", "2.5"],
361
+ ["2.3", "3.1"],
362
+ ["2.1"],
363
+ ["4.1"],
364
+ ["4.2"],
365
+ ["4.3"],
366
+ ["4.4"],
367
+ ["3.2"],
368
+ ["5.1"],
369
+ ["5.2"]
370
+ ],
371
+ "clusterCount": 10,
267
372
  "sequentialDeps": [["2.1", "2.2"], ["2.2", "2.4"], ["2.2", "2.5"], ["2.1", "2.3"]],
268
373
  "estLines": 143,
269
374
  "hasExplicitContract": false
@@ -272,7 +377,7 @@ El output DEBE ser un JSON válido en este formato:
272
377
  {
273
378
  "phase": "2. Core Implementation",
274
379
  "mode": "inline",
275
- "reason": "Archivos compartidos dentro de la fase: src/logging.ts, src/cli.ts"
380
+ "reason": "Archivos compartidos dentro de la fase: src/logging.ts, src/cli.ts. Además tiene dependencias entre clusters sin contrato."
276
381
  },
277
382
  {
278
383
  "phase": "3. Documentation",
@@ -293,12 +398,17 @@ El output DEBE ser un JSON válido en este formato:
293
398
  }
294
399
  ```
295
400
 
296
- ### Ejemplo 2: Cambio chico sin fases
401
+ ### Ejemplo 2: Cambio chico sin archivos compartidos
297
402
 
298
403
  **Input:**
299
- - 3 tasks
300
- - Archivos diferentes
301
- - Sin dependencias
404
+ - 3 tasks en archivos diferentes
405
+ - Sin dependencias secuenciales
406
+ - ~20 líneas totales
407
+
408
+ **Análisis de clusters:**
409
+ - clusterCount == taskCount == 3 (todos los clusters son tamaño 1 — sin archivos compartidos)
410
+ - Rule 3a: 3 < 3? No → skip
411
+ - Rule 3b: 20 < 30? Sí → INLINE
302
412
 
303
413
  **Decisión:**
304
414
 
@@ -307,13 +417,19 @@ El output DEBE ser un JSON válido en este formato:
307
417
  "mode": "inline",
308
418
  "confidence": 0.85,
309
419
  "reasons": [
310
- "3 tasks. El overhead de dispatchear subagentes supera el beneficio."
420
+ "Cambio pequeño (~20 líneas). Inline más eficiente en tokens."
311
421
  ],
312
422
  "codegraphUsed": [],
313
- "globalRuleTriggered": 3,
423
+ "globalRuleTriggered": "3b",
314
424
  "taskAnalysis": {
315
425
  "taskCount": 3,
316
426
  "sharedFiles": {},
427
+ "fileClusters": [
428
+ ["task1"],
429
+ ["task2"],
430
+ ["task3"]
431
+ ],
432
+ "clusterCount": 3,
317
433
  "sequentialDeps": [],
318
434
  "estLines": 20,
319
435
  "hasExplicitContract": false
@@ -322,13 +438,19 @@ El output DEBE ser un JSON válido en este formato:
322
438
  }
323
439
  ```
324
440
 
325
- ### Ejemplo 3: Tasks globalmente independientes
441
+ ### Ejemplo 3: Tasks globalmente independientes (sin archivos compartidos)
326
442
 
327
443
  **Input:**
328
444
  - 8 tasks, cada una en su propio archivo
329
445
  - Sin dependencias secuenciales
330
446
  - ~120 líneas totales
331
447
 
448
+ **Análisis de clusters:**
449
+ - clusterCount == taskCount == 8 (sin archivos compartidos)
450
+ - Rule 3a: 8 < 3? No → skip
451
+ - Rule 3b: 120 < 30? No → skip
452
+ - Rule 3c: → SUBAGENT-DRIVEN
453
+
332
454
  **Decisión:**
333
455
 
334
456
  ```json
@@ -336,13 +458,24 @@ El output DEBE ser un JSON válido en este formato:
336
458
  "mode": "subagent-driven",
337
459
  "confidence": 0.9,
338
460
  "reasons": [
339
- "8 tasks independientes sin archivos compartidos. Subagentes evitan saturación de contexto."
461
+ "8 tasks independientes sin archivos compartidos. Subagentes aíslan contexto y evitan saturación."
340
462
  ],
341
463
  "codegraphUsed": ["codegraph_context"],
342
- "globalRuleTriggered": 5,
464
+ "globalRuleTriggered": "3c",
343
465
  "taskAnalysis": {
344
466
  "taskCount": 8,
345
467
  "sharedFiles": {},
468
+ "fileClusters": [
469
+ ["task1"],
470
+ ["task2"],
471
+ ["task3"],
472
+ ["task4"],
473
+ ["task5"],
474
+ ["task6"],
475
+ ["task7"],
476
+ ["task8"]
477
+ ],
478
+ "clusterCount": 8,
346
479
  "sequentialDeps": [],
347
480
  "estLines": 120,
348
481
  "hasExplicitContract": false
@@ -351,11 +484,73 @@ El output DEBE ser un JSON válido en este formato:
351
484
  }
352
485
  ```
353
486
 
487
+ ### Ejemplo 4: Clusters independientes — el fix del bug (Rule 2b)
488
+
489
+ Este es el escenario exacto que el diseño anterior NO manejaba correctamente.
490
+
491
+ **Input:**
492
+ - 5 tasks
493
+ - Task 1 y Task 2 modifican `src/workflow-factories.ts` → cluster A
494
+ - Task 3 y Task 4 modifican `src/structured-call.ts` → cluster B
495
+ - Task 5 crea archivo nuevo `tests/workflow.test.ts` → cluster C
496
+ - Sin dependencias secuenciales entre clusters
497
+ - ~85 líneas totales
498
+
499
+ **Análisis de clusters:**
500
+ - cluster A: [task1, task2] — comparten `workflow-factories.ts`
501
+ - cluster B: [task3, task4] — comparten `structured-call.ts`
502
+ - cluster C: [task5] — archivo propio
503
+ - clusterCount = 3, hay clusters con tamaño > 1
504
+ - NO hay dependencias secuenciales ENTRE clusters
505
+ - → Rule 2b: SUBAGENT-DRIVEN con cluster dispatch
506
+
507
+ **Output:**
508
+
509
+ ```json
510
+ {
511
+ "mode": "subagent-driven",
512
+ "confidence": 0.95,
513
+ "reasons": [
514
+ "3 clusters independientes sin archivos compartidos entre clusters. Cada cluster → 1 subagente.",
515
+ "Cluster A (tasks 1-2), Cluster B (tasks 3-4), Cluster C (task 5)."
516
+ ],
517
+ "codegraphUsed": ["codegraph_context"],
518
+ "globalRuleTriggered": "2b",
519
+ "taskAnalysis": {
520
+ "taskCount": 5,
521
+ "sharedFiles": {
522
+ "src/workflow-factories.ts": ["task1", "task2"],
523
+ "src/structured-call.ts": ["task3", "task4"]
524
+ },
525
+ "fileClusters": [
526
+ ["task1", "task2"],
527
+ ["task3", "task4"],
528
+ ["task5"]
529
+ ],
530
+ "clusterCount": 3,
531
+ "sequentialDeps": [],
532
+ "estLines": 85,
533
+ "hasExplicitContract": false
534
+ },
535
+ "phaseRecommendations": []
536
+ }
537
+ ```
538
+
539
+ **¿Cómo se ejecuta?**
540
+
541
+ | Subagente | Cluster | Tasks | Ejecución |
542
+ |-----------|---------|-------|-----------|
543
+ | SA-1 | A | task1, task2 | Secuencial (comparten archivo) |
544
+ | SA-2 | B | task3, task4 | Secuencial (comparten archivo) |
545
+ | SA-3 | C | task5 | Directa (archivo nuevo) |
546
+
547
+ Los 3 subagentes corren en paralelo. NO hay conflictos de merge porque ningún archivo es tocado por más de un subagente. ✨
548
+
354
549
  ---
355
550
 
356
551
  ## Reglas complementarias
357
552
 
358
- - **Fases sin tasks de implementación:** si una fase solo tiene tasks de documentación, release o configuración, evaluar igual pero con sesgo a inline (regla 3 y 4 suelen gatillar para fases de 1-3 tasks).
553
+ - **Fases sin tasks de implementación:** si una fase solo tiene tasks de documentación, release o configuración, evaluar igual pero con sesgo a inline (reglas 3a/3b o d/e suelen gatillar para fases de 1-3 tasks).
359
554
 
360
555
  - **Orden de ejecución:** las fases con modo inline deben ejecutarse PRIMERO que las fases subagent-driven, porque las fases inline establecen los contratos (interfaces, tipos, módulos) que las fases subagent-driven consumen. Documentar el orden en `phaseRecommendations` incluyendo un orden sugerido de ejecución.
361
556
 
@@ -376,10 +571,13 @@ Cuando hay `phaseRecommendations`, seguir este orden:
376
571
  ## Checklist de verificación
377
572
 
378
573
  - [ ] ¿Ejecuté o verifiqué `codegraph_context`?
379
- - [ ] ¿Construí el mapa de dependencias GLOBAL (Paso 2)?
380
- - [ ] ¿Apliqué las reglas globales en orden? (1 2 3 → 4 → 5)
381
- - [ ] ¿Anoté cuál regla global se gatilló?
382
- - [ ] ¿Si el modo global es inline, ejecuté el Paso 3b por cada fase?
574
+ - [ ] ¿Construí el mapa de dependencias GLOBAL (Paso 2) incluyendo `fileClusters`?
575
+ - [ ] ¿Identifiqué los clusters (componentes conectados por archivos compartidos)?
576
+ - [ ] ¿Verifiqué dependencias secuenciales ENTRE clusters (no solo intra-cluster)?
577
+ - [ ] ¿Apliqué las reglas en orden? (1 2a/2b 3a/3b/3c)
578
+ - [ ] ¿Anoté cuál regla global se gatilló (código exacto: "1", "2a", "2b", "3a", "3b", "3c")?
579
+ - [ ] ¿Si el modo global es inline (Rule 1, 2a, 3a, 3b), ejecuté el Paso 3b por cada fase?
383
580
  - [ ] ¿Para cada fase evalué sharedFiles intra-fase Y cross-fase?
581
+ - [ ] ¿Si el modo global es subagent-driven por clusters (Rule 2b), documenté qué cluster va a cada subagente?
384
582
  - [ ] ¿El usuario dio instrucciones explícitas que anulen las reglas?
385
- - [ ] ¿El output es JSON válido con todos los campos incluyendo `phaseRecommendations`?
583
+ - [ ] ¿El output es JSON válido con todos los campos: `mode`, `confidence`, `reasons`, `globalRuleTriggered`, `taskAnalysis.fileClusters`, `taskAnalysis.clusterCount`, `phaseRecommendations`?
package/dist/cli.js CHANGED
@@ -161,7 +161,7 @@ var require_picocolors = __commonJS((exports, module) => {
161
161
  // package.json
162
162
  var package_default = {
163
163
  name: "ostacky",
164
- version: "0.3.0",
164
+ version: "0.3.2",
165
165
  description: "Instalador interactivo de agentes y comandos para OpenCode",
166
166
  type: "module",
167
167
  bin: {
@@ -876,15 +876,15 @@ var L2 = () => {
876
876
  import { join as join5 } from "path";
877
877
  // manifest.json
878
878
  var manifest_default = {
879
- version: "0.3.0",
879
+ version: "0.3.2",
880
880
  repo: "JaimeHoracio/Ostacky",
881
- tag: "v0.3.0",
881
+ tag: "v0.3.2",
882
882
  agents: [
883
883
  {
884
884
  name: "ostacky",
885
885
  file: "assets/agents/ostacky.md",
886
886
  description: "Agente principal de desarrollo con ejecución inline-first y local-first",
887
- version: "0.3.0",
887
+ version: "0.3.2",
888
888
  sha256: null
889
889
  }
890
890
  ],
@@ -893,86 +893,93 @@ var manifest_default = {
893
893
  name: "install-stack",
894
894
  file: "assets/commands/install-stack.md",
895
895
  description: "Instala el stack tecnológico del proyecto",
896
- version: "0.3.0",
896
+ version: "0.3.2",
897
897
  sha256: null
898
898
  },
899
899
  {
900
900
  name: "opsx-sync",
901
901
  file: "assets/commands/opsx-sync.md",
902
902
  description: "Sincroniza delta specs del change activo (wrapper de openspec update)",
903
- version: "0.3.0",
903
+ version: "0.3.2",
904
904
  sha256: null
905
905
  }
906
906
  ],
907
907
  skills: [
908
+ {
909
+ name: "execution-mode-evaluation",
910
+ file: "assets/skills/execution-mode-evaluation/SKILL.md",
911
+ description: "Skill de decision de modo de ejecucion inline vs subagent-driven con CodeGraph",
912
+ version: "0.3.2",
913
+ sha256: "eaa7cd3205b22c6db79a5d5f542ea554d5f1ca2d57127490011ba3abe4cb912b"
914
+ },
908
915
  {
909
916
  name: "brainstorming",
910
917
  file: "assets/skills/brainstorming/SKILL.md",
911
918
  description: "Skill de descubrimiento y exploración (Superpowers)",
912
- version: "0.3.0",
919
+ version: "0.3.2",
913
920
  sha256: "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
914
921
  },
915
922
  {
916
923
  name: "writing-plans",
917
924
  file: "assets/skills/writing-plans/SKILL.md",
918
925
  description: "Skill de planificación de implementación (Superpowers)",
919
- version: "0.3.0",
926
+ version: "0.3.2",
920
927
  sha256: "4d675df944b9c846e9066ff971861ad1c9673cd2c88375081b00a75872ad621a"
921
928
  },
922
929
  {
923
930
  name: "tdd",
924
931
  file: "assets/skills/tdd/SKILL.md",
925
932
  description: "Skill de test-driven development (Superpowers)",
926
- version: "0.3.0",
933
+ version: "0.3.2",
927
934
  sha256: "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
928
935
  },
929
936
  {
930
937
  name: "subagent-driven-development",
931
938
  file: "assets/skills/subagent-driven-development/SKILL.md",
932
939
  description: "Skill de ejecución con subagentes (Superpowers)",
933
- version: "0.3.0",
940
+ version: "0.3.2",
934
941
  sha256: "14e0f685b1dc1d7e02b7226d18f037fe4b6cba49b512a1fadf67cfad2a9dcc96"
935
942
  },
936
943
  {
937
944
  name: "dispatching-parallel-agents",
938
945
  file: "assets/skills/dispatching-parallel-agents/SKILL.md",
939
946
  description: "Skill de dispatch paralelo de agentes (Superpowers)",
940
- version: "0.3.0",
947
+ version: "0.3.2",
941
948
  sha256: "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
942
949
  },
943
950
  {
944
951
  name: "review",
945
952
  file: "assets/skills/review/SKILL.md",
946
953
  description: "Skill de revisión de código (Superpowers)",
947
- version: "0.3.0",
954
+ version: "0.3.2",
948
955
  sha256: "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
949
956
  },
950
957
  {
951
958
  name: "openspec-explore",
952
959
  file: "assets/skills/openspec-explore/SKILL.md",
953
960
  description: "Skill de exploración pre-spec (OpenSpec)",
954
- version: "0.3.0",
961
+ version: "0.3.2",
955
962
  sha256: "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
956
963
  },
957
964
  {
958
965
  name: "openspec-propose",
959
966
  file: "assets/skills/openspec-propose/SKILL.md",
960
967
  description: "Skill de generación de proposal (OpenSpec)",
961
- version: "0.3.0",
968
+ version: "0.3.2",
962
969
  sha256: "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
963
970
  },
964
971
  {
965
972
  name: "openspec-apply-change",
966
973
  file: "assets/skills/openspec-apply-change/SKILL.md",
967
974
  description: "Skill de aplicación de change (OpenSpec)",
968
- version: "0.3.0",
975
+ version: "0.3.2",
969
976
  sha256: "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
970
977
  },
971
978
  {
972
979
  name: "openspec-archive-change",
973
980
  file: "assets/skills/openspec-archive-change/SKILL.md",
974
981
  description: "Skill de archivo de change (OpenSpec)",
975
- version: "0.3.0",
982
+ version: "0.3.2",
976
983
  sha256: "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
977
984
  }
978
985
  ]
@@ -1158,7 +1165,7 @@ function clearLockfile(opencodeRoot) {
1158
1165
  const lockfile = readLockfile(opencodeRoot);
1159
1166
  if (!lockfile) {
1160
1167
  writeLockfile(opencodeRoot, {
1161
- version: "0.3.0",
1168
+ version: "0.3.2",
1162
1169
  lockedAt: new Date().toISOString(),
1163
1170
  repo: "",
1164
1171
  tag: "",
package/manifest.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
- "version": "0.3.0",
2
+ "version": "0.3.2",
3
3
  "repo": "JaimeHoracio/Ostacky",
4
- "tag": "v0.3.0",
4
+ "tag": "v0.3.2",
5
5
  "agents": [
6
6
  {
7
7
  "name": "ostacky",
8
8
  "file": "assets/agents/ostacky.md",
9
9
  "description": "Agente principal de desarrollo con ejecución inline-first y local-first",
10
- "version": "0.3.0",
10
+ "version": "0.3.2",
11
11
  "sha256": null
12
12
  }
13
13
  ],
@@ -16,86 +16,93 @@
16
16
  "name": "install-stack",
17
17
  "file": "assets/commands/install-stack.md",
18
18
  "description": "Instala el stack tecnológico del proyecto",
19
- "version": "0.3.0",
19
+ "version": "0.3.2",
20
20
  "sha256": null
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 (wrapper de openspec update)",
26
- "version": "0.3.0",
26
+ "version": "0.3.2",
27
27
  "sha256": null
28
28
  }
29
29
  ],
30
30
  "skills": [
31
+ {
32
+ "name": "execution-mode-evaluation",
33
+ "file": "assets/skills/execution-mode-evaluation/SKILL.md",
34
+ "description": "Skill de decision de modo de ejecucion inline vs subagent-driven con CodeGraph",
35
+ "version": "0.3.2",
36
+ "sha256": "eaa7cd3205b22c6db79a5d5f542ea554d5f1ca2d57127490011ba3abe4cb912b"
37
+ },
31
38
  {
32
39
  "name": "brainstorming",
33
40
  "file": "assets/skills/brainstorming/SKILL.md",
34
41
  "description": "Skill de descubrimiento y exploración (Superpowers)",
35
- "version": "0.3.0",
42
+ "version": "0.3.2",
36
43
  "sha256": "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
37
44
  },
38
45
  {
39
46
  "name": "writing-plans",
40
47
  "file": "assets/skills/writing-plans/SKILL.md",
41
48
  "description": "Skill de planificación de implementación (Superpowers)",
42
- "version": "0.3.0",
49
+ "version": "0.3.2",
43
50
  "sha256": "4d675df944b9c846e9066ff971861ad1c9673cd2c88375081b00a75872ad621a"
44
51
  },
45
52
  {
46
53
  "name": "tdd",
47
54
  "file": "assets/skills/tdd/SKILL.md",
48
55
  "description": "Skill de test-driven development (Superpowers)",
49
- "version": "0.3.0",
56
+ "version": "0.3.2",
50
57
  "sha256": "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
51
58
  },
52
59
  {
53
60
  "name": "subagent-driven-development",
54
61
  "file": "assets/skills/subagent-driven-development/SKILL.md",
55
62
  "description": "Skill de ejecución con subagentes (Superpowers)",
56
- "version": "0.3.0",
63
+ "version": "0.3.2",
57
64
  "sha256": "14e0f685b1dc1d7e02b7226d18f037fe4b6cba49b512a1fadf67cfad2a9dcc96"
58
65
  },
59
66
  {
60
67
  "name": "dispatching-parallel-agents",
61
68
  "file": "assets/skills/dispatching-parallel-agents/SKILL.md",
62
69
  "description": "Skill de dispatch paralelo de agentes (Superpowers)",
63
- "version": "0.3.0",
70
+ "version": "0.3.2",
64
71
  "sha256": "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
65
72
  },
66
73
  {
67
74
  "name": "review",
68
75
  "file": "assets/skills/review/SKILL.md",
69
76
  "description": "Skill de revisión de código (Superpowers)",
70
- "version": "0.3.0",
77
+ "version": "0.3.2",
71
78
  "sha256": "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
72
79
  },
73
80
  {
74
81
  "name": "openspec-explore",
75
82
  "file": "assets/skills/openspec-explore/SKILL.md",
76
83
  "description": "Skill de exploración pre-spec (OpenSpec)",
77
- "version": "0.3.0",
84
+ "version": "0.3.2",
78
85
  "sha256": "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
79
86
  },
80
87
  {
81
88
  "name": "openspec-propose",
82
89
  "file": "assets/skills/openspec-propose/SKILL.md",
83
90
  "description": "Skill de generación de proposal (OpenSpec)",
84
- "version": "0.3.0",
91
+ "version": "0.3.2",
85
92
  "sha256": "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
86
93
  },
87
94
  {
88
95
  "name": "openspec-apply-change",
89
96
  "file": "assets/skills/openspec-apply-change/SKILL.md",
90
97
  "description": "Skill de aplicación de change (OpenSpec)",
91
- "version": "0.3.0",
98
+ "version": "0.3.2",
92
99
  "sha256": "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
93
100
  },
94
101
  {
95
102
  "name": "openspec-archive-change",
96
103
  "file": "assets/skills/openspec-archive-change/SKILL.md",
97
104
  "description": "Skill de archivo de change (OpenSpec)",
98
- "version": "0.3.0",
105
+ "version": "0.3.2",
99
106
  "sha256": "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
100
107
  }
101
108
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ostacky",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Instalador interactivo de agentes y comandos para OpenCode",
5
5
  "type": "module",
6
6
  "bin": {