gufi-cli 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +23 -0
- package/dist/commands/env.d.ts +30 -0
- package/dist/commands/env.js +145 -0
- package/dist/index.js +22 -1
- package/package.json +1 -1
package/CLAUDE.md
CHANGED
|
@@ -1419,6 +1419,29 @@ gufi automation calcular_stock -c 116 --edit
|
|
|
1419
1419
|
gufi automation calcular_stock -c 116 --file script.js
|
|
1420
1420
|
```
|
|
1421
1421
|
|
|
1422
|
+
### Environment Variables
|
|
1423
|
+
|
|
1424
|
+
```bash
|
|
1425
|
+
# Ver variables de entorno de la company
|
|
1426
|
+
gufi env
|
|
1427
|
+
|
|
1428
|
+
# Crear/actualizar variable
|
|
1429
|
+
gufi env:set STRIPE_API_KEY sk-live-xxx
|
|
1430
|
+
|
|
1431
|
+
# Eliminar variable
|
|
1432
|
+
gufi env:delete STRIPE_API_KEY
|
|
1433
|
+
```
|
|
1434
|
+
|
|
1435
|
+
### Schema (Estructura de Tablas)
|
|
1436
|
+
|
|
1437
|
+
```bash
|
|
1438
|
+
# Ver todas las tablas de la company
|
|
1439
|
+
gufi schema
|
|
1440
|
+
|
|
1441
|
+
# Filtrar por módulo
|
|
1442
|
+
gufi schema -m 360
|
|
1443
|
+
```
|
|
1444
|
+
|
|
1422
1445
|
### Row CRUD (Datos de Tablas)
|
|
1423
1446
|
|
|
1424
1447
|
```bash
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gufi env - Manage company environment variables
|
|
3
|
+
* gufi schema - View company table structure
|
|
4
|
+
*/
|
|
5
|
+
interface EnvOptions {
|
|
6
|
+
company?: string;
|
|
7
|
+
set?: string;
|
|
8
|
+
delete?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface SchemaOptions {
|
|
11
|
+
company?: string;
|
|
12
|
+
module?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* gufi env - List environment variables
|
|
16
|
+
*/
|
|
17
|
+
export declare function envListCommand(options: EnvOptions): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* gufi env:set <key> <value> - Set an environment variable
|
|
20
|
+
*/
|
|
21
|
+
export declare function envSetCommand(key: string, value: string, options: EnvOptions): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* gufi env:delete <key> - Delete an environment variable
|
|
24
|
+
*/
|
|
25
|
+
export declare function envDeleteCommand(key: string, options: EnvOptions): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* gufi schema - View company table structure
|
|
28
|
+
*/
|
|
29
|
+
export declare function schemaCommand(options: SchemaOptions): Promise<void>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gufi env - Manage company environment variables
|
|
3
|
+
* gufi schema - View company table structure
|
|
4
|
+
*/
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
import { getToken, getApiUrl } from "../lib/config.js";
|
|
8
|
+
async function apiRequest(endpoint, options = {}) {
|
|
9
|
+
const token = getToken();
|
|
10
|
+
if (!token) {
|
|
11
|
+
throw new Error("No estás logueado. Ejecuta: gufi login");
|
|
12
|
+
}
|
|
13
|
+
const url = `${getApiUrl()}${endpoint}`;
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
...options,
|
|
16
|
+
headers: {
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
Authorization: `Bearer ${token}`,
|
|
19
|
+
"X-Client": "cli",
|
|
20
|
+
...options.headers,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const text = await response.text();
|
|
25
|
+
throw new Error(`API Error ${response.status}: ${text}`);
|
|
26
|
+
}
|
|
27
|
+
return response.json();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* gufi env - List environment variables
|
|
31
|
+
*/
|
|
32
|
+
export async function envListCommand(options) {
|
|
33
|
+
const spinner = ora("Cargando variables de entorno...").start();
|
|
34
|
+
try {
|
|
35
|
+
const data = await apiRequest("/api/cli/env");
|
|
36
|
+
spinner.stop();
|
|
37
|
+
console.log(chalk.magenta("\n 🔐 Variables de Entorno\n"));
|
|
38
|
+
if (!data || data.length === 0) {
|
|
39
|
+
console.log(chalk.gray(" No hay variables configuradas\n"));
|
|
40
|
+
console.log(chalk.gray(" Usa: gufi env:set <KEY> <VALUE>\n"));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Show as table
|
|
44
|
+
const maxKeyLen = Math.max(...data.map((v) => v.key.length), 10);
|
|
45
|
+
console.log(chalk.gray(" " + "KEY".padEnd(maxKeyLen + 2) + "VALUE"));
|
|
46
|
+
console.log(chalk.gray(" " + "─".repeat(maxKeyLen + 20)));
|
|
47
|
+
for (const env of data) {
|
|
48
|
+
const maskedValue = env.is_secret
|
|
49
|
+
? "••••••••"
|
|
50
|
+
: (env.value?.substring(0, 30) + (env.value?.length > 30 ? "..." : ""));
|
|
51
|
+
console.log(" " +
|
|
52
|
+
chalk.cyan(env.key.padEnd(maxKeyLen + 2)) +
|
|
53
|
+
chalk.white(maskedValue));
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.gray(`\n Total: ${data.length} variables\n`));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
spinner.fail(chalk.red(error.message));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* gufi env:set <key> <value> - Set an environment variable
|
|
64
|
+
*/
|
|
65
|
+
export async function envSetCommand(key, value, options) {
|
|
66
|
+
const spinner = ora(`Guardando ${key}...`).start();
|
|
67
|
+
try {
|
|
68
|
+
await apiRequest("/api/cli/env", {
|
|
69
|
+
method: "POST",
|
|
70
|
+
body: JSON.stringify({ key, value }),
|
|
71
|
+
});
|
|
72
|
+
spinner.succeed(chalk.green(`${key} guardada`));
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
spinner.fail(chalk.red(error.message));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* gufi env:delete <key> - Delete an environment variable
|
|
82
|
+
*/
|
|
83
|
+
export async function envDeleteCommand(key, options) {
|
|
84
|
+
const spinner = ora(`Eliminando ${key}...`).start();
|
|
85
|
+
try {
|
|
86
|
+
await apiRequest(`/api/cli/env/${encodeURIComponent(key)}`, {
|
|
87
|
+
method: "DELETE",
|
|
88
|
+
});
|
|
89
|
+
spinner.succeed(chalk.green(`${key} eliminada`));
|
|
90
|
+
console.log();
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
spinner.fail(chalk.red(error.message));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* gufi schema - View company table structure
|
|
99
|
+
*/
|
|
100
|
+
export async function schemaCommand(options) {
|
|
101
|
+
const spinner = ora("Cargando schema...").start();
|
|
102
|
+
try {
|
|
103
|
+
const data = await apiRequest("/api/cli/schema");
|
|
104
|
+
spinner.stop();
|
|
105
|
+
console.log(chalk.magenta("\n 📊 Schema de la Company\n"));
|
|
106
|
+
if (!data.modules || data.modules.length === 0) {
|
|
107
|
+
console.log(chalk.gray(" No hay módulos\n"));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
for (const module of data.modules) {
|
|
111
|
+
// Filter by module if specified
|
|
112
|
+
if (options.module && module.id !== parseInt(options.module)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
console.log(chalk.cyan(` 📦 ${module.name}`) +
|
|
116
|
+
chalk.gray(` (ID: ${module.id})`));
|
|
117
|
+
if (module.entities && module.entities.length > 0) {
|
|
118
|
+
for (const entity of module.entities) {
|
|
119
|
+
const tableName = `m${module.id}_t${entity.id}`;
|
|
120
|
+
console.log(chalk.white(` └─ ${entity.name}`) +
|
|
121
|
+
chalk.gray(` → ${tableName}`));
|
|
122
|
+
// Show fields if available
|
|
123
|
+
if (entity.fields && entity.fields.length > 0) {
|
|
124
|
+
const fieldList = entity.fields
|
|
125
|
+
.slice(0, 5)
|
|
126
|
+
.map((f) => f.name)
|
|
127
|
+
.join(", ");
|
|
128
|
+
const more = entity.fields.length > 5
|
|
129
|
+
? ` +${entity.fields.length - 5} más`
|
|
130
|
+
: "";
|
|
131
|
+
console.log(chalk.gray(` campos: ${fieldList}${more}`));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
console.log();
|
|
136
|
+
}
|
|
137
|
+
// Summary
|
|
138
|
+
const totalTables = data.modules.reduce((acc, m) => acc + (m.entities?.length || 0), 0);
|
|
139
|
+
console.log(chalk.gray(` ${data.modules.length} módulos, ${totalTables} tablas\n`));
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
spinner.fail(chalk.red(error.message));
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -39,11 +39,12 @@ import { listCommand } from "./commands/list.js";
|
|
|
39
39
|
import { logsCommand } from "./commands/logs.js";
|
|
40
40
|
import { companiesCommand, modulesCommand, moduleCommand, moduleUpdateCommand, companyCreateCommand, automationsCommand, automationCommand, } from "./commands/companies.js";
|
|
41
41
|
import { rowsListCommand, rowGetCommand, rowCreateCommand, rowUpdateCommand, rowDeleteCommand, rowDuplicateCommand, rowsBulkCreateCommand, } from "./commands/rows.js";
|
|
42
|
+
import { envListCommand, envSetCommand, envDeleteCommand, schemaCommand, } from "./commands/env.js";
|
|
42
43
|
const program = new Command();
|
|
43
44
|
program
|
|
44
45
|
.name("gufi")
|
|
45
46
|
.description("🟣 Gufi CLI - Desarrolla módulos, vistas y automations")
|
|
46
|
-
.version("0.1.
|
|
47
|
+
.version("0.1.7");
|
|
47
48
|
// ════════════════════════════════════════════════════════════════════
|
|
48
49
|
// 🔐 Auth
|
|
49
50
|
// ════════════════════════════════════════════════════════════════════
|
|
@@ -75,6 +76,11 @@ program
|
|
|
75
76
|
.command("modules <company_id>")
|
|
76
77
|
.description("Ver módulos de una company")
|
|
77
78
|
.action(modulesCommand);
|
|
79
|
+
program
|
|
80
|
+
.command("schema")
|
|
81
|
+
.description("Ver estructura de tablas de la company")
|
|
82
|
+
.option("-m, --module <id>", "Filtrar por módulo")
|
|
83
|
+
.action(schemaCommand);
|
|
78
84
|
program
|
|
79
85
|
.command("module <module_id>")
|
|
80
86
|
.description("Ver/editar JSON de un módulo")
|
|
@@ -104,6 +110,21 @@ program
|
|
|
104
110
|
.option("-f, --file <path>", "Exportar a archivo")
|
|
105
111
|
.action(automationCommand);
|
|
106
112
|
// ════════════════════════════════════════════════════════════════════
|
|
113
|
+
// 🔐 Environment Variables
|
|
114
|
+
// ════════════════════════════════════════════════════════════════════
|
|
115
|
+
program
|
|
116
|
+
.command("env")
|
|
117
|
+
.description("Ver variables de entorno de la company")
|
|
118
|
+
.action(envListCommand);
|
|
119
|
+
program
|
|
120
|
+
.command("env:set <key> <value>")
|
|
121
|
+
.description("Crear/actualizar variable de entorno")
|
|
122
|
+
.action(envSetCommand);
|
|
123
|
+
program
|
|
124
|
+
.command("env:delete <key>")
|
|
125
|
+
.description("Eliminar variable de entorno")
|
|
126
|
+
.action(envDeleteCommand);
|
|
127
|
+
// ════════════════════════════════════════════════════════════════════
|
|
107
128
|
// 📊 Row CRUD - Datos de tablas
|
|
108
129
|
// ════════════════════════════════════════════════════════════════════
|
|
109
130
|
program
|