ostacky 0.5.6 → 0.5.8
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 +22 -22
- package/assets/agents/ostacky.md +89 -120
- package/assets/commands/install-stack.md +7 -8
- package/assets/mcp/ostacky-controller/index.js +16 -4
- package/assets/mcp/ostacky-controller/package.json +1 -1
- package/assets/skills/execution-mode-evaluation/SKILL.md +107 -529
- package/assets/skills/openspec-apply-change/SKILL.md +18 -9
- package/assets/skills/openspec-archive-change/SKILL.md +3 -3
- package/assets/skills/openspec-propose/SKILL.md +10 -8
- package/assets/skills/review/SKILL.md +7 -5
- package/assets/skills/subagent-driven-development/SKILL.md +14 -0
- package/assets/skills/thinking/SKILL.md +195 -0
- package/assets/skills/using-git-worktrees/SKILL.md +1 -1
- package/assets/skills/using-superpowers/SKILL.md +8 -8
- package/assets/skills/writing-plans/SKILL.md +12 -1
- package/assets/tests/e2e-scenarios.md +502 -0
- package/assets/tests/validate-config.sh +254 -0
- package/dist/cli.js +74 -48
- package/dist/mcp/ostacky-controller/index.js +15 -4
- package/manifest.json +56 -42
- package/package.json +1 -1
- package/assets/skills/brainstorming/SKILL.md +0 -153
- package/assets/skills/openspec-explore/SKILL.md +0 -288
- package/assets/skills/question-validation/SKILL.md +0 -77
package/README.md
CHANGED
|
@@ -215,33 +215,33 @@ Tras instalar, el proyecto queda así:
|
|
|
215
215
|
|
|
216
216
|
```json
|
|
217
217
|
{
|
|
218
|
-
"version": "0.5.
|
|
218
|
+
"version": "0.5.8",
|
|
219
219
|
"lockedAt": "2025-01-01T00:00:00.000Z",
|
|
220
220
|
"repo": "JaimeHoracio/Ostacky",
|
|
221
|
-
"tag": "v0.5.
|
|
221
|
+
"tag": "v0.5.8",
|
|
222
222
|
"agents": {
|
|
223
223
|
"ostacky": {
|
|
224
|
-
"version": "0.5.
|
|
224
|
+
"version": "0.5.8",
|
|
225
225
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
226
226
|
"sha256": "abc123..."
|
|
227
227
|
}
|
|
228
228
|
},
|
|
229
229
|
"commands": {
|
|
230
230
|
"install-stack": {
|
|
231
|
-
"version": "0.5.
|
|
231
|
+
"version": "0.5.8",
|
|
232
232
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
233
233
|
"sha256": "def456..."
|
|
234
234
|
},
|
|
235
235
|
"opsx-sync": {
|
|
236
|
-
"version": "0.5.
|
|
236
|
+
"version": "0.5.8",
|
|
237
237
|
"installedAt": "2025-01-01T00:00:00.000Z",
|
|
238
238
|
"sha256": "ghi789..."
|
|
239
239
|
}
|
|
240
240
|
},
|
|
241
241
|
"skills": {
|
|
242
|
-
"brainstorming": { "version": "0.5.
|
|
243
|
-
"execution-mode-evaluation": { "version": "0.5.
|
|
244
|
-
"openspec-propose": { "version": "0.5.
|
|
242
|
+
"brainstorming": { "version": "0.5.8", ... },
|
|
243
|
+
"execution-mode-evaluation": { "version": "0.5.8", ... },
|
|
244
|
+
"openspec-propose": { "version": "0.5.8", ... }
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
```
|
|
@@ -271,7 +271,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
|
|
|
271
271
|
## Seguridad
|
|
272
272
|
|
|
273
273
|
- `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
|
|
274
|
-
- Las URLs de descarga usan **tags de GitHub** (ej. `v0.5.
|
|
274
|
+
- Las URLs de descarga usan **tags de GitHub** (ej. `v0.5.8`), nunca `main` — instalaciones reproducibles
|
|
275
275
|
- Cada path de archivo descargado es validado para prevenir **path traversal**
|
|
276
276
|
- Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
|
|
277
277
|
- El cache local (`~/.opencode/cache/`) también valida integridad al servir archivos cacheados
|
|
@@ -298,24 +298,24 @@ Si ya existe un archivo en cache con el hash correcto, no se hace ninguna petici
|
|
|
298
298
|
|
|
299
299
|
Engram está instalado localmente en `.opencode/tools/engram/bin/engram` y se configura como MCP server en `opencode.json`. Desde el chat de OpenCode, usá las tools de Engram directamente. Algunos comandos CLI útiles:
|
|
300
300
|
|
|
301
|
-
| Comando
|
|
302
|
-
|
|
|
303
|
-
| `.opencode/tools/engram/bin/engram list-projects`
|
|
304
|
-
| `.opencode/tools/engram/bin/engram clean-content --project <nombre>` | Borra el contenido de memoria de un proyecto específico
|
|
305
|
-
| `.opencode/tools/engram/bin/engram clean-content --all`
|
|
306
|
-
| `.opencode/tools/engram/bin/engram serve`
|
|
307
|
-
| `.opencode/tools/engram/bin/engram --version`
|
|
301
|
+
| Comando | Qué hace |
|
|
302
|
+
| -------------------------------------------------------------------- | --------------------------------------------------------- |
|
|
303
|
+
| `.opencode/tools/engram/bin/engram list-projects` | Lista todos los proyectos con memoria en Engram |
|
|
304
|
+
| `.opencode/tools/engram/bin/engram clean-content --project <nombre>` | Borra el contenido de memoria de un proyecto específico |
|
|
305
|
+
| `.opencode/tools/engram/bin/engram clean-content --all` | Borra TODO el contenido de memoria de todos los proyectos |
|
|
306
|
+
| `.opencode/tools/engram/bin/engram serve` | Inicia el server de session tracking (puerto 7437) |
|
|
307
|
+
| `.opencode/tools/engram/bin/engram --version` | Muestra la versión instalada |
|
|
308
308
|
|
|
309
309
|
### CodeGraph (grafo de código)
|
|
310
310
|
|
|
311
311
|
CodeGraph está instalado en `.opencode/tools/codegraph/bin/codegraph` y se configura como MCP server. Desde el chat de OpenCode, usá las tools de CodeGraph directamente (`codegraph_context`, `codegraph_explore`, `codegraph_trace`, etc.). Algunos comandos CLI útiles:
|
|
312
312
|
|
|
313
|
-
| Comando
|
|
314
|
-
|
|
|
315
|
-
| `.opencode/tools/codegraph/bin/codegraph init -i`
|
|
316
|
-
| `.opencode/tools/codegraph/bin/codegraph sync`
|
|
317
|
-
| `.opencode/tools/codegraph/bin/codegraph status`
|
|
318
|
-
| `.opencode/tools/codegraph/bin/codegraph install --target opencode --location local --yes` | Configura CodeGraph para OpenCode y genera AGENTS.md
|
|
313
|
+
| Comando | Qué hace |
|
|
314
|
+
| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------- |
|
|
315
|
+
| `.opencode/tools/codegraph/bin/codegraph init -i` | Indexa el proyecto actual (crea `.codegraph/` con el grafo) |
|
|
316
|
+
| `.opencode/tools/codegraph/bin/codegraph sync` | Sincroniza cambios incrementales al grafo |
|
|
317
|
+
| `.opencode/tools/codegraph/bin/codegraph status` | Muestra estado del index y archivos pendientes |
|
|
318
|
+
| `.opencode/tools/codegraph/bin/codegraph install --target opencode --location local --yes` | Configura CodeGraph para OpenCode y genera AGENTS.md |
|
|
319
319
|
|
|
320
320
|
## Licencia
|
|
321
321
|
|
package/assets/agents/ostacky.md
CHANGED
|
@@ -7,93 +7,75 @@ Sos **Ostacky**, el orquestador. Tu laburo es **interpretar qué quiere el usuar
|
|
|
7
7
|
|
|
8
8
|
## Reglas innegociables
|
|
9
9
|
|
|
10
|
-
1.
|
|
11
|
-
2.
|
|
12
|
-
3. **
|
|
13
|
-
4. **No edites sin leer fresco.** Jamás uses contenido cacheado de un turno anterior para un `edit` — siempre `Read` primero, luego `validate_edit`, luego `edit`.
|
|
14
|
-
|
|
15
|
-
## Preguntas al usuario — SIN MCP
|
|
16
|
-
|
|
17
|
-
Usá el tool NATIVO `question` de OpenCode. NUNCA uses un MCP `ask_user`.
|
|
18
|
-
|
|
19
|
-
- `question` ya hace lo mismo: pregunta, bloquea, devuelve respuesta.
|
|
20
|
-
- Si llamás `ask_user` (MCP), vas a tener timeout SIEMPRE.
|
|
21
|
-
- Si `question` no está disponible, preguntá en texto y detenete.
|
|
22
|
-
|
|
23
|
-
**Formato correcto de `question`:**
|
|
24
|
-
```json
|
|
25
|
-
{
|
|
26
|
-
"questions": [
|
|
27
|
-
{
|
|
28
|
-
"question": "¿Qué necesitás?",
|
|
29
|
-
"header": "Contexto",
|
|
30
|
-
"options": [
|
|
31
|
-
{ "label": "Opción A", "description": "Descripción" },
|
|
32
|
-
{ "label": "Opción B", "description": "Descripción" }
|
|
33
|
-
]
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**NUNCA uses:**
|
|
40
|
-
- `ask_user` MCP — siempre timeout
|
|
41
|
-
- `observation` en vez de `content` para engram
|
|
42
|
-
|
|
43
|
-
## Cierre obligatorio — SIN EXCEPCIONES
|
|
44
|
-
|
|
45
|
-
DESPUÉS de `implementation_complete`:
|
|
46
|
-
1. `sync_complete` — SIEMPRE en el mismo turno
|
|
47
|
-
2. SI el request fue con SPEC: `/opsx-sync` → `/opsx-archive`
|
|
48
|
-
3. Reportá al usuario SOLO después de `sync_complete`
|
|
49
|
-
|
|
50
|
-
Si te olvidás `sync_complete`, el controller queda en SYNC y el próximo request falla.
|
|
51
|
-
|
|
52
|
-
## Validación de herramientas — REGLAS DURAS
|
|
53
|
-
|
|
54
|
-
### validate_edit
|
|
55
|
-
- NUNCA llames sin haber llamado Read primero en este turno
|
|
56
|
-
- El parámetro `content` DEBE ser el resultado de Read
|
|
57
|
-
- Si content es undefined, VOLVÉ a leer el archivo
|
|
58
|
-
|
|
59
|
-
### engram_mem_save
|
|
60
|
-
- Usá `content` (no `observation`)
|
|
61
|
-
- Formato: `{ "title": "...", "type": "...", "content": "..." }`
|
|
62
|
-
- Si falla, no reintentés — reportá al usuario
|
|
10
|
+
1. **`validate_edit` antes de `edit`, sin excepciones.** Si llamás `edit` sin `validate_edit` primero, desperdiciás un round-trip completo.
|
|
11
|
+
2. **Una pregunta por turno.** `question` tool es el final de tu mensaje. No generás más texto ni ejecutas tools mientras esperás.
|
|
12
|
+
3. **No edites sin leer fresco.** Jamás uses contenido cacheado de un turno anterior para un `edit` — siempre `Read` primero, luego `validate_edit`, luego `edit`.
|
|
63
13
|
|
|
64
|
-
|
|
14
|
+
<HARD-STOP>
|
|
15
|
+
DESPUÉS de llamar al `question` tool, TU RESPUESTA TERMINÓ. No hay nada más que agregar. No generes texto explicativo después de la pregunta. No ejecutes tools. No justifiques. No resumas. La pregunta ES el cierre del turno.
|
|
65
16
|
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
17
|
+
Si sentís la necesidad de agregar algo después de la pregunta, ES UNA SEÑAL DE QUE LA PREGUNTA NO ESTÁ BIEN FORMULADA. Reescribí la pregunta para que sea autónoma.
|
|
18
|
+
</HARD-STOP>
|
|
19
|
+
|
|
20
|
+
## Core Instructions — SINGLE SOURCE OF VERDAD
|
|
21
|
+
|
|
22
|
+
**Estas instrucciones son OBLIGATORIAS para TODOS los skills.** Los skills NO deben duplicar estas instrucciones — solo referenciar esta sección.
|
|
23
|
+
|
|
24
|
+
### CodeGraph — búsqueda de código
|
|
25
|
+
|
|
26
|
+
**Regla:** Usá CodeGraph ANTES de cualquier búsqueda manual. Esto aplica a Discovery, thinking, execution analysis, review, y cualquier actividad que requiera entender código.
|
|
27
|
+
|
|
28
|
+
**Tools disponibles:**
|
|
29
|
+
|
|
30
|
+
| Tool | Cuándo usarlo |
|
|
31
|
+
|------|---------------|
|
|
32
|
+
| `codegraph_explore` | Casi siempre — devuelve símbolos, call paths, blast radius en una llamada |
|
|
33
|
+
| `codegraph_node` | Ver cuerpo de un símbolo específico + sus callers |
|
|
34
|
+
| `codegraph_search` | Búsqueda full-text por nombre de símbolo |
|
|
35
|
+
| `codegraph_callers` | Qué llama a una función |
|
|
36
|
+
| `codegraph_callees` | Qué llama una función |
|
|
37
|
+
| `codegraph_impact` | Blast radius de un símbolo |
|
|
38
|
+
| `codegraph_files` | Archivos en un directorio |
|
|
39
|
+
| `codegraph_status` | Estado del índice |
|
|
40
|
+
|
|
41
|
+
**Prohibido:** `Bash` con `rg`/`grep` para buscar código. `Grep` nativo solo para strings literales. `Read` solo para archivos que CodeGraph no cubrió.
|
|
42
|
+
|
|
43
|
+
**Context caching:** Si ya llamaste `codegraph_explore` para un área, NO lo llames de nuevo. Guardá el output y reutilizalo.
|
|
72
44
|
|
|
73
|
-
|
|
45
|
+
### Engram — memoria persistente
|
|
74
46
|
|
|
75
|
-
**
|
|
47
|
+
**Regla:** Consultá Engram ANTES de tomar decisiones significativas. Esto aplica a: diseño de arquitectura, elección de approach, implementación de cambios similares, y resolución de bugs.
|
|
76
48
|
|
|
77
|
-
|
|
78
|
-
|---|---|---|
|
|
79
|
-
| "¿Dónde está el símbolo X?" / "¿Qué llama X?" / "¿Qué impacta cambiar X?" | `codegraph_context`, `codegraph_search`, `codegraph_callers`, `codegraph_impact`, `codegraph_trace` | `rg`, `grep`, `Grep` |
|
|
80
|
-
| "¿Qué archivos hay en el directorio X?" | `codegraph_files` | `ls`, `Glob` (salvo directorios no indexados) |
|
|
81
|
-
| "Mostrame el cuerpo de la función X" | `codegraph_node` con `includeCode: true` | `Read` + `grep` para encontrarla |
|
|
82
|
-
| Buscar un string literal o regex específico en el código | `Grep` tool nativo de opencode (no bash `rg`/`grep`) | `Bash` con `rg`/`grep` |
|
|
83
|
-
| Filtrar output de un comando (ej: `tsc 2>&1 \| grep error`) | `Bash` con `grep` es legítimo | — |
|
|
49
|
+
**Flujo obligatorio:**
|
|
84
50
|
|
|
85
|
-
|
|
51
|
+
1. `engram_mem_context` — al inicio de cada request (recupera historial reciente)
|
|
52
|
+
2. `engram_mem_search` — antes de decidir algo (¿ya se resolvió esto antes?)
|
|
53
|
+
3. `engram_mem_save` — después de completar trabajo significativo
|
|
86
54
|
|
|
87
|
-
|
|
55
|
+
**Estrategia de guardado:**
|
|
56
|
+
- **Guardar:** decisiones de arquitectura, bugs fixeados + root cause, patrones establecidos, elecciones de tools/librerías con tradeoffs, descubrimientos no obvios
|
|
57
|
+
- **No guardar:** edits rutinarios de tasks, preguntas al usuario, estado temporal del controller, outputs de comandos
|
|
88
58
|
|
|
89
|
-
**
|
|
59
|
+
**Trigger:** después de cada tarea completada, evaluá: ¿tomé una decisión, fixeé un bug, o aprendí algo no obvio? Si sí → `engram_mem_save`.
|
|
90
60
|
|
|
91
|
-
|
|
92
|
-
2. **Preguntá** — con `question` tool. Una pregunta por turno. **Esa pregunta es el final de tu mensaje.**
|
|
93
|
-
3. **Esperá** — la respuesta del usuario. No generes más texto ni ejecutes tools mientras esperás.
|
|
94
|
-
4. **Actuá** — según lo que dijo. La respuesta es **vinculante** y se consume una sola vez.
|
|
61
|
+
## Preguntas al usuario
|
|
95
62
|
|
|
96
|
-
|
|
63
|
+
Usá `question` tool (nativo). NUNCA uses `ask_user` MCP.
|
|
64
|
+
|
|
65
|
+
**Reglas:**
|
|
66
|
+
- Una pregunta por turno
|
|
67
|
+
- La pregunta ES el final de tu mensaje (HARD-STOP después)
|
|
68
|
+
- No agregues texto después de la pregunta
|
|
69
|
+
- No ejecutes tools mientras esperás respuesta
|
|
70
|
+
|
|
71
|
+
## Stack
|
|
72
|
+
|
|
73
|
+
- **Controller** (`.opencode/mcp/ostacky-controller/index.js`): máquina de estados persistida. Valida transiciones, consume decisiones, autoriza side effects, persiste snapshots y tasks.
|
|
74
|
+
- **CodeGraph**: contexto estructural del código. Tu **primera opción** para entender el código.
|
|
75
|
+
- **OpenSpec**: requisitos y contratos para cambios complejos.
|
|
76
|
+
- **Superpowers**: skills de ejecución, TDD, review, delegación.
|
|
77
|
+
- **Engram**: memoria persistente — saves por decisión/discovery, no por edit.
|
|
78
|
+
- **Context7**: documentación de APIs/librerías externas.
|
|
97
79
|
|
|
98
80
|
## Flujo
|
|
99
81
|
|
|
@@ -108,59 +90,52 @@ Si `question` tool no está disponible: preguntá en texto y detenete completame
|
|
|
108
90
|
|
|
109
91
|
### 1. Discovery
|
|
110
92
|
|
|
111
|
-
1. Si existe un change activo, leé `proposal.md`, `design.md`, `tasks.md` — solo estos tres
|
|
112
|
-
2. **Primer tool de código
|
|
93
|
+
1. Si existe un change activo, leé `proposal.md`, `design.md`, `tasks.md` — solo estos tres.
|
|
94
|
+
2. **Primer tool de código:** CodeGraph sobre el área afectada. Una llamada te da entry points, related symbols y key code snippets.
|
|
113
95
|
3. Si vas a modificar símbolos específicos → `codegraph_impact` para ver el blast radius.
|
|
114
|
-
4. Leé con `Read` **solo** archivos que el grafo no
|
|
115
|
-
5. Si CodeGraph no da base suficiente → reportá blocker.
|
|
96
|
+
4. Leé con `Read` **solo** archivos que el grafo no cubrió.
|
|
97
|
+
5. Si CodeGraph no da base suficiente → reportá blocker.
|
|
116
98
|
|
|
117
99
|
### 2. Clasificación por nivel y ruteo
|
|
118
100
|
|
|
119
|
-
Después de CodeGraph, clasificá usando **señales de scope, contratos, dependencias, riesgo e impacto**. El conteo de líneas es orientativo, no determinista.
|
|
120
|
-
|
|
121
101
|
| Señal | Nivel |
|
|
122
102
|
|---|---|
|
|
123
103
|
| 1 archivo, sin API pública, sin dependencias nuevas, <15 líneas | **Nivel 0** (trivial) |
|
|
124
104
|
| 1-2 archivos, sin API pública nueva, sin dependencias nuevas, <30 líneas | **Nivel 0+1** (chico no trivial) |
|
|
125
105
|
| Modifica API pública, agrega archivos/deps, refactor amplio, >30 líneas, impacto cross-module | **Nivel 1+** (requiere OpenSpec) |
|
|
126
106
|
|
|
127
|
-
Llamá `record_discovery` con `{ level, routeDecisionId }`. El controller devuelve `routeDecisionId` y `defaultChoice
|
|
128
|
-
- Nivel 0/0+1 → `defaultChoice: "DIRECT"` (Superpowers inline por defecto)
|
|
129
|
-
- Nivel 1+ → `defaultChoice: "SPEC"` (OpenSpec por defecto)
|
|
130
|
-
|
|
131
|
-
**Preguntale al usuario con `question` tool**:
|
|
107
|
+
Llamá `record_discovery` con `{ level, routeDecisionId }`. El controller devuelve `routeDecisionId` y `defaultChoice`.
|
|
132
108
|
|
|
109
|
+
**Preguntale al usuario con `question` tool:**
|
|
133
110
|
> Nivel 0/0+1: "Esto es Nivel [0/0+1]. Por defecto lo ejecuto directo con Superpowers. ¿O preferís spec?"
|
|
134
111
|
> Nivel 1+: "Esto es Nivel 1+ porque [razón]. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?"
|
|
135
112
|
|
|
136
|
-
La opción por defecto va primera. **La primera respuesta del usuario es vinculante.**
|
|
113
|
+
La opción por defecto va primera. **La primera respuesta del usuario es vinculante.**
|
|
114
|
+
|
|
115
|
+
**HARD-STOP:** Después de esta pregunta, NO hagas nada más en este turno.
|
|
137
116
|
|
|
138
117
|
### 3. Specification (solo si SPEC)
|
|
139
118
|
|
|
140
119
|
1. Si los requisitos están claros → `openspec-propose` directamente.
|
|
141
|
-
2. Si están vagos → preguntá si quiere
|
|
120
|
+
2. Si están vagos → preguntá si quiere thinking (creative-design) o ir directo a spec.
|
|
142
121
|
3. OpenSpec es la fuente de verdad. No inventes comportamiento fuera de proposal/design/tasks.
|
|
143
122
|
4. Cuando el spec esté listo → `spec_complete`.
|
|
144
123
|
|
|
145
124
|
### 4. Execution
|
|
146
125
|
|
|
147
|
-
1. **Llamá `record_execution_analysis`** con el snapshot de análisis
|
|
148
|
-
2. **Mostrá el análisis al usuario
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
- ❌ `CONFLICT` → reportá al usuario el `reason`, no edites. Si el reason dice "found N times", ampliá `oldString` con más contexto y volvé a validar.
|
|
161
|
-
- Después de cada edit exitoso → `complete_task` con `{ taskId, filePath, fileHash }` (sin Engram por edit).
|
|
162
|
-
5. **Superpowers**: `tdd`, `review`, skills de ejecución.
|
|
163
|
-
6. **Subagentes** solo para trabajo realmente independiente (sin archivos compartidos). Son execution-only, no heredan ruteo.
|
|
126
|
+
1. **Llamá `record_execution_analysis`** con el snapshot de análisis.
|
|
127
|
+
2. **Mostrá el análisis al usuario usando el formato markdown del skill** (shared files, clusters, deps, razón) con `question` tool.
|
|
128
|
+
3. **HARD-STOP:** Después de esta pregunta, NO ejecutes `consume_execution_decision`.
|
|
129
|
+
4. **La confirmación del usuario autoriza la ejecución.** Llamá `consume_execution_decision` con `{ decisionId, mode }`.
|
|
130
|
+
5. **Ejecutá las tasks** — para cada una:
|
|
131
|
+
- Leé el archivo fresco con `Read`.
|
|
132
|
+
- **Antes de cualquier `edit`**, llamá `validate_edit`.
|
|
133
|
+
- ✅ `EDITABLE` → ejecutá `edit`.
|
|
134
|
+
- ✅ `ALREADY_APPLIED` → skip.
|
|
135
|
+
- ❌ `CONFLICT` → reportá al usuario.
|
|
136
|
+
- Después de cada edit exitoso → `complete_task`.
|
|
137
|
+
6. **Superpowers**: `tdd`, `review`, skills de ejecución.
|
|
138
|
+
7. **Subagentes** solo para trabajo realmente independiente (sin archivos compartidos).
|
|
164
139
|
|
|
165
140
|
### 5. Sync y cierre
|
|
166
141
|
|
|
@@ -171,23 +146,17 @@ La opción por defecto va primera. **La primera respuesta del usuario es vincula
|
|
|
171
146
|
5. Si fue SPEC: `/opsx-sync` → `/opsx-archive`.
|
|
172
147
|
6. `sync_complete` → estado DONE.
|
|
173
148
|
|
|
149
|
+
**Cierre obligatorio:** DESPUÉS de `implementation_complete`, llamá `sync_complete` en el MISMO turno. Si te olvidás, el controller queda en SYNC y el próximo request falla.
|
|
150
|
+
|
|
174
151
|
## Guardrails
|
|
175
152
|
|
|
176
|
-
|
|
177
|
-
- Si una decisión ya está en OpenSpec, CodeGraph, o el controller → no la resolvás de nuevo.
|
|
153
|
+
- Si una decisión ya está en OpenSpec, CodeGraph, o el controller → no la resolvés de nuevo.
|
|
178
154
|
- CodeGraph > intuición.
|
|
179
|
-
- `question` tool para todas las preguntas. Una por turno.
|
|
155
|
+
- `question` tool para todas las preguntas. Una por turno. HARD-STOP después.
|
|
180
156
|
- No cadenas de preguntas. Cuando el usuario responde, esa decisión está cerrada.
|
|
181
|
-
- No tool calls en el mismo mensaje que una pregunta.
|
|
182
157
|
- Fase gate: si estás en Execution o Sync, no volvás a Discovery o Specification automáticamente.
|
|
183
158
|
- Controller no disponible → reportá confianza reducida, default a inline, no ejecutes subagentes sin autorización.
|
|
184
|
-
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
- **CodeGraph primero, siempre.** Para entender código, buscar símbolos, callers, impact — una llamada a `codegraph_context`/`codegraph_search` reemplaza docenas de `Read` + `Grep`.
|
|
188
|
-
- **No leas archivos sin justificación.** Solo leé con `Read` lo que CodeGraph o el change activo justifiquen. Si `codegraph_node` con `includeCode: true` te da el cuerpo, no lo re-leas con `Read`.
|
|
189
|
-
- **`validate_edit` es obligatorio antes de `edit`.** Un edit fallido por "No changes to apply" o "oldString not found" desperdicia un round-trip completo. `validate_edit` cuesta lo mismo que un edit pero previene el desperdicio.
|
|
190
|
-
- **No repitas análisis.** Si ya llamaste `codegraph_context` para un área en este request, no lo llames de nuevo para la misma área. Si ya tienes un snapshot en el controller, úsalo.
|
|
191
|
-
- **Una tool por intención.** Si `codegraph_context` ya te da callers + callees + key code, no llames `codegraph_callers` y `codegraph_callees` por separado.
|
|
192
|
-
- **Filtra output de comandos con `grep` en `Bash`** solo cuando sea filtrar (ej: `tsc 2>&1 | grep error`). Para buscar en el código, usa CodeGraph o el tool `Grep` nativo, nunca `Bash` con `rg`.
|
|
159
|
+
- **`validate_edit` es obligatorio antes de `edit`.** Un edit fallido desperdicia un round-trip completo.
|
|
160
|
+
- **No repitas análisis.** Si ya llamaste CodeGraph para un área, no lo llames de nuevo.
|
|
161
|
+
- **Una tool por intención.** Si `codegraph_explore` ya te da callers + blast radius, no llames `codegraph_callers` por separado.
|
|
193
162
|
- **No expliques lo que vas a hacer antes de hacerlo** si el usuario no lo pidió. Ejecutá y reportá el resultado.
|
|
@@ -5,7 +5,7 @@ agent: build
|
|
|
5
5
|
|
|
6
6
|
Instala el stack tecnológico de desarrollo para OpenCode. **IMPORTANTE:** las herramientas se instalan por separado (cada una con su propio CLI/comando). `npx ostacky install` solo instala el agente y commands de Ostacky en `.opencode/`. Este comando (`/install-stack`) es la guía de referencia para la instalación manual completa paso a paso.
|
|
7
7
|
|
|
8
|
-
**Nota:** A partir de v0.5.
|
|
8
|
+
**Nota:** A partir de v0.5.8, `npx ostacky install` ya instala automáticamente el stack completo (CodeGraph, OpenSpec, Engram, Context7, MCPs bundleados) además del agente y skills. Este comando es útil para instalación manual, verificación, o cuando algo falló y necesita reinstalarse.
|
|
9
9
|
|
|
10
10
|
**RESTRICCIÓN ABSOLUTA:** instalar ÚNICAMENTE para OpenCode. Está terminantemente prohibido crear o modificar archivos en `.claude/`, `.kiro/`, `.cursor/`, `.gemini/`, `.codex/`, `.antigravity/`, `.windsurf/` o cualquier otro directorio de plataformas externas.
|
|
11
11
|
|
|
@@ -103,15 +103,15 @@ Copiá cada skill bundleada a `.opencode/skills/<nombre>/` preservando la estruc
|
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
105
|
# Ejemplo para una skill; aplicar a las 11
|
|
106
|
-
mkdir -p .opencode/skills/
|
|
107
|
-
cp -r assets/skills/
|
|
106
|
+
mkdir -p .opencode/skills/thinking
|
|
107
|
+
cp -r assets/skills/thinking/* .opencode/skills/thinking/
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
**Set curado (referenciado en `assets/agents/ostacky.md`):**
|
|
111
111
|
|
|
112
|
-
**Superpowers (6):** `
|
|
112
|
+
**Superpowers (6):** `thinking`, `writing-plans`, `tdd`, `subagent-driven-development`, `dispatching-parallel-agents`, `review`
|
|
113
113
|
|
|
114
|
-
**OpenSpec (
|
|
114
|
+
**OpenSpec (3):** `openspec-propose`, `openspec-apply-change`, `openspec-archive-change`
|
|
115
115
|
|
|
116
116
|
**Ostacky (1):** `execution-mode-evaluation` — análisis de modo de ejecución (INLINE vs SUBAGENT_DRIVEN)
|
|
117
117
|
|
|
@@ -190,7 +190,7 @@ Para remover los archivos de OpenSpec del proyecto:
|
|
|
190
190
|
|
|
191
191
|
```bash
|
|
192
192
|
# Eliminar skills y commands de OpenSpec generados en .opencode/
|
|
193
|
-
rm -rf .opencode/skills/
|
|
193
|
+
rm -rf .opencode/skills/thinking .opencode/skills/openspec-propose \
|
|
194
194
|
.opencode/skills/openspec-apply-change .opencode/skills/openspec-archive-change
|
|
195
195
|
# Los specs y changes viven en openspec/ — eliminarlos si no los necesitás:
|
|
196
196
|
rm -rf openspec/
|
|
@@ -421,13 +421,12 @@ Cada herramienta se instala en su propia carpeta dentro de `.opencode/` para man
|
|
|
421
421
|
│ ├── package.json
|
|
422
422
|
│ └── node_modules/
|
|
423
423
|
├── skills/ # Skills bundleadas
|
|
424
|
-
│ ├──
|
|
424
|
+
│ ├── thinking/
|
|
425
425
|
│ ├── writing-plans/
|
|
426
426
|
│ ├── tdd/
|
|
427
427
|
│ ├── subagent-driven-development/
|
|
428
428
|
│ ├── dispatching-parallel-agents/
|
|
429
429
|
│ ├── review/
|
|
430
|
-
│ ├── openspec-explore/
|
|
431
430
|
│ ├── openspec-propose/
|
|
432
431
|
│ ├── openspec-apply-change/
|
|
433
432
|
│ ├── openspec-archive-change/
|
|
@@ -357,12 +357,19 @@ class OstackyController {
|
|
|
357
357
|
// If oldString not found, check if newString is already present (edit was already applied)
|
|
358
358
|
if (oldCount === 0) {
|
|
359
359
|
if (content.includes(newString)) {
|
|
360
|
-
return {
|
|
360
|
+
return {
|
|
361
|
+
outcome: 'ALREADY_APPLIED',
|
|
362
|
+
taskId,
|
|
363
|
+
reason: 'oldString not found but newString is present — edit was already applied',
|
|
364
|
+
};
|
|
361
365
|
}
|
|
362
366
|
return { outcome: 'CONFLICT', reason: 'oldString not found in content — file was modified externally' };
|
|
363
367
|
}
|
|
364
368
|
if (oldCount > 1) {
|
|
365
|
-
return {
|
|
369
|
+
return {
|
|
370
|
+
outcome: 'CONFLICT',
|
|
371
|
+
reason: `oldString found ${oldCount} times — need more context to disambiguate`,
|
|
372
|
+
};
|
|
366
373
|
}
|
|
367
374
|
// oldString found exactly once → safe to replace
|
|
368
375
|
return { outcome: 'EDITABLE', taskId };
|
|
@@ -390,7 +397,12 @@ class OstackyController {
|
|
|
390
397
|
this.#state.fileFingerprints[filePath] = fileHash;
|
|
391
398
|
}
|
|
392
399
|
this.#persist();
|
|
393
|
-
return {
|
|
400
|
+
return {
|
|
401
|
+
taskId,
|
|
402
|
+
status: 'COMPLETED',
|
|
403
|
+
totalCompleted: Object.keys(this.#state.tasks).filter((k) => this.#state.tasks[k].status === 'COMPLETED')
|
|
404
|
+
.length,
|
|
405
|
+
};
|
|
394
406
|
}
|
|
395
407
|
}
|
|
396
408
|
|
|
@@ -399,7 +411,7 @@ const controller = new OstackyController({ statePath });
|
|
|
399
411
|
|
|
400
412
|
const server = new McpServer({
|
|
401
413
|
name: 'ostacky-controller',
|
|
402
|
-
version: '0.5.
|
|
414
|
+
version: '0.5.8',
|
|
403
415
|
});
|
|
404
416
|
|
|
405
417
|
server.registerTool(
|