shark-ai 0.2.1 → 0.3.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.
|
@@ -40,8 +40,15 @@ var ConfigSchema = z.object({
|
|
|
40
40
|
language: z.enum(["pt-br", "en-us", "es-es"]).default("pt-br"),
|
|
41
41
|
project: z.string().optional(),
|
|
42
42
|
environment: z.string().optional(),
|
|
43
|
-
activeRealm: z.string().optional()
|
|
43
|
+
activeRealm: z.string().optional(),
|
|
44
44
|
// Currently logged-in realm
|
|
45
|
+
agents: z.object({
|
|
46
|
+
dev: z.string().optional(),
|
|
47
|
+
ba: z.string().optional(),
|
|
48
|
+
spec: z.string().optional(),
|
|
49
|
+
qa: z.string().optional(),
|
|
50
|
+
scan: z.string().optional()
|
|
51
|
+
}).default({})
|
|
45
52
|
});
|
|
46
53
|
|
|
47
54
|
// src/core/config/sharkrc-loader.ts
|
|
@@ -198,9 +205,24 @@ var enUs = {
|
|
|
198
205
|
actions: {
|
|
199
206
|
language: "Set Language",
|
|
200
207
|
logLevel: "Log Level",
|
|
208
|
+
agents: "Configure Agents",
|
|
201
209
|
back: "Back"
|
|
202
210
|
},
|
|
203
211
|
selectLanguage: "Select language:",
|
|
212
|
+
agentMenu: {
|
|
213
|
+
title: "Agent Configuration",
|
|
214
|
+
selectAgent: "Which agent would you like to configure?",
|
|
215
|
+
enterId: "Enter StackSpot Agent ID (or empty for default):",
|
|
216
|
+
updated: "Agent ID {0} updated.",
|
|
217
|
+
options: {
|
|
218
|
+
dev: "Developer Agent",
|
|
219
|
+
ba: "Business Analyst",
|
|
220
|
+
spec: "Specification Agent",
|
|
221
|
+
qa: "QA Agent",
|
|
222
|
+
scan: "Scan Agent",
|
|
223
|
+
back: "Back"
|
|
224
|
+
}
|
|
225
|
+
},
|
|
204
226
|
languageUpdated: "Updated language to: {0}"
|
|
205
227
|
},
|
|
206
228
|
login: {
|
|
@@ -208,6 +230,33 @@ var enUs = {
|
|
|
208
230
|
alreadyLoggedIn: "You are already logged in",
|
|
209
231
|
success: "Successfully logged in!",
|
|
210
232
|
error: "Login failed"
|
|
233
|
+
},
|
|
234
|
+
scan: {
|
|
235
|
+
intro: "\u{1F575}\uFE0F\u200D\u2642\uFE0F Scan Agent",
|
|
236
|
+
scanningProject: "Scanning project at:",
|
|
237
|
+
outputTarget: "Output file:",
|
|
238
|
+
language: "Language:",
|
|
239
|
+
templateCreated: "\u2705 Template created at:",
|
|
240
|
+
fileExists: "\u{1F4C4} File already exists, will be updated",
|
|
241
|
+
analyzing: "\u{1F575}\uFE0F\u200D\u2642\uFE0F Scan Agent analyzing (Step {step})...",
|
|
242
|
+
completed: "\u2728 Scan completed successfully!",
|
|
243
|
+
error: "Error executing scan",
|
|
244
|
+
stepComplete: "Step complete",
|
|
245
|
+
scanningDir: "\u{1F4C2} Scanning dir: {0}",
|
|
246
|
+
readingFile: "\u{1F4D6} Reading file: {0}",
|
|
247
|
+
searching: "\u{1F50D} Searching: {0}",
|
|
248
|
+
generated: "\u2705 Context Generated: {0}",
|
|
249
|
+
updated: "\u2705 Context Updated: {0}",
|
|
250
|
+
notFound: "File not found.",
|
|
251
|
+
stopped: "Scan Agent stopped without actions.",
|
|
252
|
+
agentAsks: "\u{1F916} Scan Agent asks:",
|
|
253
|
+
agentInput: "Agent needs input:",
|
|
254
|
+
replyPlaceholder: "Reply...",
|
|
255
|
+
targetRedirect: "Agent targeted '{0}' but we enforce '{1}'. Redirecting write.",
|
|
256
|
+
contentNotFound: "Target content not found for replacement.",
|
|
257
|
+
skipped: "Skipped (Scan Agent only writes context file)",
|
|
258
|
+
pendingSections: "The following sections still need analysis: {0}.",
|
|
259
|
+
allPopulated: "All sections appear to be populated!"
|
|
211
260
|
}
|
|
212
261
|
}
|
|
213
262
|
};
|
|
@@ -228,9 +277,24 @@ var esEs = {
|
|
|
228
277
|
actions: {
|
|
229
278
|
language: "Cambiar Idioma",
|
|
230
279
|
logLevel: "Nivel de Log",
|
|
280
|
+
agents: "Configurar Agentes",
|
|
231
281
|
back: "Volver"
|
|
232
282
|
},
|
|
233
283
|
selectLanguage: "Seleccione el idioma:",
|
|
284
|
+
agentMenu: {
|
|
285
|
+
title: "Configuraci\xF3n de Agentes",
|
|
286
|
+
selectAgent: "\xBFQu\xE9 agente desea configurar?",
|
|
287
|
+
enterId: "Ingrese el ID del Agente StackSpot (o dejar vac\xEDo para predeterminado):",
|
|
288
|
+
updated: "ID del Agente {0} actualizado.",
|
|
289
|
+
options: {
|
|
290
|
+
dev: "Agente Desarrollador",
|
|
291
|
+
ba: "Analista de Negocios",
|
|
292
|
+
spec: "Agente de Especificaci\xF3n",
|
|
293
|
+
qa: "Agente de QA",
|
|
294
|
+
scan: "Agente de Escaneo",
|
|
295
|
+
back: "Volver"
|
|
296
|
+
}
|
|
297
|
+
},
|
|
234
298
|
languageUpdated: "Idioma actualizado a: {0}"
|
|
235
299
|
},
|
|
236
300
|
login: {
|
|
@@ -238,6 +302,33 @@ var esEs = {
|
|
|
238
302
|
alreadyLoggedIn: "Ya has iniciado sesi\xF3n",
|
|
239
303
|
success: "\xA1Inicio de sesi\xF3n exitoso!",
|
|
240
304
|
error: "Error de inicio de sesi\xF3n"
|
|
305
|
+
},
|
|
306
|
+
scan: {
|
|
307
|
+
intro: "\u{1F575}\uFE0F\u200D\u2642\uFE0F Agente de Escaneo",
|
|
308
|
+
scanningProject: "Escaneando proyecto en:",
|
|
309
|
+
outputTarget: "Archivo de salida:",
|
|
310
|
+
language: "Idioma:",
|
|
311
|
+
templateCreated: "\u2705 Plantilla creada en:",
|
|
312
|
+
fileExists: "\u{1F4C4} El archivo ya existe, ser\xE1 actualizado",
|
|
313
|
+
analyzing: "\u{1F575}\uFE0F\u200D\u2642\uFE0F Agente de escaneo analizando (Paso {step})...",
|
|
314
|
+
completed: "\u2728 Escaneo completado exitosamente!",
|
|
315
|
+
error: "Error al ejecutar escaneo",
|
|
316
|
+
stepComplete: "Paso completado",
|
|
317
|
+
scanningDir: "\u{1F4C2} Escaneando carpeta: {0}",
|
|
318
|
+
readingFile: "\u{1F4D6} Leyendo archivo: {0}",
|
|
319
|
+
searching: "\u{1F50D} Buscando: {0}",
|
|
320
|
+
generated: "\u2705 Contexto Generado: {0}",
|
|
321
|
+
updated: "\u2705 Contexto Actualizado: {0}",
|
|
322
|
+
notFound: "Archivo no encontrado.",
|
|
323
|
+
stopped: "Agente de Escaneo se detuvo sin acciones.",
|
|
324
|
+
agentAsks: "\u{1F916} Agente de Escaneo pregunta:",
|
|
325
|
+
agentInput: "Agente necesita entrada:",
|
|
326
|
+
replyPlaceholder: "Respuesta...",
|
|
327
|
+
targetRedirect: "Agente apunt\xF3 a '{0}' pero forzamos '{1}'. Redirigiendo escritura.",
|
|
328
|
+
contentNotFound: "Contenido objetivo no encontrado para reemplazo.",
|
|
329
|
+
skipped: "Omitido (Agente de Escaneo solo escribe en archivo de contexto)",
|
|
330
|
+
pendingSections: "Las siguientes secciones a\xFAn necesitan an\xE1lisis: {0}.",
|
|
331
|
+
allPopulated: "\xA1Todas las secciones parecen estar pobladas!"
|
|
241
332
|
}
|
|
242
333
|
}
|
|
243
334
|
};
|
|
@@ -258,9 +349,24 @@ var ptBr = {
|
|
|
258
349
|
actions: {
|
|
259
350
|
language: "Alterar Idioma",
|
|
260
351
|
logLevel: "N\xEDvel de Log",
|
|
352
|
+
agents: "Configurar Agentes",
|
|
261
353
|
back: "Voltar"
|
|
262
354
|
},
|
|
263
355
|
selectLanguage: "Selecione o idioma:",
|
|
356
|
+
agentMenu: {
|
|
357
|
+
title: "Configura\xE7\xE3o de Agentes",
|
|
358
|
+
selectAgent: "Qual agente voc\xEA deseja configurar?",
|
|
359
|
+
enterId: "Digite o ID do Agente StackSpot (ou deixe vazio para padr\xE3o):",
|
|
360
|
+
updated: "ID do Agente {0} atualizado.",
|
|
361
|
+
options: {
|
|
362
|
+
dev: "Developer Agent",
|
|
363
|
+
ba: "Business Analyst",
|
|
364
|
+
spec: "Specification Agent",
|
|
365
|
+
qa: "QA Agent",
|
|
366
|
+
scan: "Scan Agent",
|
|
367
|
+
back: "Voltar"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
264
370
|
languageUpdated: "Idioma atualizado para: {0}"
|
|
265
371
|
},
|
|
266
372
|
login: {
|
|
@@ -268,6 +374,33 @@ var ptBr = {
|
|
|
268
374
|
alreadyLoggedIn: "Voc\xEA j\xE1 est\xE1 logado",
|
|
269
375
|
success: "Login realizado com sucesso!",
|
|
270
376
|
error: "Falha no login"
|
|
377
|
+
},
|
|
378
|
+
scan: {
|
|
379
|
+
intro: "\u{1F575}\uFE0F\u200D\u2642\uFE0F Scan Agent",
|
|
380
|
+
scanningProject: "Escaneando projeto em:",
|
|
381
|
+
outputTarget: "Arquivo de sa\xEDda:",
|
|
382
|
+
language: "Idioma:",
|
|
383
|
+
templateCreated: "\u2705 Template criado em:",
|
|
384
|
+
fileExists: "\u{1F4C4} Arquivo j\xE1 existe, ser\xE1 atualizado",
|
|
385
|
+
analyzing: "\u{1F575}\uFE0F\u200D\u2642\uFE0F Scan Agent analisando (Passo {step})...",
|
|
386
|
+
completed: "\u2728 Scan conclu\xEDdo com sucesso!",
|
|
387
|
+
error: "Erro ao executar scan",
|
|
388
|
+
stepComplete: "Passo conclu\xEDdo",
|
|
389
|
+
scanningDir: "\u{1F4C2} Escaneando pasta: {0}",
|
|
390
|
+
readingFile: "\u{1F4D6} Lendo arquivo: {0}",
|
|
391
|
+
searching: "\u{1F50D} Buscando: {0}",
|
|
392
|
+
generated: "\u2705 Contexto Gerado: {0}",
|
|
393
|
+
updated: "\u2705 Contexto Atualizado: {0}",
|
|
394
|
+
notFound: "Arquivo n\xE3o encontrado.",
|
|
395
|
+
stopped: "Scan Agent parou sem a\xE7\xF5es.",
|
|
396
|
+
agentAsks: "\u{1F916} Scan Agent pergunta:",
|
|
397
|
+
agentInput: "Agente precisa de input:",
|
|
398
|
+
replyPlaceholder: "Resposta...",
|
|
399
|
+
targetRedirect: "Agente mirou '{0}' mas for\xE7amos '{1}'. Redirecionando escrita.",
|
|
400
|
+
contentNotFound: "Conte\xFAdo alvo n\xE3o encontrado para substitui\xE7\xE3o.",
|
|
401
|
+
skipped: "Pulado (Scan Agent s\xF3 escreve no arquivo de contexto)",
|
|
402
|
+
pendingSections: "As seguintes se\xE7\xF5es ainda precisam de an\xE1lise: {0}.",
|
|
403
|
+
allPopulated: "Todas as se\xE7\xF5es parecem preenchidas!"
|
|
271
404
|
}
|
|
272
405
|
}
|
|
273
406
|
};
|
|
@@ -649,6 +782,7 @@ var configCommand = {
|
|
|
649
782
|
{ value: "project", label: "Set Default Project" },
|
|
650
783
|
{ value: "language", label: t("commands.config.actions.language") },
|
|
651
784
|
{ value: "logLevel", label: t("commands.config.actions.logLevel") },
|
|
785
|
+
{ value: "agents", label: t("commands.config.actions.agents") },
|
|
652
786
|
{ value: "exit", label: t("commands.config.actions.back") }
|
|
653
787
|
]
|
|
654
788
|
});
|
|
@@ -699,6 +833,31 @@ var configCommand = {
|
|
|
699
833
|
tui.log.success(`Updated log level to: ${level}`);
|
|
700
834
|
}
|
|
701
835
|
}
|
|
836
|
+
if (action === "agents") {
|
|
837
|
+
const agentType = await tui.select({
|
|
838
|
+
message: t("commands.config.agentMenu.selectAgent"),
|
|
839
|
+
options: [
|
|
840
|
+
{ value: "dev", label: t("commands.config.agentMenu.options.dev") },
|
|
841
|
+
{ value: "ba", label: t("commands.config.agentMenu.options.ba") },
|
|
842
|
+
{ value: "spec", label: t("commands.config.agentMenu.options.spec") },
|
|
843
|
+
{ value: "qa", label: t("commands.config.agentMenu.options.qa") },
|
|
844
|
+
{ value: "scan", label: t("commands.config.agentMenu.options.scan") },
|
|
845
|
+
{ value: "back", label: t("commands.config.agentMenu.options.back") }
|
|
846
|
+
]
|
|
847
|
+
});
|
|
848
|
+
if (!tui.isCancel(agentType) && agentType !== "back") {
|
|
849
|
+
const agentId = await tui.text({
|
|
850
|
+
message: t("commands.config.agentMenu.enterId"),
|
|
851
|
+
initialValue: currentConfig.agents[agentType] || "",
|
|
852
|
+
placeholder: "01xxxxxxxxxxxxxxxxxxxxxxxx"
|
|
853
|
+
});
|
|
854
|
+
if (!tui.isCancel(agentId)) {
|
|
855
|
+
const newAgents = { ...currentConfig.agents, [agentType]: agentId };
|
|
856
|
+
saveGlobalRC({ agents: newAgents });
|
|
857
|
+
tui.log.success(t("commands.config.agentMenu.updated", agentType));
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
702
861
|
manager.reloadConfig();
|
|
703
862
|
tui.outro("Configuration saved successfully to ~/.sharkrc");
|
|
704
863
|
} catch (error) {
|
|
@@ -711,10 +870,11 @@ var configCommand = {
|
|
|
711
870
|
export {
|
|
712
871
|
colors,
|
|
713
872
|
ConfigManager,
|
|
873
|
+
t,
|
|
714
874
|
tui,
|
|
715
875
|
tokenStorage,
|
|
716
876
|
FileLogger,
|
|
717
877
|
loginCommand,
|
|
718
878
|
configCommand
|
|
719
879
|
};
|
|
720
|
-
//# sourceMappingURL=chunk-
|
|
880
|
+
//# sourceMappingURL=chunk-JQAVZJTG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/colors.ts","../src/commands/login.ts","../src/ui/tui.ts","../src/core/config-manager.ts","../src/core/config/schema.ts","../src/core/config/sharkrc-loader.ts","../src/core/i18n/locales/en-us.ts","../src/core/i18n/locales/es-es.ts","../src/core/i18n/locales/pt-br.ts","../src/core/i18n/index.ts","../src/core/auth/stackspot-auth.ts","../src/core/auth/token-storage.ts","../src/core/network/connectivity.ts","../src/core/debug/file-logger.ts","../src/commands/config.ts"],"sourcesContent":["import pico from 'picocolors';\n\n// Deep Ocean Theme Palette\n// Primary (Action): Cyan\n// Secondary (Context): Blue\n// Text: White/Gray\n\nexport const colors = {\n // Semantic Colors\n primary: (text: string | number) => pico.cyan(text),\n secondary: (text: string | number) => pico.blue(text),\n\n // Status Colors\n success: (text: string | number) => pico.green(text),\n error: (text: string | number) => pico.red(text),\n warning: (text: string | number) => pico.yellow(text),\n\n // Neutral Colors\n dim: (text: string | number) => pico.dim(text),\n inverse: (text: string | number) => pico.inverse(text),\n white: (text: string | number) => pico.white(text),\n gray: (text: string | number) => pico.gray(text),\n\n // Styling\n bold: (text: string | number) => pico.bold(text),\n italic: (text: string | number) => pico.italic(text),\n};\n","import { Command } from 'commander';\nimport { tui } from '../ui/tui.js';\nimport { authenticate } from '../core/auth/stackspot-auth.js';\nimport { tokenStorage } from '../core/auth/token-storage.js';\nimport { connectivity } from '../core/network/connectivity.js';\nimport { ConfigManager } from '../core/config-manager.js';\nimport { colors } from '../ui/colors.js';\nimport { t } from '../core/i18n/index.js';\nimport { FileLogger } from '../core/debug/file-logger.js';\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with StackSpot')\n .action(async () => {\n try {\n FileLogger.init();\n await connectivity.requireOnline();\n\n\n tui.intro(t('commands.login.intro'));\n\n const realm = await tui.text({\n message: 'Account Realm (Slug)',\n placeholder: 'e.g. stackspot-freemium',\n validate: (value) => {\n if (!value) return 'Realm is required';\n if (value.includes(' ')) return 'Realm cannot contain spaces';\n },\n });\n\n if (tui.isCancel(realm)) {\n tui.outro('Login cancelled');\n return;\n }\n\n const clientId = await tui.text({\n message: 'Client ID',\n validate: (value) => {\n if (!value) return 'Client ID is required';\n },\n });\n\n if (tui.isCancel(clientId)) {\n tui.outro('Login cancelled');\n return;\n }\n\n const clientKey = await tui.password({\n message: 'Client Key',\n validate: (value) => {\n if (!value) return 'Client Key is required';\n },\n });\n\n if (tui.isCancel(clientKey)) {\n tui.outro('Login cancelled');\n return;\n }\n\n const spinner = tui.spinner();\n spinner.start('Authenticating...');\n\n try {\n const tokens = await authenticate(\n (realm as string).trim(),\n (clientId as string).trim(),\n (clientKey as string).trim()\n );\n\n FileLogger.log('LOGIN', 'Authentication success', { realm });\n\n // Save token and credentials for monitoring/refresh\n await tokenStorage.saveToken(\n realm as string,\n tokens.access_token,\n clientId as string,\n clientKey as string,\n tokens.expires_in\n );\n\n // Save active realm to config\n const configManager = ConfigManager.getInstance();\n await configManager.set('activeRealm', realm as string);\n\n spinner.stop(t('commands.login.success'));\n tui.outro(t('commands.login.success'));\n\n } catch (error: any) {\n spinner.stop(t('commands.login.error'), 1);\n tui.log.error(error.message);\n FileLogger.log('LOGIN', 'Authentication failed', error);\n process.exit(1);\n }\n } catch (error: any) {\n tui.log.error(error.message);\n FileLogger.log('LOGIN', 'Unexpected error', error);\n process.exit(1);\n }\n });\n","import * as p from '@clack/prompts';\nimport { colors } from './colors.js';\nimport { t } from '../core/i18n/index.js';\n\nexport interface TuiSpinner {\n start(msg?: string): void;\n stop(msg?: string, code?: number): void;\n message(msg: string): void;\n}\n\nexport const tui = {\n intro(title: string) {\n p.intro(colors.inverse(` ${title} `));\n },\n\n log: p.log,\n isCancel: p.isCancel,\n\n outro(msg: string) {\n p.outro(colors.primary(msg));\n },\n\n spinner(): TuiSpinner {\n const s = p.spinner();\n return {\n start: (msg) => s.start(msg),\n stop: (msg, code = 0) => s.stop(msg, code),\n message: (msg) => s.message(msg),\n };\n },\n\n async text(opts: p.TextOptions): Promise<string> {\n const result = await p.text(opts);\n this.handleCancel(result);\n return result as string;\n },\n\n async password(opts: p.PasswordOptions): Promise<string> {\n const result = await p.password(opts);\n this.handleCancel(result);\n return result as string;\n },\n\n async confirm(opts: p.ConfirmOptions): Promise<boolean> {\n const result = await p.confirm(opts);\n this.handleCancel(result);\n return result as boolean;\n },\n\n async select<Value>(opts: p.SelectOptions<any, Value>): Promise<Value> {\n const result = await p.select(opts);\n this.handleCancel(result);\n return result as Value;\n },\n\n async multiselect<Value>(opts: p.MultiSelectOptions<any, Value>): Promise<Value[]> {\n const result = await p.multiselect(opts);\n this.handleCancel(result);\n return result as Value[];\n },\n\n /**\n * Centralized cancel handler.\n * If the user presses Ctrl+C, Clack returns a symbol.\n * We detect it and exit gracefully.\n */\n handleCancel(value: unknown) {\n if (p.isCancel(value)) {\n p.cancel(t('common.operationCancelled'));\n process.exit(0);\n }\n },\n\n // Expose raw clack for advanced use cases if strictly necessary\n raw: p\n};\n","import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport { ConfigSchema, type Config } from './config/schema.js';\nimport { loadSharkRC } from './config/sharkrc-loader.js';\n\nexport class ConfigManager {\n private static instance: ConfigManager;\n private config: Config | null = null;\n\n private constructor() { }\n\n public static getInstance(): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n }\n\n public getConfig(): Config {\n if (!this.config) {\n this.config = this.loadConfig();\n }\n return this.config;\n }\n\n public reloadConfig(): void {\n this.config = this.loadConfig();\n }\n\n private loadConfig(): Config {\n // 1. Defaults (via Zod)\n let mergedConfig: any = {};\n\n // 2 & 3. Global & Local Config (.sharkrc)\n // Handled by SharkRCLoader which encapsulates precedence (Local > Global)\n const rcConfig = loadSharkRC();\n mergedConfig = { ...mergedConfig, ...rcConfig };\n\n // 4. Env Vars (SHARK_*)\n const envConfig = this.loadEnvConfig();\n mergedConfig = { ...mergedConfig, ...envConfig };\n\n // 5. Validation & Defaults\n const parsed = ConfigSchema.safeParse(mergedConfig);\n if (!parsed.success) {\n console.warn('⚠️ Invalid configuration detected, falling back to defaults or partial config');\n console.warn(parsed.error.message);\n // In a stricter mode we might throw, but CLI should try to run\n // For now, let's return a default parse to ensure we have a valid object\n return ConfigSchema.parse({});\n }\n\n return parsed.data;\n }\n\n private readJsonFile(filePath: string): any {\n try {\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch (error) {\n console.warn(`Failed to read config file at ${filePath}`, error);\n }\n return {};\n }\n\n\n public async set(key: string, value: any): Promise<void> {\n if (!this.config) {\n this.config = this.loadConfig();\n }\n (this.config as any)[key] = value;\n\n // Persist to .sharkrc in home directory\n const homeDir = os.homedir();\n const configPath = path.join(homeDir, '.sharkrc');\n\n try {\n let currentFileConfig = {};\n if (fs.existsSync(configPath)) {\n currentFileConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n }\n const newConfig = { ...currentFileConfig, [key]: value };\n fs.writeFileSync(configPath, JSON.stringify(newConfig, null, 2));\n } catch (error) {\n console.error('Failed to save configuration:', error);\n }\n }\n\n private loadEnvConfig(): any {\n const config: any = {};\n\n if (process.env.SHARK_LOG_LEVEL) {\n config.logLevel = process.env.SHARK_LOG_LEVEL;\n }\n if (process.env.SHARK_API_BASE_URL) {\n config.apiBaseUrl = process.env.SHARK_API_BASE_URL;\n }\n if (process.env.SHARK_LANGUAGE) {\n config.language = process.env.SHARK_LANGUAGE;\n }\n\n // Stack is list, requires splitting\n if (process.env.SHARK_PREFERRED_STACK) {\n config.preferredStack = process.env.SHARK_PREFERRED_STACK.split(',').map(s => s.trim());\n }\n\n return config;\n }\n}\n","import { z } from 'zod';\n\nexport const ConfigSchema = z.object({\n logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n preferredStack: z.array(z.string()).default([]),\n apiBaseUrl: z.string().optional(),\n language: z.enum(['pt-br', 'en-us', 'es-es']).default('pt-br'),\n project: z.string().optional(),\n environment: z.string().optional(),\n activeRealm: z.string().optional(), // Currently logged-in realm\n agents: z.object({\n dev: z.string().optional(),\n ba: z.string().optional(),\n spec: z.string().optional(),\n qa: z.string().optional(),\n scan: z.string().optional()\n }).default({})\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { z } from 'zod';\nimport { colors } from '../../ui/colors.js';\n\n// Reusing schema definition implicitly or we could export it from config-manager\n// For now, let's define a partial schema for RC files\nexport const SharkRCFileSchema = z.object({\n project: z.string().optional(),\n environment: z.string().optional(),\n logLevel: z.string().optional(),\n language: z.string().optional(),\n preferredStack: z.array(z.string()).optional(),\n // Add other keys as needed from the main config\n}).passthrough(); // Allow extra keys for forward compatibility\n\nexport type SharkRC = z.infer<typeof SharkRCFileSchema>;\n\nfunction loadFile(filePath: string): SharkRC {\n try {\n if (!fs.existsSync(filePath)) {\n return {};\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n const result = SharkRCFileSchema.safeParse(json);\n\n if (result.success) {\n return result.data;\n } else {\n console.warn(colors.warning(`⚠️ Invalid config in ${filePath}: ${result.error.message}`));\n return {};\n }\n } catch (error: any) {\n console.warn(colors.warning(`⚠️ Failed to read ${filePath}: ${error.message}`));\n return {};\n }\n}\n\nexport function loadSharkRC(): SharkRC {\n const homeDir = os.homedir();\n const currentDir = process.cwd();\n\n const globalPath = path.join(homeDir, '.sharkrc');\n const localPath = path.join(currentDir, '.sharkrc');\n\n const globalConfig = loadFile(globalPath);\n const localConfig = loadFile(localPath);\n\n // Local overrides Global\n return {\n ...globalConfig,\n ...localConfig\n };\n}\n\nexport function saveGlobalRC(configUpdates: Partial<SharkRC>): void {\n const homeDir = os.homedir();\n const globalPath = path.join(homeDir, '.sharkrc');\n\n const currentConfig = loadFile(globalPath);\n const newConfig = { ...currentConfig, ...configUpdates };\n\n try {\n fs.writeFileSync(globalPath, JSON.stringify(newConfig, null, 2), 'utf-8');\n } catch (error: any) {\n throw new Error(`Failed to save global config to ${globalPath}: ${error.message}`);\n }\n}\n","import { Locale } from \"../types.js\";\n\nexport const enUs: Locale = {\n common: {\n loading: 'Loading...',\n success: 'Success',\n error: 'Error',\n cancel: 'Cancel',\n operationCancelled: 'Operation cancelled.'\n },\n commands: {\n config: {\n title: 'Shark AI Configuration',\n selectAction: 'What matches your needs?',\n actions: {\n language: 'Set Language',\n logLevel: 'Log Level',\n agents: 'Configure Agents',\n back: 'Back'\n },\n selectLanguage: 'Select language:',\n agentMenu: {\n title: 'Agent Configuration',\n selectAgent: 'Which agent would you like to configure?',\n enterId: 'Enter StackSpot Agent ID (or empty for default):',\n updated: 'Agent ID {0} updated.',\n options: {\n dev: 'Developer Agent',\n ba: 'Business Analyst',\n spec: 'Specification Agent',\n qa: 'QA Agent',\n scan: 'Scan Agent',\n back: 'Back'\n }\n },\n languageUpdated: 'Updated language to: {0}'\n },\n login: {\n intro: 'StackSpot Login',\n alreadyLoggedIn: 'You are already logged in',\n success: 'Successfully logged in!',\n error: 'Login failed'\n },\n scan: {\n intro: '🕵️♂️ Scan Agent',\n scanningProject: 'Scanning project at:',\n outputTarget: 'Output file:',\n language: 'Language:',\n templateCreated: '✅ Template created at:',\n fileExists: '📄 File already exists, will be updated',\n analyzing: '🕵️♂️ Scan Agent analyzing (Step {step})...',\n completed: '✨ Scan completed successfully!',\n error: 'Error executing scan',\n stepComplete: 'Step complete',\n scanningDir: '📂 Scanning dir: {0}',\n readingFile: '📖 Reading file: {0}',\n searching: '🔍 Searching: {0}',\n generated: '✅ Context Generated: {0}',\n updated: '✅ Context Updated: {0}',\n notFound: 'File not found.',\n stopped: 'Scan Agent stopped without actions.',\n agentAsks: '🤖 Scan Agent asks:',\n agentInput: 'Agent needs input:',\n replyPlaceholder: 'Reply...',\n targetRedirect: \"Agent targeted '{0}' but we enforce '{1}'. Redirecting write.\",\n contentNotFound: 'Target content not found for replacement.',\n skipped: 'Skipped (Scan Agent only writes context file)',\n pendingSections: 'The following sections still need analysis: {0}.',\n allPopulated: 'All sections appear to be populated!'\n }\n }\n};\n","import { Locale } from \"../types.js\";\n\nexport const esEs: Locale = {\n common: {\n loading: 'Cargando...',\n success: 'Éxito',\n error: 'Error',\n cancel: 'Cancelar',\n operationCancelled: 'Operación cancelada.'\n },\n commands: {\n config: {\n title: 'Configuración Shark AI',\n selectAction: '¿Qué desea configurar?',\n actions: {\n language: 'Cambiar Idioma',\n logLevel: 'Nivel de Log',\n agents: 'Configurar Agentes',\n back: 'Volver'\n },\n selectLanguage: 'Seleccione el idioma:',\n agentMenu: {\n title: 'Configuración de Agentes',\n selectAgent: '¿Qué agente desea configurar?',\n enterId: 'Ingrese el ID del Agente StackSpot (o dejar vacío para predeterminado):',\n updated: 'ID del Agente {0} actualizado.',\n options: {\n dev: 'Agente Desarrollador',\n ba: 'Analista de Negocios',\n spec: 'Agente de Especificación',\n qa: 'Agente de QA',\n scan: 'Agente de Escaneo',\n back: 'Volver'\n }\n },\n languageUpdated: 'Idioma actualizado a: {0}'\n },\n login: {\n intro: 'Login StackSpot',\n alreadyLoggedIn: 'Ya has iniciado sesión',\n success: '¡Inicio de sesión exitoso!',\n error: 'Error de inicio de sesión'\n },\n scan: {\n intro: '🕵️♂️ Agente de Escaneo',\n scanningProject: 'Escaneando proyecto en:',\n outputTarget: 'Archivo de salida:',\n language: 'Idioma:',\n templateCreated: '✅ Plantilla creada en:',\n fileExists: '📄 El archivo ya existe, será actualizado',\n analyzing: '🕵️♂️ Agente de escaneo analizando (Paso {step})...',\n completed: '✨ Escaneo completado exitosamente!',\n error: 'Error al ejecutar escaneo',\n stepComplete: 'Paso completado',\n scanningDir: '📂 Escaneando carpeta: {0}',\n readingFile: '📖 Leyendo archivo: {0}',\n searching: '🔍 Buscando: {0}',\n generated: '✅ Contexto Generado: {0}',\n updated: '✅ Contexto Actualizado: {0}',\n notFound: 'Archivo no encontrado.',\n stopped: 'Agente de Escaneo se detuvo sin acciones.',\n agentAsks: '🤖 Agente de Escaneo pregunta:',\n agentInput: 'Agente necesita entrada:',\n replyPlaceholder: 'Respuesta...',\n targetRedirect: \"Agente apuntó a '{0}' pero forzamos '{1}'. Redirigiendo escritura.\",\n contentNotFound: 'Contenido objetivo no encontrado para reemplazo.',\n skipped: 'Omitido (Agente de Escaneo solo escribe en archivo de contexto)',\n pendingSections: 'Las siguientes secciones aún necesitan análisis: {0}.',\n allPopulated: '¡Todas las secciones parecen estar pobladas!'\n }\n }\n};\n","import { Locale } from \"../types.js\";\n\nexport const ptBr: Locale = {\n common: {\n loading: 'Carregando...',\n success: 'Sucesso',\n error: 'Erro',\n cancel: 'Cancelar',\n operationCancelled: 'Operação cancelada.'\n },\n commands: {\n config: {\n title: 'Configurações do Shark AI',\n selectAction: 'O que você deseja configurar?',\n actions: {\n language: 'Alterar Idioma',\n logLevel: 'Nível de Log',\n agents: 'Configurar Agentes',\n back: 'Voltar'\n },\n selectLanguage: 'Selecione o idioma:',\n agentMenu: {\n title: 'Configuração de Agentes',\n selectAgent: 'Qual agente você deseja configurar?',\n enterId: 'Digite o ID do Agente StackSpot (ou deixe vazio para padrão):',\n updated: 'ID do Agente {0} atualizado.',\n options: {\n dev: 'Developer Agent',\n ba: 'Business Analyst',\n spec: 'Specification Agent',\n qa: 'QA Agent',\n scan: 'Scan Agent',\n back: 'Voltar'\n }\n },\n languageUpdated: 'Idioma atualizado para: {0}'\n },\n login: {\n intro: 'Login StackSpot',\n alreadyLoggedIn: 'Você já está logado',\n success: 'Login realizado com sucesso!',\n error: 'Falha no login'\n },\n scan: {\n intro: '🕵️♂️ Scan Agent',\n scanningProject: 'Escaneando projeto em:',\n outputTarget: 'Arquivo de saída:',\n language: 'Idioma:',\n templateCreated: '✅ Template criado em:',\n fileExists: '📄 Arquivo já existe, será atualizado',\n analyzing: '🕵️♂️ Scan Agent analisando (Passo {step})...',\n completed: '✨ Scan concluído com sucesso!',\n error: 'Erro ao executar scan',\n stepComplete: 'Passo concluído',\n scanningDir: '📂 Escaneando pasta: {0}',\n readingFile: '📖 Lendo arquivo: {0}',\n searching: '🔍 Buscando: {0}',\n generated: '✅ Contexto Gerado: {0}',\n updated: '✅ Contexto Atualizado: {0}',\n notFound: 'Arquivo não encontrado.',\n stopped: 'Scan Agent parou sem ações.',\n agentAsks: '🤖 Scan Agent pergunta:',\n agentInput: 'Agente precisa de input:',\n replyPlaceholder: 'Resposta...',\n targetRedirect: \"Agente mirou '{0}' mas forçamos '{1}'. Redirecionando escrita.\",\n contentNotFound: 'Conteúdo alvo não encontrado para substituição.',\n skipped: 'Pulado (Scan Agent só escreve no arquivo de contexto)',\n pendingSections: 'As seguintes seções ainda precisam de análise: {0}.',\n allPopulated: 'Todas as seções parecem preenchidas!'\n }\n }\n};\n","import { ConfigManager } from \"../config-manager.js\";\nimport { enUs } from \"./locales/en-us.js\";\nimport { esEs } from \"./locales/es-es.js\";\nimport { ptBr } from \"./locales/pt-br.js\";\nimport { Locale } from \"./types.js\";\n\nconst locales: Record<string, Locale> = {\n 'pt-br': ptBr,\n 'en-us': enUs,\n 'es-es': esEs\n};\n\nfunction getNestedValue(obj: any, path: string): string | undefined {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\n}\n\nexport function t(key: string, ...args: string[]): string {\n const config = ConfigManager.getInstance().getConfig();\n const lang = config.language || 'pt-br';\n\n // Normalize lang just in case\n const normalizedLang = lang.toLowerCase();\n\n const locale = locales[normalizedLang] || locales['pt-br']; // Fallback to pt-br\n\n let template = getNestedValue(locale, key);\n\n if (!template) {\n // Fallback to pt-br if key missing in current language\n template = getNestedValue(locales['pt-br'], key);\n }\n\n if (!template) {\n return key; // Return key if not found anywhere\n }\n\n // Simple replacement for {0}, {1}, etc.\n return template.replace(/\\{(\\d+)\\}/g, (match, index) => {\n return typeof args[index] !== 'undefined' ? args[index] : match;\n });\n}\n","import { AuthToken } from './types.js';\n\n/**\n * Authenticates with StackSpot IDM using Client Credentials flow.\n * \n * @param realm The account realm (slug).\n * @param clientId The Client ID.\n * @param clientSecret The Client Secret.\n * @returns Promise resolving to the AuthToken.\n * @throws Error if authentication fails.\n */\nexport async function authenticate(realm: string, clientId: string, clientSecret: string): Promise<AuthToken> {\n const url = `https://idm.stackspot.com/${realm}/oidc/oauth/token`;\n\n const body = new URLSearchParams();\n body.append('grant_type', 'client_credentials');\n body.append('client_id', clientId);\n body.append('client_secret', clientSecret);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Authentication failed: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n const data = (await response.json()) as AuthToken;\n return data;\n } catch (error: any) {\n // Wrap network errors or other failures\n if (error instanceof Error) {\n throw new Error(`Failed to authenticate with StackSpot: ${error.message}`);\n }\n throw error;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { colors } from '../../ui/colors.js';\n\nconst SHARK_DIR = '.shark-ai';\nconst CREDENTIALS_FILE = 'credentials.json';\n\ninterface Credentials {\n clientId?: string;\n clientKey?: string;\n accessToken: string;\n expiresAt?: number;\n}\n\ntype CredentialsMap = Record<string, Credentials>;\n\n/**\n * Manages secure storage of authentication tokens using a local file with restricted permissions.\n * Replaces the native keytar dependency for better compatibility.\n */\nexport const tokenStorage = {\n /**\n * Get the secure file path\n */\n getFilePath(): string {\n const homeDir = os.homedir();\n const sharkDir = path.join(homeDir, SHARK_DIR);\n\n // Ensure directory exists with 700 permissions\n if (!fs.existsSync(sharkDir)) {\n fs.mkdirSync(sharkDir, { mode: 0o700 });\n }\n\n return path.join(sharkDir, CREDENTIALS_FILE);\n },\n\n /**\n * Reads the credentials file safely\n */\n readCredentials(): CredentialsMap {\n const filePath = this.getFilePath();\n try {\n if (!fs.existsSync(filePath)) {\n return {};\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n return {};\n }\n },\n\n /**\n * Save credentials to file with 600 permissions\n */\n writeCredentials(creds: CredentialsMap): void {\n const filePath = this.getFilePath();\n try {\n fs.writeFileSync(filePath, JSON.stringify(creds, null, 2), { mode: 0o600 });\n } catch (error: any) {\n throw new Error(`Failed to save credentials to ${filePath}: ${error.message}`);\n }\n },\n\n /**\n * Saves the access token (and optional client credentials) for the given realm.\n */\n async saveToken(realm: string, token: string, clientId?: string, clientKey?: string, expiresIn?: number): Promise<void> {\n const creds = this.readCredentials();\n\n const now = Math.floor(Date.now() / 1000);\n const expiresAt = expiresIn ? now + expiresIn : undefined;\n\n creds[realm] = {\n ...creds[realm], // Preserve existing data if any\n accessToken: token,\n ...(clientId && { clientId }),\n ...(clientKey && { clientKey }),\n ...(expiresAt && { expiresAt })\n };\n\n this.writeCredentials(creds);\n },\n\n /**\n * Retrieves the access token for the given realm.\n * Checks ENV var first (SHARK_ACCESS_TOKEN).\n */\n async getToken(realm: string): Promise<string | null> {\n // Priority: Environment Variable (CI/CD)\n if (process.env.SHARK_ACCESS_TOKEN) {\n return process.env.SHARK_ACCESS_TOKEN;\n }\n\n const creds = this.readCredentials();\n const realmCreds = creds[realm];\n\n if (!realmCreds) return null;\n\n // Check expiration logic could go here, but for now just return the token\n // The auth layer should handle refresh if token is expired/invalid\n return realmCreds.accessToken;\n },\n\n /**\n * Retrieves full credentials object (for refresh logic)\n */\n async getCredentials(realm: string): Promise<Credentials | null> {\n const creds = this.readCredentials();\n return creds[realm] || null;\n },\n\n /**\n * Deletes the access token/credentials for the given realm.\n */\n async deleteToken(realm: string): Promise<boolean> {\n const creds = this.readCredentials();\n if (creds[realm]) {\n delete creds[realm];\n this.writeCredentials(creds);\n return true;\n }\n return false;\n }\n};\n","import dns from 'dns/promises';\nimport { colors } from '../../ui/colors.js';\n\nexport class Connectivity {\n private static instance: Connectivity;\n // Common reliable host to check connectivity\n private readonly CHECK_HOST = 'google.com';\n private readonly TIMEOUT_MS = 3000;\n\n private constructor() { }\n\n public static getInstance(): Connectivity {\n if (!Connectivity.instance) {\n Connectivity.instance = new Connectivity();\n }\n return Connectivity.instance;\n }\n\n /**\n * Checks if the user has internet connection.\n * Uses DNS lookup which is generally faster and lighter than a full fetch.\n */\n public async checkConnection(): Promise<boolean> {\n try {\n // Promise.race to enforce timeout\n await Promise.race([\n dns.lookup(this.CHECK_HOST),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error('timeout')), this.TIMEOUT_MS)\n )\n ]);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Throws an error if the user is offline.\n * Use this as a guard at the start of online-only commands.\n */\n public async requireOnline(): Promise<void> {\n const isOnline = await this.checkConnection();\n if (!isOnline) {\n throw new Error(`⚠️ ${colors.bold('Offline Mode Detected')}\\n This command requires an active internet connection.\\n Please check your network and try again.`);\n }\n }\n}\n\nexport const connectivity = Connectivity.getInstance();\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport class FileLogger {\n private static logPath = path.resolve(process.cwd(), 'shark-debug.log');\n private static enabled = true; // Enabled by default for this debugging session\n\n static init() {\n try {\n fs.writeFileSync(this.logPath, `--- Shark CLI Debug Log Started at ${new Date().toISOString()} ---\\n`);\n } catch (e) {\n console.error('Failed to initialize debug log:', e);\n }\n }\n\n static log(category: string, message: string, data?: any) {\n if (!this.enabled) return;\n\n try {\n const timestamp = new Date().toISOString();\n let logEntry = `[${timestamp}] [${category.toUpperCase()}] ${message}\\n`;\n if (data !== undefined) {\n if (typeof data === 'object') {\n logEntry += JSON.stringify(data, null, 2) + '\\n';\n } else {\n logEntry += String(data) + '\\n';\n }\n }\n logEntry += '-'.repeat(40) + '\\n';\n\n fs.appendFileSync(this.logPath, logEntry);\n } catch (e) {\n // calculated risk: silence logging errors to not break app\n }\n }\n}\n","import { tui } from '../ui/tui.js';\nimport { colors } from '../ui/colors.js';\nimport { ConfigManager } from '../core/config-manager.js';\nimport { saveGlobalRC } from '../core/config/sharkrc-loader.js';\nimport { t } from '../core/i18n/index.js';\n\nexport const configCommand = {\n action: async () => {\n tui.intro(t('commands.config.title'));\n\n const manager = ConfigManager.getInstance();\n const currentConfig = manager.getConfig();\n\n // Show current status\n tui.log.info(colors.dim('Current Configuration:'));\n tui.log.message(`• Project: ${colors.primary(currentConfig.project || 'Not Set')}`);\n tui.log.message(`• Language: ${colors.primary(currentConfig.language)}`);\n tui.log.message(`• Log Level: ${colors.primary(currentConfig.logLevel)}`);\n\n const action = await tui.select({\n message: t('commands.config.selectAction'),\n options: [\n { value: 'project', label: 'Set Default Project' },\n { value: 'language', label: t('commands.config.actions.language') },\n { value: 'logLevel', label: t('commands.config.actions.logLevel') },\n { value: 'agents', label: t('commands.config.actions.agents') },\n { value: 'exit', label: t('commands.config.actions.back') }\n ]\n });\n\n if (tui.isCancel(action) || action === 'exit') {\n tui.outro('Configuration unchanged.');\n return;\n }\n\n try {\n if (action === 'project') {\n const project = await tui.text({\n message: 'Enter default project slug:',\n initialValue: currentConfig.project,\n placeholder: 'e.g., my-awesome-project'\n });\n\n if (!tui.isCancel(project)) {\n saveGlobalRC({ project: project as string });\n tui.log.success(`Updated project to: ${project}`);\n }\n }\n\n if (action === 'language') {\n const lang = await tui.select({\n message: t('commands.config.selectLanguage'),\n options: [\n { value: 'pt-br', label: 'Português (Brasil)' },\n { value: 'en-us', label: 'English (US)' },\n { value: 'es-es', label: 'Español' }\n ],\n initialValue: currentConfig.language\n });\n\n if (!tui.isCancel(lang)) {\n saveGlobalRC({ language: lang as any });\n tui.log.success(t('commands.config.languageUpdated', lang as string));\n }\n }\n\n if (action === 'logLevel') {\n const level = await tui.select({\n message: 'Select log level:',\n options: [\n { value: 'debug', label: 'Debug (Verbose)' },\n { value: 'info', label: 'Info (Standard)' },\n { value: 'warn', label: 'Warn (Important only)' },\n { value: 'error', label: 'Error (Critical only)' }\n ],\n initialValue: currentConfig.logLevel\n });\n\n if (!tui.isCancel(level)) {\n saveGlobalRC({ logLevel: level as any });\n tui.log.success(`Updated log level to: ${level}`);\n }\n }\n\n if (action === 'agents') {\n const agentType = await tui.select({\n message: t('commands.config.agentMenu.selectAgent'),\n options: [\n { value: 'dev', label: t('commands.config.agentMenu.options.dev') },\n { value: 'ba', label: t('commands.config.agentMenu.options.ba') },\n { value: 'spec', label: t('commands.config.agentMenu.options.spec') },\n { value: 'qa', label: t('commands.config.agentMenu.options.qa') },\n { value: 'scan', label: t('commands.config.agentMenu.options.scan') },\n { value: 'back', label: t('commands.config.agentMenu.options.back') }\n ]\n });\n\n if (!tui.isCancel(agentType) && agentType !== 'back') {\n const agentId = await tui.text({\n message: t('commands.config.agentMenu.enterId'),\n initialValue: (currentConfig.agents as any)[agentType as string] || '',\n placeholder: '01xxxxxxxxxxxxxxxxxxxxxxxx'\n });\n\n if (!tui.isCancel(agentId)) {\n const newAgents = { ...currentConfig.agents, [agentType as string]: agentId };\n saveGlobalRC({ agents: newAgents as any });\n tui.log.success(t('commands.config.agentMenu.updated', agentType as string));\n }\n }\n }\n\n // Reload to confirm\n manager.reloadConfig();\n tui.outro('Configuration saved successfully to ~/.sharkrc');\n\n } catch (error: any) {\n tui.log.error(`Failed to save configuration: ${error.message}`);\n process.exit(1);\n }\n }\n};\n"],"mappings":"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","names":["text","os","path","fs","z","z","fs","os","path","path","fs","path","os","fs","path","spinner"]}
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/colors.ts","../src/commands/login.ts","../src/ui/tui.ts","../src/core/config-manager.ts","../src/core/config/schema.ts","../src/core/config/sharkrc-loader.ts","../src/core/i18n/locales/en-us.ts","../src/core/i18n/locales/es-es.ts","../src/core/i18n/locales/pt-br.ts","../src/core/i18n/index.ts","../src/core/auth/stackspot-auth.ts","../src/core/auth/token-storage.ts","../src/core/network/connectivity.ts","../src/core/debug/file-logger.ts","../src/commands/config.ts"],"sourcesContent":["import pico from 'picocolors';\n\n// Deep Ocean Theme Palette\n// Primary (Action): Cyan\n// Secondary (Context): Blue\n// Text: White/Gray\n\nexport const colors = {\n // Semantic Colors\n primary: (text: string | number) => pico.cyan(text),\n secondary: (text: string | number) => pico.blue(text),\n\n // Status Colors\n success: (text: string | number) => pico.green(text),\n error: (text: string | number) => pico.red(text),\n warning: (text: string | number) => pico.yellow(text),\n\n // Neutral Colors\n dim: (text: string | number) => pico.dim(text),\n inverse: (text: string | number) => pico.inverse(text),\n white: (text: string | number) => pico.white(text),\n gray: (text: string | number) => pico.gray(text),\n\n // Styling\n bold: (text: string | number) => pico.bold(text),\n italic: (text: string | number) => pico.italic(text),\n};\n","import { Command } from 'commander';\nimport { tui } from '../ui/tui.js';\nimport { authenticate } from '../core/auth/stackspot-auth.js';\nimport { tokenStorage } from '../core/auth/token-storage.js';\nimport { connectivity } from '../core/network/connectivity.js';\nimport { ConfigManager } from '../core/config-manager.js';\nimport { colors } from '../ui/colors.js';\nimport { t } from '../core/i18n/index.js';\nimport { FileLogger } from '../core/debug/file-logger.js';\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with StackSpot')\n .action(async () => {\n try {\n FileLogger.init();\n await connectivity.requireOnline();\n\n\n tui.intro(t('commands.login.intro'));\n\n const realm = await tui.text({\n message: 'Account Realm (Slug)',\n placeholder: 'e.g. stackspot-freemium',\n validate: (value) => {\n if (!value) return 'Realm is required';\n if (value.includes(' ')) return 'Realm cannot contain spaces';\n },\n });\n\n if (tui.isCancel(realm)) {\n tui.outro('Login cancelled');\n return;\n }\n\n const clientId = await tui.text({\n message: 'Client ID',\n validate: (value) => {\n if (!value) return 'Client ID is required';\n },\n });\n\n if (tui.isCancel(clientId)) {\n tui.outro('Login cancelled');\n return;\n }\n\n const clientKey = await tui.password({\n message: 'Client Key',\n validate: (value) => {\n if (!value) return 'Client Key is required';\n },\n });\n\n if (tui.isCancel(clientKey)) {\n tui.outro('Login cancelled');\n return;\n }\n\n const spinner = tui.spinner();\n spinner.start('Authenticating...');\n\n try {\n const tokens = await authenticate(\n (realm as string).trim(),\n (clientId as string).trim(),\n (clientKey as string).trim()\n );\n\n FileLogger.log('LOGIN', 'Authentication success', { realm });\n\n // Save token and credentials for monitoring/refresh\n await tokenStorage.saveToken(\n realm as string,\n tokens.access_token,\n clientId as string,\n clientKey as string,\n tokens.expires_in\n );\n\n // Save active realm to config\n const configManager = ConfigManager.getInstance();\n await configManager.set('activeRealm', realm as string);\n\n spinner.stop(t('commands.login.success'));\n tui.outro(t('commands.login.success'));\n\n } catch (error: any) {\n spinner.stop(t('commands.login.error'), 1);\n tui.log.error(error.message);\n FileLogger.log('LOGIN', 'Authentication failed', error);\n process.exit(1);\n }\n } catch (error: any) {\n tui.log.error(error.message);\n FileLogger.log('LOGIN', 'Unexpected error', error);\n process.exit(1);\n }\n });\n","import * as p from '@clack/prompts';\nimport { colors } from './colors.js';\nimport { t } from '../core/i18n/index.js';\n\nexport interface TuiSpinner {\n start(msg?: string): void;\n stop(msg?: string, code?: number): void;\n message(msg: string): void;\n}\n\nexport const tui = {\n intro(title: string) {\n p.intro(colors.inverse(` ${title} `));\n },\n\n log: p.log,\n isCancel: p.isCancel,\n\n outro(msg: string) {\n p.outro(colors.primary(msg));\n },\n\n spinner(): TuiSpinner {\n const s = p.spinner();\n return {\n start: (msg) => s.start(msg),\n stop: (msg, code = 0) => s.stop(msg, code),\n message: (msg) => s.message(msg),\n };\n },\n\n async text(opts: p.TextOptions): Promise<string> {\n const result = await p.text(opts);\n this.handleCancel(result);\n return result as string;\n },\n\n async password(opts: p.PasswordOptions): Promise<string> {\n const result = await p.password(opts);\n this.handleCancel(result);\n return result as string;\n },\n\n async confirm(opts: p.ConfirmOptions): Promise<boolean> {\n const result = await p.confirm(opts);\n this.handleCancel(result);\n return result as boolean;\n },\n\n async select<Value>(opts: p.SelectOptions<any, Value>): Promise<Value> {\n const result = await p.select(opts);\n this.handleCancel(result);\n return result as Value;\n },\n\n async multiselect<Value>(opts: p.MultiSelectOptions<any, Value>): Promise<Value[]> {\n const result = await p.multiselect(opts);\n this.handleCancel(result);\n return result as Value[];\n },\n\n /**\n * Centralized cancel handler.\n * If the user presses Ctrl+C, Clack returns a symbol.\n * We detect it and exit gracefully.\n */\n handleCancel(value: unknown) {\n if (p.isCancel(value)) {\n p.cancel(t('common.operationCancelled'));\n process.exit(0);\n }\n },\n\n // Expose raw clack for advanced use cases if strictly necessary\n raw: p\n};\n","import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport { ConfigSchema, type Config } from './config/schema.js';\nimport { loadSharkRC } from './config/sharkrc-loader.js';\n\nexport class ConfigManager {\n private static instance: ConfigManager;\n private config: Config | null = null;\n\n private constructor() { }\n\n public static getInstance(): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n }\n\n public getConfig(): Config {\n if (!this.config) {\n this.config = this.loadConfig();\n }\n return this.config;\n }\n\n public reloadConfig(): void {\n this.config = this.loadConfig();\n }\n\n private loadConfig(): Config {\n // 1. Defaults (via Zod)\n let mergedConfig: any = {};\n\n // 2 & 3. Global & Local Config (.sharkrc)\n // Handled by SharkRCLoader which encapsulates precedence (Local > Global)\n const rcConfig = loadSharkRC();\n mergedConfig = { ...mergedConfig, ...rcConfig };\n\n // 4. Env Vars (SHARK_*)\n const envConfig = this.loadEnvConfig();\n mergedConfig = { ...mergedConfig, ...envConfig };\n\n // 5. Validation & Defaults\n const parsed = ConfigSchema.safeParse(mergedConfig);\n if (!parsed.success) {\n console.warn('⚠️ Invalid configuration detected, falling back to defaults or partial config');\n console.warn(parsed.error.message);\n // In a stricter mode we might throw, but CLI should try to run\n // For now, let's return a default parse to ensure we have a valid object\n return ConfigSchema.parse({});\n }\n\n return parsed.data;\n }\n\n private readJsonFile(filePath: string): any {\n try {\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch (error) {\n console.warn(`Failed to read config file at ${filePath}`, error);\n }\n return {};\n }\n\n\n public async set(key: string, value: any): Promise<void> {\n if (!this.config) {\n this.config = this.loadConfig();\n }\n (this.config as any)[key] = value;\n\n // Persist to .sharkrc in home directory\n const homeDir = os.homedir();\n const configPath = path.join(homeDir, '.sharkrc');\n\n try {\n let currentFileConfig = {};\n if (fs.existsSync(configPath)) {\n currentFileConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n }\n const newConfig = { ...currentFileConfig, [key]: value };\n fs.writeFileSync(configPath, JSON.stringify(newConfig, null, 2));\n } catch (error) {\n console.error('Failed to save configuration:', error);\n }\n }\n\n private loadEnvConfig(): any {\n const config: any = {};\n\n if (process.env.SHARK_LOG_LEVEL) {\n config.logLevel = process.env.SHARK_LOG_LEVEL;\n }\n if (process.env.SHARK_API_BASE_URL) {\n config.apiBaseUrl = process.env.SHARK_API_BASE_URL;\n }\n if (process.env.SHARK_LANGUAGE) {\n config.language = process.env.SHARK_LANGUAGE;\n }\n\n // Stack is list, requires splitting\n if (process.env.SHARK_PREFERRED_STACK) {\n config.preferredStack = process.env.SHARK_PREFERRED_STACK.split(',').map(s => s.trim());\n }\n\n return config;\n }\n}\n","import { z } from 'zod';\n\nexport const ConfigSchema = z.object({\n logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n preferredStack: z.array(z.string()).default([]),\n apiBaseUrl: z.string().optional(),\n language: z.enum(['pt-br', 'en-us', 'es-es']).default('pt-br'),\n project: z.string().optional(),\n environment: z.string().optional(),\n activeRealm: z.string().optional(), // Currently logged-in realm\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { z } from 'zod';\nimport { colors } from '../../ui/colors.js';\n\n// Reusing schema definition implicitly or we could export it from config-manager\n// For now, let's define a partial schema for RC files\nexport const SharkRCFileSchema = z.object({\n project: z.string().optional(),\n environment: z.string().optional(),\n logLevel: z.string().optional(),\n language: z.string().optional(),\n preferredStack: z.array(z.string()).optional(),\n // Add other keys as needed from the main config\n}).passthrough(); // Allow extra keys for forward compatibility\n\nexport type SharkRC = z.infer<typeof SharkRCFileSchema>;\n\nfunction loadFile(filePath: string): SharkRC {\n try {\n if (!fs.existsSync(filePath)) {\n return {};\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n const result = SharkRCFileSchema.safeParse(json);\n\n if (result.success) {\n return result.data;\n } else {\n console.warn(colors.warning(`⚠️ Invalid config in ${filePath}: ${result.error.message}`));\n return {};\n }\n } catch (error: any) {\n console.warn(colors.warning(`⚠️ Failed to read ${filePath}: ${error.message}`));\n return {};\n }\n}\n\nexport function loadSharkRC(): SharkRC {\n const homeDir = os.homedir();\n const currentDir = process.cwd();\n\n const globalPath = path.join(homeDir, '.sharkrc');\n const localPath = path.join(currentDir, '.sharkrc');\n\n const globalConfig = loadFile(globalPath);\n const localConfig = loadFile(localPath);\n\n // Local overrides Global\n return {\n ...globalConfig,\n ...localConfig\n };\n}\n\nexport function saveGlobalRC(configUpdates: Partial<SharkRC>): void {\n const homeDir = os.homedir();\n const globalPath = path.join(homeDir, '.sharkrc');\n\n const currentConfig = loadFile(globalPath);\n const newConfig = { ...currentConfig, ...configUpdates };\n\n try {\n fs.writeFileSync(globalPath, JSON.stringify(newConfig, null, 2), 'utf-8');\n } catch (error: any) {\n throw new Error(`Failed to save global config to ${globalPath}: ${error.message}`);\n }\n}\n","import { Locale } from \"../types.js\";\n\nexport const enUs: Locale = {\n common: {\n loading: 'Loading...',\n success: 'Success',\n error: 'Error',\n cancel: 'Cancel',\n operationCancelled: 'Operation cancelled.'\n },\n commands: {\n config: {\n title: 'Shark AI Configuration',\n selectAction: 'What matches your needs?',\n actions: {\n language: 'Set Language',\n logLevel: 'Log Level',\n back: 'Back'\n },\n selectLanguage: 'Select language:',\n languageUpdated: 'Updated language to: {0}'\n },\n login: {\n intro: 'StackSpot Login',\n alreadyLoggedIn: 'You are already logged in',\n success: 'Successfully logged in!',\n error: 'Login failed'\n }\n }\n};\n","import { Locale } from \"../types.js\";\n\nexport const esEs: Locale = {\n common: {\n loading: 'Cargando...',\n success: 'Éxito',\n error: 'Error',\n cancel: 'Cancelar',\n operationCancelled: 'Operación cancelada.'\n },\n commands: {\n config: {\n title: 'Configuración Shark AI',\n selectAction: '¿Qué desea configurar?',\n actions: {\n language: 'Cambiar Idioma',\n logLevel: 'Nivel de Log',\n back: 'Volver'\n },\n selectLanguage: 'Seleccione el idioma:',\n languageUpdated: 'Idioma actualizado a: {0}'\n },\n login: {\n intro: 'Login StackSpot',\n alreadyLoggedIn: 'Ya has iniciado sesión',\n success: '¡Inicio de sesión exitoso!',\n error: 'Error de inicio de sesión'\n }\n }\n};\n","import { Locale } from \"../types.js\";\n\nexport const ptBr: Locale = {\n common: {\n loading: 'Carregando...',\n success: 'Sucesso',\n error: 'Erro',\n cancel: 'Cancelar',\n operationCancelled: 'Operação cancelada.'\n },\n commands: {\n config: {\n title: 'Configurações do Shark AI',\n selectAction: 'O que você deseja configurar?',\n actions: {\n language: 'Alterar Idioma',\n logLevel: 'Nível de Log',\n back: 'Voltar'\n },\n selectLanguage: 'Selecione o idioma:',\n languageUpdated: 'Idioma atualizado para: {0}'\n },\n login: {\n intro: 'Login StackSpot',\n alreadyLoggedIn: 'Você já está logado',\n success: 'Login realizado com sucesso!',\n error: 'Falha no login'\n }\n }\n};\n","import { ConfigManager } from \"../config-manager.js\";\nimport { enUs } from \"./locales/en-us.js\";\nimport { esEs } from \"./locales/es-es.js\";\nimport { ptBr } from \"./locales/pt-br.js\";\nimport { Locale } from \"./types.js\";\n\nconst locales: Record<string, Locale> = {\n 'pt-br': ptBr,\n 'en-us': enUs,\n 'es-es': esEs\n};\n\nfunction getNestedValue(obj: any, path: string): string | undefined {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\n}\n\nexport function t(key: string, ...args: string[]): string {\n const config = ConfigManager.getInstance().getConfig();\n const lang = config.language || 'pt-br';\n\n // Normalize lang just in case\n const normalizedLang = lang.toLowerCase();\n\n const locale = locales[normalizedLang] || locales['pt-br']; // Fallback to pt-br\n\n let template = getNestedValue(locale, key);\n\n if (!template) {\n // Fallback to pt-br if key missing in current language\n template = getNestedValue(locales['pt-br'], key);\n }\n\n if (!template) {\n return key; // Return key if not found anywhere\n }\n\n // Simple replacement for {0}, {1}, etc.\n return template.replace(/\\{(\\d+)\\}/g, (match, index) => {\n return typeof args[index] !== 'undefined' ? args[index] : match;\n });\n}\n","import { AuthToken } from './types.js';\n\n/**\n * Authenticates with StackSpot IDM using Client Credentials flow.\n * \n * @param realm The account realm (slug).\n * @param clientId The Client ID.\n * @param clientSecret The Client Secret.\n * @returns Promise resolving to the AuthToken.\n * @throws Error if authentication fails.\n */\nexport async function authenticate(realm: string, clientId: string, clientSecret: string): Promise<AuthToken> {\n const url = `https://idm.stackspot.com/${realm}/oidc/oauth/token`;\n\n const body = new URLSearchParams();\n body.append('grant_type', 'client_credentials');\n body.append('client_id', clientId);\n body.append('client_secret', clientSecret);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Authentication failed: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n const data = (await response.json()) as AuthToken;\n return data;\n } catch (error: any) {\n // Wrap network errors or other failures\n if (error instanceof Error) {\n throw new Error(`Failed to authenticate with StackSpot: ${error.message}`);\n }\n throw error;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { colors } from '../../ui/colors.js';\n\nconst SHARK_DIR = '.shark-ai';\nconst CREDENTIALS_FILE = 'credentials.json';\n\ninterface Credentials {\n clientId?: string;\n clientKey?: string;\n accessToken: string;\n expiresAt?: number;\n}\n\ntype CredentialsMap = Record<string, Credentials>;\n\n/**\n * Manages secure storage of authentication tokens using a local file with restricted permissions.\n * Replaces the native keytar dependency for better compatibility.\n */\nexport const tokenStorage = {\n /**\n * Get the secure file path\n */\n getFilePath(): string {\n const homeDir = os.homedir();\n const sharkDir = path.join(homeDir, SHARK_DIR);\n\n // Ensure directory exists with 700 permissions\n if (!fs.existsSync(sharkDir)) {\n fs.mkdirSync(sharkDir, { mode: 0o700 });\n }\n\n return path.join(sharkDir, CREDENTIALS_FILE);\n },\n\n /**\n * Reads the credentials file safely\n */\n readCredentials(): CredentialsMap {\n const filePath = this.getFilePath();\n try {\n if (!fs.existsSync(filePath)) {\n return {};\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n return {};\n }\n },\n\n /**\n * Save credentials to file with 600 permissions\n */\n writeCredentials(creds: CredentialsMap): void {\n const filePath = this.getFilePath();\n try {\n fs.writeFileSync(filePath, JSON.stringify(creds, null, 2), { mode: 0o600 });\n } catch (error: any) {\n throw new Error(`Failed to save credentials to ${filePath}: ${error.message}`);\n }\n },\n\n /**\n * Saves the access token (and optional client credentials) for the given realm.\n */\n async saveToken(realm: string, token: string, clientId?: string, clientKey?: string, expiresIn?: number): Promise<void> {\n const creds = this.readCredentials();\n\n const now = Math.floor(Date.now() / 1000);\n const expiresAt = expiresIn ? now + expiresIn : undefined;\n\n creds[realm] = {\n ...creds[realm], // Preserve existing data if any\n accessToken: token,\n ...(clientId && { clientId }),\n ...(clientKey && { clientKey }),\n ...(expiresAt && { expiresAt })\n };\n\n this.writeCredentials(creds);\n },\n\n /**\n * Retrieves the access token for the given realm.\n * Checks ENV var first (SHARK_ACCESS_TOKEN).\n */\n async getToken(realm: string): Promise<string | null> {\n // Priority: Environment Variable (CI/CD)\n if (process.env.SHARK_ACCESS_TOKEN) {\n return process.env.SHARK_ACCESS_TOKEN;\n }\n\n const creds = this.readCredentials();\n const realmCreds = creds[realm];\n\n if (!realmCreds) return null;\n\n // Check expiration logic could go here, but for now just return the token\n // The auth layer should handle refresh if token is expired/invalid\n return realmCreds.accessToken;\n },\n\n /**\n * Retrieves full credentials object (for refresh logic)\n */\n async getCredentials(realm: string): Promise<Credentials | null> {\n const creds = this.readCredentials();\n return creds[realm] || null;\n },\n\n /**\n * Deletes the access token/credentials for the given realm.\n */\n async deleteToken(realm: string): Promise<boolean> {\n const creds = this.readCredentials();\n if (creds[realm]) {\n delete creds[realm];\n this.writeCredentials(creds);\n return true;\n }\n return false;\n }\n};\n","import dns from 'dns/promises';\nimport { colors } from '../../ui/colors.js';\n\nexport class Connectivity {\n private static instance: Connectivity;\n // Common reliable host to check connectivity\n private readonly CHECK_HOST = 'google.com';\n private readonly TIMEOUT_MS = 3000;\n\n private constructor() { }\n\n public static getInstance(): Connectivity {\n if (!Connectivity.instance) {\n Connectivity.instance = new Connectivity();\n }\n return Connectivity.instance;\n }\n\n /**\n * Checks if the user has internet connection.\n * Uses DNS lookup which is generally faster and lighter than a full fetch.\n */\n public async checkConnection(): Promise<boolean> {\n try {\n // Promise.race to enforce timeout\n await Promise.race([\n dns.lookup(this.CHECK_HOST),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error('timeout')), this.TIMEOUT_MS)\n )\n ]);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Throws an error if the user is offline.\n * Use this as a guard at the start of online-only commands.\n */\n public async requireOnline(): Promise<void> {\n const isOnline = await this.checkConnection();\n if (!isOnline) {\n throw new Error(`⚠️ ${colors.bold('Offline Mode Detected')}\\n This command requires an active internet connection.\\n Please check your network and try again.`);\n }\n }\n}\n\nexport const connectivity = Connectivity.getInstance();\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport class FileLogger {\n private static logPath = path.resolve(process.cwd(), 'shark-debug.log');\n private static enabled = true; // Enabled by default for this debugging session\n\n static init() {\n try {\n fs.writeFileSync(this.logPath, `--- Shark CLI Debug Log Started at ${new Date().toISOString()} ---\\n`);\n } catch (e) {\n console.error('Failed to initialize debug log:', e);\n }\n }\n\n static log(category: string, message: string, data?: any) {\n if (!this.enabled) return;\n\n try {\n const timestamp = new Date().toISOString();\n let logEntry = `[${timestamp}] [${category.toUpperCase()}] ${message}\\n`;\n if (data !== undefined) {\n if (typeof data === 'object') {\n logEntry += JSON.stringify(data, null, 2) + '\\n';\n } else {\n logEntry += String(data) + '\\n';\n }\n }\n logEntry += '-'.repeat(40) + '\\n';\n\n fs.appendFileSync(this.logPath, logEntry);\n } catch (e) {\n // calculated risk: silence logging errors to not break app\n }\n }\n}\n","import { tui } from '../ui/tui.js';\nimport { colors } from '../ui/colors.js';\nimport { ConfigManager } from '../core/config-manager.js';\nimport { saveGlobalRC } from '../core/config/sharkrc-loader.js';\nimport { t } from '../core/i18n/index.js';\n\nexport const configCommand = {\n action: async () => {\n tui.intro(t('commands.config.title'));\n\n const manager = ConfigManager.getInstance();\n const currentConfig = manager.getConfig();\n\n // Show current status\n tui.log.info(colors.dim('Current Configuration:'));\n tui.log.message(`• Project: ${colors.primary(currentConfig.project || 'Not Set')}`);\n tui.log.message(`• Language: ${colors.primary(currentConfig.language)}`);\n tui.log.message(`• Log Level: ${colors.primary(currentConfig.logLevel)}`);\n\n const action = await tui.select({\n message: t('commands.config.selectAction'),\n options: [\n { value: 'project', label: 'Set Default Project' },\n { value: 'language', label: t('commands.config.actions.language') },\n { value: 'logLevel', label: t('commands.config.actions.logLevel') },\n { value: 'exit', label: t('commands.config.actions.back') }\n ]\n });\n\n if (tui.isCancel(action) || action === 'exit') {\n tui.outro('Configuration unchanged.');\n return;\n }\n\n try {\n if (action === 'project') {\n const project = await tui.text({\n message: 'Enter default project slug:',\n initialValue: currentConfig.project,\n placeholder: 'e.g., my-awesome-project'\n });\n\n if (!tui.isCancel(project)) {\n saveGlobalRC({ project: project as string });\n tui.log.success(`Updated project to: ${project}`);\n }\n }\n\n if (action === 'language') {\n const lang = await tui.select({\n message: t('commands.config.selectLanguage'),\n options: [\n { value: 'pt-br', label: 'Português (Brasil)' },\n { value: 'en-us', label: 'English (US)' },\n { value: 'es-es', label: 'Español' }\n ],\n initialValue: currentConfig.language\n });\n\n if (!tui.isCancel(lang)) {\n saveGlobalRC({ language: lang as any });\n tui.log.success(t('commands.config.languageUpdated', lang as string));\n }\n }\n\n if (action === 'logLevel') {\n const level = await tui.select({\n message: 'Select log level:',\n options: [\n { value: 'debug', label: 'Debug (Verbose)' },\n { value: 'info', label: 'Info (Standard)' },\n { value: 'warn', label: 'Warn (Important only)' },\n { value: 'error', label: 'Error (Critical only)' }\n ],\n initialValue: currentConfig.logLevel\n });\n\n if (!tui.isCancel(level)) {\n saveGlobalRC({ logLevel: level as any });\n tui.log.success(`Updated log level to: ${level}`);\n }\n }\n\n // Reload to confirm\n manager.reloadConfig();\n tui.outro('Configuration saved successfully to ~/.sharkrc');\n\n } catch (error: any) {\n tui.log.error(`Failed to save configuration: ${error.message}`);\n process.exit(1);\n }\n }\n};\n"],"mappings":"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","names":["text","os","path","fs","z","z","fs","os","path","path","fs","path","os","fs","path","spinner"]}
|