ostacky 0.5.6 → 0.5.7
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 +76 -50
- package/dist/mcp/ostacky-controller/index.js +15 -4
- package/manifest.json +58 -44
- 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
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Ostacky Configuration Validation Test
|
|
3
|
+
# Validates that all required files exist and references are correct
|
|
4
|
+
|
|
5
|
+
ASSETS_DIR="assets"
|
|
6
|
+
SKILLS_DIR="$ASSETS_DIR/skills"
|
|
7
|
+
AGENTS_DIR="$ASSETS_DIR/agents"
|
|
8
|
+
COMMANDS_DIR="$ASSETS_DIR/commands"
|
|
9
|
+
MCP_DIR="$ASSETS_DIR/mcp"
|
|
10
|
+
|
|
11
|
+
PASS=0
|
|
12
|
+
FAIL=0
|
|
13
|
+
WARN=0
|
|
14
|
+
|
|
15
|
+
pass() { echo " ✅ $1"; PASS=$((PASS + 1)); }
|
|
16
|
+
fail() { echo " ❌ $1"; FAIL=$((FAIL + 1)); }
|
|
17
|
+
warn() { echo " ⚠️ $1"; WARN=$((WARN + 1)); }
|
|
18
|
+
|
|
19
|
+
echo "═══════════════════════════════════════════════════════════"
|
|
20
|
+
echo " Ostacky Configuration Validation Test"
|
|
21
|
+
echo "═══════════════════════════════════════════════════════════"
|
|
22
|
+
echo ""
|
|
23
|
+
|
|
24
|
+
# ─── 1. Agent file exists ─────────────────────────────────────────────────────
|
|
25
|
+
echo "1. Agent file"
|
|
26
|
+
if [ -f "$AGENTS_DIR/ostacky.md" ]; then
|
|
27
|
+
pass "ostacky.md exists"
|
|
28
|
+
else
|
|
29
|
+
fail "ostacky.md not found"
|
|
30
|
+
fi
|
|
31
|
+
echo ""
|
|
32
|
+
|
|
33
|
+
# ─── 2. Core Instructions section exists ───────────────────────────────────────
|
|
34
|
+
echo "2. Core Instructions in ostacky.md"
|
|
35
|
+
if grep -q "Core Instructions" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
36
|
+
pass "Core Instructions section found"
|
|
37
|
+
else
|
|
38
|
+
fail "Core Instructions section missing"
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if grep -q "SINGLE SOURCE OF VERDAD" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
42
|
+
pass "Single source of truth marker found"
|
|
43
|
+
else
|
|
44
|
+
fail "Single source of truth marker missing"
|
|
45
|
+
fi
|
|
46
|
+
echo ""
|
|
47
|
+
|
|
48
|
+
# ─── 3. Required skills exist ─────────────────────────────────────────────────
|
|
49
|
+
echo "3. Required skills"
|
|
50
|
+
REQUIRED_SKILLS=(
|
|
51
|
+
"thinking"
|
|
52
|
+
"writing-plans"
|
|
53
|
+
"tdd"
|
|
54
|
+
"subagent-driven-development"
|
|
55
|
+
"dispatching-parallel-agents"
|
|
56
|
+
"review"
|
|
57
|
+
"openspec-propose"
|
|
58
|
+
"openspec-apply-change"
|
|
59
|
+
"openspec-archive-change"
|
|
60
|
+
"execution-mode-evaluation"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
for skill in "${REQUIRED_SKILLS[@]}"; do
|
|
64
|
+
if [ -d "$SKILLS_DIR/$skill" ] && [ -f "$SKILLS_DIR/$skill/SKILL.md" ]; then
|
|
65
|
+
pass "skill: $skill"
|
|
66
|
+
else
|
|
67
|
+
fail "skill: $skill (missing)"
|
|
68
|
+
fi
|
|
69
|
+
done
|
|
70
|
+
echo ""
|
|
71
|
+
|
|
72
|
+
# ─── 4. Deprecated skills removed ─────────────────────────────────────────────
|
|
73
|
+
echo "4. Deprecated skills removed"
|
|
74
|
+
DEPRECATED_SKILLS=("brainstorming" "openspec-explore")
|
|
75
|
+
|
|
76
|
+
for skill in "${DEPRECATED_SKILLS[@]}"; do
|
|
77
|
+
if [ -d "$SKILLS_DIR/$skill" ]; then
|
|
78
|
+
fail "deprecated skill still exists: $skill"
|
|
79
|
+
else
|
|
80
|
+
pass "deprecated skill removed: $skill"
|
|
81
|
+
fi
|
|
82
|
+
done
|
|
83
|
+
echo ""
|
|
84
|
+
|
|
85
|
+
# ─── 5. No references to deprecated skills ────────────────────────────────────
|
|
86
|
+
echo "5. No references to deprecated skills in source"
|
|
87
|
+
for skill in "${DEPRECATED_SKILLS[@]}"; do
|
|
88
|
+
REFS=$(grep -r "$skill" "$ASSETS_DIR" --include="*.md" 2>/dev/null | grep -v "Binary file" | wc -l)
|
|
89
|
+
if [ "$REFS" -eq 0 ]; then
|
|
90
|
+
pass "no references to: $skill"
|
|
91
|
+
else
|
|
92
|
+
fail "found $REFS references to deprecated skill: $skill"
|
|
93
|
+
grep -r "$skill" "$ASSETS_DIR" --include="*.md" 2>/dev/null | grep -v "Binary file" | head -5
|
|
94
|
+
fi
|
|
95
|
+
done
|
|
96
|
+
echo ""
|
|
97
|
+
|
|
98
|
+
# ─── 6. thinking skill has both modes ─────────────────────────────────────────
|
|
99
|
+
echo "6. thinking skill modes"
|
|
100
|
+
THINKING_SKILL="$SKILLS_DIR/thinking/SKILL.md"
|
|
101
|
+
|
|
102
|
+
if grep -q "creative-design" "$THINKING_SKILL" 2>/dev/null; then
|
|
103
|
+
pass "creative-design mode found"
|
|
104
|
+
else
|
|
105
|
+
fail "creative-design mode missing"
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
if grep -q "open-explore" "$THINKING_SKILL" 2>/dev/null; then
|
|
109
|
+
pass "open-explore mode found"
|
|
110
|
+
else
|
|
111
|
+
fail "open-explore mode missing"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
if grep -q "Mode Detection" "$THINKING_SKILL" 2>/dev/null; then
|
|
115
|
+
pass "mode detection logic found"
|
|
116
|
+
else
|
|
117
|
+
fail "mode detection logic missing"
|
|
118
|
+
fi
|
|
119
|
+
echo ""
|
|
120
|
+
|
|
121
|
+
# ─── 7. thinking skill has Transition Rules ───────────────────────────────────
|
|
122
|
+
echo "7. thinking skill transitions"
|
|
123
|
+
if grep -q "Transition Rules" "$THINKING_SKILL" 2>/dev/null; then
|
|
124
|
+
pass "Transition Rules section found"
|
|
125
|
+
else
|
|
126
|
+
fail "Transition Rules section missing"
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
if grep -q "openspec-propose" "$THINKING_SKILL" 2>/dev/null; then
|
|
130
|
+
pass "transition to openspec-propose found"
|
|
131
|
+
else
|
|
132
|
+
fail "transition to openspec-propose missing"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
if grep -q "writing-plans" "$THINKING_SKILL" 2>/dev/null; then
|
|
136
|
+
pass "transition to writing-plans found"
|
|
137
|
+
else
|
|
138
|
+
fail "transition to writing-plans missing"
|
|
139
|
+
fi
|
|
140
|
+
echo ""
|
|
141
|
+
|
|
142
|
+
# ─── 8. thinking skill references Core Instructions ───────────────────────────
|
|
143
|
+
echo "8. thinking skill follows Core Instructions"
|
|
144
|
+
if grep -q "Core Instructions" "$THINKING_SKILL" 2>/dev/null; then
|
|
145
|
+
pass "references Core Instructions"
|
|
146
|
+
else
|
|
147
|
+
fail "does not reference Core Instructions"
|
|
148
|
+
fi
|
|
149
|
+
echo ""
|
|
150
|
+
|
|
151
|
+
# ─── 9. Other skills reference Core Instructions ─────────────────────────────
|
|
152
|
+
echo "9. Other skills follow Core Instructions"
|
|
153
|
+
SKILLS_WITH_CORE_REFS=("subagent-driven-development" "review" "writing-plans")
|
|
154
|
+
|
|
155
|
+
for skill in "${SKILLS_WITH_CORE_REFS[@]}"; do
|
|
156
|
+
SKILL_FILE="$SKILLS_DIR/$skill/SKILL.md"
|
|
157
|
+
if [ -f "$SKILL_FILE" ]; then
|
|
158
|
+
if grep -q "Core Instructions" "$SKILL_FILE" 2>/dev/null; then
|
|
159
|
+
pass "$skill references Core Instructions"
|
|
160
|
+
else
|
|
161
|
+
warn "$skill does not reference Core Instructions (may need update)"
|
|
162
|
+
fi
|
|
163
|
+
fi
|
|
164
|
+
done
|
|
165
|
+
echo ""
|
|
166
|
+
|
|
167
|
+
# ─── 10. Controller MCP exists ────────────────────────────────────────────────
|
|
168
|
+
echo "10. Controller MCP"
|
|
169
|
+
if [ -f "$MCP_DIR/ostacky-controller/index.js" ]; then
|
|
170
|
+
pass "ostacky-controller/index.js exists"
|
|
171
|
+
else
|
|
172
|
+
fail "ostacky-controller/index.js not found"
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
if grep -q "validate_edit" "$MCP_DIR/ostacky-controller/index.js" 2>/dev/null; then
|
|
176
|
+
pass "validate_edit tool registered"
|
|
177
|
+
else
|
|
178
|
+
fail "validate_edit tool missing"
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
if grep -q "complete_task" "$MCP_DIR/ostacky-controller/index.js" 2>/dev/null; then
|
|
182
|
+
pass "complete_task tool registered"
|
|
183
|
+
else
|
|
184
|
+
fail "complete_task tool missing"
|
|
185
|
+
fi
|
|
186
|
+
echo ""
|
|
187
|
+
|
|
188
|
+
# ─── 11. Commands exist ──────────────────────────────────────────────────────
|
|
189
|
+
echo "11. Commands"
|
|
190
|
+
if [ -f "$COMMANDS_DIR/install-stack.md" ]; then
|
|
191
|
+
pass "install-stack.md exists"
|
|
192
|
+
else
|
|
193
|
+
fail "install-stack.md not found"
|
|
194
|
+
fi
|
|
195
|
+
|
|
196
|
+
if [ -f "$COMMANDS_DIR/opsx-sync.md" ]; then
|
|
197
|
+
pass "opsx-sync.md exists"
|
|
198
|
+
else
|
|
199
|
+
fail "opsx-sync.md not found"
|
|
200
|
+
fi
|
|
201
|
+
echo ""
|
|
202
|
+
|
|
203
|
+
# ─── 12. Classification rules in ostacky.md ──────────────────────────────────
|
|
204
|
+
echo "12. Classification rules"
|
|
205
|
+
if grep -q "Nivel 0" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
206
|
+
pass "Level 0 classification found"
|
|
207
|
+
else
|
|
208
|
+
fail "Level 0 classification missing"
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
if grep -q "Nivel 0+1" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
212
|
+
pass "Level 0+1 classification found"
|
|
213
|
+
else
|
|
214
|
+
fail "Level 0+1 classification missing"
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
if grep -q "Nivel 1+" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
218
|
+
pass "Level 1+ classification found"
|
|
219
|
+
else
|
|
220
|
+
fail "Level 1+ classification missing"
|
|
221
|
+
fi
|
|
222
|
+
echo ""
|
|
223
|
+
|
|
224
|
+
# ─── 13. Specification flow references correct skills ────────────────────────
|
|
225
|
+
echo "13. Specification flow"
|
|
226
|
+
if grep -q "openspec-propose" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
227
|
+
pass "Specification phase references openspec-propose"
|
|
228
|
+
else
|
|
229
|
+
fail "Specification phase missing openspec-propose reference"
|
|
230
|
+
fi
|
|
231
|
+
|
|
232
|
+
if grep -q "thinking" "$AGENTS_DIR/ostacky.md" 2>/dev/null; then
|
|
233
|
+
pass "Specification phase references thinking"
|
|
234
|
+
else
|
|
235
|
+
fail "Specification phase missing thinking reference"
|
|
236
|
+
fi
|
|
237
|
+
echo ""
|
|
238
|
+
|
|
239
|
+
# ─── Summary ──────────────────────────────────────────────────────────────────
|
|
240
|
+
echo "═══════════════════════════════════════════════════════════"
|
|
241
|
+
echo " Summary"
|
|
242
|
+
echo "═══════════════════════════════════════════════════════════"
|
|
243
|
+
echo " ✅ Passed: $PASS"
|
|
244
|
+
echo " ❌ Failed: $FAIL"
|
|
245
|
+
echo " ⚠️ Warnings: $WARN"
|
|
246
|
+
echo ""
|
|
247
|
+
|
|
248
|
+
if [ "$FAIL" -eq 0 ]; then
|
|
249
|
+
echo " 🎉 All tests passed!"
|
|
250
|
+
exit 0
|
|
251
|
+
else
|
|
252
|
+
echo " 💥 Some tests failed."
|
|
253
|
+
exit 1
|
|
254
|
+
fi
|
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.5.
|
|
164
|
+
version: "0.5.7",
|
|
165
165
|
description: "Instalador interactivo de agentes y comandos para OpenCode",
|
|
166
166
|
type: "module",
|
|
167
167
|
bin: {
|
|
@@ -879,16 +879,16 @@ import { join as join5 } from "path";
|
|
|
879
879
|
import { existsSync as existsSync4 } from "fs";
|
|
880
880
|
// manifest.json
|
|
881
881
|
var manifest_default = {
|
|
882
|
-
version: "0.5.
|
|
882
|
+
version: "0.5.7",
|
|
883
883
|
repo: "JaimeHoracio/Ostacky",
|
|
884
|
-
tag: "v0.5.
|
|
884
|
+
tag: "v0.5.7",
|
|
885
885
|
agents: [
|
|
886
886
|
{
|
|
887
887
|
name: "ostacky",
|
|
888
888
|
file: "assets/agents/ostacky.md",
|
|
889
889
|
description: "Orquestador principal con ruteo por nivel de impacto, máquina de estados persistida (controller MCP), edición segura con 3 outcomes, y delegación en OpenSpec + Superpowers",
|
|
890
|
-
version: "0.5.
|
|
891
|
-
sha256: "
|
|
890
|
+
version: "0.5.7",
|
|
891
|
+
sha256: "eb3ab4cfcdedee63dd4aae05d748d34d9cfc3323bdc5f53f06848cfe3efd439f"
|
|
892
892
|
}
|
|
893
893
|
],
|
|
894
894
|
commands: [
|
|
@@ -896,14 +896,14 @@ var manifest_default = {
|
|
|
896
896
|
name: "install-stack",
|
|
897
897
|
file: "assets/commands/install-stack.md",
|
|
898
898
|
description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, Context7, controller MCP)",
|
|
899
|
-
version: "0.5.
|
|
900
|
-
sha256: "
|
|
899
|
+
version: "0.5.7",
|
|
900
|
+
sha256: "f8357678ae180fc9fda03be2e4f44a18ee4d7eedf138a6f9dbe22cc63bd2bc41"
|
|
901
901
|
},
|
|
902
902
|
{
|
|
903
903
|
name: "opsx-sync",
|
|
904
904
|
file: "assets/commands/opsx-sync.md",
|
|
905
905
|
description: "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
|
|
906
|
-
version: "0.5.
|
|
906
|
+
version: "0.5.7",
|
|
907
907
|
sha256: "ed9948f1910743b672e1dfad496bc96972a224a98b063232be39290d43068c50"
|
|
908
908
|
}
|
|
909
909
|
],
|
|
@@ -912,94 +912,108 @@ var manifest_default = {
|
|
|
912
912
|
name: "ostacky-controller",
|
|
913
913
|
file: "assets/mcp/ostacky-controller/",
|
|
914
914
|
description: "Máquina de estados persistida para Ostacky: 13 tools MCP para ciclo completo de request (start_request → discovery → route → execution → sync → done), edición segura con validación de transiciones y persistencia atómica",
|
|
915
|
-
version: "0.5.
|
|
916
|
-
sha256: "
|
|
915
|
+
version: "0.5.7",
|
|
916
|
+
sha256: "f457acabe9187fea9ea4a132d4a54e26021d1dc8a87469ba5815d8d3052336af"
|
|
917
917
|
}
|
|
918
918
|
],
|
|
919
919
|
skills: [
|
|
920
|
+
{
|
|
921
|
+
name: "thinking",
|
|
922
|
+
file: "assets/skills/thinking/SKILL.md",
|
|
923
|
+
description: "Skill unificado de pensamiento con dos modos: creative-design (producción de diseño → transición a writing-plans o openspec-propose) y open-exploration (exploración libre)",
|
|
924
|
+
version: "0.5.7",
|
|
925
|
+
sha256: "3801f3c964e3c4a64f54747d7a8b2e5c2c956c907ebc938b45d05c3b5ee6dfa4"
|
|
926
|
+
},
|
|
920
927
|
{
|
|
921
928
|
name: "execution-mode-evaluation",
|
|
922
929
|
file: "assets/skills/execution-mode-evaluation/SKILL.md",
|
|
923
930
|
description: "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
|
|
924
|
-
version: "0.5.
|
|
925
|
-
sha256: "
|
|
926
|
-
},
|
|
927
|
-
{
|
|
928
|
-
name: "brainstorming",
|
|
929
|
-
file: "assets/skills/brainstorming/SKILL.md",
|
|
930
|
-
description: "Skill de descubrimiento y exploración (Superpowers)",
|
|
931
|
-
version: "0.5.6",
|
|
932
|
-
sha256: "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
|
|
931
|
+
version: "0.5.7",
|
|
932
|
+
sha256: "0d791c514c1bde60ac3a2b02e75fdebf36230e46c30d76d5f1c32aefad82463f"
|
|
933
933
|
},
|
|
934
934
|
{
|
|
935
935
|
name: "writing-plans",
|
|
936
936
|
file: "assets/skills/writing-plans/SKILL.md",
|
|
937
937
|
description: "Skill de planificación de implementación (Superpowers) — execution handoff removido, Ostacky decide modo de ejecución",
|
|
938
|
-
version: "0.5.
|
|
939
|
-
sha256: "
|
|
938
|
+
version: "0.5.7",
|
|
939
|
+
sha256: "d8dde75ee7aac1195060444e93484319d5b1ddc7125576715978b5352354c9a8"
|
|
940
940
|
},
|
|
941
941
|
{
|
|
942
942
|
name: "tdd",
|
|
943
943
|
file: "assets/skills/tdd/SKILL.md",
|
|
944
944
|
description: "Skill de test-driven development (Superpowers)",
|
|
945
|
-
version: "0.5.
|
|
946
|
-
sha256: "
|
|
945
|
+
version: "0.5.7",
|
|
946
|
+
sha256: "7dee67b4af6bdccc7a914ca34533184d64592d0f5b23aeae631538168db14994"
|
|
947
947
|
},
|
|
948
948
|
{
|
|
949
949
|
name: "subagent-driven-development",
|
|
950
950
|
file: "assets/skills/subagent-driven-development/SKILL.md",
|
|
951
951
|
description: "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
|
|
952
|
-
version: "0.5.
|
|
953
|
-
sha256: "
|
|
952
|
+
version: "0.5.7",
|
|
953
|
+
sha256: "6b5344c5749dd9b61bed0fded1516c212cdfeec59779f9c32a5a84fa94315431"
|
|
954
954
|
},
|
|
955
955
|
{
|
|
956
956
|
name: "dispatching-parallel-agents",
|
|
957
957
|
file: "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
958
958
|
description: "Skill de dispatch paralelo de agentes (Superpowers)",
|
|
959
|
-
version: "0.5.
|
|
960
|
-
sha256: "
|
|
959
|
+
version: "0.5.7",
|
|
960
|
+
sha256: "76806091c7f923ba2596546b19cccd98a08e57a68745df77c3a7b998fe838e2b"
|
|
961
961
|
},
|
|
962
962
|
{
|
|
963
963
|
name: "review",
|
|
964
964
|
file: "assets/skills/review/SKILL.md",
|
|
965
965
|
description: "Skill de revisión de código (Superpowers)",
|
|
966
|
-
version: "0.5.
|
|
967
|
-
sha256: "
|
|
966
|
+
version: "0.5.7",
|
|
967
|
+
sha256: "fc68671ac4592ceeae6bf0d3ac33abaf78cd34e94e67c07ad0329843d6003468"
|
|
968
968
|
},
|
|
969
969
|
{
|
|
970
|
-
name: "
|
|
971
|
-
file: "assets/skills/
|
|
972
|
-
description: "Skill de
|
|
973
|
-
version: "0.5.
|
|
974
|
-
sha256: "
|
|
970
|
+
name: "receiving-code-review",
|
|
971
|
+
file: "assets/skills/receiving-code-review/SKILL.md",
|
|
972
|
+
description: "Skill de recibir y procesar feedback de code review",
|
|
973
|
+
version: "0.5.7",
|
|
974
|
+
sha256: "b6ace0ce93c5eade7b3f17d6744aa2fca6f492632b80e5dd754f93ba2c331550"
|
|
975
975
|
},
|
|
976
976
|
{
|
|
977
977
|
name: "openspec-propose",
|
|
978
978
|
file: "assets/skills/openspec-propose/SKILL.md",
|
|
979
979
|
description: "Skill de generación de proposal (OpenSpec)",
|
|
980
|
-
version: "0.5.
|
|
981
|
-
sha256: "
|
|
980
|
+
version: "0.5.7",
|
|
981
|
+
sha256: "674b84346d954f61fbbe53d1efb7e6cd9a761b49ea6a9950aa9dfbfe6366a165"
|
|
982
982
|
},
|
|
983
983
|
{
|
|
984
984
|
name: "openspec-apply-change",
|
|
985
985
|
file: "assets/skills/openspec-apply-change/SKILL.md",
|
|
986
986
|
description: "Skill de aplicación de change (OpenSpec)",
|
|
987
|
-
version: "0.5.
|
|
988
|
-
sha256: "
|
|
987
|
+
version: "0.5.7",
|
|
988
|
+
sha256: "9e4fe9fe780b580bfba9f842c3c3603e77150355f8bf2b68a85e8ce41e2c941a"
|
|
989
989
|
},
|
|
990
990
|
{
|
|
991
991
|
name: "openspec-archive-change",
|
|
992
992
|
file: "assets/skills/openspec-archive-change/SKILL.md",
|
|
993
993
|
description: "Skill de archivo de change (OpenSpec)",
|
|
994
|
-
version: "0.5.
|
|
995
|
-
sha256: "
|
|
994
|
+
version: "0.5.7",
|
|
995
|
+
sha256: "4c611a20654841c585fe1c6f573e6e69c8b95c4eecdfe5552923be44dd3da0c4"
|
|
996
|
+
},
|
|
997
|
+
{
|
|
998
|
+
name: "using-git-worktrees",
|
|
999
|
+
file: "assets/skills/using-git-worktrees/SKILL.md",
|
|
1000
|
+
description: "Skill de uso de git worktrees para aislamiento de trabajo",
|
|
1001
|
+
version: "0.5.7",
|
|
1002
|
+
sha256: "ff16257abe3836ca0f1003f130236a79acf4c8574a2e9fed092a5101d52ae860"
|
|
996
1003
|
},
|
|
997
1004
|
{
|
|
998
|
-
name: "
|
|
999
|
-
file: "assets/skills/
|
|
1000
|
-
description: "
|
|
1001
|
-
version: "0.5.
|
|
1002
|
-
sha256: "
|
|
1005
|
+
name: "using-superpowers",
|
|
1006
|
+
file: "assets/skills/using-superpowers/SKILL.md",
|
|
1007
|
+
description: "Skill de orquestación de Superpowers skills",
|
|
1008
|
+
version: "0.5.7",
|
|
1009
|
+
sha256: "bc8bd5445b623c1158f83c518155518b6556c58dd194f73f3bab444a983410ab"
|
|
1010
|
+
},
|
|
1011
|
+
{
|
|
1012
|
+
name: "writing-skills",
|
|
1013
|
+
file: "assets/skills/writing-skills/SKILL.md",
|
|
1014
|
+
description: "Skill de creación y edición de skills",
|
|
1015
|
+
version: "0.5.7",
|
|
1016
|
+
sha256: "915369d6a74570c1605ad49d6e6551a946ca232b12400fbb45797149f16a7f2c"
|
|
1003
1017
|
}
|
|
1004
1018
|
]
|
|
1005
1019
|
};
|
|
@@ -1190,7 +1204,7 @@ function clearLockfile(opencodeRoot) {
|
|
|
1190
1204
|
const lockfile = readLockfile(opencodeRoot);
|
|
1191
1205
|
if (!lockfile) {
|
|
1192
1206
|
writeLockfile(opencodeRoot, {
|
|
1193
|
-
version: "0.5.
|
|
1207
|
+
version: "0.5.7",
|
|
1194
1208
|
lockedAt: new Date().toISOString(),
|
|
1195
1209
|
repo: "",
|
|
1196
1210
|
tag: "",
|
|
@@ -1405,6 +1419,8 @@ function upsertLockfile(paths, type, item, manifest, contentHash) {
|
|
|
1405
1419
|
existing.skills = {};
|
|
1406
1420
|
if (!existing.mcpServers)
|
|
1407
1421
|
existing.mcpServers = {};
|
|
1422
|
+
if (!existing[type])
|
|
1423
|
+
existing[type] = {};
|
|
1408
1424
|
existing[type][item.name] = {
|
|
1409
1425
|
version: item.version,
|
|
1410
1426
|
installedAt: new Date().toISOString(),
|
|
@@ -1610,6 +1626,14 @@ function uninstallAll(paths) {
|
|
|
1610
1626
|
for (const name of Object.keys(lockfile.mcpServers ?? {})) {
|
|
1611
1627
|
uninstallMcpServer(name, paths);
|
|
1612
1628
|
}
|
|
1629
|
+
if (existsSync3(paths.mcp)) {
|
|
1630
|
+
for (const entry of readdirSync(paths.mcp)) {
|
|
1631
|
+
const dirPath = join4(paths.mcp, entry);
|
|
1632
|
+
if (statSync(dirPath).isDirectory()) {
|
|
1633
|
+
uninstallMcpServer(entry, paths);
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1613
1637
|
clearLockfile(paths.root);
|
|
1614
1638
|
}
|
|
1615
1639
|
function isCommandAvailable(cmd) {
|
|
@@ -1659,9 +1683,9 @@ function downloadToFile(url, dest, timeoutMs = 180000) {
|
|
|
1659
1683
|
const pump = ({ done, value }) => {
|
|
1660
1684
|
if (done) {
|
|
1661
1685
|
file.end();
|
|
1662
|
-
return Promise.resolve();
|
|
1686
|
+
return Promise.resolve(undefined);
|
|
1663
1687
|
}
|
|
1664
|
-
return new Promise((
|
|
1688
|
+
return new Promise((ok) => file.write(Buffer.from(value), () => ok())).then(() => reader.read().then(pump));
|
|
1665
1689
|
};
|
|
1666
1690
|
return reader.read().then(pump);
|
|
1667
1691
|
}).then(() => {
|
|
@@ -2338,7 +2362,9 @@ async function doAddMcp(manifest, paths) {
|
|
|
2338
2362
|
onCancel(selected);
|
|
2339
2363
|
const spin = L2();
|
|
2340
2364
|
for (const name of selected) {
|
|
2341
|
-
const item = manifest.mcpServers
|
|
2365
|
+
const item = manifest.mcpServers?.find((m3) => m3.name === name);
|
|
2366
|
+
if (!item)
|
|
2367
|
+
continue;
|
|
2342
2368
|
spin.start(`Instalando MCP server: ${name} (${item.version})`);
|
|
2343
2369
|
try {
|
|
2344
2370
|
await installMcpServer(item, manifest, paths);
|
|
@@ -2716,7 +2742,7 @@ async function doUninstallMcp(paths) {
|
|
|
2716
2742
|
const options = installed.map((name) => ({
|
|
2717
2743
|
value: name,
|
|
2718
2744
|
label: name,
|
|
2719
|
-
hint: `v${lockfile.mcpServers[name]
|
|
2745
|
+
hint: `v${lockfile.mcpServers?.[name]?.version ?? "?"}`
|
|
2720
2746
|
}));
|
|
2721
2747
|
const selected = await pe({
|
|
2722
2748
|
message: "¿Qué MCP servers querés desinstalar?",
|
|
@@ -19836,12 +19836,19 @@ class OstackyController {
|
|
|
19836
19836
|
}
|
|
19837
19837
|
if (oldCount === 0) {
|
|
19838
19838
|
if (content.includes(newString)) {
|
|
19839
|
-
return {
|
|
19839
|
+
return {
|
|
19840
|
+
outcome: "ALREADY_APPLIED",
|
|
19841
|
+
taskId,
|
|
19842
|
+
reason: "oldString not found but newString is present — edit was already applied"
|
|
19843
|
+
};
|
|
19840
19844
|
}
|
|
19841
19845
|
return { outcome: "CONFLICT", reason: "oldString not found in content — file was modified externally" };
|
|
19842
19846
|
}
|
|
19843
19847
|
if (oldCount > 1) {
|
|
19844
|
-
return {
|
|
19848
|
+
return {
|
|
19849
|
+
outcome: "CONFLICT",
|
|
19850
|
+
reason: `oldString found ${oldCount} times — need more context to disambiguate`
|
|
19851
|
+
};
|
|
19845
19852
|
}
|
|
19846
19853
|
return { outcome: "EDITABLE", taskId };
|
|
19847
19854
|
}
|
|
@@ -19866,14 +19873,18 @@ class OstackyController {
|
|
|
19866
19873
|
this.#state.fileFingerprints[filePath] = fileHash;
|
|
19867
19874
|
}
|
|
19868
19875
|
this.#persist();
|
|
19869
|
-
return {
|
|
19876
|
+
return {
|
|
19877
|
+
taskId,
|
|
19878
|
+
status: "COMPLETED",
|
|
19879
|
+
totalCompleted: Object.keys(this.#state.tasks).filter((k) => this.#state.tasks[k].status === "COMPLETED").length
|
|
19880
|
+
};
|
|
19870
19881
|
}
|
|
19871
19882
|
}
|
|
19872
19883
|
var statePath = process.env.OSTACKY_STATE_PATH || ".opencode/ostacky-state.json";
|
|
19873
19884
|
var controller = new OstackyController({ statePath });
|
|
19874
19885
|
var server = new McpServer({
|
|
19875
19886
|
name: "ostacky-controller",
|
|
19876
|
-
version: "0.5.
|
|
19887
|
+
version: "0.5.7"
|
|
19877
19888
|
});
|
|
19878
19889
|
server.registerTool("start_request", {
|
|
19879
19890
|
description: "Start or resume a new request in the state machine. Call this first.",
|