ostacky 0.6.3 → 0.7.1
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 +9 -10
- package/assets/agents/ostacky.md +244 -62
- package/assets/commands/install-stack.md +62 -5
- package/assets/mcp/ostacky-controller/index.js +1377 -989
- package/assets/mcp/ostacky-controller/package.json +1 -1
- package/assets/skills/brainstorming/SKILL.md +8 -8
- package/assets/skills/execution-mode-evaluation/SKILL.md +8 -8
- package/assets/skills/graceful-degradation/SKILL.md +3 -3
- package/assets/skills/openspec-apply-change/SKILL.md +3 -3
- package/assets/skills/openspec-propose/SKILL.md +2 -2
- package/assets/skills/review/SKILL.md +2 -2
- package/assets/skills/subagent-driven-development/SKILL.md +8 -8
- package/dist/cli.js +142 -67
- package/manifest.json +36 -43
- package/package.json +1 -1
- package/assets/skills/writing-plans/SKILL.md +0 -149
package/dist/cli.js
CHANGED
|
@@ -520,31 +520,31 @@ var init_fs = __esm(() => {
|
|
|
520
520
|
var manifest_default;
|
|
521
521
|
var init_manifest = __esm(() => {
|
|
522
522
|
manifest_default = {
|
|
523
|
-
version: "0.
|
|
523
|
+
version: "0.7.1",
|
|
524
524
|
repo: "JaimeHoracio/Ostacky",
|
|
525
|
-
tag: "v0.
|
|
525
|
+
tag: "v0.7.1",
|
|
526
526
|
agents: [
|
|
527
527
|
{
|
|
528
528
|
name: "ostacky",
|
|
529
529
|
file: "assets/agents/ostacky.md",
|
|
530
|
-
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",
|
|
531
|
-
version: "0.
|
|
532
|
-
sha256: "
|
|
530
|
+
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.7.1: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
|
|
531
|
+
version: "0.7.1",
|
|
532
|
+
sha256: "f833e69b6eaa3dfe24de9addf6455b3da55f829b51cba3c7c90c65c69cda34c2"
|
|
533
533
|
}
|
|
534
534
|
],
|
|
535
535
|
commands: [
|
|
536
536
|
{
|
|
537
537
|
name: "install-stack",
|
|
538
538
|
file: "assets/commands/install-stack.md",
|
|
539
|
-
description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, Context7, controller MCP con SDK oficial)",
|
|
540
|
-
version: "0.
|
|
541
|
-
sha256: "
|
|
539
|
+
description: "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, Context7, controller MCP con SDK oficial). v0.7.1: Paso 1.5 controller expandido con verificación post-instalación y troubleshooting.",
|
|
540
|
+
version: "0.7.1",
|
|
541
|
+
sha256: "ef4244855cf733dfe50a2a8e7c436c5741f92574cc50f0fca49faed60480e013"
|
|
542
542
|
},
|
|
543
543
|
{
|
|
544
544
|
name: "opsx-sync",
|
|
545
545
|
file: "assets/commands/opsx-sync.md",
|
|
546
546
|
description: "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
|
|
547
|
-
version: "0.
|
|
547
|
+
version: "0.7.1",
|
|
548
548
|
sha256: "fe0158478f2ca63b315037a85fc1632b77868532e319af6c7384285441767d64"
|
|
549
549
|
}
|
|
550
550
|
],
|
|
@@ -552,15 +552,15 @@ var init_manifest = __esm(() => {
|
|
|
552
552
|
{
|
|
553
553
|
name: "ostacky-controller",
|
|
554
554
|
file: "assets/mcp/ostacky-controller/",
|
|
555
|
-
description: "Máquina de estados persistida con @modelcontextprotocol/server SDK.
|
|
556
|
-
version: "0.
|
|
557
|
-
sha256: "
|
|
555
|
+
description: "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.7.1: 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.",
|
|
556
|
+
version: "0.7.1",
|
|
557
|
+
sha256: "0e639fb1d5bedf8b93b4e259782b9b7de68cd4bb89875e2c546279d17131b7b7"
|
|
558
558
|
},
|
|
559
559
|
{
|
|
560
560
|
name: "openspec",
|
|
561
561
|
file: "assets/mcp/openspec/",
|
|
562
562
|
description: "MCP server local para OpenSpec - proposal, apply, archive, sync de cambios",
|
|
563
|
-
version: "0.
|
|
563
|
+
version: "0.7.1",
|
|
564
564
|
sha256: "fa4be28bfc1e75db8f1a037e2580f04a60066c80e8e5934e90e1041020d04609"
|
|
565
565
|
}
|
|
566
566
|
],
|
|
@@ -568,114 +568,107 @@ var init_manifest = __esm(() => {
|
|
|
568
568
|
{
|
|
569
569
|
name: "brainstorming",
|
|
570
570
|
file: "assets/skills/brainstorming/SKILL.md",
|
|
571
|
-
description: "Skill unificado de pensamiento con dos modos: creative-design (producción de diseño → transición a
|
|
572
|
-
version: "0.
|
|
573
|
-
sha256: "
|
|
571
|
+
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)",
|
|
572
|
+
version: "0.7.1",
|
|
573
|
+
sha256: "333810ca63450e8ab795e8c5a58e645101e788d79210ca8ac36e10d11be39585"
|
|
574
574
|
},
|
|
575
575
|
{
|
|
576
576
|
name: "execution-mode-evaluation",
|
|
577
577
|
file: "assets/skills/execution-mode-evaluation/SKILL.md",
|
|
578
578
|
description: "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
|
|
579
|
-
version: "0.
|
|
580
|
-
sha256: "
|
|
581
|
-
},
|
|
582
|
-
{
|
|
583
|
-
name: "writing-plans",
|
|
584
|
-
file: "assets/skills/writing-plans/SKILL.md",
|
|
585
|
-
description: "Skill de planificación de implementación (Superpowers) — execution handoff removido, Ostacky decide modo de ejecución",
|
|
586
|
-
version: "0.6.3",
|
|
587
|
-
sha256: "9b14903231df96f54da08158c117801b18bba8f5a2e5a0c069854d059e99f294"
|
|
579
|
+
version: "0.7.1",
|
|
580
|
+
sha256: "edf6fca0af52cce83f8fd08e7db9b3d79cc130b53fca505e90d3fbaf4909338b"
|
|
588
581
|
},
|
|
589
582
|
{
|
|
590
583
|
name: "tdd",
|
|
591
584
|
file: "assets/skills/tdd/SKILL.md",
|
|
592
585
|
description: "Skill de test-driven development (Superpowers)",
|
|
593
|
-
version: "0.
|
|
586
|
+
version: "0.7.1",
|
|
594
587
|
sha256: "aa412298980b7826165c211145c1b8e9135f68f36247bb3cb96d0a0eae274486"
|
|
595
588
|
},
|
|
596
589
|
{
|
|
597
590
|
name: "subagent-driven-development",
|
|
598
591
|
file: "assets/skills/subagent-driven-development/SKILL.md",
|
|
599
592
|
description: "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
|
|
600
|
-
version: "0.
|
|
601
|
-
sha256: "
|
|
593
|
+
version: "0.7.1",
|
|
594
|
+
sha256: "1a42d714a9a13faf05f0bf7b580e8d837c2e77a5633839542ccce603023419e8"
|
|
602
595
|
},
|
|
603
596
|
{
|
|
604
597
|
name: "dispatching-parallel-agents",
|
|
605
598
|
file: "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
606
599
|
description: "Skill de dispatch paralelo de agentes (Superpowers)",
|
|
607
|
-
version: "0.
|
|
600
|
+
version: "0.7.1",
|
|
608
601
|
sha256: "3c8a66d51ae2e719e877d02c3dac32bd804722c3bb9227c258ecae78252a20ab"
|
|
609
602
|
},
|
|
610
603
|
{
|
|
611
604
|
name: "review",
|
|
612
605
|
file: "assets/skills/review/SKILL.md",
|
|
613
606
|
description: "Skill de revisión de código (Superpowers)",
|
|
614
|
-
version: "0.
|
|
615
|
-
sha256: "
|
|
607
|
+
version: "0.7.1",
|
|
608
|
+
sha256: "b19650ed4d1d4d9857a4dd5b7e08e91328a1a1fc9c45bcc2fb600fa9d0213279"
|
|
616
609
|
},
|
|
617
610
|
{
|
|
618
611
|
name: "receiving-code-review",
|
|
619
612
|
file: "assets/skills/receiving-code-review/SKILL.md",
|
|
620
613
|
description: "Skill de recibir y procesar feedback de code review",
|
|
621
|
-
version: "0.
|
|
614
|
+
version: "0.7.1",
|
|
622
615
|
sha256: "d761e884e71d8d3476ac734d287cae403a4024506a7d12e7361a448217c0a831"
|
|
623
616
|
},
|
|
624
617
|
{
|
|
625
618
|
name: "openspec-propose",
|
|
626
619
|
file: "assets/skills/openspec-propose/SKILL.md",
|
|
627
620
|
description: "Skill de generación de proposal (OpenSpec)",
|
|
628
|
-
version: "0.
|
|
629
|
-
sha256: "
|
|
621
|
+
version: "0.7.1",
|
|
622
|
+
sha256: "bb59100b9fd3c9f9a1ec6509fa975ec55bf7fc737df4fe73bb3e9bbc217b83f7"
|
|
630
623
|
},
|
|
631
624
|
{
|
|
632
625
|
name: "openspec-apply-change",
|
|
633
626
|
file: "assets/skills/openspec-apply-change/SKILL.md",
|
|
634
627
|
description: "Skill de aplicación de change (OpenSpec)",
|
|
635
|
-
version: "0.
|
|
636
|
-
sha256: "
|
|
628
|
+
version: "0.7.1",
|
|
629
|
+
sha256: "dfc823bf89fc7505e91ab6dee9c1f004be38a410bd3d88fb67b211b1b6cbb1d0"
|
|
637
630
|
},
|
|
638
631
|
{
|
|
639
632
|
name: "openspec-archive-change",
|
|
640
633
|
file: "assets/skills/openspec-archive-change/SKILL.md",
|
|
641
634
|
description: "Skill de archivo de change (OpenSpec)",
|
|
642
|
-
version: "0.
|
|
635
|
+
version: "0.7.1",
|
|
643
636
|
sha256: "16e4b561de7747283663fed602e506abf502452c49a8d4b86d7a5539c40f0195"
|
|
644
637
|
},
|
|
645
638
|
{
|
|
646
639
|
name: "openspec-explore",
|
|
647
640
|
file: "assets/skills/openspec-explore/SKILL.md",
|
|
648
641
|
description: "Modo explore para OpenSpec — thinking partner para explorar ideas, investigar problemas y clarificar requisitos antes/durante un cambio",
|
|
649
|
-
version: "0.
|
|
642
|
+
version: "0.7.1",
|
|
650
643
|
sha256: "37ae4aaf17ea71a395bab6dc4d9d61b9a49d7910f6692535ae8553244c46880b"
|
|
651
644
|
},
|
|
652
645
|
{
|
|
653
646
|
name: "using-git-worktrees",
|
|
654
647
|
file: "assets/skills/using-git-worktrees/SKILL.md",
|
|
655
648
|
description: "Skill de uso de git worktrees para aislamiento de trabajo",
|
|
656
|
-
version: "0.
|
|
649
|
+
version: "0.7.1",
|
|
657
650
|
sha256: "11afa9123828fc5caa22137aff907cd99c751e99027fbd4c020751110a949281"
|
|
658
651
|
},
|
|
659
652
|
{
|
|
660
653
|
name: "using-superpowers",
|
|
661
654
|
file: "assets/skills/using-superpowers/SKILL.md",
|
|
662
655
|
description: "Skill de orquestación de Superpowers skills",
|
|
663
|
-
version: "0.
|
|
656
|
+
version: "0.7.1",
|
|
664
657
|
sha256: "7e54536f96d2a379185a10bfc1e970850caa2561b6d8aca7080f0defea0381a4"
|
|
665
658
|
},
|
|
666
659
|
{
|
|
667
660
|
name: "writing-skills",
|
|
668
661
|
file: "assets/skills/writing-skills/SKILL.md",
|
|
669
662
|
description: "Skill de creación y edición de skills",
|
|
670
|
-
version: "0.
|
|
663
|
+
version: "0.7.1",
|
|
671
664
|
sha256: "3d76b906cee518a2b809febb70db95697a35b9f368986bb504b4120c3bfb437a"
|
|
672
665
|
},
|
|
673
666
|
{
|
|
674
667
|
name: "graceful-degradation",
|
|
675
668
|
file: "assets/skills/graceful-degradation/SKILL.md",
|
|
676
669
|
description: "Skill de degradación graceful cuando múltiples tools están indisponibles",
|
|
677
|
-
version: "0.
|
|
678
|
-
sha256: "
|
|
670
|
+
version: "0.7.1",
|
|
671
|
+
sha256: "e5090e475729f21871bb25bce738000f3616955ed3edb3ba926dd740d3298948"
|
|
679
672
|
}
|
|
680
673
|
]
|
|
681
674
|
};
|
|
@@ -1052,7 +1045,8 @@ __export(exports_stack, {
|
|
|
1052
1045
|
installEngram: () => installEngram,
|
|
1053
1046
|
installCodeGraph: () => installCodeGraph,
|
|
1054
1047
|
buildLocalMcpCommand: () => buildLocalMcpCommand,
|
|
1055
|
-
buildEngramDownloadUrl: () => buildEngramDownloadUrl
|
|
1048
|
+
buildEngramDownloadUrl: () => buildEngramDownloadUrl,
|
|
1049
|
+
OPENSPEC_NPM_PACKAGE: () => OPENSPEC_NPM_PACKAGE
|
|
1056
1050
|
});
|
|
1057
1051
|
import { chmodSync, copyFileSync as copyFileSync3, existsSync as existsSync6, mkdirSync as mkdirSync4, rmSync as rmSync4, unlinkSync as unlinkSync3 } from "fs";
|
|
1058
1052
|
import { basename as basename2, dirname as dirname5, join as join7, resolve as resolve2 } from "path";
|
|
@@ -1192,20 +1186,56 @@ async function installCodeGraph(toolsDir) {
|
|
|
1192
1186
|
}
|
|
1193
1187
|
function setupOpenSpec(projectRoot = findProjectRoot()) {
|
|
1194
1188
|
const useBun = isCommandAvailable("bun");
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1189
|
+
const fail = (msg) => ({ success: false, message: msg });
|
|
1190
|
+
const tryDirect = () => {
|
|
1191
|
+
try {
|
|
1192
|
+
const invocation = getCommandInvocation(useBun ? "bunx" : "npx", useBun ? [OPENSPEC_NPM_PACKAGE, "init", "--tools", "opencode", "--force"] : ["--yes", OPENSPEC_NPM_PACKAGE, "init", "--tools", "opencode", "--force"]);
|
|
1193
|
+
execFileSync3(invocation.command, invocation.args, {
|
|
1194
|
+
stdio: "pipe",
|
|
1195
|
+
timeout: 120000,
|
|
1196
|
+
cwd: projectRoot
|
|
1197
|
+
});
|
|
1198
|
+
return true;
|
|
1199
|
+
} catch {
|
|
1200
|
+
return false;
|
|
1201
|
+
}
|
|
1202
|
+
};
|
|
1203
|
+
const tryInstallGlobal = () => {
|
|
1204
|
+
if (!useBun && !isCommandAvailable("npm")) {
|
|
1205
|
+
return { ok: false, error: "Ni bun ni npm están disponibles para instalar OpenSpec globalmente" };
|
|
1206
|
+
}
|
|
1207
|
+
const pkgManager = useBun ? "bun" : "npm";
|
|
1208
|
+
const installArgs = useBun ? ["add", "-g", OPENSPEC_NPM_PACKAGE] : ["install", "-g", OPENSPEC_NPM_PACKAGE];
|
|
1209
|
+
try {
|
|
1210
|
+
const invocation = getCommandInvocation(pkgManager, installArgs);
|
|
1211
|
+
execFileSync3(invocation.command, invocation.args, { stdio: "pipe", timeout: 120000 });
|
|
1212
|
+
} catch (installErr) {
|
|
1213
|
+
return { ok: false, error: `Instalación global falló: ${installErr.message}` };
|
|
1214
|
+
}
|
|
1215
|
+
try {
|
|
1216
|
+
const retryInvocation = getCommandInvocation("openspec", ["init", "--tools", "opencode", "--force"]);
|
|
1217
|
+
execFileSync3(retryInvocation.command, retryInvocation.args, {
|
|
1218
|
+
stdio: "pipe",
|
|
1219
|
+
timeout: 120000,
|
|
1220
|
+
cwd: projectRoot
|
|
1221
|
+
});
|
|
1222
|
+
return { ok: true };
|
|
1223
|
+
} catch (retryErr) {
|
|
1224
|
+
return { ok: false, error: `Reintento con binario global falló: ${retryErr.message}` };
|
|
1225
|
+
}
|
|
1226
|
+
};
|
|
1227
|
+
if (tryDirect()) {
|
|
1202
1228
|
return { success: true, message: "OpenSpec configurado para OpenCode" };
|
|
1203
|
-
}
|
|
1229
|
+
}
|
|
1230
|
+
const fallback = tryInstallGlobal();
|
|
1231
|
+
if (fallback.ok) {
|
|
1204
1232
|
return {
|
|
1205
|
-
success:
|
|
1206
|
-
message: `
|
|
1233
|
+
success: true,
|
|
1234
|
+
message: `OpenSpec configurado para OpenCode (binario instalado globalmente con ${useBun ? "bun" : "npm"})`
|
|
1207
1235
|
};
|
|
1208
1236
|
}
|
|
1237
|
+
const manualCmd = useBun ? `bun add -g ${OPENSPEC_NPM_PACKAGE}` : `npm install -g ${OPENSPEC_NPM_PACKAGE}`;
|
|
1238
|
+
return fail(`Error configurando OpenSpec: ni bunx/npx ni la instalación global resolvieron el binario. ` + `Solución manual: ejecuta \`${manualCmd}\` y luego corré /install-stack de nuevo. ` + `Detalle: ${fallback.error}`);
|
|
1209
1239
|
}
|
|
1210
1240
|
async function installEngram(toolsDir) {
|
|
1211
1241
|
const location = resolveToolInstallLocation(toolsDir);
|
|
@@ -1429,6 +1459,7 @@ function verifyMcpServers(projectRoot) {
|
|
|
1429
1459
|
}
|
|
1430
1460
|
return result;
|
|
1431
1461
|
}
|
|
1462
|
+
var OPENSPEC_NPM_PACKAGE = "@fission-ai/openspec";
|
|
1432
1463
|
var init_stack = __esm(() => {
|
|
1433
1464
|
init_fs();
|
|
1434
1465
|
init_config();
|
|
@@ -1437,7 +1468,7 @@ var init_stack = __esm(() => {
|
|
|
1437
1468
|
// package.json
|
|
1438
1469
|
var package_default = {
|
|
1439
1470
|
name: "ostacky",
|
|
1440
|
-
version: "0.
|
|
1471
|
+
version: "0.7.1",
|
|
1441
1472
|
description: "Instalador interactivo de agentes y comandos para OpenCode",
|
|
1442
1473
|
type: "module",
|
|
1443
1474
|
bin: {
|
|
@@ -2493,7 +2524,13 @@ function validateMcpModule(nodeExecutable, serverPath, cwd) {
|
|
|
2493
2524
|
throw new Error(`El MCP no pasó la validación de carga: ${error.message}`);
|
|
2494
2525
|
}
|
|
2495
2526
|
}
|
|
2496
|
-
|
|
2527
|
+
var DEFAULT_PROBE_OPTIONS = {
|
|
2528
|
+
requiredTools: ["ping", "start_request"],
|
|
2529
|
+
exerciseWrite: true
|
|
2530
|
+
};
|
|
2531
|
+
async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath, options = {}) {
|
|
2532
|
+
const requiredTools = options.requiredTools ?? DEFAULT_PROBE_OPTIONS.requiredTools;
|
|
2533
|
+
const exerciseWrite = options.exerciseWrite ?? requiredTools.includes("start_request");
|
|
2497
2534
|
try {
|
|
2498
2535
|
await new Promise((resolve2, reject) => {
|
|
2499
2536
|
const child = spawn(nodeExecutable, [serverPath], {
|
|
@@ -2562,17 +2599,22 @@ async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath) {
|
|
|
2562
2599
|
}
|
|
2563
2600
|
if (message.id === 2) {
|
|
2564
2601
|
const tools = message.result?.tools ?? [];
|
|
2565
|
-
|
|
2566
|
-
|
|
2602
|
+
const missing = requiredTools.filter((name) => !tools.some((tool) => tool.name === name));
|
|
2603
|
+
if (missing.length > 0) {
|
|
2604
|
+
fail(`El MCP inició pero no expuso las tools requeridas: ${missing.join(", ")}`);
|
|
2567
2605
|
return;
|
|
2568
2606
|
}
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2607
|
+
if (exerciseWrite) {
|
|
2608
|
+
send({
|
|
2609
|
+
jsonrpc: "2.0",
|
|
2610
|
+
id: 3,
|
|
2611
|
+
method: "tools/call",
|
|
2612
|
+
params: { name: "start_request", arguments: { requestId: "installer-probe" } }
|
|
2613
|
+
});
|
|
2614
|
+
continue;
|
|
2615
|
+
}
|
|
2616
|
+
finish();
|
|
2617
|
+
return;
|
|
2576
2618
|
}
|
|
2577
2619
|
if (message.id === 3) {
|
|
2578
2620
|
const result = message.result;
|
|
@@ -2591,7 +2633,7 @@ async function probeMcpServer(nodeExecutable, serverPath, cwd, statePath) {
|
|
|
2591
2633
|
params: {
|
|
2592
2634
|
protocolVersion: "2025-03-26",
|
|
2593
2635
|
capabilities: {},
|
|
2594
|
-
clientInfo: { name: "ostacky-installer", version: "0.
|
|
2636
|
+
clientInfo: { name: "ostacky-installer", version: "0.7.1" }
|
|
2595
2637
|
}
|
|
2596
2638
|
});
|
|
2597
2639
|
});
|
|
@@ -2691,6 +2733,29 @@ async function installSkill(item, manifest, paths) {
|
|
|
2691
2733
|
copyDirRecursive(src, dest);
|
|
2692
2734
|
upsertLockfile(paths, "skills", item, manifest, treeHash);
|
|
2693
2735
|
}
|
|
2736
|
+
function pruneStaleSkills(paths, manifest) {
|
|
2737
|
+
const expected = new Set(manifest.skills.map((s) => s.name));
|
|
2738
|
+
const removed = [];
|
|
2739
|
+
if (!existsSync5(paths.skills))
|
|
2740
|
+
return removed;
|
|
2741
|
+
for (const entry of readdirSync2(paths.skills)) {
|
|
2742
|
+
const dir = join6(paths.skills, entry);
|
|
2743
|
+
try {
|
|
2744
|
+
if (!statSync2(dir).isDirectory())
|
|
2745
|
+
continue;
|
|
2746
|
+
} catch {
|
|
2747
|
+
continue;
|
|
2748
|
+
}
|
|
2749
|
+
if (!expected.has(entry)) {
|
|
2750
|
+
try {
|
|
2751
|
+
rmSync3(dir, { recursive: true, force: true });
|
|
2752
|
+
removeFromLockfile(paths.root, "skills", entry);
|
|
2753
|
+
removed.push(entry);
|
|
2754
|
+
} catch {}
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
return removed;
|
|
2758
|
+
}
|
|
2694
2759
|
async function installMcpServer(item, manifest, paths) {
|
|
2695
2760
|
const src = getBundledMcpPath(item.name);
|
|
2696
2761
|
if (!existsSync5(src)) {
|
|
@@ -2738,7 +2803,9 @@ async function installMcpServer(item, manifest, paths) {
|
|
|
2738
2803
|
throw new Error(`El MCP ${item.name} no contiene index.js después de instalarse.`);
|
|
2739
2804
|
}
|
|
2740
2805
|
validateMcpModule(nodeExecutable, stagedServerPath, staging);
|
|
2741
|
-
|
|
2806
|
+
const isController = item.name === "ostacky-controller";
|
|
2807
|
+
const probeOptions = isController ? { requiredTools: ["ping", "start_request"], exerciseWrite: true } : { requiredTools: [], exerciseWrite: false };
|
|
2808
|
+
await probeMcpServer(nodeExecutable, stagedServerPath, staging, isController ? join6(staging, ".probe-state.json") : undefined, probeOptions);
|
|
2742
2809
|
const configPath = findOpenCodeConfig(projectRoot) ?? join6(projectRoot, "opencode.json");
|
|
2743
2810
|
const configSnapshot = takeFileSnapshot(configPath);
|
|
2744
2811
|
const lockfileSnapshot = takeFileSnapshot(getLockfilePath(paths.root));
|
|
@@ -3069,6 +3136,10 @@ async function doInstallAll(manifest, paths) {
|
|
|
3069
3136
|
errors++;
|
|
3070
3137
|
}
|
|
3071
3138
|
}
|
|
3139
|
+
const pruned = pruneStaleSkills(paths, manifest);
|
|
3140
|
+
if (pruned.length > 0) {
|
|
3141
|
+
v2.info(`Skills obsoletas removidas: ${pruned.join(", ")}`);
|
|
3142
|
+
}
|
|
3072
3143
|
for (const mcp of manifest.mcpServers ?? []) {
|
|
3073
3144
|
spin.start(`Instalando MCP server: ${mcp.name} (${mcp.version})`);
|
|
3074
3145
|
try {
|
|
@@ -3282,6 +3353,10 @@ async function doUpdate(manifest, paths) {
|
|
|
3282
3353
|
}
|
|
3283
3354
|
}
|
|
3284
3355
|
v2.success(`${updated} recurso(s) actualizado(s).`);
|
|
3356
|
+
const pruned = pruneStaleSkills(paths, manifest);
|
|
3357
|
+
if (pruned.length > 0) {
|
|
3358
|
+
v2.info(`Skills obsoletas removidas del filesystem: ${pruned.join(", ")}`);
|
|
3359
|
+
}
|
|
3285
3360
|
}
|
|
3286
3361
|
|
|
3287
3362
|
// src/prompts/uninstall.ts
|
package/manifest.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.7.1",
|
|
3
3
|
"repo": "JaimeHoracio/Ostacky",
|
|
4
|
-
"tag": "v0.
|
|
4
|
+
"tag": "v0.7.1",
|
|
5
5
|
"agents": [
|
|
6
6
|
{
|
|
7
7
|
"name": "ostacky",
|
|
8
8
|
"file": "assets/agents/ostacky.md",
|
|
9
|
-
"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",
|
|
10
|
-
"version": "0.
|
|
11
|
-
"sha256": "
|
|
9
|
+
"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.7.1: prune de skills obsoletas, lastHandoff, getAvailableTransitions, consecutiveFailures real, mem_session_summary automático al cierre.",
|
|
10
|
+
"version": "0.7.1",
|
|
11
|
+
"sha256": "f833e69b6eaa3dfe24de9addf6455b3da55f829b51cba3c7c90c65c69cda34c2"
|
|
12
12
|
}
|
|
13
13
|
],
|
|
14
14
|
"commands": [
|
|
15
15
|
{
|
|
16
16
|
"name": "install-stack",
|
|
17
17
|
"file": "assets/commands/install-stack.md",
|
|
18
|
-
"description": "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, Context7, controller MCP con SDK oficial)",
|
|
19
|
-
"version": "0.
|
|
20
|
-
"sha256": "
|
|
18
|
+
"description": "Instala el stack tecnológico del proyecto (CodeGraph, skills, OpenSpec, Engram, Context7, controller MCP con SDK oficial). v0.7.1: Paso 1.5 controller expandido con verificación post-instalación y troubleshooting.",
|
|
19
|
+
"version": "0.7.1",
|
|
20
|
+
"sha256": "ef4244855cf733dfe50a2a8e7c436c5741f92574cc50f0fca49faed60480e013"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"name": "opsx-sync",
|
|
24
24
|
"file": "assets/commands/opsx-sync.md",
|
|
25
25
|
"description": "Sincroniza delta specs del change activo sin inicializar CodeGraph si ya existe índice",
|
|
26
|
-
"version": "0.
|
|
26
|
+
"version": "0.7.1",
|
|
27
27
|
"sha256": "fe0158478f2ca63b315037a85fc1632b77868532e319af6c7384285441767d64"
|
|
28
28
|
}
|
|
29
29
|
],
|
|
@@ -31,15 +31,15 @@
|
|
|
31
31
|
{
|
|
32
32
|
"name": "ostacky-controller",
|
|
33
33
|
"file": "assets/mcp/ostacky-controller/",
|
|
34
|
-
"description": "Máquina de estados persistida con @modelcontextprotocol/server SDK.
|
|
35
|
-
"version": "0.
|
|
36
|
-
"sha256": "
|
|
34
|
+
"description": "Máquina de estados persistida con @modelcontextprotocol/server SDK. v0.7.1: 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.",
|
|
35
|
+
"version": "0.7.1",
|
|
36
|
+
"sha256": "0e639fb1d5bedf8b93b4e259782b9b7de68cd4bb89875e2c546279d17131b7b7"
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"name": "openspec",
|
|
40
40
|
"file": "assets/mcp/openspec/",
|
|
41
41
|
"description": "MCP server local para OpenSpec - proposal, apply, archive, sync de cambios",
|
|
42
|
-
"version": "0.
|
|
42
|
+
"version": "0.7.1",
|
|
43
43
|
"sha256": "fa4be28bfc1e75db8f1a037e2580f04a60066c80e8e5934e90e1041020d04609"
|
|
44
44
|
}
|
|
45
45
|
],
|
|
@@ -47,114 +47,107 @@
|
|
|
47
47
|
{
|
|
48
48
|
"name": "brainstorming",
|
|
49
49
|
"file": "assets/skills/brainstorming/SKILL.md",
|
|
50
|
-
"description": "Skill unificado de pensamiento con dos modos: creative-design (producción de diseño → transición a
|
|
51
|
-
"version": "0.
|
|
52
|
-
"sha256": "
|
|
50
|
+
"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)",
|
|
51
|
+
"version": "0.7.1",
|
|
52
|
+
"sha256": "333810ca63450e8ab795e8c5a58e645101e788d79210ca8ac36e10d11be39585"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"name": "execution-mode-evaluation",
|
|
56
56
|
"file": "assets/skills/execution-mode-evaluation/SKILL.md",
|
|
57
57
|
"description": "Skill de análisis de modo de ejecución — output reconciliado con controller snapshot contract (recommendation field)",
|
|
58
|
-
"version": "0.
|
|
59
|
-
"sha256": "
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"name": "writing-plans",
|
|
63
|
-
"file": "assets/skills/writing-plans/SKILL.md",
|
|
64
|
-
"description": "Skill de planificación de implementación (Superpowers) — execution handoff removido, Ostacky decide modo de ejecución",
|
|
65
|
-
"version": "0.6.3",
|
|
66
|
-
"sha256": "9b14903231df96f54da08158c117801b18bba8f5a2e5a0c069854d059e99f294"
|
|
58
|
+
"version": "0.7.1",
|
|
59
|
+
"sha256": "edf6fca0af52cce83f8fd08e7db9b3d79cc130b53fca505e90d3fbaf4909338b"
|
|
67
60
|
},
|
|
68
61
|
{
|
|
69
62
|
"name": "tdd",
|
|
70
63
|
"file": "assets/skills/tdd/SKILL.md",
|
|
71
64
|
"description": "Skill de test-driven development (Superpowers)",
|
|
72
|
-
"version": "0.
|
|
65
|
+
"version": "0.7.1",
|
|
73
66
|
"sha256": "aa412298980b7826165c211145c1b8e9135f68f36247bb3cb96d0a0eae274486"
|
|
74
67
|
},
|
|
75
68
|
{
|
|
76
69
|
"name": "subagent-driven-development",
|
|
77
70
|
"file": "assets/skills/subagent-driven-development/SKILL.md",
|
|
78
71
|
"description": "Skill de ejecución con subagentes (Superpowers) — ejecuta solo después de confirmación del coordinador Ostacky",
|
|
79
|
-
"version": "0.
|
|
80
|
-
"sha256": "
|
|
72
|
+
"version": "0.7.1",
|
|
73
|
+
"sha256": "1a42d714a9a13faf05f0bf7b580e8d837c2e77a5633839542ccce603023419e8"
|
|
81
74
|
},
|
|
82
75
|
{
|
|
83
76
|
"name": "dispatching-parallel-agents",
|
|
84
77
|
"file": "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
85
78
|
"description": "Skill de dispatch paralelo de agentes (Superpowers)",
|
|
86
|
-
"version": "0.
|
|
79
|
+
"version": "0.7.1",
|
|
87
80
|
"sha256": "3c8a66d51ae2e719e877d02c3dac32bd804722c3bb9227c258ecae78252a20ab"
|
|
88
81
|
},
|
|
89
82
|
{
|
|
90
83
|
"name": "review",
|
|
91
84
|
"file": "assets/skills/review/SKILL.md",
|
|
92
85
|
"description": "Skill de revisión de código (Superpowers)",
|
|
93
|
-
"version": "0.
|
|
94
|
-
"sha256": "
|
|
86
|
+
"version": "0.7.1",
|
|
87
|
+
"sha256": "b19650ed4d1d4d9857a4dd5b7e08e91328a1a1fc9c45bcc2fb600fa9d0213279"
|
|
95
88
|
},
|
|
96
89
|
{
|
|
97
90
|
"name": "receiving-code-review",
|
|
98
91
|
"file": "assets/skills/receiving-code-review/SKILL.md",
|
|
99
92
|
"description": "Skill de recibir y procesar feedback de code review",
|
|
100
|
-
"version": "0.
|
|
93
|
+
"version": "0.7.1",
|
|
101
94
|
"sha256": "d761e884e71d8d3476ac734d287cae403a4024506a7d12e7361a448217c0a831"
|
|
102
95
|
},
|
|
103
96
|
{
|
|
104
97
|
"name": "openspec-propose",
|
|
105
98
|
"file": "assets/skills/openspec-propose/SKILL.md",
|
|
106
99
|
"description": "Skill de generación de proposal (OpenSpec)",
|
|
107
|
-
"version": "0.
|
|
108
|
-
"sha256": "
|
|
100
|
+
"version": "0.7.1",
|
|
101
|
+
"sha256": "bb59100b9fd3c9f9a1ec6509fa975ec55bf7fc737df4fe73bb3e9bbc217b83f7"
|
|
109
102
|
},
|
|
110
103
|
{
|
|
111
104
|
"name": "openspec-apply-change",
|
|
112
105
|
"file": "assets/skills/openspec-apply-change/SKILL.md",
|
|
113
106
|
"description": "Skill de aplicación de change (OpenSpec)",
|
|
114
|
-
"version": "0.
|
|
115
|
-
"sha256": "
|
|
107
|
+
"version": "0.7.1",
|
|
108
|
+
"sha256": "dfc823bf89fc7505e91ab6dee9c1f004be38a410bd3d88fb67b211b1b6cbb1d0"
|
|
116
109
|
},
|
|
117
110
|
{
|
|
118
111
|
"name": "openspec-archive-change",
|
|
119
112
|
"file": "assets/skills/openspec-archive-change/SKILL.md",
|
|
120
113
|
"description": "Skill de archivo de change (OpenSpec)",
|
|
121
|
-
"version": "0.
|
|
114
|
+
"version": "0.7.1",
|
|
122
115
|
"sha256": "16e4b561de7747283663fed602e506abf502452c49a8d4b86d7a5539c40f0195"
|
|
123
116
|
},
|
|
124
117
|
{
|
|
125
118
|
"name": "openspec-explore",
|
|
126
119
|
"file": "assets/skills/openspec-explore/SKILL.md",
|
|
127
120
|
"description": "Modo explore para OpenSpec — thinking partner para explorar ideas, investigar problemas y clarificar requisitos antes/durante un cambio",
|
|
128
|
-
"version": "0.
|
|
121
|
+
"version": "0.7.1",
|
|
129
122
|
"sha256": "37ae4aaf17ea71a395bab6dc4d9d61b9a49d7910f6692535ae8553244c46880b"
|
|
130
123
|
},
|
|
131
124
|
{
|
|
132
125
|
"name": "using-git-worktrees",
|
|
133
126
|
"file": "assets/skills/using-git-worktrees/SKILL.md",
|
|
134
127
|
"description": "Skill de uso de git worktrees para aislamiento de trabajo",
|
|
135
|
-
"version": "0.
|
|
128
|
+
"version": "0.7.1",
|
|
136
129
|
"sha256": "11afa9123828fc5caa22137aff907cd99c751e99027fbd4c020751110a949281"
|
|
137
130
|
},
|
|
138
131
|
{
|
|
139
132
|
"name": "using-superpowers",
|
|
140
133
|
"file": "assets/skills/using-superpowers/SKILL.md",
|
|
141
134
|
"description": "Skill de orquestación de Superpowers skills",
|
|
142
|
-
"version": "0.
|
|
135
|
+
"version": "0.7.1",
|
|
143
136
|
"sha256": "7e54536f96d2a379185a10bfc1e970850caa2561b6d8aca7080f0defea0381a4"
|
|
144
137
|
},
|
|
145
138
|
{
|
|
146
139
|
"name": "writing-skills",
|
|
147
140
|
"file": "assets/skills/writing-skills/SKILL.md",
|
|
148
141
|
"description": "Skill de creación y edición de skills",
|
|
149
|
-
"version": "0.
|
|
142
|
+
"version": "0.7.1",
|
|
150
143
|
"sha256": "3d76b906cee518a2b809febb70db95697a35b9f368986bb504b4120c3bfb437a"
|
|
151
144
|
},
|
|
152
145
|
{
|
|
153
146
|
"name": "graceful-degradation",
|
|
154
147
|
"file": "assets/skills/graceful-degradation/SKILL.md",
|
|
155
148
|
"description": "Skill de degradación graceful cuando múltiples tools están indisponibles",
|
|
156
|
-
"version": "0.
|
|
157
|
-
"sha256": "
|
|
149
|
+
"version": "0.7.1",
|
|
150
|
+
"sha256": "e5090e475729f21871bb25bce738000f3616955ed3edb3ba926dd740d3298948"
|
|
158
151
|
}
|
|
159
152
|
]
|
|
160
153
|
}
|