ostacky 0.1.0 → 0.1.2

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 CHANGED
@@ -156,20 +156,20 @@ Tras instalar, el proyecto queda así:
156
156
 
157
157
  ```json
158
158
  {
159
- "version": "0.1.0",
159
+ "version": "0.1.2",
160
160
  "lockedAt": "2025-01-01T00:00:00.000Z",
161
161
  "repo": "JaimeHoracio/Ostacky",
162
- "tag": "v0.1.0",
162
+ "tag": "v0.1.2",
163
163
  "agents": {
164
164
  "ostacky": {
165
- "version": "0.1.0",
165
+ "version": "0.1.2",
166
166
  "installedAt": "2025-01-01T00:00:00.000Z",
167
167
  "sha256": "abc123..."
168
168
  }
169
169
  },
170
170
  "commands": {
171
171
  "install-stack": {
172
- "version": "0.1.0",
172
+ "version": "0.1.2",
173
173
  "installedAt": "2025-01-01T00:00:00.000Z",
174
174
  "sha256": "def456..."
175
175
  }
@@ -201,7 +201,7 @@ Ese paso es opcional. Si no aparece en la terminal, recargá OpenCode y volvé a
201
201
  ## Seguridad
202
202
 
203
203
  - `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
204
- - Las URLs de descarga usan **tags de GitHub** (ej. `v0.1.0`), nunca `main` — instalaciones reproducibles
204
+ - Las URLs de descarga usan **tags de GitHub** (ej. `v0.1.2`), nunca `main` — instalaciones reproducibles
205
205
  - Cada path de archivo descargado es validado para prevenir **path traversal**
206
206
  - Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
207
207
  - El cache local (`~/.opencode/cache/`) también valida integridad al servir archivos cacheados
@@ -222,68 +222,6 @@ Los archivos descargados se guardan en:
222
222
 
223
223
  Si ya existe un archivo en cache con el hash correcto, no se hace ninguna petición de red.
224
224
 
