ccenv-cli 1.0.0

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.
@@ -0,0 +1,278 @@
1
+ // Profile management commands
2
+ import * as config from '../lib/config.js';
3
+ import { generateShellScript, generateResetScript, detectShell, generateEnvVars } from '../lib/shell.js';
4
+ import { getTemplate, listTemplates } from '../templates/providers.js';
5
+ import { spawn } from 'child_process';
6
+ export function listProfiles() {
7
+ const profiles = config.getProfiles();
8
+ const activeProfile = config.getActiveProfile();
9
+ const profileNames = Object.keys(profiles);
10
+ if (profileNames.length === 0) {
11
+ console.log('No profiles configured yet.');
12
+ console.log('');
13
+ console.log('Create one with:');
14
+ console.log(' ccx create <name>');
15
+ console.log('');
16
+ console.log('Or use a template:');
17
+ console.log(' ccx create myprofile --template openrouter');
18
+ return;
19
+ }
20
+ console.log('Profiles:\n');
21
+ for (const name of profileNames.sort()) {
22
+ const profile = profiles[name];
23
+ const isActive = name === activeProfile;
24
+ const marker = isActive ? ' * ' : ' ';
25
+ const activeLabel = isActive ? ' (active)' : '';
26
+ console.log(`${marker}${name}${activeLabel}`);
27
+ console.log(` Provider: ${profile.provider}`);
28
+ console.log(` Base URL: ${profile.baseUrl}`);
29
+ if (profile.model) {
30
+ console.log(` Model: ${profile.model}`);
31
+ }
32
+ console.log('');
33
+ }
34
+ }
35
+ export function showProfile(name) {
36
+ const profile = config.getProfile(name);
37
+ if (!profile) {
38
+ console.error(`Profile "${name}" not found.`);
39
+ process.exit(1);
40
+ }
41
+ console.log(`Profile: ${profile.name}`);
42
+ console.log('─'.repeat(40));
43
+ console.log(`Provider: ${profile.provider}`);
44
+ console.log(`Base URL: ${profile.baseUrl}`);
45
+ console.log(`Model: ${profile.model || '(default)'}`);
46
+ console.log(`API Key: ${profile.apiKey ? '********' : '(not set)'}`);
47
+ console.log(`Clear Key: ${profile.clearAnthropicKey ? 'Yes' : 'No'}`);
48
+ if (profile.description) {
49
+ console.log(`Description: ${profile.description}`);
50
+ }
51
+ console.log(`Created: ${profile.createdAt}`);
52
+ console.log(`Updated: ${profile.updatedAt}`);
53
+ }
54
+ export function createProfile(name, options) {
55
+ if (config.profileExists(name)) {
56
+ console.error(`Profile "${name}" already exists. Use 'ccx edit ${name}' to modify it.`);
57
+ process.exit(1);
58
+ }
59
+ let profile;
60
+ if (options.template) {
61
+ const template = getTemplate(options.template);
62
+ if (!template) {
63
+ console.error(`Template "${options.template}" not found.`);
64
+ console.log('Available templates:');
65
+ listTemplates().forEach(t => console.log(` - ${t.name}: ${t.description}`));
66
+ process.exit(1);
67
+ }
68
+ profile = {
69
+ name,
70
+ description: options.description || template.description,
71
+ provider: template.name,
72
+ baseUrl: options.baseUrl || template.baseUrl,
73
+ model: options.model || template.defaultModel,
74
+ apiKey: options.apiKey,
75
+ clearAnthropicKey: options.clearKey ?? template.clearAnthropicKey,
76
+ createdAt: new Date().toISOString(),
77
+ updatedAt: new Date().toISOString()
78
+ };
79
+ if (template.requiresApiKey && !options.apiKey) {
80
+ console.log(`Note: This template requires an API key.`);
81
+ if (template.setupInstructions) {
82
+ console.log(`Setup: ${template.setupInstructions}`);
83
+ }
84
+ console.log(`Add it with: ccx edit ${name} --api-key YOUR_KEY`);
85
+ }
86
+ }
87
+ else {
88
+ if (!options.baseUrl) {
89
+ console.error('Either --template or --base-url is required.');
90
+ process.exit(1);
91
+ }
92
+ profile = {
93
+ name,
94
+ description: options.description,
95
+ provider: 'custom',
96
+ baseUrl: options.baseUrl,
97
+ model: options.model,
98
+ apiKey: options.apiKey,
99
+ clearAnthropicKey: options.clearKey ?? true,
100
+ createdAt: new Date().toISOString(),
101
+ updatedAt: new Date().toISOString()
102
+ };
103
+ }
104
+ config.saveProfile(profile);
105
+ console.log(`Profile "${name}" created successfully.`);
106
+ console.log('');
107
+ console.log(`Activate it with:`);
108
+ console.log(` eval "$(ccx use ${name})"`);
109
+ }
110
+ export function editProfile(name, options) {
111
+ const profile = config.getProfile(name);
112
+ if (!profile) {
113
+ console.error(`Profile "${name}" not found.`);
114
+ process.exit(1);
115
+ }
116
+ if (options.baseUrl !== undefined)
117
+ profile.baseUrl = options.baseUrl;
118
+ if (options.model !== undefined)
119
+ profile.model = options.model;
120
+ if (options.apiKey !== undefined)
121
+ profile.apiKey = options.apiKey;
122
+ if (options.description !== undefined)
123
+ profile.description = options.description;
124
+ if (options.clearKey !== undefined)
125
+ profile.clearAnthropicKey = options.clearKey;
126
+ config.saveProfile(profile);
127
+ console.log(`Profile "${name}" updated successfully.`);
128
+ }
129
+ export function deleteProfileCommand(name, force = false) {
130
+ if (!config.profileExists(name)) {
131
+ console.error(`Profile "${name}" not found.`);
132
+ process.exit(1);
133
+ }
134
+ if (!force) {
135
+ console.log(`To confirm deletion, run: ccx delete ${name} --force`);
136
+ return;
137
+ }
138
+ config.deleteProfile(name);
139
+ console.log(`Profile "${name}" deleted.`);
140
+ }
141
+ export function useProfile(name, shell) {
142
+ const profile = config.getProfile(name);
143
+ if (!profile) {
144
+ console.error(`Profile "${name}" not found.`);
145
+ process.exit(1);
146
+ }
147
+ const detectedShell = shell || detectShell();
148
+ const script = generateShellScript(profile, detectedShell);
149
+ // Output the script for eval
150
+ console.log(script);
151
+ // Update active profile in config
152
+ config.setActiveProfile(name);
153
+ }
154
+ export function resetEnvironment(shell) {
155
+ const detectedShell = shell || detectShell();
156
+ const script = generateResetScript(detectedShell);
157
+ console.log(script);
158
+ config.setActiveProfile(null);
159
+ }
160
+ export function showCurrent() {
161
+ const activeProfile = config.getActiveProfile();
162
+ const envProfile = process.env.CCX_ACTIVE_PROFILE;
163
+ console.log('Current Status:');
164
+ console.log('─'.repeat(40));
165
+ console.log(`Config active: ${activeProfile || '(none)'}`);
166
+ console.log(`Shell active: ${envProfile || '(none)'}`);
167
+ console.log('');
168
+ console.log('Environment Variables:');
169
+ console.log(` ANTHROPIC_BASE_URL: ${process.env.ANTHROPIC_BASE_URL || '(not set)'}`);
170
+ console.log(` ANTHROPIC_AUTH_TOKEN: ${process.env.ANTHROPIC_AUTH_TOKEN ? '********' : '(not set)'}`);
171
+ console.log(` ANTHROPIC_MODEL: ${process.env.ANTHROPIC_MODEL || '(not set)'}`);
172
+ console.log(` ANTHROPIC_API_KEY: ${process.env.ANTHROPIC_API_KEY ? '********' : '(not set)'}`);
173
+ }
174
+ export function showTemplates() {
175
+ console.log('Available Provider Templates:\n');
176
+ for (const template of listTemplates()) {
177
+ console.log(` ${template.name}`);
178
+ console.log(` ${template.displayName}`);
179
+ console.log(` ${template.description}`);
180
+ if (template.defaultModel) {
181
+ console.log(` Default model: ${template.defaultModel}`);
182
+ }
183
+ console.log('');
184
+ }
185
+ console.log('Usage: ccx create <name> --template <template-name>');
186
+ }
187
+ export function exportProfile(name) {
188
+ const profile = config.getProfile(name);
189
+ if (!profile) {
190
+ console.error(`Profile "${name}" not found.`);
191
+ process.exit(1);
192
+ }
193
+ // Export without the API key for safety
194
+ const exported = { ...profile, apiKey: undefined };
195
+ console.log(JSON.stringify(exported, null, 2));
196
+ }
197
+ export function importProfile(jsonStr, name) {
198
+ try {
199
+ const imported = JSON.parse(jsonStr);
200
+ if (name) {
201
+ imported.name = name;
202
+ }
203
+ if (!imported.name) {
204
+ console.error('Profile name is required. Use --name flag or include "name" in JSON.');
205
+ process.exit(1);
206
+ }
207
+ if (config.profileExists(imported.name)) {
208
+ console.error(`Profile "${imported.name}" already exists.`);
209
+ process.exit(1);
210
+ }
211
+ imported.createdAt = new Date().toISOString();
212
+ imported.updatedAt = new Date().toISOString();
213
+ config.saveProfile(imported);
214
+ console.log(`Profile "${imported.name}" imported successfully.`);
215
+ if (!imported.apiKey) {
216
+ console.log(`Note: No API key was imported. Add one with: ccx edit ${imported.name} --api-key YOUR_KEY`);
217
+ }
218
+ }
219
+ catch (e) {
220
+ console.error('Invalid JSON:', e);
221
+ process.exit(1);
222
+ }
223
+ }
224
+ // Run Claude directly with a profile's environment
225
+ export async function runWithProfile(name) {
226
+ const profile = config.getProfile(name);
227
+ if (!profile) {
228
+ console.error(`Profile "${name}" not found.`);
229
+ process.exit(1);
230
+ }
231
+ const env = generateEnvVars(profile);
232
+ const childEnv = { ...process.env };
233
+ // Set the environment variables
234
+ for (const [key, value] of Object.entries(env)) {
235
+ if (value === '') {
236
+ delete childEnv[key];
237
+ }
238
+ else if (value !== undefined) {
239
+ childEnv[key] = value;
240
+ }
241
+ }
242
+ childEnv['CCX_ACTIVE_PROFILE'] = name;
243
+ // Update active profile in config
244
+ config.setActiveProfile(name);
245
+ console.log(`Launching Claude with profile: ${name}`);
246
+ console.log(`Model: ${profile.model || '(default)'}`);
247
+ console.log('');
248
+ // Spawn claude with the modified environment
249
+ const child = spawn('claude', [], {
250
+ env: childEnv,
251
+ stdio: 'inherit',
252
+ shell: true
253
+ });
254
+ child.on('close', (code) => {
255
+ process.exit(code || 0);
256
+ });
257
+ }
258
+ // Run Claude with reset environment (official)
259
+ export async function runReset() {
260
+ const childEnv = { ...process.env };
261
+ // Remove ccx-related env vars
262
+ delete childEnv['ANTHROPIC_BASE_URL'];
263
+ delete childEnv['ANTHROPIC_AUTH_TOKEN'];
264
+ delete childEnv['ANTHROPIC_MODEL'];
265
+ delete childEnv['CCX_ACTIVE_PROFILE'];
266
+ config.setActiveProfile(null);
267
+ console.log('Launching Claude with default settings');
268
+ console.log('');
269
+ const child = spawn('claude', [], {
270
+ env: childEnv,
271
+ stdio: 'inherit',
272
+ shell: true
273
+ });
274
+ child.on('close', (code) => {
275
+ process.exit(code || 0);
276
+ });
277
+ }
278
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function runSetupWizard(): Promise<void>;
2
+ export declare function runQuickSetup(templateName: string): Promise<void>;
3
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/commands/wizard.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoIpD;AAED,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDvE"}
@@ -0,0 +1,180 @@
1
+ // Interactive setup wizard
2
+ import { select, input, confirm, password } from '@inquirer/prompts';
3
+ import { listTemplates, getTemplate } from '../templates/providers.js';
4
+ import * as config from '../lib/config.js';
5
+ export async function runSetupWizard() {
6
+ console.log('');
7
+ console.log('╔══════════════════════════════════════════╗');
8
+ console.log('║ Claude Env - Profile Setup Wizard ║');
9
+ console.log('╚══════════════════════════════════════════╝');
10
+ console.log('');
11
+ // Get profile name
12
+ const profileName = await input({
13
+ message: 'Profile name:',
14
+ validate: (value) => {
15
+ if (!value.trim())
16
+ return 'Name is required';
17
+ if (config.profileExists(value))
18
+ return 'Profile already exists';
19
+ if (!/^[a-zA-Z0-9_-]+$/.test(value))
20
+ return 'Only alphanumeric, dash, and underscore allowed';
21
+ return true;
22
+ }
23
+ });
24
+ // Select provider template
25
+ const templates = listTemplates();
26
+ const templateChoice = await select({
27
+ message: 'Select a provider:',
28
+ choices: templates.map(t => ({
29
+ name: `${t.displayName} - ${t.description}`,
30
+ value: t.name
31
+ }))
32
+ });
33
+ const template = getTemplate(templateChoice);
34
+ // Get base URL (use template default or ask for custom)
35
+ let baseUrl = template.baseUrl;
36
+ if (templateChoice === 'custom' || !baseUrl) {
37
+ baseUrl = await input({
38
+ message: 'API Base URL:',
39
+ validate: (value) => value.trim() ? true : 'URL is required'
40
+ });
41
+ }
42
+ else {
43
+ const customUrl = await confirm({
44
+ message: `Use default URL (${template.baseUrl})?`,
45
+ default: true
46
+ });
47
+ if (!customUrl) {
48
+ baseUrl = await input({
49
+ message: 'Custom API Base URL:',
50
+ default: template.baseUrl
51
+ });
52
+ }
53
+ }
54
+ // Get model
55
+ let model = template.defaultModel;
56
+ if (template.defaultModel) {
57
+ const useDefaultModel = await confirm({
58
+ message: `Use default model (${template.defaultModel})?`,
59
+ default: true
60
+ });
61
+ if (!useDefaultModel) {
62
+ model = await input({
63
+ message: 'Model name:',
64
+ default: template.defaultModel
65
+ });
66
+ }
67
+ }
68
+ else {
69
+ model = await input({
70
+ message: 'Model name (optional):',
71
+ });
72
+ }
73
+ // Get API key if required
74
+ let apiKey;
75
+ if (template.requiresApiKey) {
76
+ if (template.setupInstructions) {
77
+ console.log('');
78
+ console.log(`ℹ ${template.setupInstructions}`);
79
+ console.log('');
80
+ }
81
+ apiKey = await password({
82
+ message: 'API Key:',
83
+ mask: '*'
84
+ });
85
+ }
86
+ else {
87
+ const wantApiKey = await confirm({
88
+ message: 'Add an API key? (optional)',
89
+ default: false
90
+ });
91
+ if (wantApiKey) {
92
+ apiKey = await password({
93
+ message: 'API Key:',
94
+ mask: '*'
95
+ });
96
+ }
97
+ }
98
+ // Description
99
+ const description = await input({
100
+ message: 'Description (optional):',
101
+ default: template.description
102
+ });
103
+ // Clear ANTHROPIC_API_KEY?
104
+ const clearKey = await confirm({
105
+ message: 'Unset ANTHROPIC_API_KEY when using this profile?',
106
+ default: template.clearAnthropicKey
107
+ });
108
+ // Create the profile
109
+ const profile = {
110
+ name: profileName,
111
+ description,
112
+ provider: template.name,
113
+ baseUrl,
114
+ model: model || undefined,
115
+ apiKey: apiKey || undefined,
116
+ clearAnthropicKey: clearKey,
117
+ createdAt: new Date().toISOString(),
118
+ updatedAt: new Date().toISOString()
119
+ };
120
+ config.saveProfile(profile);
121
+ console.log('');
122
+ console.log('✓ Profile created successfully!');
123
+ console.log('');
124
+ console.log('To activate this profile, run:');
125
+ console.log('');
126
+ console.log(` eval "$(ccx use ${profileName})"`);
127
+ console.log('');
128
+ }
129
+ export async function runQuickSetup(templateName) {
130
+ const template = getTemplate(templateName);
131
+ if (!template) {
132
+ console.error(`Template "${templateName}" not found.`);
133
+ console.log('Available templates:');
134
+ listTemplates().forEach(t => console.log(` - ${t.name}`));
135
+ process.exit(1);
136
+ }
137
+ console.log('');
138
+ console.log(`Quick Setup: ${template.displayName}`);
139
+ console.log('─'.repeat(40));
140
+ if (template.setupInstructions) {
141
+ console.log(`ℹ ${template.setupInstructions}`);
142
+ console.log('');
143
+ }
144
+ const profileName = await input({
145
+ message: 'Profile name:',
146
+ default: templateName,
147
+ validate: (value) => {
148
+ if (!value.trim())
149
+ return 'Name is required';
150
+ if (config.profileExists(value))
151
+ return 'Profile already exists';
152
+ return true;
153
+ }
154
+ });
155
+ let apiKey;
156
+ if (template.requiresApiKey) {
157
+ apiKey = await password({
158
+ message: 'API Key:',
159
+ mask: '*',
160
+ validate: (value) => value.trim() ? true : 'API key is required for this provider'
161
+ });
162
+ }
163
+ const profile = {
164
+ name: profileName,
165
+ description: template.description,
166
+ provider: template.name,
167
+ baseUrl: template.baseUrl,
168
+ model: template.defaultModel,
169
+ apiKey,
170
+ clearAnthropicKey: template.clearAnthropicKey,
171
+ createdAt: new Date().toISOString(),
172
+ updatedAt: new Date().toISOString()
173
+ };
174
+ config.saveProfile(profile);
175
+ console.log('');
176
+ console.log('✓ Profile created!');
177
+ console.log('');
178
+ console.log(`Activate with: eval "$(ccx use ${profileName})"`);
179
+ }
180
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/commands/wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Profile, ProfileConfig } from '../types.js';
2
+ export declare function getConfig(): ProfileConfig;
3
+ export declare function getProfiles(): Record<string, Profile>;
4
+ export declare function getProfile(name: string): Profile | undefined;
5
+ export declare function saveProfile(profile: Profile): void;
6
+ export declare function deleteProfile(name: string): boolean;
7
+ export declare function getActiveProfile(): string | null;
8
+ export declare function setActiveProfile(name: string | null): void;
9
+ export declare function profileExists(name: string): boolean;
10
+ export declare function getConfigPath(): string;
11
+ export declare function resetConfig(): void;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwCrD,wBAAgB,SAAS,IAAI,aAAa,CAEzC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAQ5D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAYlD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAanD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,94 @@
1
+ // Configuration manager using conf for persistent storage
2
+ import Conf from 'conf';
3
+ import * as crypto from 'crypto';
4
+ import * as os from 'os';
5
+ // Simple encryption for API keys (not military-grade, but better than plaintext)
6
+ const ENCRYPTION_KEY = crypto.createHash('sha256')
7
+ .update(os.hostname() + os.userInfo().username + 'ccx-salt-v1')
8
+ .digest();
9
+ function encrypt(text) {
10
+ const iv = crypto.randomBytes(16);
11
+ const cipher = crypto.createCipheriv('aes-256-cbc', ENCRYPTION_KEY, iv);
12
+ let encrypted = cipher.update(text, 'utf8', 'hex');
13
+ encrypted += cipher.final('hex');
14
+ return iv.toString('hex') + ':' + encrypted;
15
+ }
16
+ function decrypt(text) {
17
+ try {
18
+ const [ivHex, encrypted] = text.split(':');
19
+ const iv = Buffer.from(ivHex, 'hex');
20
+ const decipher = crypto.createDecipheriv('aes-256-cbc', ENCRYPTION_KEY, iv);
21
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
22
+ decrypted += decipher.final('utf8');
23
+ return decrypted;
24
+ }
25
+ catch {
26
+ return text; // Return as-is if decryption fails (might be unencrypted)
27
+ }
28
+ }
29
+ const config = new Conf({
30
+ projectName: 'claude-env',
31
+ defaults: {
32
+ profiles: {},
33
+ activeProfile: null,
34
+ settings: {
35
+ encryptionEnabled: true,
36
+ defaultShell: process.platform === 'win32' ? 'powershell' : 'bash'
37
+ }
38
+ }
39
+ });
40
+ export function getConfig() {
41
+ return config.store;
42
+ }
43
+ export function getProfiles() {
44
+ return config.get('profiles');
45
+ }
46
+ export function getProfile(name) {
47
+ const profiles = getProfiles();
48
+ const profile = profiles[name];
49
+ if (profile && profile.apiKey) {
50
+ // Decrypt API key when retrieving
51
+ return { ...profile, apiKey: decrypt(profile.apiKey) };
52
+ }
53
+ return profile;
54
+ }
55
+ export function saveProfile(profile) {
56
+ const profiles = getProfiles();
57
+ const toSave = { ...profile };
58
+ // Encrypt API key before saving
59
+ if (toSave.apiKey && config.get('settings.encryptionEnabled')) {
60
+ toSave.apiKey = encrypt(toSave.apiKey);
61
+ }
62
+ toSave.updatedAt = new Date().toISOString();
63
+ profiles[profile.name] = toSave;
64
+ config.set('profiles', profiles);
65
+ }
66
+ export function deleteProfile(name) {
67
+ const profiles = getProfiles();
68
+ if (profiles[name]) {
69
+ delete profiles[name];
70
+ config.set('profiles', profiles);
71
+ // Clear active profile if it was deleted
72
+ if (config.get('activeProfile') === name) {
73
+ config.set('activeProfile', null);
74
+ }
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ export function getActiveProfile() {
80
+ return config.get('activeProfile');
81
+ }
82
+ export function setActiveProfile(name) {
83
+ config.set('activeProfile', name);
84
+ }
85
+ export function profileExists(name) {
86
+ return name in getProfiles();
87
+ }
88
+ export function getConfigPath() {
89
+ return config.path;
90
+ }
91
+ export function resetConfig() {
92
+ config.clear();
93
+ }
94
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Profile, ShellType, EnvVars } from '../types.js';
2
+ export declare function generateEnvVars(profile: Profile): EnvVars;
3
+ export declare function generateShellScript(profile: Profile, shell: ShellType): string;
4
+ export declare function generateResetScript(shell: ShellType): string;
5
+ export declare function detectShell(): ShellType;
6
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CA6BzD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAgB9E;AAwFD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAqB5D;AAED,wBAAgB,WAAW,IAAI,SAAS,CAUvC"}