ostacky 0.9.4 → 0.9.6

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.
Files changed (113) hide show
  1. package/README.md +27 -25
  2. package/assets/agents/ostacky.md +3 -3
  3. package/assets/commands/install-stack.md +2 -2
  4. package/assets/mcp/ostacky-controller/index.js +80 -19
  5. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CVhIKulL.d.mts → auth--n_Yzytt.d.cts} +14 -9
  6. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CVhIKulL.d.mts.map → auth--n_Yzytt.d.cts.map} +1 -1
  7. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CfDMXiII.cjs → auth-4-zilcqg.cjs} +3 -2
  8. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-4-zilcqg.cjs.map +1 -0
  9. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CUe6YdwF.mjs → auth-CGP0BDVq.mjs} +3 -2
  10. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CGP0BDVq.mjs.map +1 -0
  11. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-B2Q9_Vxp.d.cts → auth-YUQV3RRv.d.mts} +14 -9
  12. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-B2Q9_Vxp.d.cts.map → auth-YUQV3RRv.d.mts.map} +1 -1
  13. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
  14. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
  15. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
  16. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
  17. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
  18. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
  19. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
  20. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
  21. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/package.json +1 -1
  22. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/README.md +3 -3
  23. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-CplOkyLC.mjs → ajvProvider-CEoC__sr.mjs} +483 -38
  24. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-CEoC__sr.mjs.map +1 -0
  25. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-BdSo9BII.d.mts → ajvProvider-CgI-5L6O.d.mts} +25 -8
  26. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-BdSo9BII.d.mts.map → ajvProvider-CgI-5L6O.d.mts.map} +1 -1
  27. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-B_4czhCS.d.cts → ajvProvider-FOQRM7up.d.cts} +24 -7
  28. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-B_4czhCS.d.cts.map → ajvProvider-FOQRM7up.d.cts.map} +1 -1
  29. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-Brn-Q2J_.cjs → ajvProvider-ZaoO9afR.cjs} +483 -38
  30. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-ZaoO9afR.cjs.map +1 -0
  31. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-ojcZaap3.cjs → cfWorkerProvider-BwbPzsdI.cjs} +25 -15
  32. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-BwbPzsdI.cjs.map +1 -0
  33. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-BYRW5af5.d.mts → cfWorkerProvider-C03CSigr.d.mts} +21 -6
  34. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-C03CSigr.d.mts.map +1 -0
  35. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-D9GAttn8.d.cts → cfWorkerProvider-doTkZbTr.d.cts} +20 -5
  36. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-doTkZbTr.d.cts.map +1 -0
  37. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-Bd-iTHAF.mjs → cfWorkerProvider-p3WaZPqB.mjs} +26 -15
  38. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-p3WaZPqB.mjs.map +1 -0
  39. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-DzBzpE4_.d.cts → createMcpHandler-BLVe3qmU.d.cts} +137 -32
  40. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +1 -0
  41. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-CEckaSEs.d.mts → createMcpHandler-Bt6U_Fqb.d.mts} +138 -33
  42. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +1 -0
  43. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-D8eXzoGv.cjs +46 -0
  44. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-D8eXzoGv.cjs.map +1 -0
  45. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-DoSzNhcb.mjs +34 -0
  46. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-DoSzNhcb.mjs.map +1 -0
  47. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.cjs +209 -257
  48. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
  49. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.cts +45 -3
  50. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
  51. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.mts +46 -4
  52. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
  53. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.mjs +201 -252
  54. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
  55. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{mcp-DM1iHYFo.cjs → mcp-DUcCQSTW.cjs} +458 -35
  56. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +1 -0
  57. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{mcp-IJurDZVN.mjs → mcp-Dw2OlZ1f.mjs} +389 -32
  58. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +1 -0
  59. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.cjs +1 -1
  60. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.d.cts +1 -1
  61. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.d.mts +1 -1
  62. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.mjs +1 -1
  63. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.cjs +1 -1
  64. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.d.cts +1 -1
  65. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.d.mts +1 -1
  66. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.mjs +1 -1
  67. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +2 -2
  68. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.d.cts +1 -1
  69. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.d.mts +1 -1
  70. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +2 -2
  71. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{src-BX_fm-dB.cjs → src-CgFsfg3E.cjs} +161 -48
  72. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +1 -0
  73. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{src-D86MbS1I.mjs → src-D-y6h4N7.mjs} +161 -48
  74. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +1 -0
  75. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +30 -3
  76. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.cjs.map +1 -1
  77. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +9 -1
  78. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts.map +1 -1
  79. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +9 -1
  80. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts.map +1 -1
  81. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +30 -3
  82. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.mjs.map +1 -1
  83. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{types-mS0yxCL0.d.mts → types-DUs7mGBv.d.mts} +1 -1
  84. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{types-mS0yxCL0.d.mts.map → types-DUs7mGBv.d.mts.map} +1 -1
  85. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.cjs +1 -1
  86. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.d.cts +1 -1
  87. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.d.mts +1 -1
  88. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.mjs +1 -1
  89. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.cjs +1 -1
  90. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.d.cts +1 -1
  91. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.d.mts +1 -1
  92. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.mjs +1 -1
  93. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/package.json +4 -4
  94. package/assets/mcp/ostacky-controller/package.json +1 -1
  95. package/assets/plugins/ostacky-controller/index.ts +43 -8
  96. package/dist/cli.js +130 -74
  97. package/manifest.json +29 -29
  98. package/package.json +7 -2
  99. package/assets/mcp/openspec/bun.lock +0 -20
  100. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CUe6YdwF.mjs.map +0 -1
  101. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CfDMXiII.cjs.map +0 -1
  102. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-Brn-Q2J_.cjs.map +0 -1
  103. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-CplOkyLC.mjs.map +0 -1
  104. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-BYRW5af5.d.mts.map +0 -1
  105. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-Bd-iTHAF.mjs.map +0 -1
  106. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-D9GAttn8.d.cts.map +0 -1
  107. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-ojcZaap3.cjs.map +0 -1
  108. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CEckaSEs.d.mts.map +0 -1
  109. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DzBzpE4_.d.cts.map +0 -1
  110. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-DM1iHYFo.cjs.map +0 -1
  111. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-IJurDZVN.mjs.map +0 -1
  112. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-BX_fm-dB.cjs.map +0 -1
  113. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-D86MbS1I.mjs.map +0 -1
