@johpaz/hive 1.1.3 → 1.1.5

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 (69) hide show
  1. package/package.json +5 -6
  2. package/packages/cli/dist/commands/agent-run.d.ts +1 -0
  3. package/packages/cli/dist/commands/agent-run.js +178 -0
  4. package/packages/cli/dist/commands/agents.d.ts +1 -0
  5. package/packages/cli/dist/commands/agents.js +372 -0
  6. package/packages/cli/dist/commands/chat.d.ts +1 -0
  7. package/packages/cli/dist/commands/chat.js +152 -0
  8. package/packages/cli/dist/commands/config.d.ts +1 -0
  9. package/packages/cli/dist/commands/config.js +49 -0
  10. package/packages/cli/dist/commands/cron.d.ts +1 -0
  11. package/packages/cli/dist/commands/cron.js +166 -0
  12. package/packages/cli/dist/commands/dev.d.ts +1 -0
  13. package/packages/cli/dist/commands/dev.js +120 -0
  14. package/packages/cli/dist/commands/doctor.d.ts +1 -0
  15. package/packages/cli/dist/commands/doctor.js +161 -0
  16. package/packages/cli/dist/commands/gateway.d.ts +4 -0
  17. package/packages/cli/dist/commands/gateway.js +444 -0
  18. package/packages/cli/dist/commands/logs.d.ts +1 -0
  19. package/packages/cli/dist/commands/logs.js +87 -0
  20. package/packages/cli/dist/commands/mcp.d.ts +1 -0
  21. package/packages/cli/dist/commands/mcp.js +175 -0
  22. package/packages/cli/dist/commands/message.d.ts +1 -0
  23. package/packages/cli/dist/commands/message.js +65 -0
  24. package/packages/cli/dist/commands/onboard.d.ts +1 -0
  25. package/packages/cli/dist/commands/onboard.js +1715 -0
  26. package/packages/cli/dist/commands/security.d.ts +1 -0
  27. package/packages/cli/dist/commands/security.js +155 -0
  28. package/packages/cli/dist/commands/service.d.ts +1 -0
  29. package/packages/cli/dist/commands/service.js +77 -0
  30. package/packages/cli/dist/commands/sessions.d.ts +1 -0
  31. package/packages/cli/dist/commands/sessions.js +132 -0
  32. package/packages/cli/dist/commands/skills.d.ts +1 -0
  33. package/packages/cli/dist/commands/skills.js +190 -0
  34. package/packages/cli/dist/commands/update.d.ts +1 -0
  35. package/packages/cli/dist/commands/update.js +27 -0
  36. package/packages/cli/dist/hive-binary +0 -0
  37. package/packages/cli/dist/index.d.ts +2 -0
  38. package/packages/cli/dist/index.js +184 -0
  39. package/packages/cli/dist/utils/token.d.ts +1 -0
  40. package/packages/cli/dist/utils/token.js +8 -0
  41. package/packages/cli/package.json +3 -1
  42. package/packages/core/package.json +9 -1
  43. package/packages/core/src/config/loader.d.ts +298 -0
  44. package/packages/core/src/config/loader.js +513 -0
  45. package/packages/core/src/storage/schema.d.ts +3 -0
  46. package/packages/core/src/storage/schema.js +541 -0
  47. package/packages/core/src/storage/sqlite.d.ts +51 -0
  48. package/packages/core/src/storage/sqlite.js +350 -0
  49. package/packages/core/src/utils/logger.d.ts +84 -0
  50. package/packages/core/src/utils/logger.js +352 -0
  51. package/packages/cli/src/commands/agent-run.ts +0 -168
  52. package/packages/cli/src/commands/agents.ts +0 -398
  53. package/packages/cli/src/commands/chat.ts +0 -142
  54. package/packages/cli/src/commands/config.ts +0 -50
  55. package/packages/cli/src/commands/cron.ts +0 -161
  56. package/packages/cli/src/commands/dev.ts +0 -95
  57. package/packages/cli/src/commands/doctor.ts +0 -133
  58. package/packages/cli/src/commands/gateway.ts +0 -443
  59. package/packages/cli/src/commands/logs.ts +0 -57
  60. package/packages/cli/src/commands/mcp.ts +0 -175
  61. package/packages/cli/src/commands/message.ts +0 -77
  62. package/packages/cli/src/commands/onboard.ts +0 -1868
  63. package/packages/cli/src/commands/security.ts +0 -144
  64. package/packages/cli/src/commands/service.ts +0 -50
  65. package/packages/cli/src/commands/sessions.ts +0 -116
  66. package/packages/cli/src/commands/skills.ts +0 -187
  67. package/packages/cli/src/commands/update.ts +0 -25
  68. package/packages/cli/src/index.ts +0 -185
  69. package/packages/cli/src/utils/token.ts +0 -6