225
- ## Desarrollo
226
-
227
- > Los pasos de esta sección son **solo para quienes quieran contribuir o modificar el código**. Si eres usuario final, no necesitas ejecutar nada de esto — basta con `npx ostacky`.
228
-
229
- ### Requisitos adicionales para desarrollo
230
-
231
- - [Bun](https://bun.sh/) >= 1.x
232
-
233
- ### 1. Clonar e instalar dependencias
234
-
235
- ```bash
236
- git clone https://github.com/JaimeHoracio/Ostacky.git
237
- cd Ostacky
238
- bun install
239
- ```
240
-
241
- `bun install` descarga todas las dependencias definidas en `package.json` (incluyendo TypeScript y los tipos de Bun).
242
-
243
- ### 2. Ejecutar en modo desarrollo
244
-
245
- ```bash
246
- bun run dev
247
- # equivalente a: bun run src/cli.ts
248
- ```
249
-
250
- ### 3. Compilar la CLI
251
-
252
- La CLI se distribuye como un ejecutable JavaScript en `dist/cli.js`. Para generarlo:
253
-
254
- ```bash
255
- bun run build
256
- ```
257
-
258
- Este comando ejecuta internamente:
259
-
260
- ```bash
261
- bun build src/cli.ts --target=node --format=esm --outfile dist/cli.js && bun scripts/add-shebang.ts
262
- ```
263
-
264
- Tras compilar deberías obtener:
265
-
266
- ```
267
- dist/
268
- └── cli.js
269
- ```
270
-
271
- ### 4. Probar el binario compilado
272
-
273
- ```bash
274
- node dist/cli.js
275
- # o
276
- bun run start
277
- ```
278
-
279
- ### Publicar en npm
280
-
281
- El script `prepublishOnly` ejecuta `bun run build` automáticamente antes de publicar, por lo que `dist/` siempre estará actualizado al publicar.
282
-
283
- ```bash
284
- npm publish
285
- ```
286
-
287
225
  ## Licencia
288
226
 
289
227
  MIT
@@ -3,7 +3,7 @@ description: Instala CodeGraph, skills curadas y OpenSpec localmente para OpenCo
3
3
  agent: build
4
4
  ---
5
5
 
6
- Instala el stack tecnológico de desarrollo para este proyecto, basado en el set curado de 10 skills bundleado dentro del paquete Ostacky.
6
+ Instala el stack tecnológico de desarrollo. NOTA: `npx ostacky install` ahora instala automáticamente CodeGraph, OpenSpec y Engram. Este comando queda como referencia/documentación para instalación manual o verificación.
7
7
 
8
8
  **RESTRICCIÓN ABSOLUTA:** instalar ÚNICAMENTE para OpenCode. Está terminantemente prohibido crear o modificar archivos en `.claude/`, `.kiro/`, `.cursor/`, `.gemini/`, `.codex/`, `.antigravity/`, `.windsurf/` o cualquier otro directorio de plataformas externas.
9
9
 
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.1.0",
164
+ version: "0.1.2",
165
165
  description: "Instalador interactivo de agentes y comandos para OpenCode",
166
166
  type: "module",
167
167
  bin: {
@@ -189,7 +189,7 @@ var package_default = {
189
189
  license: "MIT",
190
190
  dependencies: {
191
191
  "@clack/prompts": "^0.9.0",
192
- settings: "^0.1.1"
192
+ settings: "^0.1.2"
193
193
  },
194
194
  devDependencies: {
195
195
  "@types/bun": "latest",
@@ -877,15 +877,15 @@ var L2 = () => {
877
877
  import { join as join5 } from "path";
878
878
  // manifest.json
879
879
  var manifest_default = {
880
- version: "0.1.0",
880
+ version: "0.1.2",
881
881
  repo: "JaimeHoracio/Ostacky",
882
- tag: "v0.1.0",
882
+ tag: "v0.1.2",
883
883
  agents: [
884
884
  {
885
885
  name: "ostacky",
886
886
  file: "assets/agents/ostacky.md",
887
887
  description: "Agente principal de desarrollo con ejecución inline-first y local-first",
888
- version: "0.1.0",
888
+ version: "0.1.2",
889
889
  sha256: null
890
890
  }
891
891
  ],
@@ -894,14 +894,14 @@ var manifest_default = {
894
894
  name: "install-stack",
895
895
  file: "assets/commands/install-stack.md",
896
896
  description: "Instala el stack tecnológico del proyecto",
897
- version: "0.1.0",
897
+ version: "0.1.2",
898
898
  sha256: null
899
899
  },
900
900
  {
901
901
  name: "opsx-sync",
902
902
  file: "assets/commands/opsx-sync.md",
903
903
  description: "Sincroniza delta specs del change activo (wrapper de openspec update)",
904
- version: "0.1.0",
904
+ version: "0.1.2",
905
905
  sha256: null
906
906
  }
907
907
  ],
@@ -910,71 +910,71 @@ var manifest_default = {
910
910
  name: "brainstorming",
911
911
  file: "assets/skills/brainstorming/SKILL.md",
912
912
  description: "Skill de descubrimiento y exploración (Superpowers)",
913
- version: "0.1.0",
914
- sha256: "22be76380b086c4ac6d38b8b124f6f7df47c32a67237a6ceaf8c7fd19aa524b0"
913
+ version: "0.1.2",
914
+ sha256: "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
915
915
  },
916
916
  {
917
917
  name: "writing-plans",
918
918
  file: "assets/skills/writing-plans/SKILL.md",
919
919
  description: "Skill de planificación de implementación (Superpowers)",
920
- version: "0.1.0",
921
- sha256: "4d56ce833af79c628e72cd95b06d13597131a09f9d98aae0a42c6a98a8ee1b95"
920
+ version: "0.1.2",
921
+ sha256: "4d675df944b9c846e9066ff971861ad1c9673cd2c88375081b00a75872ad621a"
922
922
  },
923
923
  {
924
924
  name: "tdd",
925
925
  file: "assets/skills/tdd/SKILL.md",
926
926
  description: "Skill de test-driven development (Superpowers)",
927
- version: "0.1.0",
928
- sha256: "b5cd98b3c122162b5a5eac3c78858a64ba165bf4e8c251d8a804a593c0c72312"
927
+ version: "0.1.2",
928
+ sha256: "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
929
929
  },
930
930
  {
931
931
  name: "subagent-driven-development",
932
932
  file: "assets/skills/subagent-driven-development/SKILL.md",
933
933
  description: "Skill de ejecución con subagentes (Superpowers)",
934
- version: "0.1.0",
935
- sha256: "7534b60788e05644831347194b1f99bcb41e2eda130994cfddafee3146ba63bd"
934
+ version: "0.1.2",
935
+ sha256: "14e0f685b1dc1d7e02b7226d18f037fe4b6cba49b512a1fadf67cfad2a9dcc96"
936
936
  },
937
937
  {
938
938
  name: "dispatching-parallel-agents",
939
939
  file: "assets/skills/dispatching-parallel-agents/SKILL.md",
940
940
  description: "Skill de dispatch paralelo de agentes (Superpowers)",
941
- version: "0.1.0",
942
- sha256: "b7e99d62c5d2ade21a3b6cdc94a7f90772e23fe3294ca600386f192f6181f6b2"
941
+ version: "0.1.2",
942
+ sha256: "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
943
943
  },
944
944
  {
945
945
  name: "review",
946
946
  file: "assets/skills/review/SKILL.md",
947
947
  description: "Skill de revisión de código (Superpowers)",
948
- version: "0.1.0",
949
- sha256: "af8fd392835967111e865f170d90d3dd9b8266b517ffb7d551dffda704500a90"
948
+ version: "0.1.2",
949
+ sha256: "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
950
950
  },
951
951
  {
952
952
  name: "openspec-explore",
953
953
  file: "assets/skills/openspec-explore/SKILL.md",
954
954
  description: "Skill de exploración pre-spec (OpenSpec)",
955
- version: "0.1.0",
956
- sha256: "c3eaff7d64b7e5e757b120dd231d2e6b56e9f440055dc9ab5431b466d6244bd7"
955
+ version: "0.1.2",
956
+ sha256: "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
957
957
  },
958
958
  {
959
959
  name: "openspec-propose",
960
960
  file: "assets/skills/openspec-propose/SKILL.md",
961
961
  description: "Skill de generación de proposal (OpenSpec)",
962
- version: "0.1.0",
963
- sha256: "28c59bdce6e9af0ab07102b2e6d0b47a0f0dc2f1bfb8321576d47f6c240e778b"
962
+ version: "0.1.2",
963
+ sha256: "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
964
964
  },
965
965
  {
966
966
  name: "openspec-apply-change",
967
967
  file: "assets/skills/openspec-apply-change/SKILL.md",
968
968
  description: "Skill de aplicación de change (OpenSpec)",
969
- version: "0.1.0",
970
- sha256: "8fa8182e40fd92cefbbcc1e303d9aa9c02e2b7f3f2c0625cb61fb916e4fc5760"
969
+ version: "0.1.2",
970
+ sha256: "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
971
971
  },
972
972
  {
973
973
  name: "openspec-archive-change",
974
974
  file: "assets/skills/openspec-archive-change/SKILL.md",
975
975
  description: "Skill de archivo de change (OpenSpec)",
976
- version: "0.1.0",
977
- sha256: "564b8dca28084c75ca192137113e9186c4fb31d2de0e26c081fd67c37f7d4a56"
976
+ version: "0.1.2",
977
+ sha256: "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
978
978
  }
979
979
  ]
980
980
  };
@@ -1159,7 +1159,7 @@ function clearLockfile(opencodeRoot) {
1159
1159
  const lockfile = readLockfile(opencodeRoot);
1160
1160
  if (!lockfile) {
1161
1161
  writeLockfile(opencodeRoot, {
1162
- version: "0.1.0",
1162
+ version: "0.1.2",
1163
1163
  lockedAt: new Date().toISOString(),
1164
1164
  repo: "",
1165
1165
  tag: "",
@@ -1177,6 +1177,7 @@ function clearLockfile(opencodeRoot) {
1177
1177
  }
1178
1178
 
1179
1179
  // src/installer.ts
1180
+ import { execSync } from "child_process";
1180
1181
  function findOpenCodeDir(startDir = process.cwd()) {
1181
1182
  let current = resolve(startDir);
1182
1183
  while (true) {
@@ -1363,6 +1364,184 @@ function uninstallAll(paths) {
1363
1364
  }
1364
1365
  clearLockfile(paths.root);
1365
1366
  }
1367
+ function isCommandAvailable(cmd) {
1368
+ try {
1369
+ if (process.platform === "win32") {
1370
+ execSync(`where ${cmd} >nul 2>&1`);
1371
+ } else {
1372
+ execSync(`which ${cmd} >/dev/null 2>&1`);
1373
+ }
1374
+ return true;
1375
+ } catch {
1376
+ return false;
1377
+ }
1378
+ }
1379
+ function installCodeGraph() {
1380
+ if (!isCommandAvailable("codegraph")) {
1381
+ try {
1382
+ if (process.platform === "win32") {
1383
+ execSync('powershell -c "irm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iex"', { stdio: "inherit", timeout: 120000 });
1384
+ } else {
1385
+ execSync("curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh", { stdio: "inherit", timeout: 120000 });
1386
+ }
1387
+ if (!isCommandAvailable("codegraph")) {
1388
+ return {
1389
+ success: false,
1390
+ message: "CodeGraph instalado pero no está en PATH. ¿Necesitás reiniciar la terminal?"
1391
+ };
1392
+ }
1393
+ } catch (e2) {
1394
+ return {
1395
+ success: false,
1396
+ message: `Error instalando CodeGraph: ${e2.message}`
1397
+ };
1398
+ }
1399
+ }
1400
+ try {
1401
+ execSync("codegraph install --target=opencode --location=local --yes", {
1402
+ stdio: "pipe",
1403
+ timeout: 60000
1404
+ });
1405
+ execSync("codegraph init -i", { stdio: "pipe", timeout: 120000 });
1406
+ return { success: true, message: "CodeGraph instalado y configurado para OpenCode" };
1407
+ } catch (e2) {
1408
+ return {
1409
+ success: false,
1410
+ message: `Error configurando CodeGraph: ${e2.message}`
1411
+ };
1412
+ }
1413
+ }
1414
+ function setupOpenSpec() {
1415
+ try {
1416
+ execSync("npx --yes openspec init --tools opencode --force", {
1417
+ stdio: "pipe",
1418
+ timeout: 120000
1419
+ });
1420
+ return { success: true, message: "OpenSpec configurado para OpenCode" };
1421
+ } catch (e2) {
1422
+ return {
1423
+ success: false,
1424
+ message: `Error configurando OpenSpec: ${e2.message}`
1425
+ };
1426
+ }
1427
+ }
1428
+ function installEngram() {
1429
+ if (isCommandAvailable("engram")) {
1430
+ try {
1431
+ execSync("engram setup opencode", { stdio: "pipe", timeout: 30000 });
1432
+ return { success: true, message: "Engram ya instalado y configurado para OpenCode" };
1433
+ } catch (e2) {
1434
+ return {
1435
+ success: false,
1436
+ message: `Error configurando Engram: ${e2.message}`
1437
+ };
1438
+ }
1439
+ }
1440
+ if (isCommandAvailable("go")) {
1441
+ try {
1442
+ execSync("go install github.com/Gentleman-Programming/engram/cmd/engram@latest", { stdio: "pipe", timeout: 120000 });
1443
+ if (isCommandAvailable("engram")) {
1444
+ execSync("engram setup opencode", { stdio: "pipe", timeout: 30000 });
1445
+ return { success: true, message: "Engram instalado via go install y configurado" };
1446
+ }
1447
+ } catch {}
1448
+ }
1449
+ if (isCommandAvailable("brew") && (process.platform === "darwin" || process.platform === "linux")) {
1450
+ try {
1451
+ execSync("brew install gentleman-programming/tap/engram", {
1452
+ stdio: "pipe",
1453
+ timeout: 120000
1454
+ });
1455
+ if (isCommandAvailable("engram")) {
1456
+ execSync("engram setup opencode", { stdio: "pipe", timeout: 30000 });
1457
+ return { success: true, message: "Engram instalado via Homebrew y configurado" };
1458
+ }
1459
+ } catch {}
1460
+ }
1461
+ return {
1462
+ success: false,
1463
+ message: `No se pudo instalar Engram automáticamente.
1464
+ ` + ` - Tenés Go? Ejecutá: go install github.com/Gentleman-Programming/engram/cmd/engram@latest
1465
+ ` + ` - O descargá el binario: https://github.com/Gentleman-Programming/engram/releases
1466
+ ` + " - Después ejecutá: engram setup opencode"
1467
+ };
1468
+ }
1469
+ function patchOpenCodeConfig() {
1470
+ const projectRoot = findProjectRoot();
1471
+ const candidates = ["opencode.json", "opencode.jsonc"];
1472
+ let configPath = null;
1473
+ for (const name of candidates) {
1474
+ const full = join4(projectRoot, name);
1475
+ if (existsSync3(full)) {
1476
+ configPath = full;
1477
+ break;
1478
+ }
1479
+ }
1480
+ if (!configPath) {
1481
+ return {
1482
+ success: false,
1483
+ message: "No se encontró opencode.json ni opencode.jsonc"
1484
+ };
1485
+ }
1486
+ try {
1487
+ const raw = readFileSync3(configPath, "utf-8");
1488
+ const config = JSON.parse(raw);
1489
+ let changed = false;
1490
+ if ("plugin" in config) {
1491
+ delete config.plugin;
1492
+ changed = true;
1493
+ }
1494
+ if (changed) {
1495
+ writeFileSync3(configPath, JSON.stringify(config, null, 2) + `
1496
+ `, "utf-8");
1497
+ return { success: true, message: "Config actualizada (plugin legacy eliminado)" };
1498
+ }
1499
+ return { success: true, message: "Config de OpenCode ya está limpia" };
1500
+ } catch (e2) {
1501
+ return {
1502
+ success: false,
1503
+ message: `Error parcheando config: ${e2.message}`
1504
+ };
1505
+ }
1506
+ }
1507
+ function uninstallEngramConfig() {
1508
+ const projectRoot = findProjectRoot();
1509
+ const candidates = ["opencode.json", "opencode.jsonc"];
1510
+ let configPath = null;
1511
+ for (const name of candidates) {
1512
+ const full = join4(projectRoot, name);
1513
+ if (existsSync3(full)) {
1514
+ configPath = full;
1515
+ break;
1516
+ }
1517
+ }
1518
+ if (!configPath) {
1519
+ return { success: false, message: "No se encontró opencode.json ni opencode.jsonc" };
1520
+ }
1521
+ try {
1522
+ const raw = readFileSync3(configPath, "utf-8");
1523
+ const config = JSON.parse(raw);
1524
+ let changed = false;
1525
+ if (config.mcp && "engram" in config.mcp) {
1526
+ delete config.mcp.engram;
1527
+ if (Object.keys(config.mcp).length === 0) {
1528
+ delete config.mcp;
1529
+ }
1530
+ changed = true;
1531
+ }
1532
+ if (!changed) {
1533
+ return { success: true, message: "Engram no estaba configurado en este proyecto" };
1534
+ }
1535
+ writeFileSync3(configPath, JSON.stringify(config, null, 2) + `
1536
+ `, "utf-8");
1537
+ return { success: true, message: "Config de Engram eliminada de opencode.json" };
1538
+ } catch (e2) {
1539
+ return {
1540
+ success: false,
1541
+ message: `Error limpiando config de Engram: ${e2.message}`
1542
+ };
1543
+ }
1544
+ }
1366
1545
 
1367
1546
  // src/prompts.ts
1368
1547
  function onCancel(value) {
@@ -1392,13 +1571,39 @@ async function loadLatestManifest() {
1392
1571
  function printPostInstallSteps() {
1393
1572
  ye([
1394
1573
  "Recargá OpenCode",
1395
- "Ejecutá /install-stack para instalar el stack",
1396
- "Recargá OpenCode nuevamente",
1397
1574
  "Usá @Ostacky para invocar al agente",
1398
- "Las skills bundleadas viven en .opencode/skills/ — revisá cuáles activás"
1575
+ "Las skills bundleadas viven en .opencode/skills/ — revisá cuáles activás",
1576
+ "Si ves errores en la instalación del stack, ejecutá /install-stack desde OpenCode como referencia"
1399
1577
  ].join(`
1400
1578
  → `), "Próximos pasos");
1401
1579
  }
1580
+ async function doInstallStack() {
1581
+ const spin = L2();
1582
+ let allOk = true;
1583
+ spin.start("Instalando CodeGraph...");
1584
+ const cg = installCodeGraph();
1585
+ spin.stop(cg.success ? `✓ ${cg.message}` : `✗ ${cg.message}`);
1586
+ if (!cg.success)
1587
+ allOk = false;
1588
+ spin.start("Configurando OpenSpec...");
1589
+ const os = setupOpenSpec();
1590
+ spin.stop(os.success ? `✓ ${os.message}` : `✗ ${os.message}`);
1591
+ if (!os.success)
1592
+ allOk = false;
1593
+ spin.start("Instalando Engram...");
1594
+ const eng = installEngram();
1595
+ spin.stop(eng.success ? `✓ ${eng.message}` : `✗ ${eng.message}`);
1596
+ if (!eng.success)
1597
+ allOk = false;
1598
+ spin.start("Verificando configuración...");
1599
+ const cfg = patchOpenCodeConfig();
1600
+ spin.stop(cfg.success ? `✓ ${cfg.message}` : `✗ ${cfg.message}`);
1601
+ if (!cfg.success)
1602
+ allOk = false;
1603
+ if (!allOk) {
1604
+ v2.warn("Algunos componentes requieren atención. Revisá los mensajes de error arriba.");
1605
+ }
1606
+ }
1402
1607
  async function resolveOpenCodePaths() {
1403
1608
  const existing = findOpenCodeDir();
1404
1609
  if (existing) {
@@ -1494,6 +1699,19 @@ async function doInstallAll(manifest, paths) {
1494
1699
  errors++;
1495
1700
  }
1496
1701
  }
1702
+ if (errors === 0) {
1703
+ v2.info("Instalando stack de herramientas...");
1704
+ await doInstallStack();
1705
+ }
1706
+ const missingTools = [];
1707
+ if (!isCommandAvailable("codegraph"))
1708
+ missingTools.push("CodeGraph");
1709
+ if (!isCommandAvailable("engram"))
1710
+ missingTools.push("Engram");
1711
+ if (missingTools.length > 0) {
1712
+ v2.warn(`Faltan herramientas del stack: ${missingTools.join(", ")}.
1713
+ ` + "Ejecutá `/install-stack` desde el agente para instalarlas manualmente.");
1714
+ }
1497
1715
  if (errors === 0) {
1498
1716
  v2.success("Todo instalado correctamente.");
1499
1717
  } else {
@@ -1763,6 +1981,18 @@ async function doUninstallTotal(paths) {
1763
1981
  }
1764
1982
  uninstallAll(paths);
1765
1983
  v2.success(`${pathsToDelete.length} item(s) eliminado(s).`);
1984
+ const cleanEngram = await me({
1985
+ message: "¿Deseas remover la configuración de Engram del proyecto (mcp.engram)?"
1986
+ });
1987
+ onCancel(cleanEngram);
1988
+ if (cleanEngram) {
1989
+ const result = uninstallEngramConfig();
1990
+ if (result.success) {
1991
+ v2.success(result.message);
1992
+ } else {
1993
+ v2.warn(result.message);
1994
+ }
1995
+ }
1766
1996
  }
1767
1997
  async function doUninstallAgent(paths) {
1768
1998
  const lockfile = readLockfile(paths.root);
@@ -2013,8 +2243,8 @@ var HELP = `
2013
2243
  ostacky — Instalador de agentes, comandos y skills para OpenCode
2014
2244
 
2015
2245
  Uso:
2016
- npx ostacky Menú interactivo
2017
- npx ostacky install Instalar todo
2246
+ npx ostacky Menú interactivo (instalación completa)
2247
+ npx ostacky install Instalar TODO (agente + skills + CodeGraph + OpenSpec + Engram)
2018
2248
  npx ostacky add agent Agregar agente(s)
2019
2249
  npx ostacky add command Agregar command(s)
2020
2250
  npx ostacky add skill Agregar skill(s)
package/manifest.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
- "version": "0.1.0",
2
+ "version": "0.1.2",
3
3
  "repo": "JaimeHoracio/Ostacky",
4
- "tag": "v0.1.0",
4
+ "tag": "v0.1.2",
5
5
  "agents": [
6
6
  {
7
7
  "name": "ostacky",
8
8
  "file": "assets/agents/ostacky.md",
9
9
  "description": "Agente principal de desarrollo con ejecución inline-first y local-first",
10
- "version": "0.1.0",
10
+ "version": "0.1.2",
11
11
  "sha256": null
12
12
  }
13
13
  ],
@@ -16,14 +16,14 @@
16
16
  "name": "install-stack",
17
17
  "file": "assets/commands/install-stack.md",
18
18
  "description": "Instala el stack tecnológico del proyecto",
19
- "version": "0.1.0",
19
+ "version": "0.1.2",
20
20
  "sha256": null
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 (wrapper de openspec update)",
26
- "version": "0.1.0",
26
+ "version": "0.1.2",
27
27
  "sha256": null
28
28
  }
29
29
  ],
@@ -32,71 +32,71 @@
32
32
  "name": "brainstorming",
33
33
  "file": "assets/skills/brainstorming/SKILL.md",
34
34
  "description": "Skill de descubrimiento y exploración (Superpowers)",
35
- "version": "0.1.0",
36
- "sha256": "22be76380b086c4ac6d38b8b124f6f7df47c32a67237a6ceaf8c7fd19aa524b0"
35
+ "version": "0.1.2",
36
+ "sha256": "ad15458c54912007ae3f708c698a11f0a4a58e2a7c7860a1ae8874db573c9e98"
37
37
  },
38
38
  {
39
39
  "name": "writing-plans",
40
40
  "file": "assets/skills/writing-plans/SKILL.md",
41
41
  "description": "Skill de planificación de implementación (Superpowers)",
42
- "version": "0.1.0",
43
- "sha256": "4d56ce833af79c628e72cd95b06d13597131a09f9d98aae0a42c6a98a8ee1b95"
42
+ "version": "0.1.2",
43
+ "sha256": "4d675df944b9c846e9066ff971861ad1c9673cd2c88375081b00a75872ad621a"
44
44
  },
45
45
  {
46
46
  "name": "tdd",
47
47
  "file": "assets/skills/tdd/SKILL.md",
48
48
  "description": "Skill de test-driven development (Superpowers)",
49
- "version": "0.1.0",
50
- "sha256": "b5cd98b3c122162b5a5eac3c78858a64ba165bf4e8c251d8a804a593c0c72312"
49
+ "version": "0.1.2",
50
+ "sha256": "7eacd8ee81dc5c0b85065c0392e37ee10314661f7edb59dd8e70a9e0dae8f371"
51
51
  },
52
52
  {
53
53
  "name": "subagent-driven-development",
54
54
  "file": "assets/skills/subagent-driven-development/SKILL.md",
55
55
  "description": "Skill de ejecución con subagentes (Superpowers)",
56
- "version": "0.1.0",
57
- "sha256": "7534b60788e05644831347194b1f99bcb41e2eda130994cfddafee3146ba63bd"
56
+ "version": "0.1.2",
57
+ "sha256": "14e0f685b1dc1d7e02b7226d18f037fe4b6cba49b512a1fadf67cfad2a9dcc96"
58
58
  },
59
59
  {
60
60
  "name": "dispatching-parallel-agents",
61
61
  "file": "assets/skills/dispatching-parallel-agents/SKILL.md",
62
62
  "description": "Skill de dispatch paralelo de agentes (Superpowers)",
63
- "version": "0.1.0",
64
- "sha256": "b7e99d62c5d2ade21a3b6cdc94a7f90772e23fe3294ca600386f192f6181f6b2"
63
+ "version": "0.1.2",
64
+ "sha256": "281edf0c38f358497c7e2066fa8217a2ba3e2a39b4205c4af0c41d328fc035a1"
65
65
  },
66
66
  {
67
67
  "name": "review",
68
68
  "file": "assets/skills/review/SKILL.md",
69
69
  "description": "Skill de revisión de código (Superpowers)",
70
- "version": "0.1.0",
71
- "sha256": "af8fd392835967111e865f170d90d3dd9b8266b517ffb7d551dffda704500a90"
70
+ "version": "0.1.2",
71
+ "sha256": "c78d3beff45e9bb6b5e9e1d7155910f379e082d7aaf3c61b90d651d09e0d2e2a"
72
72
  },
73
73
  {
74
74
  "name": "openspec-explore",
75
75
  "file": "assets/skills/openspec-explore/SKILL.md",
76
76
  "description": "Skill de exploración pre-spec (OpenSpec)",
77
- "version": "0.1.0",
78
- "sha256": "c3eaff7d64b7e5e757b120dd231d2e6b56e9f440055dc9ab5431b466d6244bd7"
77
+ "version": "0.1.2",
78
+ "sha256": "1c75cab8672c2eb8b12f27a0b31f0b7fdb73c21c72583c1e8a566e09fe4108a6"
79
79
  },
80
80
  {
81
81
  "name": "openspec-propose",
82
82
  "file": "assets/skills/openspec-propose/SKILL.md",
83
83
  "description": "Skill de generación de proposal (OpenSpec)",
84
- "version": "0.1.0",
85
- "sha256": "28c59bdce6e9af0ab07102b2e6d0b47a0f0dc2f1bfb8321576d47f6c240e778b"
84
+ "version": "0.1.2",
85
+ "sha256": "ab88e9aa22db09559ccf7987d08adc0469b7c6fbe46498e63a3b64926f19e66b"
86
86
  },
87
87
  {
88
88
  "name": "openspec-apply-change",
89
89
  "file": "assets/skills/openspec-apply-change/SKILL.md",
90
90
  "description": "Skill de aplicación de change (OpenSpec)",
91
- "version": "0.1.0",
92
- "sha256": "8fa8182e40fd92cefbbcc1e303d9aa9c02e2b7f3f2c0625cb61fb916e4fc5760"
91
+ "version": "0.1.2",
92
+ "sha256": "847c2f88a66e8d5946c1fec422a5367c89eca5340839b659bbaaeb6f0bdac487"
93
93
  },
94
94
  {
95
95
  "name": "openspec-archive-change",
96
96
  "file": "assets/skills/openspec-archive-change/SKILL.md",
97
97
  "description": "Skill de archivo de change (OpenSpec)",
98
- "version": "0.1.0",
99
- "sha256": "564b8dca28084c75ca192137113e9186c4fb31d2de0e26c081fd67c37f7d4a56"
98
+ "version": "0.1.2",
99
+ "sha256": "3d35905ec40a081b8fd77b144426e540c67b1f50cc5801b655313a4fdfaa087a"
100
100
  }
101
101
  ]
102
102
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ostacky",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Instalador interactivo de agentes y comandos para OpenCode",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,7 +28,7 @@
28
28
  "license": "MIT",
29
29
  "dependencies": {
30
30
  "@clack/prompts": "^0.9.0",
31
- "settings": "^0.1.1"
31
+ "settings": "^0.1.2"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/bun": "latest",
@@ -1,36 +0,0 @@
1
- ---
2
- name: brainstorming
3
- description: Discovery and exploration of user intent, requirements, and design
4
- source: github.com/obra/superpowers
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # brainstorming (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/obra/superpowers @ `ref: main`
14
- **Original path in upstream:** `skills/brainstorming/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/brainstorming/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/brainstorming/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/obra/superpowers.git`
34
- 2. Copy `skills/brainstorming/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: dispatching-parallel-agents
3
- description: Run multiple independent tasks in parallel via subagents
4
- source: github.com/obra/superpowers
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # dispatching-parallel-agents (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/obra/superpowers @ `ref: main`
14
- **Original path in upstream:** `skills/dispatching-parallel-agents/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/dispatching-parallel-agents/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/dispatching-parallel-agents/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/obra/superpowers.git`
34
- 2. Copy `skills/dispatching-parallel-agents/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: openspec-apply-change
3
- description: Implement tasks from an OpenSpec change
4
- source: github.com/Fission-AI/OpenSpec
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # openspec-apply-change (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/Fission-AI/OpenSpec @ `ref: main`
14
- **Original path in upstream:** `skills/openspec-apply-change/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/openspec-apply-change/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/openspec-apply-change/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/Fission-AI/OpenSpec.git`
34
- 2. Copy `skills/openspec-apply-change/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: openspec-archive-change
3
- description: Archive a completed change in the experimental workflow
4
- source: github.com/Fission-AI/OpenSpec
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # openspec-archive-change (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/Fission-AI/OpenSpec @ `ref: main`
14
- **Original path in upstream:** `skills/openspec-archive-change/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/openspec-archive-change/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/openspec-archive-change/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/Fission-AI/OpenSpec.git`
34
- 2. Copy `skills/openspec-archive-change/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: openspec-explore
3
- description: Enter explore mode to think through ideas before committing to a change
4
- source: github.com/Fission-AI/OpenSpec
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # openspec-explore (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/Fission-AI/OpenSpec @ `ref: main`
14
- **Original path in upstream:** `skills/openspec-explore/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/openspec-explore/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/openspec-explore/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/Fission-AI/OpenSpec.git`
34
- 2. Copy `skills/openspec-explore/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: openspec-propose
3
- description: Create a change proposal with all artifacts (proposal, design, tasks)
4
- source: github.com/Fission-AI/OpenSpec
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # openspec-propose (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/Fission-AI/OpenSpec @ `ref: main`
14
- **Original path in upstream:** `skills/openspec-propose/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/openspec-propose/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/openspec-propose/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/Fission-AI/OpenSpec.git`
34
- 2. Copy `skills/openspec-propose/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: review
3
- description: Review code changes for security, performance, bugs, and quality
4
- source: github.com/obra/superpowers
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # review (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/obra/superpowers @ `ref: main`
14
- **Original path in upstream:** `skills/review/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/review/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/review/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/obra/superpowers.git`
34
- 2. Copy `skills/review/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: subagent-driven-development
3
- description: Execute an implementation plan by delegating to specialized subagents
4
- source: github.com/obra/superpowers
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # subagent-driven-development (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/obra/superpowers @ `ref: main`
14
- **Original path in upstream:** `skills/subagent-driven-development/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/subagent-driven-development/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/subagent-driven-development/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/obra/superpowers.git`
34
- 2. Copy `skills/subagent-driven-development/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: tdd
3
- description: Test-driven development: failing test, minimal implementation, refactor
4
- source: github.com/obra/superpowers
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # tdd (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/obra/superpowers @ `ref: main`
14
- **Original path in upstream:** `skills/tdd/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/tdd/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/tdd/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/obra/superpowers.git`
34
- 2. Copy `skills/tdd/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`
@@ -1,36 +0,0 @@
1
- ---
2
- name: writing-plans
3
- description: Break a spec or requirements into a multi-step implementation plan
4
- source: github.com/obra/superpowers
5
- ref: main
6
- status: placeholder
7
- ---
8
-
9
- # writing-plans (placeholder)
10
-
11
- **Status:** placeholder. Real content must be fetched from upstream via `ostacky sync` (maintainer command).
12
-
13
- **Source:** github.com/obra/superpowers @ `ref: main`
14
- **Original path in upstream:** `skills/writing-plans/SKILL.md` (or equivalent — adjust per repo)
15
-
16
- ## What this skill does
17
-
18
- This file is a placeholder so the bundled installer can copy a complete directory
19
- structure into `.opencode/skills/writing-plans/`. The CLI hashes the directory tree and
20
- records the hash in the lockfile. Replacing this placeholder with the real
21
- upstream content is a maintainer task, not an end-user task.
22
-
23
- ## For end users
24
-
25
- If you ran `ostacky install` and see this file in your `.opencode/skills/writing-plans/`,
26
- your installation is working as designed. The curated set is intentionally small.
27
- To get the real skill content, ask the Ostacky maintainer to refresh the bundle.
28
-
29
- ## For maintainers
30
-
31
- To populate this placeholder with the real upstream content:
32
-
33
- 1. `git clone --depth=1 https://github.com/github.com/obra/superpowers.git`
34
- 2. Copy `skills/writing-plans/SKILL.md` (and `scripts/`, `references/` if present) to this directory
35
- 3. Update `manifest.json` with the computed tree hash for this skill
36
- 4. Bump version, `npm publish`