package/dist/cli.js CHANGED
@@ -244,21 +244,24 @@ function findProjectRoot(startDir = process.cwd()) {
244
244
  if (out && existsSync(out))
245
245
  return resolve(out);
246
246
  } catch {}
247
- let current = resolve(startDir);
248
- while (true) {
249
- if (existsSync(join(current, ".opencode")) || existsSync(join(current, ".git"))) {
250
- return current;
251
- }
252
- const parent = dirname(current);
253
- if (parent === current)
254
- return resolve(startDir);
255
- current = parent;
247
+ return resolve(startDir);
248
+ }
249
+ function isGitRepo(dir = process.cwd()) {
250
+ try {
251
+ const out = execFileSync("git", ["rev-parse", "--is-inside-work-tree"], {
252
+ encoding: "utf-8",
253
+ cwd: dir,
254
+ stdio: ["pipe", "pipe", "pipe"]
255
+ }).trim();
256
+ return out === "true";
257
+ } catch {
258
+ return false;
256
259
  }
257
260
  }
261
+ function initGitRepo(dir) {
262
+ execFileSync("git", ["init"], { cwd: dir, stdio: "pipe" });
263
+ }
258
264
  function getOpenCodeDirForScope(scope, cwd = process.cwd()) {
259
- const existing = findOpenCodeDir(cwd);
260
- if (existing)
261
- return existing;
262
265
  return join(findProjectRoot(cwd), ".opencode");
263
266
  }
