ostacky 0.3.1 → 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 +5 -5
- package/assets/skills/execution-mode-evaluation/README.md +55 -22
- package/assets/skills/execution-mode-evaluation/SKILL.md +250 -52
- package/dist/cli.js +18 -18
- package/manifest.json +16 -16
- package/package.json +1 -1
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.
|
|
196
|
+
"version": "0.3.2",
|
|
197
197
|
"lockedAt": "2025-01-01T00:00:00.000Z",
|
|
198
198
|
"repo": "JaimeHoracio/Ostacky",
|
|
199
|
-
"tag": "v0.3.
|
|
199
|
+
"tag": "v0.3.2",
|
|
200
200
|
"agents": {
|
|
201
201
|
"ostacky": {
|
|
202
|
-
"version": "0.3.
|
|
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.
|
|
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.
|
|
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
|
-
│
|
|
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
|
-
│
|
|
120
|
-
│
|
|
121
|
-
│
|
|
122
|
-
│
|
|
123
|
-
│
|
|
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
|
|
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
|
-
│ "
|
|
157
|
-
│ "
|
|
158
|
-
│ "
|
|
159
|
-
│
|
|
160
|
-
│
|
|
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" →
|
|
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 |
|
|
189
|
-
| 2 |
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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` |
|
|
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 —
|
|
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
|
|
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
|
-
"
|
|
257
|
-
"
|
|
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":
|
|
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
|
|
401
|
+
### Ejemplo 2: Cambio chico sin archivos compartidos
|
|
297
402
|
|
|
298
403
|
**Input:**
|
|
299
|
-
- 3 tasks
|
|
300
|
-
-
|
|
301
|
-
-
|
|
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
|
-
"
|
|
420
|
+
"Cambio pequeño (~20 líneas). Inline más eficiente en tokens."
|
|
311
421
|
],
|
|
312
422
|
"codegraphUsed": [],
|
|
313
|
-
"globalRuleTriggered":
|
|
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
|
|
461
|
+
"8 tasks independientes sin archivos compartidos. Subagentes aíslan contexto y evitan saturación."
|
|
340
462
|
],
|
|
341
463
|
"codegraphUsed": ["codegraph_context"],
|
|
342
|
-
"globalRuleTriggered":
|
|
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 (
|
|
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
|
-
- [ ] ¿
|
|
381
|
-
- [ ] ¿
|
|
382
|
-
- [ ] ¿
|
|
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
|
|
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.
|
|
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.
|
|
879
|
+
version: "0.3.2",
|
|
880
880
|
repo: "JaimeHoracio/Ostacky",
|
|
881
|
-
tag: "v0.3.
|
|
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.
|
|
887
|
+
version: "0.3.2",
|
|
888
888
|
sha256: null
|
|
889
889
|
}
|
|
890
890
|
],
|
|
@@ -893,14 +893,14 @@ 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.
|
|
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.
|
|
903
|
+
version: "0.3.2",
|
|
904
904
|
sha256: null
|
|
905
905
|
}
|
|
906
906
|
],
|
|
@@ -909,77 +909,77 @@ var manifest_default = {
|
|
|
909
909
|
name: "execution-mode-evaluation",
|
|
910
910
|
file: "assets/skills/execution-mode-evaluation/SKILL.md",
|
|
911
911
|
description: "Skill de decision de modo de ejecucion inline vs subagent-driven con CodeGraph",
|
|
912
|
-
version: "0.3.
|
|
912
|
+
version: "0.3.2",
|
|
913
913
|
sha256: "eaa7cd3205b22c6db79a5d5f542ea554d5f1ca2d57127490011ba3abe4cb912b"
|
|
914
914
|
},
|
|
915
915
|
{
|
|
916
916
|
name: "brainstorming",
|
|
917
917
|
file: "assets/skills/brainstorming/SKILL.md",
|
|
918
918
|
description: "Skill de descubrimiento y exploración (Superpowers)",
|
|
919
|
-
version: "0.3.
|
|
919
|
+
version: "0.3.2",
|
|
920
920
|
sha256: "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
|
|
921
921
|
},
|
|
922
922
|
{
|
|
923
923
|
name: "writing-plans",
|
|
924
924
|
file: "assets/skills/writing-plans/SKILL.md",
|
|
925
925
|
description: "Skill de planificación de implementación (Superpowers)",
|
|
926
|
-
version: "0.3.
|
|
926
|
+
version: "0.3.2",
|
|
927
927
|
sha256: "4d675df944b9c846e9066ff971861ad1c9673cd2c88375081b00a75872ad621a"
|
|
928
928
|
},
|
|
929
929
|
{
|
|
930
930
|
name: "tdd",
|
|
931
931
|
file: "assets/skills/tdd/SKILL.md",
|
|
932
932
|
description: "Skill de test-driven development (Superpowers)",
|
|
933
|
-
version: "0.3.
|
|
933
|
+
version: "0.3.2",
|
|
934
934
|
sha256: "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
|
|
935
935
|
},
|
|
936
936
|
{
|
|
937
937
|
name: "subagent-driven-development",
|
|
938
938
|
file: "assets/skills/subagent-driven-development/SKILL.md",
|
|
939
939
|
description: "Skill de ejecución con subagentes (Superpowers)",
|
|
940
|
-
version: "0.3.
|
|
940
|
+
version: "0.3.2",
|
|
941
941
|
sha256: "14e0f685b1dc1d7e02b7226d18f037fe4b6cba49b512a1fadf67cfad2a9dcc96"
|
|
942
942
|
},
|
|
943
943
|
{
|
|
944
944
|
name: "dispatching-parallel-agents",
|
|
945
945
|
file: "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
946
946
|
description: "Skill de dispatch paralelo de agentes (Superpowers)",
|
|
947
|
-
version: "0.3.
|
|
947
|
+
version: "0.3.2",
|
|
948
948
|
sha256: "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
|
|
949
949
|
},
|
|
950
950
|
{
|
|
951
951
|
name: "review",
|
|
952
952
|
file: "assets/skills/review/SKILL.md",
|
|
953
953
|
description: "Skill de revisión de código (Superpowers)",
|
|
954
|
-
version: "0.3.
|
|
954
|
+
version: "0.3.2",
|
|
955
955
|
sha256: "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
|
|
956
956
|
},
|
|
957
957
|
{
|
|
958
958
|
name: "openspec-explore",
|
|
959
959
|
file: "assets/skills/openspec-explore/SKILL.md",
|
|
960
960
|
description: "Skill de exploración pre-spec (OpenSpec)",
|
|
961
|
-
version: "0.3.
|
|
961
|
+
version: "0.3.2",
|
|
962
962
|
sha256: "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
|
|
963
963
|
},
|
|
964
964
|
{
|
|
965
965
|
name: "openspec-propose",
|
|
966
966
|
file: "assets/skills/openspec-propose/SKILL.md",
|
|
967
967
|
description: "Skill de generación de proposal (OpenSpec)",
|
|
968
|
-
version: "0.3.
|
|
968
|
+
version: "0.3.2",
|
|
969
969
|
sha256: "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
|
|
970
970
|
},
|
|
971
971
|
{
|
|
972
972
|
name: "openspec-apply-change",
|
|
973
973
|
file: "assets/skills/openspec-apply-change/SKILL.md",
|
|
974
974
|
description: "Skill de aplicación de change (OpenSpec)",
|
|
975
|
-
version: "0.3.
|
|
975
|
+
version: "0.3.2",
|
|
976
976
|
sha256: "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
|
|
977
977
|
},
|
|
978
978
|
{
|
|
979
979
|
name: "openspec-archive-change",
|
|
980
980
|
file: "assets/skills/openspec-archive-change/SKILL.md",
|
|
981
981
|
description: "Skill de archivo de change (OpenSpec)",
|
|
982
|
-
version: "0.3.
|
|
982
|
+
version: "0.3.2",
|
|
983
983
|
sha256: "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
|
|
984
984
|
}
|
|
985
985
|
]
|
|
@@ -1165,7 +1165,7 @@ function clearLockfile(opencodeRoot) {
|
|
|
1165
1165
|
const lockfile = readLockfile(opencodeRoot);
|
|
1166
1166
|
if (!lockfile) {
|
|
1167
1167
|
writeLockfile(opencodeRoot, {
|
|
1168
|
-
version: "0.3.
|
|
1168
|
+
version: "0.3.2",
|
|
1169
1169
|
lockedAt: new Date().toISOString(),
|
|
1170
1170
|
repo: "",
|
|
1171
1171
|
tag: "",
|
package/manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.3.
|
|
2
|
+
"version": "0.3.2",
|
|
3
3
|
"repo": "JaimeHoracio/Ostacky",
|
|
4
|
-
"tag": "v0.3.
|
|
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.
|
|
10
|
+
"version": "0.3.2",
|
|
11
11
|
"sha256": null
|
|
12
12
|
}
|
|
13
13
|
],
|
|
@@ -16,14 +16,14 @@
|
|
|
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.
|
|
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.
|
|
26
|
+
"version": "0.3.2",
|
|
27
27
|
"sha256": null
|
|
28
28
|
}
|
|
29
29
|
],
|
|
@@ -32,77 +32,77 @@
|
|
|
32
32
|
"name": "execution-mode-evaluation",
|
|
33
33
|
"file": "assets/skills/execution-mode-evaluation/SKILL.md",
|
|
34
34
|
"description": "Skill de decision de modo de ejecucion inline vs subagent-driven con CodeGraph",
|
|
35
|
-
"version": "0.3.
|
|
35
|
+
"version": "0.3.2",
|
|
36
36
|
"sha256": "eaa7cd3205b22c6db79a5d5f542ea554d5f1ca2d57127490011ba3abe4cb912b"
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"name": "brainstorming",
|
|
40
40
|
"file": "assets/skills/brainstorming/SKILL.md",
|
|
41
41
|
"description": "Skill de descubrimiento y exploración (Superpowers)",
|
|
42
|
-
"version": "0.3.
|
|
42
|
+
"version": "0.3.2",
|
|
43
43
|
"sha256": "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"name": "writing-plans",
|
|
47
47
|
"file": "assets/skills/writing-plans/SKILL.md",
|
|
48
48
|
"description": "Skill de planificación de implementación (Superpowers)",
|
|
49
|
-
"version": "0.3.
|
|
49
|
+
"version": "0.3.2",
|
|
50
50
|
"sha256": "4d675df944b9c846e9066ff971861ad1c9673cd2c88375081b00a75872ad621a"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
"name": "tdd",
|
|
54
54
|
"file": "assets/skills/tdd/SKILL.md",
|
|
55
55
|
"description": "Skill de test-driven development (Superpowers)",
|
|
56
|
-
"version": "0.3.
|
|
56
|
+
"version": "0.3.2",
|
|
57
57
|
"sha256": "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
"name": "subagent-driven-development",
|
|
61
61
|
"file": "assets/skills/subagent-driven-development/SKILL.md",
|
|
62
62
|
"description": "Skill de ejecución con subagentes (Superpowers)",
|
|
63
|
-
"version": "0.3.
|
|
63
|
+
"version": "0.3.2",
|
|
64
64
|
"sha256": "14e0f685b1dc1d7e02b7226d18f037fe4b6cba49b512a1fadf67cfad2a9dcc96"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"name": "dispatching-parallel-agents",
|
|
68
68
|
"file": "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
69
69
|
"description": "Skill de dispatch paralelo de agentes (Superpowers)",
|
|
70
|
-
"version": "0.3.
|
|
70
|
+
"version": "0.3.2",
|
|
71
71
|
"sha256": "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
"name": "review",
|
|
75
75
|
"file": "assets/skills/review/SKILL.md",
|
|
76
76
|
"description": "Skill de revisión de código (Superpowers)",
|
|
77
|
-
"version": "0.3.
|
|
77
|
+
"version": "0.3.2",
|
|
78
78
|
"sha256": "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"name": "openspec-explore",
|
|
82
82
|
"file": "assets/skills/openspec-explore/SKILL.md",
|
|
83
83
|
"description": "Skill de exploración pre-spec (OpenSpec)",
|
|
84
|
-
"version": "0.3.
|
|
84
|
+
"version": "0.3.2",
|
|
85
85
|
"sha256": "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
"name": "openspec-propose",
|
|
89
89
|
"file": "assets/skills/openspec-propose/SKILL.md",
|
|
90
90
|
"description": "Skill de generación de proposal (OpenSpec)",
|
|
91
|
-
"version": "0.3.
|
|
91
|
+
"version": "0.3.2",
|
|
92
92
|
"sha256": "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"name": "openspec-apply-change",
|
|
96
96
|
"file": "assets/skills/openspec-apply-change/SKILL.md",
|
|
97
97
|
"description": "Skill de aplicación de change (OpenSpec)",
|
|
98
|
-
"version": "0.3.
|
|
98
|
+
"version": "0.3.2",
|
|
99
99
|
"sha256": "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
102
|
"name": "openspec-archive-change",
|
|
103
103
|
"file": "assets/skills/openspec-archive-change/SKILL.md",
|
|
104
104
|
"description": "Skill de archivo de change (OpenSpec)",
|
|
105
|
-
"version": "0.3.
|
|
105
|
+
"version": "0.3.2",
|
|
106
106
|
"sha256": "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
|
|
107
107
|
}
|
|
108
108
|
]
|