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 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.6");
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gufi-cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "CLI for developing Gufi Marketplace views locally with Claude Code",
5
5
  "bin": {
6
6
  "gufi": "./bin/gufi.js"