264
267
  function ensureOpenCodePaths(opencodeDir) {
@@ -621,31 +624,31 @@ var init_fs = __esm(() => {
621
624
  var manifest_default;
622
625
  var init_manifest = __esm(() => {
623
626
  manifest_default = {
624
- version: "0.9.4",
627
+ version: "0.9.6",
625
628
  repo: "JaimeHoracio/Ostacky",
626
- tag: "v0.9.4",
629
+ tag: "v0.9.6",
627
630
  agents: [
628
631
  {
629
632
  name: "ostacky",
630
633
  file: "assets/agents/ostacky.md",
631
- description: "Orquestador con recuperación automática (nunca se congela), ruteo por nivel de impacto, controller MCP con SDK oficial, edición segura con fallback inline, y delegación en OpenSpec + Superpowers. v0.9.4: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
632
- version: "0.9.4",
633
- sha256: "7bd37a5fb4c451a8ac8dc75a727a295835a72651a31f3df6a4b639c902160d70"
634
+ description: "Orquestador con recuperación automática (nunca se congela), ruteo por nivel de impacto, controller MCP con SDK oficial, edición segura con fallback inline, y delegación en OpenSpec + Superpowers. v0.9.6: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
635
+ version: "0.9.6",
636
+ sha256: "29e435104f6915905a85e15ca768a339c3e5b0898fc923ae147afb7c4f20a716"
634
637
  }
635
638
  ],
636
639
  commands: [
637
640
  {
638
641
  name: "install-stack",
639
642
  file: "assets/commands/install-stack.md",
640
- description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.9.4: controller plugin como alma hard-gate, Context7 removido del stack.",
641
- version: "0.9.4",
642
- sha256: "f6b3f09519f4c0d5be7db2a0ec715cd962bc7bb12b1c14eb69baaa033086103c"
643
+ description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, controller plugin). v0.9.6: controller plugin como alma hard-gate, Context7 removido del stack.",
644
+ version: "0.9.6",
645
+ sha256: "88da074ab02bef60bcaebd1fed9592ea13f95d245850ec9f2467cf69a7f2fc4c"
643
646
  },
644
647
  {
645
648
  name: "opsx-sync",
646
649
  file: "assets/commands/opsx-sync.md",
647
650
  description: "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
648
- version: "0.9.4",
651
+ version: "0.9.6",
649
652
  sha256: "fe0158478f2ca63b315037a85fc1632b77868532e319af6c7384285441767d64"
650
653
  }
651
654
  ],
@@ -653,16 +656,16 @@ var init_manifest = __esm(() => {
653
656
  {
654
657
  name: "ostacky-controller",
655
658
  file: "assets/mcp/ostacky-controller/",
656
- description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.9.4: 22 tools (incluye set_handoff, get_handoff, clear_handoff, get_available_transitions funcional). Bugfixes: consecutiveFailures real, lastHandoff state, defaultChoice persistido. Robustez: degraded mode automático tras 3 fallos, persistence condicional para Nivel 0, prune de skills obsoletas.",
657
- version: "0.9.4",
658
- sha256: "c6321b265fa9ff5cf3b4a0438f71c9c7ca7012f683a30f11f1c44c36063684b9"
659
+ description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.9.6: 22 tools (incluye set_handoff, get_handoff, clear_handoff, get_available_transitions funcional). Bugfixes: consecutiveFailures real, lastHandoff state, defaultChoice persistido. Robustez: degraded mode automático tras 3 fallos, persistence condicional para Nivel 0, prune de skills obsoletas.",
660
+ version: "0.9.6",
661
+ sha256: "6669c464c47a285a21f3eea6456487c92b725a40e7938ade5ecfff97e2537427"
659
662
  },
660
663
  {
661
664
  name: "openspec",
662
665
  file: "assets/mcp/openspec/",
663
666
  description: "MCP server local para OpenSpec - proposal, apply, archive, sync de cambios",
664
- version: "0.9.4",
665
- sha256: "fa4be28bfc1e75db8f1a037e2580f04a60066c80e8e5934e90e1041020d04609"
667
+ version: "0.9.6",
668
+ sha256: "bdb283fe8ec2dfcba2ec4f38191f4039e58cd7ae12e44e66310783b42c827638"
666
669
  }
667
670
  ],
668
671
  skills: [
@@ -670,105 +673,105 @@ var init_manifest = __esm(() => {
670
673
  name: "brainstorming",
671
674
  file: "assets/skills/brainstorming/SKILL.md",
672
675
  description: "Skill unificado de pensamiento con dos modos: creative-design (producción de diseño → transición a implementación directa o openspec-propose) y open-exploration (exploración libre)",
673
- version: "0.9.4",
676
+ version: "0.9.6",
674
677
  sha256: "f1013a86a8f27914d85a716e23c7fd32db1786d93615e8b0834b13d184308549"
675
678
  },
676
679
  {
677
680
  name: "execution-mode-evaluation",
678
681
  file: "assets/skills/execution-mode-evaluation/SKILL.md",
679
682
  description: "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
680
- version: "0.9.4",
683
+ version: "0.9.6",
681
684
  sha256: "2158a6864c0912e868a9d720db7fd79441e6cc298e3320833d2527c9727c852e"
682
685
  },
683
686
  {
684
687
  name: "tdd",
685
688
  file: "assets/skills/tdd/SKILL.md",
686
689
  description: "Skill de test-driven development (Superpowers)",
687
- version: "0.9.4",
690
+ version: "0.9.6",
688
691
  sha256: "f0ebfbbc43a8868d31a3fd2df37ae7f60fe8add09c6475862395a68269e5ff7f"
689
692
  },
690
693
  {
691
694
  name: "subagent-driven-development",
692
695
  file: "assets/skills/subagent-driven-development/SKILL.md",
693
696
  description: "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
694
- version: "0.9.4",
697
+ version: "0.9.6",
695
698
  sha256: "1a42d714a9a13faf05f0bf7b580e8d837c2e77a5633839542ccce603023419e8"
696
699
  },
697
700
  {
698
701
  name: "dispatching-parallel-agents",
699
702
  file: "assets/skills/dispatching-parallel-agents/SKILL.md",
700
703
  description: "Skill de dispatch paralelo de agentes (Superpowers)",
701
- version: "0.9.4",
704
+ version: "0.9.6",
702
705
  sha256: "7e7b712ef742d5631e302e6a71583e2bbbd33094da9281abfb84b43505fc3ef1"
703
706
  },
704
707
  {
705
708
  name: "review",
706
709
  file: "assets/skills/review/SKILL.md",
707
710
  description: "Skill de revisión de código (Superpowers)",
708
- version: "0.9.4",
711
+ version: "0.9.6",
709
712
  sha256: "b19650ed4d1d4d9857a4dd5b7e08e91328a1a1fc9c45bcc2fb600fa9d0213279"
710
713
  },
711
714
  {
712
715
  name: "receiving-code-review",
713
716
  file: "assets/skills/receiving-code-review/SKILL.md",
714
717
  description: "Skill de recibir y procesar feedback de code review",
715
- version: "0.9.4",
718
+ version: "0.9.6",
716
719
  sha256: "d761e884e71d8d3476ac734d287cae403a4024506a7d12e7361a448217c0a831"
717
720
  },
718
721
  {
719
722
  name: "openspec-propose",
720
723
  file: "assets/skills/openspec-propose/SKILL.md",
721
724
  description: "Skill de generación de proposal (OpenSpec)",
722
- version: "0.9.4",
725
+ version: "0.9.6",
723
726
  sha256: "6a517f750f24c008208156a2d653e97ed30b1e53878aeac5ce394e573db0678f"
724
727
  },
725
728
  {
726
729
  name: "openspec-apply-change",
727
730
  file: "assets/skills/openspec-apply-change/SKILL.md",
728
731
  description: "Skill de aplicación de change (OpenSpec)",
729
- version: "0.9.4",
732
+ version: "0.9.6",
730
733
  sha256: "dfc823bf89fc7505e91ab6dee9c1f004be38a410bd3d88fb67b211b1b6cbb1d0"
731
734
  },
732
735
  {
733
736
  name: "openspec-archive-change",
734
737
  file: "assets/skills/openspec-archive-change/SKILL.md",
735
738
  description: "Skill de archivo de change (OpenSpec)",
736
- version: "0.9.4",
739
+ version: "0.9.6",
737
740
  sha256: "16e4b561de7747283663fed602e506abf502452c49a8d4b86d7a5539c40f0195"
738
741
  },
739
742
  {
740
743
  name: "openspec-explore",
741
744
  file: "assets/skills/openspec-explore/SKILL.md",
742
745
  description: "Modo explore para OpenSpec — thinking partner para explorar ideas, investigar problemas y clarificar requisitos antes/durante un cambio",
743
- version: "0.9.4",
746
+ version: "0.9.6",
744
747
  sha256: "9eafc3a8c693b8d9916867ef764d49e5222da717fde501c957bb3f6c312d2415"
745
748
  },
746
749
  {
747
750
  name: "using-git-worktrees",
748
751
  file: "assets/skills/using-git-worktrees/SKILL.md",
749
752
  description: "Skill de uso de git worktrees para aislamiento de trabajo",
750
- version: "0.9.4",
753
+ version: "0.9.6",
751
754
  sha256: "93341bc1b7c053618a8b6dc07e3615b77990d7b549a0201f5835d95fef67ce13"
752
755
  },
753
756
  {
754
757
  name: "using-superpowers",
755
758
  file: "assets/skills/using-superpowers/SKILL.md",
756
759
  description: "Skill de orquestación de Superpowers skills",
757
- version: "0.9.4",
760
+ version: "0.9.6",
758
761
  sha256: "7e54536f96d2a379185a10bfc1e970850caa2561b6d8aca7080f0defea0381a4"
759
762
  },
760
763
  {
761
764
  name: "writing-skills",
762
765
  file: "assets/skills/writing-skills/SKILL.md",
763
766
  description: "Skill de creación y edición de skills",
764
- version: "0.9.4",
767
+ version: "0.9.6",
765
768
  sha256: "3d76b906cee518a2b809febb70db95697a35b9f368986bb504b4120c3bfb437a"
766
769
  },
767
770
  {
768
771
  name: "graceful-degradation",
769
772
  file: "assets/skills/graceful-degradation/SKILL.md",
770
773
  description: "Skill de degradación graceful cuando múltiples tools están indisponibles",
771
- version: "0.9.4",
774
+ version: "0.9.6",
772
775
  sha256: "363449bd9e6f800a0a3168667cf78f767fb105d86e4a4adadcc649d418139303"
773
776
  }
774
777
  ]
@@ -1118,10 +1121,10 @@ var init_config = __esm(() => {
1118
1121
 
1119
1122
  // src/stack.ts
1120
1123
  import { chmodSync, copyFileSync as copyFileSync3, existsSync as existsSync6, mkdirSync as mkdirSync4, rmSync as rmSync4, unlinkSync as unlinkSync3 } from "fs";
1121
- import { basename as basename2, dirname as dirname5, join as join7, resolve as resolve2 } from "path";
1124
+ import { basename as basename2, dirname as dirname5, join as join7, resolve as resolve3 } from "path";
1122
1125
  import { execFileSync as execFileSync3 } from "child_process";
1123
1126
  function resolveToolInstallLocation(toolsDir) {
1124
- const resolvedToolsDir = resolve2(toolsDir ?? join7(findProjectRoot(), ".opencode", "tools"));
1127
+ const resolvedToolsDir = resolve3(toolsDir ?? join7(findProjectRoot(), ".opencode", "tools"));
1125
1128
  const possibleOpenCodeDir = dirname5(resolvedToolsDir);
1126
1129
  return {
1127
1130
  projectRoot: basename2(possibleOpenCodeDir) === ".opencode" ? dirname5(possibleOpenCodeDir) : findProjectRoot(),
@@ -1288,11 +1291,15 @@ async function installCodeGraph(toolsDir) {
1288
1291
  return failAfterExtraction(`CodeGraph fue extraído pero no se puede ejecutar: ${error.message}`);
1289
1292
  }
1290
1293
  let indexWarning = null;
1291
- try {
1292
- runTool(localBin, ["init", "-i"], projectRoot, 120000);
1293
- } catch (error) {
1294
- const msg = error.message;
1295
- indexWarning = `El índice no se pudo inicializar todavía: ${msg}. Sugerencia: ejecutá manualmente \`${localBin} init -i\` en ${projectRoot} o \`npx ostacky install-stack --scope local\` para reintentar. Si el path del binario (${localBin}) apunta a ${cgToolDir} y esperabas otro proyecto, verificá que corriste el comando dentro del proyecto correcto (con .git) y con --scope local.`;
1294
+ if (!isGitRepo(projectRoot)) {
1295
+ indexWarning = `Sin repo git en ${projectRoot}: índice pendiente. ` + `Ejecutá \`git init\` y reintentá con \`npx ostacky install-stack --scope local\`. ` + `El binario y el MCP quedaron configurados.`;
1296
+ } else {
1297
+ try {
1298
+ runTool(localBin, ["init", "-i"], projectRoot, 120000);
1299
+ } catch (error) {
1300
+ const msg = error.message;
1301
+ indexWarning = `El índice no se pudo inicializar todavía: ${msg}. Sugerencia: ejecutá manualmente \`${localBin} init -i\` en ${projectRoot} o \`npx ostacky install-stack --scope local\` para reintentar. Si el path del binario (${localBin}) apunta a ${cgToolDir} y esperabas otro proyecto, verificá que corriste el comando dentro del proyecto correcto (con .git) y con --scope local.`;
1302
+ }
1296
1303
  }
1297
1304
  try {
1298
1305
  configureLocalTool(projectRoot, "codegraph", buildLocalMcpCommand(localBin, ["serve", "--mcp"]));
@@ -1674,7 +1681,7 @@ var init_doctor_v2 = __esm(() => {
1674
1681
  // package.json
1675
1682
  var package_default = {
1676
1683
  name: "ostacky",
1677
- version: "0.9.4",
1684
+ version: "0.9.6",
1678
1685
  description: "Instalador interactivo de agentes y comandos para OpenCode",
1679
1686
  type: "module",
1680
1687
  bin: {
@@ -1685,7 +1692,12 @@ var package_default = {
1685
1692
  dev: "bun run src/cli.ts",
1686
1693
  build: "bun build src/cli.ts --target=node --format=esm --outfile dist/cli.js && bun scripts/add-shebang.ts",
1687
1694
  start: "node dist/cli.js",
1688
- test: "bun test",
1695
+ test: "bun test --isolate",
1696
+ "test:safe": "bun run scripts/run-tests-isolated.ts",
1697
+ "check:skills": "bun run scripts/check-skill-sync.ts",
1698
+ "hash:check": "bun run scripts/update-manifest-hashes.ts --check",
1699
+ "hash:update": "bun run scripts/update-manifest-hashes.ts",
1700
+ prepublishOnly: "bun run build",
1689
1701
  update: "bun run scripts/check-skill-sync.ts && bun run scripts/sync-controller-core.ts && bun run scripts/update-manifest-hashes.ts"
1690
1702
  },
1691
1703
  files: [
@@ -2670,6 +2682,7 @@ import { dirname as dirname7 } from "path";
2670
2682
  init_github();
2671
2683
  init_fs();
2672
2684
  init_lockfile();
2685
+ import { resolve as resolve2 } from "path";
2673
2686
 
2674
2687
  // src/installer.ts
2675
2688
  init_github();
@@ -2847,7 +2860,7 @@ async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath, option
2847
2860
  params: {
2848
2861
  protocolVersion: "2025-03-26",
2849
2862
  capabilities: {},
2850
- clientInfo: { name: "ostacky-installer", version: "0.9.4" }
2863
+ clientInfo: { name: "ostacky-installer", version: "0.9.6" }
2851
2864
  }
2852
2865
  });
2853
2866
  });
@@ -3204,6 +3217,28 @@ function onCancel(value) {
3204
3217
  process.exit(0);
3205
3218
  }
3206
3219
  }
3220
+ async function runGitPreflight(cwd = process.cwd(), opts) {
3221
+ if (isGitRepo(cwd))
3222
+ return { projectRoot: findProjectRoot(cwd), gitReady: true };
3223
+ const interactive = opts?.interactive ?? process.stdin.isTTY === true;
3224
+ if (interactive) {
3225
+ const ask = opts?.confirm ?? (() => me({ message: `No hay repo Git en ${cwd}. ¿Inicializar uno? (recomendado para aislamiento por worktree)` }));
3226
+ let answer = false;
3227
+ try {
3228
+ answer = await ask();
3229
+ } catch {
3230
+ answer = false;
3231
+ }
3232
+ if (answer === true) {
3233
+ try {
3234
+ initGitRepo(cwd);
3235
+ return { projectRoot: findProjectRoot(cwd), gitReady: true };
3236
+ } catch {}
3237
+ }
3238
+ }
3239
+ v2.warn("Sin repo Git: aislamiento por worktree no disponible; se instala en el directorio actual.");
3240
+ return { projectRoot: resolve2(cwd), gitReady: false };
3241
+ }
3207
3242
  async function loadManifest() {
3208
3243
  const spin = L2();
3209
3244
  spin.start("Obteniendo recursos disponibles...");
@@ -3226,16 +3261,17 @@ function printPostInstallSteps() {
3226
3261
  ye([
3227
3262
  "Cerrá y reiniciá OpenCode si ya estaba corriendo (los MCP no recargan su config en caliente):",
3228
3263
  " TUI → opencode",
3229
- " Web → opencode web --port 4096",
3264
+ " Web → opencode pair (abrí el link/QR en el navegador)",
3230
3265
  "Seleccioná el agente: `/agents` → `ostacky` (o Shift+Tab / Ctrl+X A)",
3231
3266
  "Skills bundleadas en .opencode/skills/ — revisá cuáles activás",
3232
3267
  "¿Errores en el stack? Ejecutá /install-stack desde el chat de OpenCode"
3233
3268
  ].join(`
3234
3269
  `), "Próximos pasos");
3235
3270
  }
3236
- async function resolveOpenCodePaths(scope) {
3271
+ async function resolveOpenCodePaths(scope, opts) {
3237
3272
  const cwd = process.cwd();
3238
- const dir = scope === "local" || !scope ? getOpenCodeDirForScope("local", cwd) : getOpenCodeDirForScope("local", cwd);
3273
+ const base = opts?.gitPreflight ? (await runGitPreflight(cwd)).projectRoot : cwd;
3274
+ const dir = getOpenCodeDirForScope("local", base);
3239
3275
  if (scope && scope !== "local") {
3240
3276
  v2.warn(`Scope ${scope} removido; usando local en ${dir}`);
3241
3277
  }
@@ -3372,11 +3408,13 @@ async function doInstallStack(toolsDir, projectRoot) {
3372
3408
  } catch {}
3373
3409
  return allOk;
3374
3410
  }
3375
- async function doInstallAll(manifest, paths) {
3411
+ async function doInstallAll(manifest, paths, opts) {
3376
3412
  const spin = L2();
3377
3413
  let errors = 0;
3378
3414
  v2.info(`Scope → local | opencodeDir: ${paths.root} | tools: ${paths.tools}`);
3379
- ensureToolDirs(paths.tools, ["codegraph", "engram"]);
3415
+ if (!opts?.noStack) {
3416
+ ensureToolDirs(paths.tools, ["codegraph", "engram"]);
3417
+ }
3380
3418
  for (const agent of manifest.agents) {
3381
3419
  spin.start(`Descargando agente: ${agent.name} (${agent.version})`);
3382
3420
  try {
@@ -3452,24 +3490,37 @@ async function doInstallAll(manifest, paths) {
3452
3490
  } catch {}
3453
3491
  let stackOk = true;
3454
3492
  let missingTools = [];
3455
- v2.info("Instalando stack de herramientas...");
3456
- stackOk = await doInstallStack(paths.tools, dirname6(paths.root));
3457
- if (!stackOk)
3458
- errors++;
3493
+ if (opts?.noStack) {
3494
+ v2.info("Stack omitido (--no-stack): solo núcleo (agente/commands/skills/MCPs/plugins).");
3495
+ } else {
3496
+ v2.info("Instalando stack de herramientas...");
3497
+ stackOk = await doInstallStack(paths.tools, dirname6(paths.root));
3498
+ if (!stackOk)
3499
+ errors++;
3500
+ }
3459
3501
  const codegraphDir = join8(paths.tools, "codegraph");
3460
3502
  const engramDir = join8(paths.tools, "engram");
3461
- if (!existsSync7(codegraphDir) || !findBinaryInDir(codegraphDir, "codegraph"))
3462
- missingTools.push("CodeGraph");
3463
- if (!existsSync7(engramDir) || !findBinaryInDir(engramDir, "engram"))
3464
- missingTools.push("Engram");
3503
+ if (!opts?.noStack) {
3504
+ if (!existsSync7(codegraphDir) || !findBinaryInDir(codegraphDir, "codegraph"))
3505
+ missingTools.push("CodeGraph");
3506
+ if (!existsSync7(engramDir) || !findBinaryInDir(engramDir, "engram"))
3507
+ missingTools.push("Engram");
3508
+ }
3465
3509
  if (missingTools.length > 0) {
3466
3510
  v2.warn(`Faltan herramientas del stack: ${missingTools.join(", ")}.
3467
3511
  ` + "Ejecutá `/install-stack` desde el agente para instalarlas manualmente.");
3468
3512
  }
3469
- if (errors === 0 && stackOk && missingTools.length === 0) {
3513
+ const coreOk = errors === 0;
3514
+ const stackPartial = !stackOk || missingTools.length > 0;
3515
+ if (coreOk && !stackPartial) {
3470
3516
  v2.success("Todo instalado correctamente.");
3517
+ } else if (coreOk) {
3518
+ const missing = missingTools.length > 0 ? ` Faltan: ${missingTools.join(", ")}.` : "";
3519
+ v2.warn(`Núcleo OK (agente/commands/skills/MCPs instalados). Stack parcial.${missing} ` + `Revisá los mensajes de error arriba y reintentá con \`npx ostacky install-stack --scope local\`.`);
3471
3520
  } else {
3472
- v2.warn(`Instalación parcial: ${errors} componente(s) requieren atención.`);
3521
+ v2.warn(`Núcleo con errores: ${errors} componente(s) requieren atención. Revisá los mensajes de error arriba.`);
3522
+ if (stackPartial)
3523
+ v2.warn("Además el stack quedó parcial: reintentá con `npx ostacky install-stack --scope local`.");
3473
3524
  }
3474
3525
  try {
3475
3526
  const projectRoot = dirname6(paths.root);
@@ -3479,7 +3530,7 @@ async function doInstallAll(manifest, paths) {
3479
3530
  else if (gi.updated)
3480
3531
  v2.info(`.gitignore actualizado: ${gi.patternsAdded.join(", ")}`);
3481
3532
  } catch {}
3482
- return errors === 0 && stackOk && missingTools.length === 0;
3533
+ return coreOk && !stackPartial;
3483
3534
  }
3484
3535
 
3485
3536
  // src/prompts/add.ts
@@ -4126,7 +4177,7 @@ async function runInteractiveMenu(scope) {
4126
4177
  we(" OpenCode Installer ");
4127
4178
  await ensureOpencodeInstalled();
4128
4179
  const manifest = await loadManifest();
4129
- const paths = await resolveOpenCodePaths(scope ?? null);
4180
+ const paths = await resolveOpenCodePaths(scope ?? null, { gitPreflight: true });
4130
4181
  if (!paths) {
4131
4182
  fe("Instalación cancelada.");
4132
4183
  return;
@@ -4196,16 +4247,16 @@ async function runInteractiveMenu(scope) {
4196
4247
  break;
4197
4248
  }
4198
4249
  }
4199
- async function runInstallCommand(scope) {
4250
+ async function runInstallCommand(scope, opts) {
4200
4251
  we(" OpenCode Installer ");
4201
4252
  await ensureOpencodeInstalled();
4202
4253
  const manifest = await loadManifest();
4203
- const paths = await resolveOpenCodePaths(scope ?? null);
4254
+ const paths = await resolveOpenCodePaths(scope ?? null, { gitPreflight: true });
4204
4255
  if (!paths) {
4205
4256
  fe("Cancelado.");
4206
4257
  return;
4207
4258
  }
4208
- if (!await doInstallAll(manifest, paths))
4259
+ if (!await doInstallAll(manifest, paths, opts))
4209
4260
  process.exitCode = 1;
4210
4261
  printPostInstallSteps();
4211
4262
  fe(process.exitCode ? "Instalación parcial." : "Instalación completada.");
@@ -4265,7 +4316,7 @@ async function runAddMcpCommand(scope) {
4265
4316
  async function runInstallStackCommand(scope) {
4266
4317
  await ensureOpencodeInstalled();
4267
4318
  we(" OpenCode Installer — Stack ");
4268
- const paths = await resolveOpenCodePaths(scope ?? null);
4319
+ const paths = await resolveOpenCodePaths(scope ?? null, { gitPreflight: true });
4269
4320
  if (!paths) {
4270
4321
  fe("Cancelado.");
4271
4322
  return;
@@ -4472,7 +4523,7 @@ ostacky — Instalador de agentes, comandos, skills y MCPs para OpenCode
4472
4523
 
4473
4524
  Uso:
4474
4525
  npx ostacky [--scope local] Menú interactivo (instalación completa, siempre local)
4475
- npx ostacky install [--scope local] Instalar TODO (agente + skills + MCPs + CodeGraph + OpenSpec + Engram)
4526
+ npx ostacky install [--scope local] [--no-stack] Instalar TODO (agente + skills + MCPs + CodeGraph + OpenSpec + Engram; --no-stack omite el stack)
4476
4527
  npx ostacky add agent [--scope local] Agregar agente(s)
4477
4528
  npx ostacky add command [--scope local] Agregar command(s)
4478
4529
  npx ostacky add skill [--scope local] Agregar skill(s)
@@ -4515,6 +4566,10 @@ function parseScopeArg(argv = process.argv) {
4515
4566
  process.exit(1);
4516
4567
  }
4517
4568
  }
4569
+ if (arg === "-g") {
4570
+ console.error(`Error: -g/global removido; Ostacky instala siempre local en <proyecto>/.opencode. Hacé cd al proyecto y re-ejecutá sin -g.`);
4571
+ process.exit(1);
4572
+ }
4518
4573
  }
4519
4574
  return null;
4520
4575
  }
@@ -4534,6 +4589,7 @@ function withoutScopeArgs(argv) {
4534
4589
  }
4535
4590
  var scope = parseScopeArg();
4536
4591
  var argvNoScope = withoutScopeArgs(process.argv);
4592
+ var noStack = process.argv.includes("--no-stack");
4537
4593
  var [, , cmd, subcmd] = argvNoScope;
4538
4594
  async function runDoctorCommand() {
4539
4595
  const cwd = process.cwd();
@@ -4869,7 +4925,7 @@ async function main() {
4869
4925
  }
4870
4926
  switch (cmd) {
4871
4927
  case "install":
4872
- await runInstallCommand(scope);
4928
+ await runInstallCommand(scope, { noStack });
4873
4929
  break;
4874
4930
  case "install-stack":
4875
4931
  await runInstallStackCommand(scope);