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.
@@ -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.6",
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.6",
882
+ version: "0.5.7",
883
883
  repo: "JaimeHoracio/Ostacky",
884
- tag: "v0.5.6",
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.6",
891
- sha256: "e9848ba26a932a7c2b78c998d750e4d011f95085899bab95cb6410cf74802ff3"
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.6",
900
- sha256: "95f207e63015a6772cf60b3d8dd8878d0fb65229be925ec8c3d234c570553f29"
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.6",
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.6",
916
- sha256: "70b8eaec4248cffb90a19625a8ff99dcc9cfe9e678c25093358a31409975aeb0"
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.6",
925
- sha256: "1063bc501b284d84daa181198cfb8194beff481594ba9931e6bbd46d89cfdabd"
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.6",
939
- sha256: "ff242e9205666f74dc1b28bf19bd77270d46dcc5c322d643faa49aabf8e8d096"
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.6",
946
- sha256: "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
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.6",
953
- sha256: "a9e6c9070f63dcac0a065a1abd91c9218fa07e201f594d1ce5f6a0dc0bfa0674"
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.6",
960
- sha256: "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
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.6",
967
- sha256: "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
966
+ version: "0.5.7",
967
+ sha256: "fc68671ac4592ceeae6bf0d3ac33abaf78cd34e94e67c07ad0329843d6003468"
968
968
  },
969
969
  {
970
- name: "openspec-explore",
971
- file: "assets/skills/openspec-explore/SKILL.md",
972
- description: "Skill de exploración pre-spec (OpenSpec)",
973
- version: "0.5.6",
974
- sha256: "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
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.6",
981
- sha256: "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
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.6",
988
- sha256: "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
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.6",
995
- sha256: "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
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: "question-validation",
999
- file: "assets/skills/question-validation/SKILL.md",
1000
- description: "Valida que el agente use el tool nativo question en vez del MCP ask_user eliminado",
1001
- version: "0.5.6",
1002
- sha256: "1b3a9dca1fecbcc74371e2132660b1740b585bc26a80cf13040d333f4c5eb6f1"
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.6",
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((w2) => file.write(Buffer.from(value), () => w2())).then(() => reader.read().then(pump));
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.find((m3) => m3.name === name);
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].version}`
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 { outcome: "ALREADY_APPLIED", taskId, reason: "oldString not found but newString is present — edit was already applied" };
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 { outcome: "CONFLICT", reason: `oldString found ${oldCount} times — need more context to disambiguate` };
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 { taskId, status: "COMPLETED", totalCompleted: Object.keys(this.#state.tasks).filter((k) => this.#state.tasks[k].status === "COMPLETED").length };
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.6"
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.",