@@ -0,0 +1 @@
1
+ export declare function securityAudit(): Promise<void>;
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.securityAudit = securityAudit;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const loader_1 = require("@johpaz/hive-core/config/loader");
40
+ const getHiveDirConst = () => (0, loader_1.getHiveDir)();
41
+ const getWorkspace = () => path.join(getHiveDirConst(), "workspace");
42
+ async function securityAudit() {
43
+ console.log("\n🔒 Hive Security Audit\n");
44
+ const results = [];
45
+ const config = (0, loader_1.loadConfig)();
46
+ // Red
47
+ results.push({ category: "Red", name: "Gateway bind", status: "ok", message: "127.0.0.1 (loopback)" });
48
+ results.push({ category: "Red", name: "Puerto", status: "ok", message: "18790 (no expuesto externamente)" });
49
+ const gateway = config.gateway;
50
+ const token = gateway?.authToken;
51
+ results.push({
52
+ category: "Red",
53
+ name: "Token bearer",
54
+ status: token && token.length > 0 ? "ok" : "warn",
55
+ message: token && token.length > 0 ? "configurado" : "no configurado",
56
+ });
57
+ // Archivos
58
+ const authProfiles = path.join(getHiveDirConst(), "auth-profiles.json");
59
+ if (fs.existsSync(authProfiles)) {
60
+ const stat = fs.statSync(authProfiles);
61
+ const mode = stat.mode & 0o777;
62
+ results.push({
63
+ category: "Archivos",
64
+ name: "auth-profiles.json permisos",
65
+ status: mode === 0o600 ? "ok" : "warn",
66
+ message: mode === 0o600 ? "600 (seguro)" : `${(mode).toString(8)} — ejecuta: chmod 600 ${authProfiles}`,
67
+ });
68
+ }
69
+ const envFile = path.join(getHiveDirConst(), ".env");
70
+ if (fs.existsSync(envFile)) {
71
+ const stat = fs.statSync(envFile);
72
+ const mode = stat.mode & 0o777;
73
+ results.push({
74
+ category: "Archivos",
75
+ name: ".env permisos",
76
+ status: mode === 0o600 ? "ok" : "warn",
77
+ message: mode === 0o600 ? "600 (seguro)" : `${(mode).toString(8)} — ejecuta: chmod 600 ${envFile}`,
78
+ });
79
+ }
80
+ // Configuración
81
+ const models = config.models;
82
+ const providers = models?.providers;
83
+ let hasHardcodedKey = false;
84
+ if (providers) {
85
+ for (const [, p] of Object.entries(providers)) {
86
+ const apiKey = p.apiKey;
87
+ if (apiKey && !apiKey.startsWith("${") && !apiKey.startsWith("process.env")) {
88
+ hasHardcodedKey = true;
89
+ }
90
+ }
91
+ }
92
+ results.push({
93
+ category: "Configuración",
94
+ name: "API keys",
95
+ status: !hasHardcodedKey ? "ok" : "warn",
96
+ message: !hasHardcodedKey ? "en variables de entorno" : "hardcodeadas en config — considera usar env vars",
97
+ });
98
+ // Workspace
99
+ results.push({
100
+ category: "Workspace",
101
+ name: "Permisos workspace",
102
+ status: fs.existsSync(getWorkspace()) ? "ok" : "warn",
103
+ message: fs.existsSync(getWorkspace()) ? "existe" : "no existe",
104
+ });
105
+ // MCP
106
+ const mcp = config.mcp;
107
+ const servers = mcp?.servers;
108
+ if (servers && Object.keys(servers).length > 0) {
109
+ results.push({ category: "MCP", name: "Servidores", status: "ok", message: `${Object.keys(servers).length} configurado(s)` });
110
+ for (const [name, server] of Object.entries(servers)) {
111
+ const cmd = server.command;
112
+ const isKnown = cmd?.includes("@modelcontextprotocol") || cmd?.includes("mcp-server");
113
+ results.push({
114
+ category: "MCP",
115
+ name: `Servidor '${name}'`,
116
+ status: isKnown ? "ok" : "warn",
117
+ message: isKnown ? "fuente conocida" : "verificar comando manualmente",
118
+ });
119
+ }
120
+ }
121
+ else {
122
+ results.push({ category: "MCP", name: "Servidores", status: "ok", message: "ninguno configurado" });
123
+ }
124
+ // Skills
125
+ const skillsDir = path.join(getHiveDirConst(), "skills");
126
+ if (fs.existsSync(skillsDir)) {
127
+ const managedSkills = fs.readdirSync(skillsDir).filter((f) => {
128
+ return fs.statSync(path.join(skillsDir, f)).isDirectory();
129
+ });
130
+ results.push({
131
+ category: "Skills",
132
+ name: "Skills de terceros",
133
+ status: managedSkills.length === 0 ? "ok" : "warn",
134
+ message: managedSkills.length === 0 ? "ninguna instalada" : `${managedSkills.length} instalada(s) — verificar manualmente`,
135
+ });
136
+ }
137
+ else {
138
+ results.push({ category: "Skills", name: "Skills de terceros", status: "ok", message: "ninguna instalada" });
139
+ }
140
+ // Mostrar resultados
141
+ const categories = [...new Set(results.map((r) => r.category))];
142
+ for (const category of categories) {
143
+ console.log(`${category}`);
144
+ const catResults = results.filter((r) => r.category === category);
145
+ for (const result of catResults) {
146
+ const icon = result.status === "ok" ? "✅" : result.status === "warn" ? "⚠️ " : "❌";
147
+ console.log(` ${icon} ${result.name}: ${result.message}`);
148
+ }
149
+ console.log();
150
+ }
151
+ // Resumen
152
+ const errors = results.filter((r) => r.status === "error");
153
+ const warns = results.filter((r) => r.status === "warn");
154
+ console.log(`📊 Resumen: ${results.length} checks, ${errors.length} errores, ${warns.length} advertencias`);
155
+ }
@@ -0,0 +1 @@
1
+ export declare function installService(): Promise<void>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.installService = installService;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ const HOME = process.env.HOME || "";
41
+ const SYSTEMD_DIR = path.join(HOME, ".config", "systemd", "user");
42
+ async function installService() {
43
+ console.log("🔧 Instalando servicio systemd para Hive...\n");
44
+ if (!fs.existsSync(SYSTEMD_DIR)) {
45
+ fs.mkdirSync(SYSTEMD_DIR, { recursive: true });
46
+ }
47
+ const serviceContent = `[Unit]
48
+ Description=Hive Personal AI Gateway
49
+ After=network-online.target
50
+ Wants=network-online.target
51
+
52
+ [Service]
53
+ Type=simple
54
+ ExecStart=${HOME}/.bun/bin/hive start
55
+ ExecStop=${HOME}/.bun/bin/hive stop
56
+ Restart=on-failure
57
+ RestartSec=5
58
+ Environment=PATH=${HOME}/.bun/bin:${HOME}/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
59
+ WorkingDirectory=${HOME}
60
+
61
+ [Install]
62
+ WantedBy=default.target
63
+ `;
64
+ const servicePath = path.join(SYSTEMD_DIR, "hive.service");
65
+ fs.writeFileSync(servicePath, serviceContent, "utf-8");
66
+ console.log(`✅ Archivo de servicio creado: ${servicePath}\n`);
67
+ console.log("Recargando systemd...");
68
+ (0, child_process_1.execSync)("systemctl --user daemon-reload", { stdio: "inherit" });
69
+ console.log("Habilitando servicio...");
70
+ (0, child_process_1.execSync)("systemctl --user enable hive", { stdio: "inherit" });
71
+ console.log("\n✅ Servicio instalado correctamente.\n");
72
+ console.log("Comandos disponibles:");
73
+ console.log(" systemctl --user start hive # Iniciar");
74
+ console.log(" systemctl --user stop hive # Detener");
75
+ console.log(" systemctl --user status hive # Ver estado");
76
+ console.log(" journalctl --user -u hive -f # Ver logs");
77
+ }
@@ -0,0 +1 @@
1
+ export declare function sessions(subcommand: string | undefined, args: string[]): Promise<void>;
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.sessions = sessions;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const HIVE_DIR = path.join(process.env.HOME || "", ".hive");
40
+ const SESSIONS_DIR = path.join(HIVE_DIR, "sessions");
41
+ async function sessions(subcommand, args) {
42
+ switch (subcommand) {
43
+ case "list":
44
+ await listSessions();
45
+ break;
46
+ case "view":
47
+ await viewSession(args[0]);
48
+ break;
49
+ case "prune":
50
+ await pruneSessions();
51
+ break;
52
+ default:
53
+ console.log(`
54
+ Usage: hive sessions <command>
55
+
56
+ Commands:
57
+ list Listar sesiones
58
+ view <id> Ver transcripción
59
+ prune Eliminar sesiones inactivas
60
+ `);
61
+ }
62
+ }
63
+ async function listSessions() {
64
+ if (!fs.existsSync(SESSIONS_DIR)) {
65
+ console.log("No hay sesiones");
66
+ return;
67
+ }
68
+ const sessions = fs.readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(".json"));
69
+ if (sessions.length === 0) {
70
+ console.log("No hay sesiones");
71
+ return;
72
+ }
73
+ console.log("\n📋 Sesiones:\n");
74
+ for (const session of sessions) {
75
+ const sessionPath = path.join(SESSIONS_DIR, session);
76
+ const stat = fs.statSync(sessionPath);
77
+ const id = session.replace(".json", "");
78
+ const date = stat.mtime.toLocaleDateString();
79
+ const time = stat.mtime.toLocaleTimeString();
80
+ let messageCount = 0;
81
+ try {
82
+ const content = JSON.parse(fs.readFileSync(sessionPath, "utf-8"));
83
+ messageCount = content.messages?.length || 0;
84
+ }
85
+ catch {
86
+ // ignore
87
+ }
88
+ console.log(` ${id}`);
89
+ console.log(` Última actividad: ${date} ${time}`);
90
+ console.log(` Mensajes: ${messageCount}`);
91
+ console.log();
92
+ }
93
+ }
94
+ async function viewSession(id) {
95
+ if (!id) {
96
+ console.log("❌ Especifica el ID de la sesión: hive sessions view <id>");
97
+ return;
98
+ }
99
+ const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);
100
+ if (!fs.existsSync(sessionPath)) {
101
+ console.log(`❌ Sesión no encontrada: ${id}`);
102
+ return;
103
+ }
104
+ const content = JSON.parse(fs.readFileSync(sessionPath, "utf-8"));
105
+ const messages = content.messages || [];
106
+ console.log(`\n📜 Sesión: ${id}\n`);
107
+ for (const msg of messages) {
108
+ const role = msg.role === "user" ? "👤 Usuario" : "🤖 Agente";
109
+ console.log(`${role}:`);
110
+ console.log(` ${msg.content}`);
111
+ console.log();
112
+ }
113
+ }
114
+ async function pruneSessions() {
115
+ if (!fs.existsSync(SESSIONS_DIR)) {
116
+ console.log("No hay sesiones para limpiar");
117
+ return;
118
+ }
119
+ const sessions = fs.readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(".json"));
120
+ const now = Date.now();
121
+ const maxAge = 7 * 24 * 60 * 60 * 1000; // 7 días
122
+ let pruned = 0;
123
+ for (const session of sessions) {
124
+ const sessionPath = path.join(SESSIONS_DIR, session);
125
+ const stat = fs.statSync(sessionPath);
126
+ if (now - stat.mtimeMs > maxAge) {
127
+ fs.unlinkSync(sessionPath);
128
+ pruned++;
129
+ }
130
+ }
131
+ console.log(`✅ Sesiones eliminadas: ${pruned}`);
132
+ }
@@ -0,0 +1 @@
1
+ export declare function skills(subcommand: string | undefined, args: string[]): Promise<void>;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.skills = skills;
37
+ const p = __importStar(require("@clack/prompts"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const SKILLS_DIR = path.join(process.env.HOME || "", ".hive", "skills");
41
+ const BUNDLED_SKILLS = [
42
+ { slug: "web-search", name: "Web Search", description: "Search the web using multiple search engines" },
43
+ { slug: "code-exec", name: "Code Execution", description: "Execute code snippets safely" },
44
+ { slug: "file-ops", name: "File Operations", description: "Read, write, and manage files" },
45
+ { slug: "memory", name: "Memory", description: "Persistent memory and notes" },
46
+ { slug: "cron", name: "Cron Jobs", description: "Schedule recurring tasks" },
47
+ ];
48
+ async function skills(subcommand, args) {
49
+ switch (subcommand) {
50
+ case "list":
51
+ await listSkills();
52
+ break;
53
+ case "search":
54
+ await searchSkills(args[0]);
55
+ break;
56
+ case "install":
57
+ await installSkill(args[0]);
58
+ break;
59
+ case "remove":
60
+ await removeSkill(args[0]);
61
+ break;
62
+ case "update":
63
+ await updateSkills();
64
+ break;
65
+ default:
66
+ console.log(`
67
+ Usage: hive skills <command>
68
+
69
+ Commands:
70
+ list Listar skills instaladas
71
+ search <query> Buscar skills
72
+ install <slug> Instalar skill
73
+ remove <nombre> Eliminar skill
74
+ update Actualizar skills
75
+ `);
76
+ }
77
+ }
78
+ async function listSkills() {
79
+ console.log("\n📚 Skills instaladas:\n");
80
+ console.log(" Bundled (incluidas):");
81
+ for (const skill of BUNDLED_SKILLS) {
82
+ console.log(` • ${skill.name} (${skill.slug})`);
83
+ console.log(` ${skill.description}`);
84
+ }
85
+ if (fs.existsSync(SKILLS_DIR)) {
86
+ const managedSkills = fs.readdirSync(SKILLS_DIR).filter((f) => {
87
+ const skillPath = path.join(SKILLS_DIR, f);
88
+ return fs.statSync(skillPath).isDirectory();
89
+ });
90
+ if (managedSkills.length > 0) {
91
+ console.log("\n Managed (instaladas):");
92
+ for (const slug of managedSkills) {
93
+ const skillPath = path.join(SKILLS_DIR, slug, "skill.json");
94
+ if (fs.existsSync(skillPath)) {
95
+ const meta = JSON.parse(fs.readFileSync(skillPath, "utf-8"));
96
+ console.log(` • ${meta.name || slug}`);
97
+ console.log(` ${meta.description || "Sin descripción"}`);
98
+ }
99
+ else {
100
+ console.log(` • ${slug}`);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ console.log();
106
+ }
107
+ async function searchSkills(query) {
108
+ if (!query) {
109
+ console.log("❌ Especifica un término de búsqueda: hive skills search <query>");
110
+ return;
111
+ }
112
+ console.log(`\n🔍 Buscando: "${query}"\n`);
113
+ const results = BUNDLED_SKILLS.filter((s) => s.name.toLowerCase().includes(query.toLowerCase()) ||
114
+ s.slug.toLowerCase().includes(query.toLowerCase()) ||
115
+ s.description.toLowerCase().includes(query.toLowerCase()));
116
+ if (results.length === 0) {
117
+ console.log("No se encontraron skills");
118
+ return;
119
+ }
120
+ for (const skill of results) {
121
+ console.log(` ${skill.slug}`);
122
+ console.log(` ${skill.name}`);
123
+ console.log(` ${skill.description}`);
124
+ console.log(` Tipo: bundled`);
125
+ console.log();
126
+ }
127
+ }
128
+ async function installSkill(slug) {
129
+ if (!slug) {
130
+ const result = await p.text({
131
+ message: "Slug de la skill a instalar:",
132
+ placeholder: "example-skill",
133
+ validate: (v) => (!v ? "El slug es requerido" : undefined),
134
+ });
135
+ if (p.isCancel(result)) {
136
+ p.cancel("Cancelado");
137
+ return;
138
+ }
139
+ slug = result;
140
+ }
141
+ console.log(`\n📦 Instalando skill: ${slug}`);
142
+ if (!fs.existsSync(SKILLS_DIR)) {
143
+ fs.mkdirSync(SKILLS_DIR, { recursive: true });
144
+ }
145
+ const skillPath = path.join(SKILLS_DIR, slug);
146
+ if (fs.existsSync(skillPath)) {
147
+ console.log("⚠️ La skill ya está instalada");
148
+ return;
149
+ }
150
+ fs.mkdirSync(skillPath, { recursive: true });
151
+ const meta = {
152
+ name: slug,
153
+ version: "1.0.0",
154
+ description: "Skill instalada manualmente",
155
+ installed: new Date().toISOString(),
156
+ };
157
+ fs.writeFileSync(path.join(skillPath, "skill.json"), JSON.stringify(meta, null, 2));
158
+ console.log(`✅ Skill "${slug}" instalada`);
159
+ }
160
+ async function removeSkill(slug) {
161
+ if (!slug) {
162
+ console.log("❌ Especifica la skill: hive skills remove <slug>");
163
+ return;
164
+ }
165
+ const skillPath = path.join(SKILLS_DIR, slug);
166
+ if (!fs.existsSync(skillPath)) {
167
+ console.log(`❌ La skill "${slug}" no está instalada`);
168
+ return;
169
+ }
170
+ const confirm = await p.confirm({
171
+ message: `¿Eliminar la skill "${slug}"?`,
172
+ initialValue: false,
173
+ });
174
+ if (p.isCancel(confirm) || !confirm) {
175
+ console.log("Cancelado");
176
+ return;
177
+ }
178
+ fs.rmSync(skillPath, { recursive: true });
179
+ console.log(`✅ Skill "${slug}" eliminada`);
180
+ }
181
+ async function updateSkills() {
182
+ if (!fs.existsSync(SKILLS_DIR)) {
183
+ console.log("No hay skills instaladas para actualizar");
184
+ return;
185
+ }
186
+ const spinner = p.spinner();
187
+ spinner.start("Actualizando skills...");
188
+ await new Promise((resolve) => setTimeout(resolve, 1000));
189
+ spinner.stop("Skills actualizadas ✅");
190
+ }
@@ -0,0 +1 @@
1
+ export declare function update(): Promise<void>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.update = update;
4
+ const PACKAGES = ["@johpaz/hive-cli"];
5
+ async function update() {
6
+ console.log("🔄 Actualizando Hive...\n");
7
+ for (const pkg of PACKAGES) {
8
+ console.log(`Actualizando ${pkg}...`);
9
+ try {
10
+ const proc = Bun.spawn(["bun", "install", "-g", `${pkg}@latest`], {
11
+ stdout: "inherit",
12
+ stderr: "inherit",
13
+ });
14
+ const exitCode = await proc.exited;
15
+ if (exitCode === 0) {
16
+ console.log(`✅ ${pkg} actualizado\n`);
17
+ }
18
+ else {
19
+ console.log(`⚠️ Error actualizando ${pkg}\n`);
20
+ }
21
+ }
22
+ catch (e) {
23
+ console.log(`⚠️ Error actualizando ${pkg}: ${e.message}\n`);
24
+ }
25
+ }
26
+ console.log("✅ Hive actualizado. Ejecuta 'hive --version' para verificar.");
27
+ }
Binary file
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bun
2
+ export {};