@zqw-cli/qenv 1.0.0 → 1.0.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.
- package/dist/index.js +57 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -927,24 +927,65 @@ Examples:
|
|
|
927
927
|
return;
|
|
928
928
|
}
|
|
929
929
|
if (options.all) {
|
|
930
|
-
const
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
930
|
+
const platform = getPlatform();
|
|
931
|
+
if (platform === "windows") {
|
|
932
|
+
const userDriver = getSystemDriver({ systemWide: false });
|
|
933
|
+
const sysDriver = getSystemDriver({ systemWide: true });
|
|
934
|
+
const userVars = await userDriver.list();
|
|
935
|
+
const sysVars = await sysDriver.list();
|
|
936
|
+
if (options.json) {
|
|
937
|
+
const merged = {};
|
|
938
|
+
for (const [k, v] of Object.entries(sysVars)) {
|
|
939
|
+
merged[k] = { value: v, scope: "system" };
|
|
940
|
+
}
|
|
941
|
+
for (const [k, v] of Object.entries(userVars)) {
|
|
942
|
+
merged[k] = { value: v, scope: "user" };
|
|
943
|
+
}
|
|
944
|
+
logger.plain(JSON.stringify(merged, null, 2));
|
|
945
|
+
return;
|
|
946
|
+
}
|
|
947
|
+
const sysEntries = Object.entries(sysVars).sort(([a], [b]) => a.localeCompare(b));
|
|
948
|
+
const userEntries = Object.entries(userVars).sort(([a], [b]) => a.localeCompare(b));
|
|
949
|
+
logger.plain("");
|
|
950
|
+
if (sysEntries.length > 0) {
|
|
951
|
+
logger.plain(import_chalk2.default.cyan.bold(" \u2500\u2500 System Variables \u2500\u2500"));
|
|
952
|
+
logger.plain("");
|
|
953
|
+
for (const [key, value] of sysEntries) {
|
|
954
|
+
logger.plain(` ${import_chalk2.default.bold(key)}=${value}`);
|
|
955
|
+
}
|
|
956
|
+
logger.plain("");
|
|
957
|
+
}
|
|
958
|
+
if (userEntries.length > 0) {
|
|
959
|
+
logger.plain(import_chalk2.default.green.bold(" \u2500\u2500 User Variables \u2500\u2500"));
|
|
960
|
+
logger.plain("");
|
|
961
|
+
for (const [key, value] of userEntries) {
|
|
962
|
+
logger.plain(` ${import_chalk2.default.bold(key)}=${value}`);
|
|
963
|
+
}
|
|
964
|
+
logger.plain("");
|
|
965
|
+
}
|
|
966
|
+
const total = sysEntries.length + userEntries.length;
|
|
967
|
+
logger.plain(` Total: ${total} variables (${sysEntries.length} system, ${userEntries.length} user)
|
|
968
|
+
`);
|
|
969
|
+
} else {
|
|
970
|
+
const driver2 = getSystemDriver();
|
|
971
|
+
const vars2 = await driver2.list();
|
|
972
|
+
if (options.json) {
|
|
973
|
+
logger.plain(JSON.stringify(vars2, null, 2));
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
const entries2 = Object.entries(vars2).sort(([a], [b]) => a.localeCompare(b));
|
|
977
|
+
if (entries2.length === 0) {
|
|
978
|
+
logger.info("No environment variables found");
|
|
979
|
+
return;
|
|
980
|
+
}
|
|
981
|
+
logger.plain("");
|
|
982
|
+
for (const [key, value] of entries2) {
|
|
983
|
+
logger.plain(` ${import_chalk2.default.bold(key)}=${value}`);
|
|
984
|
+
}
|
|
985
|
+
logger.plain(`
|
|
946
986
|
Total: ${entries2.length} variables
|
|
947
987
|
`);
|
|
988
|
+
}
|
|
948
989
|
return;
|
|
949
990
|
}
|
|
950
991
|
const vars = manifest.getAll();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/platform.ts","../src/drivers/windows.ts","../src/utils/logger.ts","../src/utils/validator.ts","../src/drivers/unix.ts","../src/shell/detect.ts","../src/drivers/dotenv.ts","../src/drivers/index.ts","../src/manifest/index.ts","../src/shell/eval.ts","../src/commands/set.ts","../src/commands/get.ts","../src/commands/remove.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/init.ts","../src/commands/import.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport chalk from 'chalk';\r\nimport { registerSetCommand } from './commands/set.js';\r\nimport { registerGetCommand } from './commands/get.js';\r\nimport { registerRemoveCommand } from './commands/remove.js';\r\nimport { registerListCommand } from './commands/list.js';\r\nimport { registerDiffCommand, registerCleanCommand } from './commands/diff.js';\r\nimport { registerInitCommand } from './commands/init.js';\r\nimport { registerImportCommand, registerExportCommand } from './commands/import.js';\r\n\r\nconst VERSION = '1.0.0';\r\n\r\n/**\r\n * Check if running in --shell-eval mode.\r\n * Shell wrapper calls: qenv --shell-eval <args...>\r\n */\r\nfunction isShellEvalMode(): boolean {\r\n return process.argv.includes('--shell-eval');\r\n}\r\n\r\n/**\r\n * Set up global flags.\r\n */\r\nfunction setupGlobals(): void {\r\n // --verbose\r\n if (process.argv.includes('--verbose')) {\r\n process.env.QENV_VERBOSE = '1';\r\n }\r\n\r\n // --no-color\r\n if (process.argv.includes('--no-color')) {\r\n process.env.NO_COLOR = '1';\r\n process.env.FORCE_COLOR = '0';\r\n }\r\n\r\n // --silent\r\n if (process.argv.includes('--silent')) {\r\n // Override console.log to suppress output\r\n const originalLog = console.log;\r\n const originalInfo = console.info;\r\n console.log = () => {};\r\n console.info = () => {};\r\n // Keep console.error for actual errors\r\n }\r\n}\r\n\r\nfunction main(): void {\r\n setupGlobals();\r\n\r\n const shellEval = isShellEvalMode();\r\n\r\n // Filter out --shell-eval from argv before commander parses\r\n const argv = process.argv.filter(arg => arg !== '--shell-eval');\r\n\r\n const program = new Command();\r\n\r\n program\r\n .name('qenv')\r\n .version(VERSION, '-V, --version', 'Output the version number')\r\n .description(`${chalk.bold(`qenv v${VERSION}`)} — Cross-platform env var manager`)\r\n .option('--no-color', 'Disable colored output')\r\n .option('--silent', 'Suppress all stdout output (errors only)')\r\n .option('--verbose', 'Output debug information')\r\n .addHelpText('after', `\r\nRun ${chalk.cyan('qenv <command> --help')} for detailed usage of each command.\r\n`);\r\n\r\n // Register all commands\r\n registerSetCommand(program, shellEval);\r\n registerGetCommand(program);\r\n registerRemoveCommand(program, shellEval);\r\n registerListCommand(program);\r\n registerDiffCommand(program);\r\n registerCleanCommand(program);\r\n registerInitCommand(program);\r\n registerImportCommand(program, shellEval);\r\n registerExportCommand(program);\r\n\r\n // Parse with filtered argv\r\n program.parse(argv);\r\n}\r\n\r\nmain();\r\n","import { execSync } from 'node:child_process';\r\n\r\nexport type Platform = 'windows' | 'macos' | 'linux';\r\n\r\n/**\r\n * Get the current platform.\r\n */\r\nexport function getPlatform(): Platform {\r\n switch (process.platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n default:\r\n return 'linux';\r\n }\r\n}\r\n\r\n/**\r\n * Check if the current process is running with elevated privileges.\r\n */\r\nexport function isElevated(): boolean {\r\n const platform = getPlatform();\r\n\r\n if (platform === 'windows') {\r\n try {\r\n execSync('net session', { stdio: 'ignore' });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // Unix: check if running as root\r\n return process.getuid?.() === 0;\r\n}\r\n\r\n/**\r\n * Get the home directory.\r\n */\r\nexport function getHomeDir(): string {\r\n return process.env.HOME || process.env.USERPROFILE || '';\r\n}\r\n","import { execSync } from 'node:child_process';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateValueForWindows } from '../utils/validator.js';\r\nimport { isElevated } from '../utils/platform.js';\r\nimport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\n/**\r\n * Windows environment variable driver.\r\n * Uses `setx` for user-level and `reg add` for system-level variables.\r\n */\r\nexport class WindowsDriver implements EnvDriver {\r\n private systemWide: boolean;\r\n\r\n constructor(options: SystemDriverOptions = {}) {\r\n this.systemWide = options.systemWide || false;\r\n }\r\n\r\n async get(name: string): Promise<string | undefined> {\r\n try {\r\n const regPath = this.systemWide\r\n ? 'HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment'\r\n : 'HKCU\\\\Environment';\r\n\r\n const output = execSync(`reg query \"${regPath}\" /v ${name}`, {\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n });\r\n\r\n // Parse reg query output: \" NAME REG_SZ value\"\r\n const match = output.match(/\\s+\\S+\\s+REG_(?:SZ|EXPAND_SZ)\\s+(.*)/);\r\n if (match) {\r\n return match[1].trim();\r\n }\r\n return undefined;\r\n } catch {\r\n // Variable not found\r\n return undefined;\r\n }\r\n }\r\n\r\n async set(name: string, value: string): Promise<void> {\r\n if (this.systemWide) {\r\n if (!isElevated()) {\r\n throw new Error('System-wide operations require administrator privileges. Run as Administrator.');\r\n }\r\n execSync(\r\n `reg add \"HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment\" /v ${name} /t REG_EXPAND_SZ /d \"${value}\" /f`,\r\n { stdio: 'pipe' }\r\n );\r\n } else {\r\n // Validate setx length limit\r\n const validation = validateValueForWindows(value);\r\n if (!validation.valid) {\r\n throw new Error(validation.message);\r\n }\r\n execSync(`setx ${name} \"${value}\"`, { stdio: 'pipe' });\r\n }\r\n\r\n // Broadcast WM_SETTINGCHANGE to notify other processes\r\n this.broadcastSettingChange();\r\n }\r\n\r\n async remove(name: string): Promise<void> {\r\n const regPath = this.systemWide\r\n ? 'HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment'\r\n : 'HKCU\\\\Environment';\r\n\r\n if (this.systemWide && !isElevated()) {\r\n throw new Error('System-wide operations require administrator privileges. Run as Administrator.');\r\n }\r\n\r\n try {\r\n execSync(`reg delete \"${regPath}\" /v ${name} /f`, { stdio: 'pipe' });\r\n this.broadcastSettingChange();\r\n } catch {\r\n throw new Error(`Failed to remove variable \"${name}\". It may not exist.`);\r\n }\r\n }\r\n\r\n async list(): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {};\r\n try {\r\n const regPath = this.systemWide\r\n ? 'HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment'\r\n : 'HKCU\\\\Environment';\r\n\r\n const output = execSync(`reg query \"${regPath}\"`, {\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n });\r\n\r\n const lines = output.split('\\n');\r\n for (const line of lines) {\r\n const match = line.match(/^\\s+(\\S+)\\s+REG_(?:SZ|EXPAND_SZ)\\s+(.*)/);\r\n if (match) {\r\n result[match[1].trim()] = match[2].trim();\r\n }\r\n }\r\n } catch {\r\n logger.debug('Failed to query Windows registry');\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Broadcast WM_SETTINGCHANGE to notify other processes of env change.\r\n */\r\n private broadcastSettingChange(): void {\r\n try {\r\n // Use PowerShell to broadcast the setting change message\r\n execSync(\r\n `powershell -Command \"[System.Environment]::SetEnvironmentVariable('__qenv_broadcast__', $null, 'User')\"`,\r\n { stdio: 'pipe' }\r\n );\r\n } catch {\r\n logger.debug('Failed to broadcast WM_SETTINGCHANGE');\r\n }\r\n }\r\n}\r\n","import chalk from 'chalk';\r\n\r\nconst prefix = chalk.blue('qenv');\r\n\r\nexport const logger = {\r\n success(msg: string): void {\r\n console.log(`${prefix} ${chalk.green('✔')} ${msg}`);\r\n },\r\n\r\n warn(msg: string): void {\r\n console.log(`${prefix} ${chalk.yellow('⚠')} ${msg}`);\r\n },\r\n\r\n error(msg: string): void {\r\n console.error(`${prefix} ${chalk.red('✖')} ${msg}`);\r\n },\r\n\r\n info(msg: string): void {\r\n console.log(`${prefix} ${chalk.cyan('ℹ')} ${msg}`);\r\n },\r\n\r\n plain(msg: string): void {\r\n console.log(msg);\r\n },\r\n\r\n debug(msg: string): void {\r\n if (process.env.QENV_VERBOSE === '1') {\r\n console.log(`${prefix} ${chalk.gray('[debug]')} ${msg}`);\r\n }\r\n },\r\n\r\n table(headers: string[], rows: string[][]): void {\r\n // Calculate column widths\r\n const colWidths = headers.map((h, i) =>\r\n Math.max(h.length, ...rows.map(r => (r[i] || '').length))\r\n );\r\n\r\n // Header\r\n const headerLine = headers\r\n .map((h, i) => h.padEnd(colWidths[i]))\r\n .join(' ');\r\n console.log(` ${chalk.bold(headerLine)}`);\r\n\r\n // Separator\r\n const sep = colWidths.map(w => '─'.repeat(w)).join('──');\r\n console.log(` ${sep}`);\r\n\r\n // Rows\r\n for (const row of rows) {\r\n const line = row\r\n .map((cell, i) => cell.padEnd(colWidths[i]))\r\n .join(' ');\r\n console.log(` ${line}`);\r\n }\r\n },\r\n};\r\n\r\n/** Check if --silent flag is active */\r\nexport function isSilent(): boolean {\r\n return process.argv.includes('--silent');\r\n}\r\n\r\n/** Check if --no-color flag is active */\r\nexport function isNoColor(): boolean {\r\n return process.argv.includes('--no-color') || process.env.NO_COLOR !== undefined;\r\n}\r\n","/**\r\n * Regex pattern for valid environment variable names.\r\n * Allows letters, digits, underscores; must start with letter or underscore.\r\n */\r\nconst VAR_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\r\n\r\n/**\r\n * Windows setx has a 1024 character limit for values.\r\n */\r\nconst WINDOWS_SETX_MAX_LENGTH = 1024;\r\n\r\n/**\r\n * Validate an environment variable name.\r\n */\r\nexport function validateName(name: string): { valid: boolean; message?: string } {\r\n if (!name || name.trim().length === 0) {\r\n return { valid: false, message: 'Variable name cannot be empty' };\r\n }\r\n\r\n if (!VAR_NAME_PATTERN.test(name)) {\r\n return {\r\n valid: false,\r\n message: `Invalid variable name \"${name}\". Must match /^[A-Za-z_][A-Za-z0-9_]*$/`,\r\n };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Validate a value for Windows setx compatibility.\r\n */\r\nexport function validateValueForWindows(value: string): { valid: boolean; message?: string } {\r\n if (value.length > WINDOWS_SETX_MAX_LENGTH) {\r\n return {\r\n valid: false,\r\n message: `Value exceeds Windows setx limit of ${WINDOWS_SETX_MAX_LENGTH} characters (got ${value.length})`,\r\n };\r\n }\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Parse a .env file line.\r\n * Returns null for comments and empty lines.\r\n */\r\nexport function parseDotEnvLine(line: string): { key: string; value: string } | null {\r\n const trimmed = line.trim();\r\n\r\n // Skip empty lines and comments\r\n if (!trimmed || trimmed.startsWith('#')) {\r\n return null;\r\n }\r\n\r\n const eqIndex = trimmed.indexOf('=');\r\n if (eqIndex === -1) {\r\n return null;\r\n }\r\n\r\n const key = trimmed.slice(0, eqIndex).trim();\r\n let value = trimmed.slice(eqIndex + 1).trim();\r\n\r\n // Remove surrounding quotes\r\n if (\r\n (value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\r\n ) {\r\n value = value.slice(1, -1);\r\n }\r\n\r\n return { key, value };\r\n}\r\n\r\n/**\r\n * Serialize key-value pairs to .env format.\r\n */\r\nexport function serializeDotEnv(vars: Record<string, string>): string {\r\n return Object.entries(vars)\r\n .map(([key, value]) => {\r\n // Quote values that contain spaces or special characters\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n return `${key}=${quoted}`;\r\n })\r\n .join('\\n');\r\n}\r\n","import { readFileSync, writeFileSync, existsSync } from 'node:fs';\r\nimport { execSync } from 'node:child_process';\r\nimport { resolve, join } from 'node:path';\r\nimport { logger } from '../utils/logger.js';\r\nimport { getHomeDir } from '../utils/platform.js';\r\nimport { detectShell, type ShellType } from '../shell/detect.js';\r\nimport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\n/** Shell config files by shell type */\r\nconst SHELL_FILES: Record<string, string[]> = {\r\n zsh: ['~/.zshrc', '~/.zprofile'],\r\n bash: ['~/.bashrc', '~/.bash_profile', '~/.profile'],\r\n fish: ['~/.config/fish/config.fish'],\r\n};\r\n\r\n/** Marker comment for qenv managed lines */\r\nconst QENV_MARKER = '# qenv:managed';\r\n\r\n/**\r\n * Unix environment variable driver.\r\n * Reads/writes shell configuration files (e.g., .bashrc, .zshrc).\r\n */\r\nexport class UnixDriver implements EnvDriver {\r\n private systemWide: boolean;\r\n\r\n constructor(options: SystemDriverOptions = {}) {\r\n this.systemWide = options.systemWide || false;\r\n }\r\n\r\n async get(name: string): Promise<string | undefined> {\r\n // First try process.env (current session)\r\n if (process.env[name] !== undefined) {\r\n return process.env[name];\r\n }\r\n\r\n // Try reading from shell config file\r\n const configPath = this.getConfigFilePath();\r\n if (configPath && existsSync(configPath)) {\r\n const content = readFileSync(configPath, 'utf-8');\r\n const regex = new RegExp(`^export ${name}=\"(.+)\"\\\\s*${QENV_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}$`, 'm');\r\n const match = content.match(regex);\r\n if (match) {\r\n return match[1];\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n async set(name: string, value: string): Promise<void> {\r\n if (this.systemWide) {\r\n // System-wide: write to /etc/environment\r\n const line = `${name}=\"${value}\"`;\r\n try {\r\n execSync(`sudo sh -c 'echo \"${line} ${QENV_MARKER}\" >> /etc/environment'`, { stdio: 'pipe' });\r\n } catch {\r\n throw new Error('System-wide operations require sudo privileges.');\r\n }\r\n return;\r\n }\r\n\r\n const configPath = this.getConfigFilePath();\r\n if (!configPath) {\r\n throw new Error('Could not determine shell configuration file.');\r\n }\r\n\r\n const exportLine = `export ${name}=\"${value}\" ${QENV_MARKER}`;\r\n\r\n let content = '';\r\n if (existsSync(configPath)) {\r\n content = readFileSync(configPath, 'utf-8');\r\n }\r\n\r\n // Check if variable already exists with qenv marker\r\n const regex = new RegExp(`^export ${name}=.*${QENV_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}$`, 'm');\r\n\r\n if (regex.test(content)) {\r\n // Replace existing line\r\n content = content.replace(regex, exportLine);\r\n } else {\r\n // Append new line\r\n content = content.trimEnd() + '\\n' + exportLine + '\\n';\r\n }\r\n\r\n writeFileSync(configPath, content, 'utf-8');\r\n logger.debug(`Wrote to ${configPath}`);\r\n }\r\n\r\n async remove(name: string): Promise<void> {\r\n if (this.systemWide) {\r\n try {\r\n execSync(\r\n `sudo sed -i '/^${name}=.*${QENV_MARKER.replace(/\\//g, '\\\\/')}/d' /etc/environment`,\r\n { stdio: 'pipe' }\r\n );\r\n } catch {\r\n throw new Error('System-wide operations require sudo privileges.');\r\n }\r\n return;\r\n }\r\n\r\n const configPath = this.getConfigFilePath();\r\n if (!configPath || !existsSync(configPath)) {\r\n throw new Error(`Variable \"${name}\" not found in shell configuration.`);\r\n }\r\n\r\n let content = readFileSync(configPath, 'utf-8');\r\n const regex = new RegExp(`^export ${name}=.*${QENV_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\n?`, 'm');\r\n\r\n if (!regex.test(content)) {\r\n throw new Error(`Variable \"${name}\" is not managed by qenv.`);\r\n }\r\n\r\n content = content.replace(regex, '');\r\n writeFileSync(configPath, content, 'utf-8');\r\n }\r\n\r\n async list(): Promise<Record<string, string>> {\r\n // Return all current environment variables\r\n const result: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (value !== undefined) {\r\n result[key] = value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Determine which shell config file to use.\r\n */\r\n private getConfigFilePath(): string | null {\r\n const home = getHomeDir();\r\n if (!home) return null;\r\n\r\n const shell = detectShell();\r\n const files = SHELL_FILES[shell] || SHELL_FILES['bash'];\r\n\r\n for (const file of files) {\r\n const resolved = file.replace('~', home);\r\n if (existsSync(resolved)) {\r\n return resolved;\r\n }\r\n }\r\n\r\n // Default to first option if none exists yet\r\n if (files.length > 0) {\r\n return files[0].replace('~', home);\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","/**\r\n * Supported shell types.\r\n */\r\nexport type ShellType = 'bash' | 'zsh' | 'fish' | 'pwsh' | 'cmd';\r\n\r\n/**\r\n * Detect the current shell type.\r\n */\r\nexport function detectShell(): ShellType {\r\n // Check QENV_SHELL override first\r\n const override = process.env.QENV_SHELL;\r\n if (override && isValidShell(override)) {\r\n return override as ShellType;\r\n }\r\n\r\n // Windows\r\n if (process.platform === 'win32') {\r\n // Check if running in PowerShell\r\n if (process.env.PSModulePath) {\r\n return 'pwsh';\r\n }\r\n return 'cmd';\r\n }\r\n\r\n // Unix: check SHELL env var\r\n const shell = process.env.SHELL || '';\r\n\r\n if (shell.includes('zsh')) return 'zsh';\r\n if (shell.includes('fish')) return 'fish';\r\n if (shell.includes('bash')) return 'bash';\r\n\r\n // Check parent process name as fallback\r\n const parentPid = process.ppid;\r\n if (parentPid) {\r\n try {\r\n const { execSync } = require('node:child_process');\r\n const parentName = execSync(`ps -p ${parentPid} -o comm=`, {\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n }).trim();\r\n\r\n if (parentName.includes('zsh')) return 'zsh';\r\n if (parentName.includes('fish')) return 'fish';\r\n if (parentName.includes('bash')) return 'bash';\r\n if (parentName.includes('pwsh') || parentName.includes('powershell')) return 'pwsh';\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n // Default to bash\r\n return 'bash';\r\n}\r\n\r\n/**\r\n * Check if a string is a valid shell type.\r\n */\r\nfunction isValidShell(shell: string): boolean {\r\n return ['bash', 'zsh', 'fish', 'pwsh', 'cmd'].includes(shell);\r\n}\r\n\r\n/**\r\n * Get a human-readable name for a shell type.\r\n */\r\nexport function getShellName(shell: ShellType): string {\r\n const names: Record<ShellType, string> = {\r\n bash: 'Bash',\r\n zsh: 'Zsh',\r\n fish: 'Fish',\r\n pwsh: 'PowerShell',\r\n cmd: 'Command Prompt',\r\n };\r\n return names[shell] || shell;\r\n}\r\n","import { readFileSync, writeFileSync, existsSync } from 'node:fs';\r\nimport { resolve, dirname } from 'node:path';\r\nimport { parseDotEnvLine, serializeDotEnv } from '../utils/validator.js';\r\nimport type { EnvDriver } from './types.js';\r\n\r\n/**\r\n * .env file driver.\r\n * Reads and writes .env files in the project directory.\r\n */\r\nexport class DotenvDriver implements EnvDriver {\r\n private filePath: string;\r\n\r\n constructor(filePath: string = '.env') {\r\n this.filePath = resolve(process.cwd(), filePath);\r\n }\r\n\r\n async get(name: string): Promise<string | undefined> {\r\n const vars = await this.readFile();\r\n return vars[name];\r\n }\r\n\r\n async set(name: string, value: string): Promise<void> {\r\n const vars = await this.readFile();\r\n vars[name] = value;\r\n await this.writeFile(vars);\r\n }\r\n\r\n async remove(name: string): Promise<void> {\r\n const vars = await this.readFile();\r\n if (!(name in vars)) {\r\n throw new Error(`Variable \"${name}\" not found in ${this.filePath}`);\r\n }\r\n delete vars[name];\r\n await this.writeFile(vars);\r\n }\r\n\r\n async list(): Promise<Record<string, string>> {\r\n return this.readFile();\r\n }\r\n\r\n /**\r\n * Remove all variables from the .env file.\r\n */\r\n async clear(): Promise<void> {\r\n await this.writeFile({});\r\n }\r\n\r\n /**\r\n * Read and parse the .env file.\r\n */\r\n private async readFile(): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {};\r\n\r\n if (!existsSync(this.filePath)) {\r\n return result;\r\n }\r\n\r\n const content = readFileSync(this.filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n\r\n for (const line of lines) {\r\n const parsed = parseDotEnvLine(line);\r\n if (parsed) {\r\n result[parsed.key] = parsed.value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Write variables to the .env file, preserving comments.\r\n */\r\n private async writeFile(vars: Record<string, string>): Promise<void> {\r\n const lines: string[] = [];\r\n\r\n // If file exists, preserve comments and order\r\n if (existsSync(this.filePath)) {\r\n const content = readFileSync(this.filePath, 'utf-8');\r\n const existingLines = content.split('\\n');\r\n const writtenKeys = new Set<string>();\r\n\r\n for (const line of existingLines) {\r\n const parsed = parseDotEnvLine(line);\r\n if (parsed) {\r\n if (parsed.key in vars) {\r\n // Update existing variable\r\n const value = vars[parsed.key];\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n lines.push(`${parsed.key}=${quoted}`);\r\n writtenKeys.add(parsed.key);\r\n }\r\n // Skip removed variables\r\n } else {\r\n // Preserve comments and empty lines\r\n lines.push(line);\r\n }\r\n }\r\n\r\n // Add new variables\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (!writtenKeys.has(key)) {\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n lines.push(`${key}=${quoted}`);\r\n }\r\n }\r\n } else {\r\n // New file\r\n for (const [key, value] of Object.entries(vars)) {\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n lines.push(`${key}=${quoted}`);\r\n }\r\n }\r\n\r\n writeFileSync(this.filePath, lines.join('\\n'), 'utf-8');\r\n }\r\n\r\n /** Get the file path of this driver */\r\n getFilePath(): string {\r\n return this.filePath;\r\n }\r\n}\r\n","import { getPlatform } from '../utils/platform.js';\r\nimport { WindowsDriver } from './windows.js';\r\nimport { UnixDriver } from './unix.js';\r\nimport { DotenvDriver } from './dotenv.js';\r\nimport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\nexport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\n/**\r\n * Get the appropriate system environment driver for the current platform.\r\n */\r\nexport function getSystemDriver(options: SystemDriverOptions = {}): EnvDriver {\r\n const platform = getPlatform();\r\n\r\n if (platform === 'windows') {\r\n return new WindowsDriver(options);\r\n }\r\n\r\n return new UnixDriver(options);\r\n}\r\n\r\n/**\r\n * Get the dotenv file driver.\r\n */\r\nexport function getDotenvDriver(filePath?: string): DotenvDriver {\r\n return new DotenvDriver(filePath);\r\n}\r\n","import Conf from 'conf';\r\n\r\n/**\r\n * Manifest entry for a tracked environment variable.\r\n */\r\nexport interface ManifestEntry {\r\n scope: 'system' | 'system-wide' | 'file';\r\n filePath: string | null;\r\n setAt: string;\r\n updatedAt: string;\r\n setBy: string;\r\n}\r\n\r\n/**\r\n * Manifest data structure.\r\n */\r\nexport interface ManifestData {\r\n version: number;\r\n vars: Record<string, ManifestEntry>;\r\n}\r\n\r\nconst SCHEMA = {\r\n version: {\r\n type: 'number' as const,\r\n default: 1,\r\n },\r\n vars: {\r\n type: 'object' as const,\r\n default: {},\r\n },\r\n};\r\n\r\n/** Get the package version for setBy field */\r\nfunction getVersion(): string {\r\n try {\r\n // Will be replaced at build time or read from package.json\r\n return `qenv@1.0.0`;\r\n } catch {\r\n return 'qenv@unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Manifest manager using `conf` for persistent storage.\r\n */\r\nclass ManifestManager {\r\n private store: Conf<ManifestData>;\r\n\r\n constructor() {\r\n this.store = new Conf<ManifestData>({\r\n projectName: 'qenv',\r\n schema: SCHEMA,\r\n defaults: {\r\n version: 1,\r\n vars: {},\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get all tracked variables.\r\n */\r\n getAll(): Record<string, ManifestEntry> {\r\n return this.store.get('vars') || {};\r\n }\r\n\r\n /**\r\n * Get a single variable entry.\r\n */\r\n get(name: string): ManifestEntry | undefined {\r\n const vars = this.getAll();\r\n return vars[name];\r\n }\r\n\r\n /**\r\n * Track a variable in the manifest.\r\n */\r\n set(name: string, scope: ManifestEntry['scope'], filePath: string | null = null): void {\r\n const vars = this.getAll();\r\n const now = new Date().toISOString();\r\n const existing = vars[name];\r\n\r\n vars[name] = {\r\n scope,\r\n filePath,\r\n setAt: existing?.setAt || now,\r\n updatedAt: now,\r\n setBy: getVersion(),\r\n };\r\n\r\n this.store.set('vars', vars);\r\n }\r\n\r\n /**\r\n * Remove a variable from the manifest.\r\n */\r\n remove(name: string): boolean {\r\n const vars = this.getAll();\r\n if (!(name in vars)) {\r\n return false;\r\n }\r\n delete vars[name];\r\n this.store.set('vars', vars);\r\n return true;\r\n }\r\n\r\n /**\r\n * Check if a variable is tracked.\r\n */\r\n has(name: string): boolean {\r\n const vars = this.getAll();\r\n return name in vars;\r\n }\r\n\r\n /**\r\n * Clear all manifest entries.\r\n */\r\n clear(): void {\r\n this.store.set('vars', {});\r\n }\r\n\r\n /**\r\n * Remove specific entries by name.\r\n */\r\n removeMany(names: string[]): number {\r\n const vars = this.getAll();\r\n let removed = 0;\r\n for (const name of names) {\r\n if (name in vars) {\r\n delete vars[name];\r\n removed++;\r\n }\r\n }\r\n this.store.set('vars', vars);\r\n return removed;\r\n }\r\n\r\n /**\r\n * Get the config file path (useful for debugging).\r\n */\r\n get path(): string {\r\n return this.store.path;\r\n }\r\n}\r\n\r\n/** Singleton manifest instance */\r\nexport const manifest = new ManifestManager();\r\n","import type { ShellType } from './detect.js';\r\n\r\n/**\r\n * Output shell eval expression to stdout.\r\n * This is used by the shell wrapper to eval in the parent process,\r\n * allowing --local mode to modify the current shell session.\r\n */\r\nexport function outputShellEval(\r\n key: string,\r\n value: string | null,\r\n action: 'set' | 'unset',\r\n shell: ShellType\r\n): void {\r\n const expressions: Record<string, Record<string, string>> = {\r\n bash: {\r\n set: `export ${key}=\"${escapeValue(value || '')}\"`,\r\n unset: `unset ${key}`,\r\n },\r\n zsh: {\r\n set: `export ${key}=\"${escapeValue(value || '')}\"`,\r\n unset: `unset ${key}`,\r\n },\r\n fish: {\r\n set: `set -gx ${key} \"${escapeValue(value || '')}\"`,\r\n unset: `set -e ${key}`,\r\n },\r\n pwsh: {\r\n set: `$env:${key} = \"${escapeValue(value || '')}\"`,\r\n unset: `Remove-Item Env:${key} -ErrorAction SilentlyContinue`,\r\n },\r\n cmd: {\r\n set: `set \"${key}=${value || ''}\"`,\r\n unset: `set \"${key}=\"`,\r\n },\r\n };\r\n\r\n const shellExprs = expressions[shell] || expressions['bash'];\r\n const expr = shellExprs[action];\r\n\r\n if (expr) {\r\n process.stdout.write(expr);\r\n }\r\n}\r\n\r\n/**\r\n * Escape special characters in a value for shell embedding.\r\n */\r\nfunction escapeValue(value: string): string {\r\n return value\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/\"/g, '\\\\\"')\r\n .replace(/\\$/g, '\\\\$')\r\n .replace(/`/g, '\\\\`');\r\n}\r\n\r\n/**\r\n * Generate a \"no-op\" eval expression (for commands that don't need shell eval).\r\n */\r\nexport function outputNoOp(): void {\r\n process.stdout.write(':');\r\n}\r\n","import type { Command } from 'commander';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateName } from '../utils/validator.js';\r\nimport { outputShellEval, outputNoOp } from '../shell/eval.js';\r\nimport { detectShell } from '../shell/detect.js';\r\n\r\nexport function registerSetCommand(program: Command, isShellEval: boolean): void {\r\n program\r\n .command('set <name> <value>')\r\n .description('Set an environment variable')\r\n .option('--local', 'Set for current shell session only (requires qenv init)')\r\n .option('--system', 'Set system-wide (requires admin/sudo)')\r\n .option('--file [path]', 'Write to .env file (default: ./.env)')\r\n .option('--json', 'Parse value as JSON')\r\n .option('--overwrite', 'Overwrite if already exists')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv set NODE_ENV production\r\n $ qenv set API_KEY sk-xxx --local\r\n $ qenv set PORT 3000 --file .env.local\r\n`)\r\n .action(async (name: string, value: string, options: {\r\n local?: boolean;\r\n system?: boolean;\r\n file?: string | boolean;\r\n json?: boolean;\r\n overwrite?: boolean;\r\n }) => {\r\n // Validate variable name\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // Parse JSON if requested\r\n let finalValue = value;\r\n if (options.json) {\r\n try {\r\n JSON.parse(value);\r\n finalValue = value;\r\n } catch {\r\n logger.error(`Invalid JSON value: ${value}`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n // --local mode: output eval expression for shell wrapper\r\n if (options.local) {\r\n if (isShellEval) {\r\n const shell = detectShell();\r\n outputShellEval(name, finalValue, 'set', shell);\r\n } else {\r\n logger.warn('--local requires qenv init. Run `qenv init` first.');\r\n logger.info('Hint: use `eval \"$(qenv --shell-eval set ' + name + ' ' + value + ' --local)\"` as a workaround.');\r\n }\r\n return;\r\n }\r\n\r\n // --file mode: write to .env file\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n\r\n // Check if already exists and --overwrite not specified\r\n if (!options.overwrite) {\r\n const existing = await driver.get(name);\r\n if (existing !== undefined) {\r\n logger.warn(`Variable \"${name}\" already exists in ${filePath}. Use --overwrite to replace.`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n }\r\n\r\n await driver.set(name, finalValue);\r\n manifest.set(name, 'file', driver.getFilePath());\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Set ${name} in ${filePath}`);\r\n }\r\n return;\r\n }\r\n\r\n // System mode (default or --system)\r\n const driver = getSystemDriver({ systemWide: options.system });\r\n\r\n // Check if already exists and --overwrite not specified\r\n if (!options.overwrite) {\r\n const existing = await driver.get(name);\r\n if (existing !== undefined) {\r\n logger.warn(`Variable \"${name}\" already exists. Use --overwrite to replace.`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n }\r\n\r\n await driver.set(name, finalValue);\r\n manifest.set(name, options.system ? 'system-wide' : 'system');\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n const scope = options.system ? 'system-wide' : 'user';\r\n logger.success(`Set ${name}=${finalValue} (${scope})`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateName } from '../utils/validator.js';\r\n\r\nexport function registerGetCommand(program: Command): void {\r\n program\r\n .command('get <name>')\r\n .description('Get an environment variable value')\r\n .option('--source', 'Show the source of the variable (qenv/system/file)')\r\n .option('--file [path]', 'Read from .env file (default: ./.env)')\r\n .option('--json', 'Output as JSON')\r\n .option('--raw', 'Output raw value only (for scripting)')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv get NODE_ENV\r\n $ qenv get API_KEY --source\r\n $ qenv get DATABASE_URL --file .env.prod\r\n $ qenv get PORT --raw\r\n`)\r\n .action(async (name: string, options: {\r\n source?: boolean;\r\n file?: string | boolean;\r\n json?: boolean;\r\n raw?: boolean;\r\n }) => {\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n try {\r\n let value: string | undefined;\r\n let source = 'system';\r\n\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n value = await driver.get(name);\r\n source = `file (${filePath})`;\r\n } else {\r\n const driver = getSystemDriver();\r\n value = await driver.get(name);\r\n\r\n // Determine source\r\n const entry = manifest.get(name);\r\n if (entry) {\r\n source = `qenv (${entry.scope})`;\r\n }\r\n }\r\n\r\n if (value === undefined) {\r\n if (options.raw) {\r\n // Raw mode: exit with code 1 if not found\r\n process.exitCode = 1;\r\n return;\r\n }\r\n logger.warn(`Variable \"${name}\" not found`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (options.raw) {\r\n process.stdout.write(value);\r\n return;\r\n }\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify({ name, value, source }));\r\n return;\r\n }\r\n\r\n if (options.source) {\r\n logger.plain(`${name}=${value}`);\r\n logger.info(`Source: ${source}`);\r\n } else {\r\n logger.plain(`${name}=${value}`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { createInterface } from 'node:readline';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateName } from '../utils/validator.js';\r\nimport { outputShellEval, outputNoOp } from '../shell/eval.js';\r\nimport { detectShell } from '../shell/detect.js';\r\n\r\n/**\r\n * Prompt user for confirmation.\r\n */\r\nfunction confirm(message: string): Promise<boolean> {\r\n const rl = createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(`${message} (y/N) `, (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\r\n });\r\n });\r\n}\r\n\r\nexport function registerRemoveCommand(program: Command, isShellEval: boolean): void {\r\n program\r\n .command('remove <name>')\r\n .alias('rm')\r\n .description('Remove an environment variable')\r\n .option('--system', 'Remove system-wide variable (requires admin/sudo)')\r\n .option('--local', 'Remove from current shell session')\r\n .option('--file [path]', 'Remove from .env file (default: ./.env)')\r\n .option('--force', 'Skip confirmation prompt')\r\n .option('--all', 'Remove all variables (only with --file)')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv remove NODE_ENV\r\n $ qenv remove API_KEY --force\r\n $ qenv remove DATABASE_URL --file .env.prod\r\n $ qenv remove --all --file\r\n`)\r\n .action(async (name: string, options: {\r\n system?: boolean;\r\n local?: boolean;\r\n file?: string | boolean;\r\n force?: boolean;\r\n all?: boolean;\r\n }) => {\r\n try {\r\n // --local mode: output eval expression for shell wrapper\r\n if (options.local) {\r\n if (isShellEval) {\r\n const shell = detectShell();\r\n outputShellEval(name, null, 'unset', shell);\r\n } else {\r\n logger.warn('--local requires qenv init. Run `qenv init` first.');\r\n }\r\n return;\r\n }\r\n\r\n // --file mode\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n\r\n if (options.all) {\r\n if (!options.force) {\r\n const confirmed = await confirm(`Remove all variables from ${filePath}?`);\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n return;\r\n }\r\n }\r\n await driver.clear();\r\n logger.success(`Cleared all variables from ${filePath}`);\r\n if (isShellEval) outputNoOp();\r\n return;\r\n }\r\n\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n await driver.remove(name);\r\n manifest.remove(name);\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Removed ${name} from ${filePath}`);\r\n }\r\n return;\r\n }\r\n\r\n // System mode\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (!options.force) {\r\n const confirmed = await confirm(`Remove variable \"${name}\"?`);\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n return;\r\n }\r\n }\r\n\r\n const driver = getSystemDriver({ systemWide: options.system });\r\n await driver.remove(name);\r\n manifest.remove(name);\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Removed ${name}`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport chalk from 'chalk';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest, type ManifestEntry } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\n/**\r\n * Format a relative time string from a date.\r\n */\r\nfunction timeAgo(dateStr: string): string {\r\n const date = new Date(dateStr);\r\n const now = new Date();\r\n const diffMs = now.getTime() - date.getTime();\r\n const diffSec = Math.floor(diffMs / 1000);\r\n const diffMin = Math.floor(diffSec / 60);\r\n const diffHour = Math.floor(diffMin / 60);\r\n const diffDay = Math.floor(diffHour / 24);\r\n\r\n if (diffDay > 0) return `${diffDay} day${diffDay > 1 ? 's' : ''} ago`;\r\n if (diffHour > 0) return `${diffHour} hour${diffHour > 1 ? 's' : ''} ago`;\r\n if (diffMin > 0) return `${diffMin} min${diffMin > 1 ? 's' : ''} ago`;\r\n return 'just now';\r\n}\r\n\r\n/**\r\n * Mask sensitive values for display.\r\n */\r\nfunction maskValue(value: string): string {\r\n if (value.length <= 6) return value;\r\n const visible = value.slice(0, 3);\r\n const tail = value.slice(-3);\r\n return `${visible}***${tail}`;\r\n}\r\n\r\nexport function registerListCommand(program: Command): void {\r\n program\r\n .command('list')\r\n .alias('ls')\r\n .description('List environment variables')\r\n .option('--all', 'List all system environment variables')\r\n .option('--file [path]', 'List variables from .env file (default: ./.env)')\r\n .option('--json', 'Output as JSON')\r\n .option('--verify', 'Verify manifest entries against actual system values')\r\n .option('--stale', 'Show only stale (not found) manifest entries')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv list\r\n $ qenv list --all\r\n $ qenv list --file .env.prod\r\n $ qenv list --json\r\n $ qenv list --verify\r\n $ qenv list --stale\r\n`)\r\n .action(async (options: {\r\n all?: boolean;\r\n file?: string | boolean;\r\n json?: boolean;\r\n verify?: boolean;\r\n stale?: boolean;\r\n }) => {\r\n try {\r\n // --file mode\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n const vars = await driver.list();\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify(vars, null, 2));\r\n return;\r\n }\r\n\r\n const entries = Object.entries(vars);\r\n if (entries.length === 0) {\r\n logger.info(`No variables found in ${filePath}`);\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n logger.table(\r\n ['NAME', 'VALUE'],\r\n entries.map(([key, value]) => [key, value])\r\n );\r\n logger.plain('');\r\n return;\r\n }\r\n\r\n // --all mode: list all system env vars\r\n if (options.all) {\r\n const driver = getSystemDriver();\r\n const vars = await driver.list();\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify(vars, null, 2));\r\n return;\r\n }\r\n\r\n const entries = Object.entries(vars).sort(([a], [b]) => a.localeCompare(b));\r\n if (entries.length === 0) {\r\n logger.info('No environment variables found');\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n for (const [key, value] of entries) {\r\n logger.plain(` ${chalk.bold(key)}=${value}`);\r\n }\r\n logger.plain(`\\n Total: ${entries.length} variables\\n`);\r\n return;\r\n }\r\n\r\n // Default: list manifest entries\r\n const vars = manifest.getAll();\r\n const entries = Object.entries(vars);\r\n\r\n if (entries.length === 0) {\r\n logger.info('No variables managed by qenv. Use `qenv set` to add variables.');\r\n return;\r\n }\r\n\r\n const driver = getSystemDriver();\r\n const rows: string[][] = [];\r\n let staleCount = 0;\r\n\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n\r\n const isStale = currentValue === undefined;\r\n if (isStale) staleCount++;\r\n\r\n // Skip non-stale entries when --stale\r\n if (options.stale && !isStale) continue;\r\n\r\n const valueDisplay = isStale\r\n ? chalk.yellow('(not found) ⚠')\r\n : maskValue(currentValue!);\r\n const updated = timeAgo(entry.updatedAt);\r\n\r\n rows.push([name, valueDisplay, entry.scope, updated]);\r\n }\r\n\r\n if (options.json) {\r\n const jsonData: Record<string, any> = {};\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n jsonData[name] = {\r\n ...entry,\r\n currentValue: currentValue || null,\r\n stale: currentValue === undefined,\r\n };\r\n }\r\n logger.plain(JSON.stringify(jsonData, null, 2));\r\n return;\r\n }\r\n\r\n if (rows.length === 0) {\r\n logger.info('No stale entries found.');\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n logger.table(['NAME', 'VALUE', 'SCOPE', 'UPDATED'], rows);\r\n logger.plain('');\r\n\r\n if (staleCount > 0) {\r\n logger.warn(\r\n `${staleCount} stale ${staleCount === 1 ? 'entry' : 'entries'} found. Run \\`qenv clean\\` to remove.`\r\n );\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport chalk from 'chalk';\r\nimport { createInterface } from 'node:readline';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\n/**\r\n * Prompt user for confirmation.\r\n */\r\nfunction confirm(message: string): Promise<boolean> {\r\n const rl = createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(`${message} (y/N) `, (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\r\n });\r\n });\r\n}\r\n\r\nexport function registerDiffCommand(program: Command): void {\r\n program\r\n .command('diff')\r\n .description('Compare manifest records with actual system values')\r\n .option('--json', 'Output as JSON')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv diff\r\n $ qenv diff --json\r\n`)\r\n .action(async (options: { json?: boolean }) => {\r\n try {\r\n const vars = manifest.getAll();\r\n const entries = Object.entries(vars);\r\n\r\n if (entries.length === 0) {\r\n logger.info('No variables managed by qenv.');\r\n return;\r\n }\r\n\r\n const driver = getSystemDriver();\r\n const diffs: Array<{\r\n name: string;\r\n scope: string;\r\n manifestStatus: string;\r\n currentValue: string | null;\r\n status: 'match' | 'changed' | 'missing';\r\n }> = [];\r\n\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n\r\n if (currentValue === undefined) {\r\n diffs.push({\r\n name,\r\n scope: entry.scope,\r\n manifestStatus: 'tracked',\r\n currentValue: null,\r\n status: 'missing',\r\n });\r\n } else {\r\n diffs.push({\r\n name,\r\n scope: entry.scope,\r\n manifestStatus: 'tracked',\r\n currentValue,\r\n status: 'match',\r\n });\r\n }\r\n }\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify(diffs, null, 2));\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n const rows: string[][] = [];\r\n\r\n for (const diff of diffs) {\r\n let statusIcon: string;\r\n switch (diff.status) {\r\n case 'match':\r\n statusIcon = chalk.green('✔ in sync');\r\n break;\r\n case 'changed':\r\n statusIcon = chalk.yellow('~ changed');\r\n break;\r\n case 'missing':\r\n statusIcon = chalk.red('✖ missing');\r\n break;\r\n }\r\n rows.push([diff.name, diff.scope, statusIcon]);\r\n }\r\n\r\n logger.table(['NAME', 'SCOPE', 'STATUS'], rows);\r\n logger.plain('');\r\n\r\n const missingCount = diffs.filter(d => d.status === 'missing').length;\r\n const changedCount = diffs.filter(d => d.status === 'changed').length;\r\n\r\n if (missingCount > 0) {\r\n logger.warn(`${missingCount} variable${missingCount > 1 ? 's' : ''} missing from system. Run \\`qenv clean\\` to remove stale entries.`);\r\n }\r\n if (changedCount > 0) {\r\n logger.info(`${changedCount} variable${changedCount > 1 ? 's' : ''} changed since last set.`);\r\n }\r\n if (missingCount === 0 && changedCount === 0) {\r\n logger.success('All variables are in sync.');\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n\r\nexport function registerCleanCommand(program: Command): void {\r\n program\r\n .command('clean')\r\n .description('Remove stale entries from manifest')\r\n .option('--force', 'Skip confirmation prompt')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv clean\r\n $ qenv clean --force\r\n`)\r\n .action(async (options: { force?: boolean }) => {\r\n try {\r\n const vars = manifest.getAll();\r\n const entries = Object.entries(vars);\r\n\r\n if (entries.length === 0) {\r\n logger.info('No variables managed by qenv.');\r\n return;\r\n }\r\n\r\n const driver = getSystemDriver();\r\n const staleNames: string[] = [];\r\n\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n\r\n if (currentValue === undefined) {\r\n staleNames.push(name);\r\n }\r\n }\r\n\r\n if (staleNames.length === 0) {\r\n logger.success('No stale entries found. Everything is clean!');\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n logger.info(`Found ${staleNames.length} stale ${staleNames.length === 1 ? 'entry' : 'entries'}:`);\r\n for (const name of staleNames) {\r\n logger.plain(` ${chalk.yellow('⚠')} ${name}`);\r\n }\r\n logger.plain('');\r\n\r\n if (!options.force) {\r\n const confirmed = await confirm('Remove these stale entries from manifest?');\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n return;\r\n }\r\n }\r\n\r\n const removed = manifest.removeMany(staleNames);\r\n logger.success(`Removed ${removed} stale ${removed === 1 ? 'entry' : 'entries'} from manifest.`);\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { readFileSync, writeFileSync, existsSync, appendFileSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport chalk from 'chalk';\r\nimport { detectShell, getShellName, type ShellType } from '../shell/detect.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { getHomeDir } from '../utils/platform.js';\r\n\r\n/** Shell config file paths */\r\nconst SHELL_CONFIGS: Record<ShellType, string> = {\r\n bash: '~/.bashrc',\r\n zsh: '~/.zshrc',\r\n fish: '~/.config/fish/config.fish',\r\n pwsh: '', // Determined dynamically via $PROFILE\r\n cmd: '', // Not applicable\r\n};\r\n\r\n/** Wrapper code for each shell */\r\nconst WRAPPER_CODE: Record<ShellType, string> = {\r\n bash: `\r\n# qenv shell integration\r\nqenv() { eval \"$(command qenv --shell-eval \"$@\")\"; }\r\n# end qenv`,\r\n zsh: `\r\n# qenv shell integration\r\nqenv() { eval \"$(command qenv --shell-eval \"$@\")\"; }\r\n# end qenv`,\r\n fish: `\r\n# qenv shell integration\r\nfunction qenv\r\n eval (command qenv --shell-eval $argv)\r\nend\r\n# end qenv`,\r\n pwsh: `\r\n# qenv shell integration\r\nfunction qenv { $result = & qenv.cmd --shell-eval @args; if ($result) { Invoke-Expression $result } }\r\n# end qenv`,\r\n cmd: '',\r\n};\r\n\r\n/** Markers for identifying qenv wrapper in config files */\r\nconst WRAPPER_START = '# qenv shell integration';\r\nconst WRAPPER_END = '# end qenv';\r\n\r\n/**\r\n * Get the shell config file path.\r\n */\r\nfunction getConfigPath(shell: ShellType): string | null {\r\n const home = getHomeDir();\r\n if (!home) return null;\r\n\r\n if (shell === 'pwsh') {\r\n // PowerShell profile path\r\n const psProfile = process.env.PROFILE;\r\n if (psProfile) return psProfile;\r\n // Default PowerShell profile locations\r\n if (process.platform === 'win32') {\r\n return resolve(process.env.USERPROFILE || home, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1');\r\n }\r\n return resolve(home, '.config', 'powershell', 'Microsoft.PowerShell_profile.ps1');\r\n }\r\n\r\n if (shell === 'cmd') {\r\n return null;\r\n }\r\n\r\n const configPath = SHELL_CONFIGS[shell];\r\n return configPath ? configPath.replace('~', home) : null;\r\n}\r\n\r\nexport function registerInitCommand(program: Command): void {\r\n program\r\n .command('init')\r\n .description('Install shell integration for --local mode support')\r\n .option('--shell <type>', 'Specify shell type (bash/zsh/fish/pwsh)')\r\n .option('--print', 'Print wrapper code without installing')\r\n .option('--uninstall', 'Remove shell integration')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv init\r\n $ qenv init --shell zsh\r\n $ qenv init --print\r\n $ qenv init --uninstall\r\n`)\r\n .action(async (options: {\r\n shell?: string;\r\n print?: boolean;\r\n uninstall?: boolean;\r\n }) => {\r\n try {\r\n const shell = (options.shell as ShellType) || detectShell();\r\n\r\n if (shell === 'cmd') {\r\n logger.error('Command Prompt (cmd) does not support shell integration.');\r\n logger.info('Please use PowerShell instead.');\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const wrapperCode = WRAPPER_CODE[shell];\r\n if (!wrapperCode) {\r\n logger.error(`Shell \"${shell}\" is not supported.`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // --print mode\r\n if (options.print) {\r\n logger.info(`Add the following to your ${getShellName(shell)} config:\\n`);\r\n logger.plain(wrapperCode);\r\n return;\r\n }\r\n\r\n const configPath = getConfigPath(shell);\r\n if (!configPath) {\r\n logger.error('Could not determine shell config file path.');\r\n logger.info('Use --print to see the wrapper code and add it manually.');\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // --uninstall mode\r\n if (options.uninstall) {\r\n if (!existsSync(configPath)) {\r\n logger.info('Shell config file not found. Nothing to uninstall.');\r\n return;\r\n }\r\n\r\n let content = readFileSync(configPath, 'utf-8');\r\n const startIdx = content.indexOf(WRAPPER_START);\r\n const endIdx = content.indexOf(WRAPPER_END);\r\n\r\n if (startIdx === -1) {\r\n logger.info('qenv shell integration not found. Nothing to uninstall.');\r\n return;\r\n }\r\n\r\n const before = content.slice(0, startIdx).trimEnd();\r\n const after = content.slice(endIdx + WRAPPER_END.length).trimStart();\r\n content = before + (after ? '\\n' + after : '') + '\\n';\r\n\r\n writeFileSync(configPath, content, 'utf-8');\r\n logger.success(`Removed qenv integration from ${configPath}`);\r\n logger.info('Restart your shell to apply changes.');\r\n return;\r\n }\r\n\r\n // Install mode\r\n let content = '';\r\n if (existsSync(configPath)) {\r\n content = readFileSync(configPath, 'utf-8');\r\n\r\n // Check if already installed\r\n if (content.includes(WRAPPER_START)) {\r\n logger.info('qenv shell integration is already installed.');\r\n logger.info(`Config file: ${configPath}`);\r\n return;\r\n }\r\n }\r\n\r\n appendFileSync(configPath, '\\n' + wrapperCode.trim() + '\\n', 'utf-8');\r\n\r\n logger.success(`Installed qenv integration in ${configPath}`);\r\n logger.info(`Shell: ${getShellName(shell)}`);\r\n logger.info('Restart your shell or run:');\r\n if (shell === 'fish') {\r\n logger.plain(` source ${configPath}`);\r\n } else if (shell === 'pwsh') {\r\n logger.plain(` . $PROFILE`);\r\n } else {\r\n logger.plain(` source ${configPath}`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport chalk from 'chalk';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { parseDotEnvLine, serializeDotEnv } from '../utils/validator.js';\r\nimport { outputShellEval, outputNoOp } from '../shell/eval.js';\r\nimport { detectShell } from '../shell/detect.js';\r\n\r\nexport function registerImportCommand(program: Command, isShellEval: boolean): void {\r\n program\r\n .command('import <file>')\r\n .description('Import variables from a .env file')\r\n .option('--local', 'Import to current shell session (requires qenv init)')\r\n .option('--dry-run', 'Preview changes without applying')\r\n .option('--overwrite', 'Overwrite existing variables')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv import .env\r\n $ qenv import .env.prod --dry-run\r\n $ qenv import .env --local\r\n $ qenv import .env --overwrite\r\n`)\r\n .action(async (file: string, options: {\r\n local?: boolean;\r\n dryRun?: boolean;\r\n overwrite?: boolean;\r\n }) => {\r\n try {\r\n const filePath = resolve(process.cwd(), file);\r\n\r\n if (!existsSync(filePath)) {\r\n logger.error(`File not found: ${filePath}`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const content = readFileSync(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n const vars: Record<string, string> = {};\r\n\r\n for (const line of lines) {\r\n const parsed = parseDotEnvLine(line);\r\n if (parsed) {\r\n vars[parsed.key] = parsed.value;\r\n }\r\n }\r\n\r\n const entries = Object.entries(vars);\r\n if (entries.length === 0) {\r\n logger.info(`No variables found in ${file}`);\r\n return;\r\n }\r\n\r\n // --dry-run mode\r\n if (options.dryRun) {\r\n logger.info(`Preview of import from ${file}:\\n`);\r\n for (const [key, value] of entries) {\r\n logger.plain(` ${chalk.green('+')} ${key}=${value}`);\r\n }\r\n logger.plain(`\\n Total: ${entries.length} variable${entries.length > 1 ? 's' : ''}`);\r\n return;\r\n }\r\n\r\n // --local mode\r\n if (options.local) {\r\n if (isShellEval) {\r\n const shell = detectShell();\r\n const evalParts: string[] = [];\r\n for (const [key, value] of entries) {\r\n const expressions: Record<string, string> = {\r\n bash: `export ${key}=\"${value}\"`,\r\n zsh: `export ${key}=\"${value}\"`,\r\n fish: `set -gx ${key} \"${value}\"`,\r\n pwsh: `$env:${key} = \"${value}\"`,\r\n cmd: `set \"${key}=${value}\"`,\r\n };\r\n evalParts.push(expressions[shell] || expressions['bash']);\r\n }\r\n const separator = shell === 'fish' ? '; ' : '; ';\r\n process.stdout.write(evalParts.join(separator));\r\n } else {\r\n logger.warn('--local requires qenv init. Run `qenv init` first.');\r\n }\r\n return;\r\n }\r\n\r\n // System import\r\n const driver = getSystemDriver();\r\n let imported = 0;\r\n let skipped = 0;\r\n\r\n for (const [key, value] of entries) {\r\n if (!options.overwrite) {\r\n const existing = await driver.get(key);\r\n if (existing !== undefined) {\r\n logger.warn(`Skipped ${key} (already exists). Use --overwrite to replace.`);\r\n skipped++;\r\n continue;\r\n }\r\n }\r\n\r\n await driver.set(key, value);\r\n manifest.set(key, 'system');\r\n imported++;\r\n }\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Imported ${imported} variable${imported > 1 ? 's' : ''} from ${file}`);\r\n if (skipped > 0) {\r\n logger.info(`Skipped ${skipped} existing variable${skipped > 1 ? 's' : ''}.`);\r\n }\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n\r\nexport function registerExportCommand(program: Command): void {\r\n program\r\n .command('export [file]')\r\n .description('Export variables to .env format')\r\n .option('--all', 'Export all system environment variables')\r\n .option('--filter <prefix>', 'Only export variables matching prefix')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv export\r\n $ qenv export .env.backup\r\n $ qenv export --all\r\n $ qenv export --filter REACT_APP_\r\n`)\r\n .action(async (file: string | undefined, options: {\r\n all?: boolean;\r\n filter?: string;\r\n }) => {\r\n try {\r\n let vars: Record<string, string> = {};\r\n\r\n if (options.all) {\r\n // Export all system env vars\r\n const driver = getSystemDriver();\r\n vars = await driver.list();\r\n } else {\r\n // Export manifest-tracked variables\r\n const manifestVars = manifest.getAll();\r\n const driver = getSystemDriver();\r\n\r\n for (const [name, entry] of Object.entries(manifestVars)) {\r\n let value: string | undefined;\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n value = await fileDriver.get(name);\r\n } else {\r\n value = await driver.get(name);\r\n }\r\n if (value !== undefined) {\r\n vars[name] = value;\r\n }\r\n }\r\n }\r\n\r\n // Apply filter if specified\r\n if (options.filter) {\r\n const prefix = options.filter;\r\n const filtered: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (key.startsWith(prefix)) {\r\n filtered[key] = value;\r\n }\r\n }\r\n vars = filtered;\r\n }\r\n\r\n const entries = Object.entries(vars);\r\n if (entries.length === 0) {\r\n logger.info('No variables to export.');\r\n return;\r\n }\r\n\r\n const output = serializeDotEnv(vars);\r\n\r\n if (file) {\r\n const outPath = resolve(process.cwd(), file);\r\n writeFileSync(outPath, output + '\\n', 'utf-8');\r\n logger.success(`Exported ${entries.length} variable${entries.length > 1 ? 's' : ''} to ${file}`);\r\n } else {\r\n // Output to stdout\r\n logger.plain(output);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":["import_chalk","import_node_child_process","chalk","import_node_child_process","execSync","import_node_fs","Conf","driver","resolve","driver","validation","import_chalk","driver","vars","entries","chalk","import_chalk","import_node_readline","confirm","resolve","chalk","import_node_fs","import_node_path","content","import_node_fs","import_node_path","import_chalk","chalk","prefix","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/platform.ts","../src/drivers/windows.ts","../src/utils/logger.ts","../src/utils/validator.ts","../src/drivers/unix.ts","../src/shell/detect.ts","../src/drivers/dotenv.ts","../src/drivers/index.ts","../src/manifest/index.ts","../src/shell/eval.ts","../src/commands/set.ts","../src/commands/get.ts","../src/commands/remove.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/init.ts","../src/commands/import.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport chalk from 'chalk';\r\nimport { registerSetCommand } from './commands/set.js';\r\nimport { registerGetCommand } from './commands/get.js';\r\nimport { registerRemoveCommand } from './commands/remove.js';\r\nimport { registerListCommand } from './commands/list.js';\r\nimport { registerDiffCommand, registerCleanCommand } from './commands/diff.js';\r\nimport { registerInitCommand } from './commands/init.js';\r\nimport { registerImportCommand, registerExportCommand } from './commands/import.js';\r\n\r\nconst VERSION = '1.0.0';\r\n\r\n/**\r\n * Check if running in --shell-eval mode.\r\n * Shell wrapper calls: qenv --shell-eval <args...>\r\n */\r\nfunction isShellEvalMode(): boolean {\r\n return process.argv.includes('--shell-eval');\r\n}\r\n\r\n/**\r\n * Set up global flags.\r\n */\r\nfunction setupGlobals(): void {\r\n // --verbose\r\n if (process.argv.includes('--verbose')) {\r\n process.env.QENV_VERBOSE = '1';\r\n }\r\n\r\n // --no-color\r\n if (process.argv.includes('--no-color')) {\r\n process.env.NO_COLOR = '1';\r\n process.env.FORCE_COLOR = '0';\r\n }\r\n\r\n // --silent\r\n if (process.argv.includes('--silent')) {\r\n // Override console.log to suppress output\r\n const originalLog = console.log;\r\n const originalInfo = console.info;\r\n console.log = () => {};\r\n console.info = () => {};\r\n // Keep console.error for actual errors\r\n }\r\n}\r\n\r\nfunction main(): void {\r\n setupGlobals();\r\n\r\n const shellEval = isShellEvalMode();\r\n\r\n // Filter out --shell-eval from argv before commander parses\r\n const argv = process.argv.filter(arg => arg !== '--shell-eval');\r\n\r\n const program = new Command();\r\n\r\n program\r\n .name('qenv')\r\n .version(VERSION, '-V, --version', 'Output the version number')\r\n .description(`${chalk.bold(`qenv v${VERSION}`)} — Cross-platform env var manager`)\r\n .option('--no-color', 'Disable colored output')\r\n .option('--silent', 'Suppress all stdout output (errors only)')\r\n .option('--verbose', 'Output debug information')\r\n .addHelpText('after', `\r\nRun ${chalk.cyan('qenv <command> --help')} for detailed usage of each command.\r\n`);\r\n\r\n // Register all commands\r\n registerSetCommand(program, shellEval);\r\n registerGetCommand(program);\r\n registerRemoveCommand(program, shellEval);\r\n registerListCommand(program);\r\n registerDiffCommand(program);\r\n registerCleanCommand(program);\r\n registerInitCommand(program);\r\n registerImportCommand(program, shellEval);\r\n registerExportCommand(program);\r\n\r\n // Parse with filtered argv\r\n program.parse(argv);\r\n}\r\n\r\nmain();\r\n","import { execSync } from 'node:child_process';\r\n\r\nexport type Platform = 'windows' | 'macos' | 'linux';\r\n\r\n/**\r\n * Get the current platform.\r\n */\r\nexport function getPlatform(): Platform {\r\n switch (process.platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n default:\r\n return 'linux';\r\n }\r\n}\r\n\r\n/**\r\n * Check if the current process is running with elevated privileges.\r\n */\r\nexport function isElevated(): boolean {\r\n const platform = getPlatform();\r\n\r\n if (platform === 'windows') {\r\n try {\r\n execSync('net session', { stdio: 'ignore' });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // Unix: check if running as root\r\n return process.getuid?.() === 0;\r\n}\r\n\r\n/**\r\n * Get the home directory.\r\n */\r\nexport function getHomeDir(): string {\r\n return process.env.HOME || process.env.USERPROFILE || '';\r\n}\r\n","import { execSync } from 'node:child_process';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateValueForWindows } from '../utils/validator.js';\r\nimport { isElevated } from '../utils/platform.js';\r\nimport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\n/**\r\n * Windows environment variable driver.\r\n * Uses `setx` for user-level and `reg add` for system-level variables.\r\n */\r\nexport class WindowsDriver implements EnvDriver {\r\n private systemWide: boolean;\r\n\r\n constructor(options: SystemDriverOptions = {}) {\r\n this.systemWide = options.systemWide || false;\r\n }\r\n\r\n async get(name: string): Promise<string | undefined> {\r\n try {\r\n const regPath = this.systemWide\r\n ? 'HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment'\r\n : 'HKCU\\\\Environment';\r\n\r\n const output = execSync(`reg query \"${regPath}\" /v ${name}`, {\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n });\r\n\r\n // Parse reg query output: \" NAME REG_SZ value\"\r\n const match = output.match(/\\s+\\S+\\s+REG_(?:SZ|EXPAND_SZ)\\s+(.*)/);\r\n if (match) {\r\n return match[1].trim();\r\n }\r\n return undefined;\r\n } catch {\r\n // Variable not found\r\n return undefined;\r\n }\r\n }\r\n\r\n async set(name: string, value: string): Promise<void> {\r\n if (this.systemWide) {\r\n if (!isElevated()) {\r\n throw new Error('System-wide operations require administrator privileges. Run as Administrator.');\r\n }\r\n execSync(\r\n `reg add \"HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment\" /v ${name} /t REG_EXPAND_SZ /d \"${value}\" /f`,\r\n { stdio: 'pipe' }\r\n );\r\n } else {\r\n // Validate setx length limit\r\n const validation = validateValueForWindows(value);\r\n if (!validation.valid) {\r\n throw new Error(validation.message);\r\n }\r\n execSync(`setx ${name} \"${value}\"`, { stdio: 'pipe' });\r\n }\r\n\r\n // Broadcast WM_SETTINGCHANGE to notify other processes\r\n this.broadcastSettingChange();\r\n }\r\n\r\n async remove(name: string): Promise<void> {\r\n const regPath = this.systemWide\r\n ? 'HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment'\r\n : 'HKCU\\\\Environment';\r\n\r\n if (this.systemWide && !isElevated()) {\r\n throw new Error('System-wide operations require administrator privileges. Run as Administrator.');\r\n }\r\n\r\n try {\r\n execSync(`reg delete \"${regPath}\" /v ${name} /f`, { stdio: 'pipe' });\r\n this.broadcastSettingChange();\r\n } catch {\r\n throw new Error(`Failed to remove variable \"${name}\". It may not exist.`);\r\n }\r\n }\r\n\r\n async list(): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {};\r\n try {\r\n const regPath = this.systemWide\r\n ? 'HKLM\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment'\r\n : 'HKCU\\\\Environment';\r\n\r\n const output = execSync(`reg query \"${regPath}\"`, {\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n });\r\n\r\n const lines = output.split('\\n');\r\n for (const line of lines) {\r\n const match = line.match(/^\\s+(\\S+)\\s+REG_(?:SZ|EXPAND_SZ)\\s+(.*)/);\r\n if (match) {\r\n result[match[1].trim()] = match[2].trim();\r\n }\r\n }\r\n } catch {\r\n logger.debug('Failed to query Windows registry');\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Broadcast WM_SETTINGCHANGE to notify other processes of env change.\r\n */\r\n private broadcastSettingChange(): void {\r\n try {\r\n // Use PowerShell to broadcast the setting change message\r\n execSync(\r\n `powershell -Command \"[System.Environment]::SetEnvironmentVariable('__qenv_broadcast__', $null, 'User')\"`,\r\n { stdio: 'pipe' }\r\n );\r\n } catch {\r\n logger.debug('Failed to broadcast WM_SETTINGCHANGE');\r\n }\r\n }\r\n}\r\n","import chalk from 'chalk';\r\n\r\nconst prefix = chalk.blue('qenv');\r\n\r\nexport const logger = {\r\n success(msg: string): void {\r\n console.log(`${prefix} ${chalk.green('✔')} ${msg}`);\r\n },\r\n\r\n warn(msg: string): void {\r\n console.log(`${prefix} ${chalk.yellow('⚠')} ${msg}`);\r\n },\r\n\r\n error(msg: string): void {\r\n console.error(`${prefix} ${chalk.red('✖')} ${msg}`);\r\n },\r\n\r\n info(msg: string): void {\r\n console.log(`${prefix} ${chalk.cyan('ℹ')} ${msg}`);\r\n },\r\n\r\n plain(msg: string): void {\r\n console.log(msg);\r\n },\r\n\r\n debug(msg: string): void {\r\n if (process.env.QENV_VERBOSE === '1') {\r\n console.log(`${prefix} ${chalk.gray('[debug]')} ${msg}`);\r\n }\r\n },\r\n\r\n table(headers: string[], rows: string[][]): void {\r\n // Calculate column widths\r\n const colWidths = headers.map((h, i) =>\r\n Math.max(h.length, ...rows.map(r => (r[i] || '').length))\r\n );\r\n\r\n // Header\r\n const headerLine = headers\r\n .map((h, i) => h.padEnd(colWidths[i]))\r\n .join(' ');\r\n console.log(` ${chalk.bold(headerLine)}`);\r\n\r\n // Separator\r\n const sep = colWidths.map(w => '─'.repeat(w)).join('──');\r\n console.log(` ${sep}`);\r\n\r\n // Rows\r\n for (const row of rows) {\r\n const line = row\r\n .map((cell, i) => cell.padEnd(colWidths[i]))\r\n .join(' ');\r\n console.log(` ${line}`);\r\n }\r\n },\r\n};\r\n\r\n/** Check if --silent flag is active */\r\nexport function isSilent(): boolean {\r\n return process.argv.includes('--silent');\r\n}\r\n\r\n/** Check if --no-color flag is active */\r\nexport function isNoColor(): boolean {\r\n return process.argv.includes('--no-color') || process.env.NO_COLOR !== undefined;\r\n}\r\n","/**\r\n * Regex pattern for valid environment variable names.\r\n * Allows letters, digits, underscores; must start with letter or underscore.\r\n */\r\nconst VAR_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\r\n\r\n/**\r\n * Windows setx has a 1024 character limit for values.\r\n */\r\nconst WINDOWS_SETX_MAX_LENGTH = 1024;\r\n\r\n/**\r\n * Validate an environment variable name.\r\n */\r\nexport function validateName(name: string): { valid: boolean; message?: string } {\r\n if (!name || name.trim().length === 0) {\r\n return { valid: false, message: 'Variable name cannot be empty' };\r\n }\r\n\r\n if (!VAR_NAME_PATTERN.test(name)) {\r\n return {\r\n valid: false,\r\n message: `Invalid variable name \"${name}\". Must match /^[A-Za-z_][A-Za-z0-9_]*$/`,\r\n };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Validate a value for Windows setx compatibility.\r\n */\r\nexport function validateValueForWindows(value: string): { valid: boolean; message?: string } {\r\n if (value.length > WINDOWS_SETX_MAX_LENGTH) {\r\n return {\r\n valid: false,\r\n message: `Value exceeds Windows setx limit of ${WINDOWS_SETX_MAX_LENGTH} characters (got ${value.length})`,\r\n };\r\n }\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Parse a .env file line.\r\n * Returns null for comments and empty lines.\r\n */\r\nexport function parseDotEnvLine(line: string): { key: string; value: string } | null {\r\n const trimmed = line.trim();\r\n\r\n // Skip empty lines and comments\r\n if (!trimmed || trimmed.startsWith('#')) {\r\n return null;\r\n }\r\n\r\n const eqIndex = trimmed.indexOf('=');\r\n if (eqIndex === -1) {\r\n return null;\r\n }\r\n\r\n const key = trimmed.slice(0, eqIndex).trim();\r\n let value = trimmed.slice(eqIndex + 1).trim();\r\n\r\n // Remove surrounding quotes\r\n if (\r\n (value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\r\n ) {\r\n value = value.slice(1, -1);\r\n }\r\n\r\n return { key, value };\r\n}\r\n\r\n/**\r\n * Serialize key-value pairs to .env format.\r\n */\r\nexport function serializeDotEnv(vars: Record<string, string>): string {\r\n return Object.entries(vars)\r\n .map(([key, value]) => {\r\n // Quote values that contain spaces or special characters\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n return `${key}=${quoted}`;\r\n })\r\n .join('\\n');\r\n}\r\n","import { readFileSync, writeFileSync, existsSync } from 'node:fs';\r\nimport { execSync } from 'node:child_process';\r\nimport { resolve, join } from 'node:path';\r\nimport { logger } from '../utils/logger.js';\r\nimport { getHomeDir } from '../utils/platform.js';\r\nimport { detectShell, type ShellType } from '../shell/detect.js';\r\nimport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\n/** Shell config files by shell type */\r\nconst SHELL_FILES: Record<string, string[]> = {\r\n zsh: ['~/.zshrc', '~/.zprofile'],\r\n bash: ['~/.bashrc', '~/.bash_profile', '~/.profile'],\r\n fish: ['~/.config/fish/config.fish'],\r\n};\r\n\r\n/** Marker comment for qenv managed lines */\r\nconst QENV_MARKER = '# qenv:managed';\r\n\r\n/**\r\n * Unix environment variable driver.\r\n * Reads/writes shell configuration files (e.g., .bashrc, .zshrc).\r\n */\r\nexport class UnixDriver implements EnvDriver {\r\n private systemWide: boolean;\r\n\r\n constructor(options: SystemDriverOptions = {}) {\r\n this.systemWide = options.systemWide || false;\r\n }\r\n\r\n async get(name: string): Promise<string | undefined> {\r\n // First try process.env (current session)\r\n if (process.env[name] !== undefined) {\r\n return process.env[name];\r\n }\r\n\r\n // Try reading from shell config file\r\n const configPath = this.getConfigFilePath();\r\n if (configPath && existsSync(configPath)) {\r\n const content = readFileSync(configPath, 'utf-8');\r\n const regex = new RegExp(`^export ${name}=\"(.+)\"\\\\s*${QENV_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}$`, 'm');\r\n const match = content.match(regex);\r\n if (match) {\r\n return match[1];\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n async set(name: string, value: string): Promise<void> {\r\n if (this.systemWide) {\r\n // System-wide: write to /etc/environment\r\n const line = `${name}=\"${value}\"`;\r\n try {\r\n execSync(`sudo sh -c 'echo \"${line} ${QENV_MARKER}\" >> /etc/environment'`, { stdio: 'pipe' });\r\n } catch {\r\n throw new Error('System-wide operations require sudo privileges.');\r\n }\r\n return;\r\n }\r\n\r\n const configPath = this.getConfigFilePath();\r\n if (!configPath) {\r\n throw new Error('Could not determine shell configuration file.');\r\n }\r\n\r\n const exportLine = `export ${name}=\"${value}\" ${QENV_MARKER}`;\r\n\r\n let content = '';\r\n if (existsSync(configPath)) {\r\n content = readFileSync(configPath, 'utf-8');\r\n }\r\n\r\n // Check if variable already exists with qenv marker\r\n const regex = new RegExp(`^export ${name}=.*${QENV_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}$`, 'm');\r\n\r\n if (regex.test(content)) {\r\n // Replace existing line\r\n content = content.replace(regex, exportLine);\r\n } else {\r\n // Append new line\r\n content = content.trimEnd() + '\\n' + exportLine + '\\n';\r\n }\r\n\r\n writeFileSync(configPath, content, 'utf-8');\r\n logger.debug(`Wrote to ${configPath}`);\r\n }\r\n\r\n async remove(name: string): Promise<void> {\r\n if (this.systemWide) {\r\n try {\r\n execSync(\r\n `sudo sed -i '/^${name}=.*${QENV_MARKER.replace(/\\//g, '\\\\/')}/d' /etc/environment`,\r\n { stdio: 'pipe' }\r\n );\r\n } catch {\r\n throw new Error('System-wide operations require sudo privileges.');\r\n }\r\n return;\r\n }\r\n\r\n const configPath = this.getConfigFilePath();\r\n if (!configPath || !existsSync(configPath)) {\r\n throw new Error(`Variable \"${name}\" not found in shell configuration.`);\r\n }\r\n\r\n let content = readFileSync(configPath, 'utf-8');\r\n const regex = new RegExp(`^export ${name}=.*${QENV_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\n?`, 'm');\r\n\r\n if (!regex.test(content)) {\r\n throw new Error(`Variable \"${name}\" is not managed by qenv.`);\r\n }\r\n\r\n content = content.replace(regex, '');\r\n writeFileSync(configPath, content, 'utf-8');\r\n }\r\n\r\n async list(): Promise<Record<string, string>> {\r\n // Return all current environment variables\r\n const result: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (value !== undefined) {\r\n result[key] = value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Determine which shell config file to use.\r\n */\r\n private getConfigFilePath(): string | null {\r\n const home = getHomeDir();\r\n if (!home) return null;\r\n\r\n const shell = detectShell();\r\n const files = SHELL_FILES[shell] || SHELL_FILES['bash'];\r\n\r\n for (const file of files) {\r\n const resolved = file.replace('~', home);\r\n if (existsSync(resolved)) {\r\n return resolved;\r\n }\r\n }\r\n\r\n // Default to first option if none exists yet\r\n if (files.length > 0) {\r\n return files[0].replace('~', home);\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","/**\r\n * Supported shell types.\r\n */\r\nexport type ShellType = 'bash' | 'zsh' | 'fish' | 'pwsh' | 'cmd';\r\n\r\n/**\r\n * Detect the current shell type.\r\n */\r\nexport function detectShell(): ShellType {\r\n // Check QENV_SHELL override first\r\n const override = process.env.QENV_SHELL;\r\n if (override && isValidShell(override)) {\r\n return override as ShellType;\r\n }\r\n\r\n // Windows\r\n if (process.platform === 'win32') {\r\n // Check if running in PowerShell\r\n if (process.env.PSModulePath) {\r\n return 'pwsh';\r\n }\r\n return 'cmd';\r\n }\r\n\r\n // Unix: check SHELL env var\r\n const shell = process.env.SHELL || '';\r\n\r\n if (shell.includes('zsh')) return 'zsh';\r\n if (shell.includes('fish')) return 'fish';\r\n if (shell.includes('bash')) return 'bash';\r\n\r\n // Check parent process name as fallback\r\n const parentPid = process.ppid;\r\n if (parentPid) {\r\n try {\r\n const { execSync } = require('node:child_process');\r\n const parentName = execSync(`ps -p ${parentPid} -o comm=`, {\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n }).trim();\r\n\r\n if (parentName.includes('zsh')) return 'zsh';\r\n if (parentName.includes('fish')) return 'fish';\r\n if (parentName.includes('bash')) return 'bash';\r\n if (parentName.includes('pwsh') || parentName.includes('powershell')) return 'pwsh';\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n // Default to bash\r\n return 'bash';\r\n}\r\n\r\n/**\r\n * Check if a string is a valid shell type.\r\n */\r\nfunction isValidShell(shell: string): boolean {\r\n return ['bash', 'zsh', 'fish', 'pwsh', 'cmd'].includes(shell);\r\n}\r\n\r\n/**\r\n * Get a human-readable name for a shell type.\r\n */\r\nexport function getShellName(shell: ShellType): string {\r\n const names: Record<ShellType, string> = {\r\n bash: 'Bash',\r\n zsh: 'Zsh',\r\n fish: 'Fish',\r\n pwsh: 'PowerShell',\r\n cmd: 'Command Prompt',\r\n };\r\n return names[shell] || shell;\r\n}\r\n","import { readFileSync, writeFileSync, existsSync } from 'node:fs';\r\nimport { resolve, dirname } from 'node:path';\r\nimport { parseDotEnvLine, serializeDotEnv } from '../utils/validator.js';\r\nimport type { EnvDriver } from './types.js';\r\n\r\n/**\r\n * .env file driver.\r\n * Reads and writes .env files in the project directory.\r\n */\r\nexport class DotenvDriver implements EnvDriver {\r\n private filePath: string;\r\n\r\n constructor(filePath: string = '.env') {\r\n this.filePath = resolve(process.cwd(), filePath);\r\n }\r\n\r\n async get(name: string): Promise<string | undefined> {\r\n const vars = await this.readFile();\r\n return vars[name];\r\n }\r\n\r\n async set(name: string, value: string): Promise<void> {\r\n const vars = await this.readFile();\r\n vars[name] = value;\r\n await this.writeFile(vars);\r\n }\r\n\r\n async remove(name: string): Promise<void> {\r\n const vars = await this.readFile();\r\n if (!(name in vars)) {\r\n throw new Error(`Variable \"${name}\" not found in ${this.filePath}`);\r\n }\r\n delete vars[name];\r\n await this.writeFile(vars);\r\n }\r\n\r\n async list(): Promise<Record<string, string>> {\r\n return this.readFile();\r\n }\r\n\r\n /**\r\n * Remove all variables from the .env file.\r\n */\r\n async clear(): Promise<void> {\r\n await this.writeFile({});\r\n }\r\n\r\n /**\r\n * Read and parse the .env file.\r\n */\r\n private async readFile(): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {};\r\n\r\n if (!existsSync(this.filePath)) {\r\n return result;\r\n }\r\n\r\n const content = readFileSync(this.filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n\r\n for (const line of lines) {\r\n const parsed = parseDotEnvLine(line);\r\n if (parsed) {\r\n result[parsed.key] = parsed.value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Write variables to the .env file, preserving comments.\r\n */\r\n private async writeFile(vars: Record<string, string>): Promise<void> {\r\n const lines: string[] = [];\r\n\r\n // If file exists, preserve comments and order\r\n if (existsSync(this.filePath)) {\r\n const content = readFileSync(this.filePath, 'utf-8');\r\n const existingLines = content.split('\\n');\r\n const writtenKeys = new Set<string>();\r\n\r\n for (const line of existingLines) {\r\n const parsed = parseDotEnvLine(line);\r\n if (parsed) {\r\n if (parsed.key in vars) {\r\n // Update existing variable\r\n const value = vars[parsed.key];\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n lines.push(`${parsed.key}=${quoted}`);\r\n writtenKeys.add(parsed.key);\r\n }\r\n // Skip removed variables\r\n } else {\r\n // Preserve comments and empty lines\r\n lines.push(line);\r\n }\r\n }\r\n\r\n // Add new variables\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (!writtenKeys.has(key)) {\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n lines.push(`${key}=${quoted}`);\r\n }\r\n }\r\n } else {\r\n // New file\r\n for (const [key, value] of Object.entries(vars)) {\r\n const needsQuotes = /[\\s#\"'=]/.test(value);\r\n const quoted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value;\r\n lines.push(`${key}=${quoted}`);\r\n }\r\n }\r\n\r\n writeFileSync(this.filePath, lines.join('\\n'), 'utf-8');\r\n }\r\n\r\n /** Get the file path of this driver */\r\n getFilePath(): string {\r\n return this.filePath;\r\n }\r\n}\r\n","import { getPlatform } from '../utils/platform.js';\r\nimport { WindowsDriver } from './windows.js';\r\nimport { UnixDriver } from './unix.js';\r\nimport { DotenvDriver } from './dotenv.js';\r\nimport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\nexport type { EnvDriver, SystemDriverOptions } from './types.js';\r\n\r\n/**\r\n * Get the appropriate system environment driver for the current platform.\r\n */\r\nexport function getSystemDriver(options: SystemDriverOptions = {}): EnvDriver {\r\n const platform = getPlatform();\r\n\r\n if (platform === 'windows') {\r\n return new WindowsDriver(options);\r\n }\r\n\r\n return new UnixDriver(options);\r\n}\r\n\r\n/**\r\n * Get the dotenv file driver.\r\n */\r\nexport function getDotenvDriver(filePath?: string): DotenvDriver {\r\n return new DotenvDriver(filePath);\r\n}\r\n","import Conf from 'conf';\r\n\r\n/**\r\n * Manifest entry for a tracked environment variable.\r\n */\r\nexport interface ManifestEntry {\r\n scope: 'system' | 'system-wide' | 'file';\r\n filePath: string | null;\r\n setAt: string;\r\n updatedAt: string;\r\n setBy: string;\r\n}\r\n\r\n/**\r\n * Manifest data structure.\r\n */\r\nexport interface ManifestData {\r\n version: number;\r\n vars: Record<string, ManifestEntry>;\r\n}\r\n\r\nconst SCHEMA = {\r\n version: {\r\n type: 'number' as const,\r\n default: 1,\r\n },\r\n vars: {\r\n type: 'object' as const,\r\n default: {},\r\n },\r\n};\r\n\r\n/** Get the package version for setBy field */\r\nfunction getVersion(): string {\r\n try {\r\n // Will be replaced at build time or read from package.json\r\n return `qenv@1.0.0`;\r\n } catch {\r\n return 'qenv@unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Manifest manager using `conf` for persistent storage.\r\n */\r\nclass ManifestManager {\r\n private store: Conf<ManifestData>;\r\n\r\n constructor() {\r\n this.store = new Conf<ManifestData>({\r\n projectName: 'qenv',\r\n schema: SCHEMA,\r\n defaults: {\r\n version: 1,\r\n vars: {},\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get all tracked variables.\r\n */\r\n getAll(): Record<string, ManifestEntry> {\r\n return this.store.get('vars') || {};\r\n }\r\n\r\n /**\r\n * Get a single variable entry.\r\n */\r\n get(name: string): ManifestEntry | undefined {\r\n const vars = this.getAll();\r\n return vars[name];\r\n }\r\n\r\n /**\r\n * Track a variable in the manifest.\r\n */\r\n set(name: string, scope: ManifestEntry['scope'], filePath: string | null = null): void {\r\n const vars = this.getAll();\r\n const now = new Date().toISOString();\r\n const existing = vars[name];\r\n\r\n vars[name] = {\r\n scope,\r\n filePath,\r\n setAt: existing?.setAt || now,\r\n updatedAt: now,\r\n setBy: getVersion(),\r\n };\r\n\r\n this.store.set('vars', vars);\r\n }\r\n\r\n /**\r\n * Remove a variable from the manifest.\r\n */\r\n remove(name: string): boolean {\r\n const vars = this.getAll();\r\n if (!(name in vars)) {\r\n return false;\r\n }\r\n delete vars[name];\r\n this.store.set('vars', vars);\r\n return true;\r\n }\r\n\r\n /**\r\n * Check if a variable is tracked.\r\n */\r\n has(name: string): boolean {\r\n const vars = this.getAll();\r\n return name in vars;\r\n }\r\n\r\n /**\r\n * Clear all manifest entries.\r\n */\r\n clear(): void {\r\n this.store.set('vars', {});\r\n }\r\n\r\n /**\r\n * Remove specific entries by name.\r\n */\r\n removeMany(names: string[]): number {\r\n const vars = this.getAll();\r\n let removed = 0;\r\n for (const name of names) {\r\n if (name in vars) {\r\n delete vars[name];\r\n removed++;\r\n }\r\n }\r\n this.store.set('vars', vars);\r\n return removed;\r\n }\r\n\r\n /**\r\n * Get the config file path (useful for debugging).\r\n */\r\n get path(): string {\r\n return this.store.path;\r\n }\r\n}\r\n\r\n/** Singleton manifest instance */\r\nexport const manifest = new ManifestManager();\r\n","import type { ShellType } from './detect.js';\r\n\r\n/**\r\n * Output shell eval expression to stdout.\r\n * This is used by the shell wrapper to eval in the parent process,\r\n * allowing --local mode to modify the current shell session.\r\n */\r\nexport function outputShellEval(\r\n key: string,\r\n value: string | null,\r\n action: 'set' | 'unset',\r\n shell: ShellType\r\n): void {\r\n const expressions: Record<string, Record<string, string>> = {\r\n bash: {\r\n set: `export ${key}=\"${escapeValue(value || '')}\"`,\r\n unset: `unset ${key}`,\r\n },\r\n zsh: {\r\n set: `export ${key}=\"${escapeValue(value || '')}\"`,\r\n unset: `unset ${key}`,\r\n },\r\n fish: {\r\n set: `set -gx ${key} \"${escapeValue(value || '')}\"`,\r\n unset: `set -e ${key}`,\r\n },\r\n pwsh: {\r\n set: `$env:${key} = \"${escapeValue(value || '')}\"`,\r\n unset: `Remove-Item Env:${key} -ErrorAction SilentlyContinue`,\r\n },\r\n cmd: {\r\n set: `set \"${key}=${value || ''}\"`,\r\n unset: `set \"${key}=\"`,\r\n },\r\n };\r\n\r\n const shellExprs = expressions[shell] || expressions['bash'];\r\n const expr = shellExprs[action];\r\n\r\n if (expr) {\r\n process.stdout.write(expr);\r\n }\r\n}\r\n\r\n/**\r\n * Escape special characters in a value for shell embedding.\r\n */\r\nfunction escapeValue(value: string): string {\r\n return value\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/\"/g, '\\\\\"')\r\n .replace(/\\$/g, '\\\\$')\r\n .replace(/`/g, '\\\\`');\r\n}\r\n\r\n/**\r\n * Generate a \"no-op\" eval expression (for commands that don't need shell eval).\r\n */\r\nexport function outputNoOp(): void {\r\n process.stdout.write(':');\r\n}\r\n","import type { Command } from 'commander';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateName } from '../utils/validator.js';\r\nimport { outputShellEval, outputNoOp } from '../shell/eval.js';\r\nimport { detectShell } from '../shell/detect.js';\r\n\r\nexport function registerSetCommand(program: Command, isShellEval: boolean): void {\r\n program\r\n .command('set <name> <value>')\r\n .description('Set an environment variable')\r\n .option('--local', 'Set for current shell session only (requires qenv init)')\r\n .option('--system', 'Set system-wide (requires admin/sudo)')\r\n .option('--file [path]', 'Write to .env file (default: ./.env)')\r\n .option('--json', 'Parse value as JSON')\r\n .option('--overwrite', 'Overwrite if already exists')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv set NODE_ENV production\r\n $ qenv set API_KEY sk-xxx --local\r\n $ qenv set PORT 3000 --file .env.local\r\n`)\r\n .action(async (name: string, value: string, options: {\r\n local?: boolean;\r\n system?: boolean;\r\n file?: string | boolean;\r\n json?: boolean;\r\n overwrite?: boolean;\r\n }) => {\r\n // Validate variable name\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // Parse JSON if requested\r\n let finalValue = value;\r\n if (options.json) {\r\n try {\r\n JSON.parse(value);\r\n finalValue = value;\r\n } catch {\r\n logger.error(`Invalid JSON value: ${value}`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n // --local mode: output eval expression for shell wrapper\r\n if (options.local) {\r\n if (isShellEval) {\r\n const shell = detectShell();\r\n outputShellEval(name, finalValue, 'set', shell);\r\n } else {\r\n logger.warn('--local requires qenv init. Run `qenv init` first.');\r\n logger.info('Hint: use `eval \"$(qenv --shell-eval set ' + name + ' ' + value + ' --local)\"` as a workaround.');\r\n }\r\n return;\r\n }\r\n\r\n // --file mode: write to .env file\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n\r\n // Check if already exists and --overwrite not specified\r\n if (!options.overwrite) {\r\n const existing = await driver.get(name);\r\n if (existing !== undefined) {\r\n logger.warn(`Variable \"${name}\" already exists in ${filePath}. Use --overwrite to replace.`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n }\r\n\r\n await driver.set(name, finalValue);\r\n manifest.set(name, 'file', driver.getFilePath());\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Set ${name} in ${filePath}`);\r\n }\r\n return;\r\n }\r\n\r\n // System mode (default or --system)\r\n const driver = getSystemDriver({ systemWide: options.system });\r\n\r\n // Check if already exists and --overwrite not specified\r\n if (!options.overwrite) {\r\n const existing = await driver.get(name);\r\n if (existing !== undefined) {\r\n logger.warn(`Variable \"${name}\" already exists. Use --overwrite to replace.`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n }\r\n\r\n await driver.set(name, finalValue);\r\n manifest.set(name, options.system ? 'system-wide' : 'system');\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n const scope = options.system ? 'system-wide' : 'user';\r\n logger.success(`Set ${name}=${finalValue} (${scope})`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateName } from '../utils/validator.js';\r\n\r\nexport function registerGetCommand(program: Command): void {\r\n program\r\n .command('get <name>')\r\n .description('Get an environment variable value')\r\n .option('--source', 'Show the source of the variable (qenv/system/file)')\r\n .option('--file [path]', 'Read from .env file (default: ./.env)')\r\n .option('--json', 'Output as JSON')\r\n .option('--raw', 'Output raw value only (for scripting)')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv get NODE_ENV\r\n $ qenv get API_KEY --source\r\n $ qenv get DATABASE_URL --file .env.prod\r\n $ qenv get PORT --raw\r\n`)\r\n .action(async (name: string, options: {\r\n source?: boolean;\r\n file?: string | boolean;\r\n json?: boolean;\r\n raw?: boolean;\r\n }) => {\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n try {\r\n let value: string | undefined;\r\n let source = 'system';\r\n\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n value = await driver.get(name);\r\n source = `file (${filePath})`;\r\n } else {\r\n const driver = getSystemDriver();\r\n value = await driver.get(name);\r\n\r\n // Determine source\r\n const entry = manifest.get(name);\r\n if (entry) {\r\n source = `qenv (${entry.scope})`;\r\n }\r\n }\r\n\r\n if (value === undefined) {\r\n if (options.raw) {\r\n // Raw mode: exit with code 1 if not found\r\n process.exitCode = 1;\r\n return;\r\n }\r\n logger.warn(`Variable \"${name}\" not found`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (options.raw) {\r\n process.stdout.write(value);\r\n return;\r\n }\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify({ name, value, source }));\r\n return;\r\n }\r\n\r\n if (options.source) {\r\n logger.plain(`${name}=${value}`);\r\n logger.info(`Source: ${source}`);\r\n } else {\r\n logger.plain(`${name}=${value}`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { createInterface } from 'node:readline';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { validateName } from '../utils/validator.js';\r\nimport { outputShellEval, outputNoOp } from '../shell/eval.js';\r\nimport { detectShell } from '../shell/detect.js';\r\n\r\n/**\r\n * Prompt user for confirmation.\r\n */\r\nfunction confirm(message: string): Promise<boolean> {\r\n const rl = createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(`${message} (y/N) `, (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\r\n });\r\n });\r\n}\r\n\r\nexport function registerRemoveCommand(program: Command, isShellEval: boolean): void {\r\n program\r\n .command('remove <name>')\r\n .alias('rm')\r\n .description('Remove an environment variable')\r\n .option('--system', 'Remove system-wide variable (requires admin/sudo)')\r\n .option('--local', 'Remove from current shell session')\r\n .option('--file [path]', 'Remove from .env file (default: ./.env)')\r\n .option('--force', 'Skip confirmation prompt')\r\n .option('--all', 'Remove all variables (only with --file)')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv remove NODE_ENV\r\n $ qenv remove API_KEY --force\r\n $ qenv remove DATABASE_URL --file .env.prod\r\n $ qenv remove --all --file\r\n`)\r\n .action(async (name: string, options: {\r\n system?: boolean;\r\n local?: boolean;\r\n file?: string | boolean;\r\n force?: boolean;\r\n all?: boolean;\r\n }) => {\r\n try {\r\n // --local mode: output eval expression for shell wrapper\r\n if (options.local) {\r\n if (isShellEval) {\r\n const shell = detectShell();\r\n outputShellEval(name, null, 'unset', shell);\r\n } else {\r\n logger.warn('--local requires qenv init. Run `qenv init` first.');\r\n }\r\n return;\r\n }\r\n\r\n // --file mode\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n\r\n if (options.all) {\r\n if (!options.force) {\r\n const confirmed = await confirm(`Remove all variables from ${filePath}?`);\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n return;\r\n }\r\n }\r\n await driver.clear();\r\n logger.success(`Cleared all variables from ${filePath}`);\r\n if (isShellEval) outputNoOp();\r\n return;\r\n }\r\n\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n await driver.remove(name);\r\n manifest.remove(name);\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Removed ${name} from ${filePath}`);\r\n }\r\n return;\r\n }\r\n\r\n // System mode\r\n const validation = validateName(name);\r\n if (!validation.valid) {\r\n logger.error(validation.message!);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (!options.force) {\r\n const confirmed = await confirm(`Remove variable \"${name}\"?`);\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n return;\r\n }\r\n }\r\n\r\n const driver = getSystemDriver({ systemWide: options.system });\r\n await driver.remove(name);\r\n manifest.remove(name);\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Removed ${name}`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport chalk from 'chalk';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest, type ManifestEntry } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { getPlatform } from '../utils/platform.js';\r\n\r\n/**\r\n * Format a relative time string from a date.\r\n */\r\nfunction timeAgo(dateStr: string): string {\r\n const date = new Date(dateStr);\r\n const now = new Date();\r\n const diffMs = now.getTime() - date.getTime();\r\n const diffSec = Math.floor(diffMs / 1000);\r\n const diffMin = Math.floor(diffSec / 60);\r\n const diffHour = Math.floor(diffMin / 60);\r\n const diffDay = Math.floor(diffHour / 24);\r\n\r\n if (diffDay > 0) return `${diffDay} day${diffDay > 1 ? 's' : ''} ago`;\r\n if (diffHour > 0) return `${diffHour} hour${diffHour > 1 ? 's' : ''} ago`;\r\n if (diffMin > 0) return `${diffMin} min${diffMin > 1 ? 's' : ''} ago`;\r\n return 'just now';\r\n}\r\n\r\n/**\r\n * Mask sensitive values for display.\r\n */\r\nfunction maskValue(value: string): string {\r\n if (value.length <= 6) return value;\r\n const visible = value.slice(0, 3);\r\n const tail = value.slice(-3);\r\n return `${visible}***${tail}`;\r\n}\r\n\r\nexport function registerListCommand(program: Command): void {\r\n program\r\n .command('list')\r\n .alias('ls')\r\n .description('List environment variables')\r\n .option('--all', 'List all system environment variables')\r\n .option('--file [path]', 'List variables from .env file (default: ./.env)')\r\n .option('--json', 'Output as JSON')\r\n .option('--verify', 'Verify manifest entries against actual system values')\r\n .option('--stale', 'Show only stale (not found) manifest entries')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv list\r\n $ qenv list --all\r\n $ qenv list --file .env.prod\r\n $ qenv list --json\r\n $ qenv list --verify\r\n $ qenv list --stale\r\n`)\r\n .action(async (options: {\r\n all?: boolean;\r\n file?: string | boolean;\r\n json?: boolean;\r\n verify?: boolean;\r\n stale?: boolean;\r\n }) => {\r\n try {\r\n // --file mode\r\n if (options.file !== undefined) {\r\n const filePath = typeof options.file === 'string' ? options.file : '.env';\r\n const driver = getDotenvDriver(filePath);\r\n const vars = await driver.list();\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify(vars, null, 2));\r\n return;\r\n }\r\n\r\n const entries = Object.entries(vars);\r\n if (entries.length === 0) {\r\n logger.info(`No variables found in ${filePath}`);\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n logger.table(\r\n ['NAME', 'VALUE'],\r\n entries.map(([key, value]) => [key, value])\r\n );\r\n logger.plain('');\r\n return;\r\n }\r\n\r\n // --all mode: list all system env vars\r\n if (options.all) {\r\n const platform = getPlatform();\r\n\r\n if (platform === 'windows') {\r\n // On Windows, query both user and system registry\r\n const userDriver = getSystemDriver({ systemWide: false });\r\n const sysDriver = getSystemDriver({ systemWide: true });\r\n\r\n const userVars = await userDriver.list();\r\n const sysVars = await sysDriver.list();\r\n\r\n if (options.json) {\r\n const merged: Record<string, { value: string; scope: string }> = {};\r\n for (const [k, v] of Object.entries(sysVars)) {\r\n merged[k] = { value: v, scope: 'system' };\r\n }\r\n for (const [k, v] of Object.entries(userVars)) {\r\n merged[k] = { value: v, scope: 'user' };\r\n }\r\n logger.plain(JSON.stringify(merged, null, 2));\r\n return;\r\n }\r\n\r\n const sysEntries = Object.entries(sysVars).sort(([a], [b]) => a.localeCompare(b));\r\n const userEntries = Object.entries(userVars).sort(([a], [b]) => a.localeCompare(b));\r\n\r\n logger.plain('');\r\n\r\n if (sysEntries.length > 0) {\r\n logger.plain(chalk.cyan.bold(' ── System Variables ──'));\r\n logger.plain('');\r\n for (const [key, value] of sysEntries) {\r\n logger.plain(` ${chalk.bold(key)}=${value}`);\r\n }\r\n logger.plain('');\r\n }\r\n\r\n if (userEntries.length > 0) {\r\n logger.plain(chalk.green.bold(' ── User Variables ──'));\r\n logger.plain('');\r\n for (const [key, value] of userEntries) {\r\n logger.plain(` ${chalk.bold(key)}=${value}`);\r\n }\r\n logger.plain('');\r\n }\r\n\r\n const total = sysEntries.length + userEntries.length;\r\n logger.plain(` Total: ${total} variables (${sysEntries.length} system, ${userEntries.length} user)\\n`);\r\n } else {\r\n // Unix: just list process env\r\n const driver = getSystemDriver();\r\n const vars = await driver.list();\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify(vars, null, 2));\r\n return;\r\n }\r\n\r\n const entries = Object.entries(vars).sort(([a], [b]) => a.localeCompare(b));\r\n if (entries.length === 0) {\r\n logger.info('No environment variables found');\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n for (const [key, value] of entries) {\r\n logger.plain(` ${chalk.bold(key)}=${value}`);\r\n }\r\n logger.plain(`\\n Total: ${entries.length} variables\\n`);\r\n }\r\n return;\r\n }\r\n\r\n // Default: list manifest entries\r\n const vars = manifest.getAll();\r\n const entries = Object.entries(vars);\r\n\r\n if (entries.length === 0) {\r\n logger.info('No variables managed by qenv. Use `qenv set` to add variables.');\r\n return;\r\n }\r\n\r\n const driver = getSystemDriver();\r\n const rows: string[][] = [];\r\n let staleCount = 0;\r\n\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n\r\n const isStale = currentValue === undefined;\r\n if (isStale) staleCount++;\r\n\r\n // Skip non-stale entries when --stale\r\n if (options.stale && !isStale) continue;\r\n\r\n const valueDisplay = isStale\r\n ? chalk.yellow('(not found) ⚠')\r\n : maskValue(currentValue!);\r\n const updated = timeAgo(entry.updatedAt);\r\n\r\n rows.push([name, valueDisplay, entry.scope, updated]);\r\n }\r\n\r\n if (options.json) {\r\n const jsonData: Record<string, any> = {};\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n jsonData[name] = {\r\n ...entry,\r\n currentValue: currentValue || null,\r\n stale: currentValue === undefined,\r\n };\r\n }\r\n logger.plain(JSON.stringify(jsonData, null, 2));\r\n return;\r\n }\r\n\r\n if (rows.length === 0) {\r\n logger.info('No stale entries found.');\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n logger.table(['NAME', 'VALUE', 'SCOPE', 'UPDATED'], rows);\r\n logger.plain('');\r\n\r\n if (staleCount > 0) {\r\n logger.warn(\r\n `${staleCount} stale ${staleCount === 1 ? 'entry' : 'entries'} found. Run \\`qenv clean\\` to remove.`\r\n );\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport chalk from 'chalk';\r\nimport { createInterface } from 'node:readline';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\n/**\r\n * Prompt user for confirmation.\r\n */\r\nfunction confirm(message: string): Promise<boolean> {\r\n const rl = createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(`${message} (y/N) `, (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\r\n });\r\n });\r\n}\r\n\r\nexport function registerDiffCommand(program: Command): void {\r\n program\r\n .command('diff')\r\n .description('Compare manifest records with actual system values')\r\n .option('--json', 'Output as JSON')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv diff\r\n $ qenv diff --json\r\n`)\r\n .action(async (options: { json?: boolean }) => {\r\n try {\r\n const vars = manifest.getAll();\r\n const entries = Object.entries(vars);\r\n\r\n if (entries.length === 0) {\r\n logger.info('No variables managed by qenv.');\r\n return;\r\n }\r\n\r\n const driver = getSystemDriver();\r\n const diffs: Array<{\r\n name: string;\r\n scope: string;\r\n manifestStatus: string;\r\n currentValue: string | null;\r\n status: 'match' | 'changed' | 'missing';\r\n }> = [];\r\n\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n\r\n if (currentValue === undefined) {\r\n diffs.push({\r\n name,\r\n scope: entry.scope,\r\n manifestStatus: 'tracked',\r\n currentValue: null,\r\n status: 'missing',\r\n });\r\n } else {\r\n diffs.push({\r\n name,\r\n scope: entry.scope,\r\n manifestStatus: 'tracked',\r\n currentValue,\r\n status: 'match',\r\n });\r\n }\r\n }\r\n\r\n if (options.json) {\r\n logger.plain(JSON.stringify(diffs, null, 2));\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n const rows: string[][] = [];\r\n\r\n for (const diff of diffs) {\r\n let statusIcon: string;\r\n switch (diff.status) {\r\n case 'match':\r\n statusIcon = chalk.green('✔ in sync');\r\n break;\r\n case 'changed':\r\n statusIcon = chalk.yellow('~ changed');\r\n break;\r\n case 'missing':\r\n statusIcon = chalk.red('✖ missing');\r\n break;\r\n }\r\n rows.push([diff.name, diff.scope, statusIcon]);\r\n }\r\n\r\n logger.table(['NAME', 'SCOPE', 'STATUS'], rows);\r\n logger.plain('');\r\n\r\n const missingCount = diffs.filter(d => d.status === 'missing').length;\r\n const changedCount = diffs.filter(d => d.status === 'changed').length;\r\n\r\n if (missingCount > 0) {\r\n logger.warn(`${missingCount} variable${missingCount > 1 ? 's' : ''} missing from system. Run \\`qenv clean\\` to remove stale entries.`);\r\n }\r\n if (changedCount > 0) {\r\n logger.info(`${changedCount} variable${changedCount > 1 ? 's' : ''} changed since last set.`);\r\n }\r\n if (missingCount === 0 && changedCount === 0) {\r\n logger.success('All variables are in sync.');\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n\r\nexport function registerCleanCommand(program: Command): void {\r\n program\r\n .command('clean')\r\n .description('Remove stale entries from manifest')\r\n .option('--force', 'Skip confirmation prompt')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv clean\r\n $ qenv clean --force\r\n`)\r\n .action(async (options: { force?: boolean }) => {\r\n try {\r\n const vars = manifest.getAll();\r\n const entries = Object.entries(vars);\r\n\r\n if (entries.length === 0) {\r\n logger.info('No variables managed by qenv.');\r\n return;\r\n }\r\n\r\n const driver = getSystemDriver();\r\n const staleNames: string[] = [];\r\n\r\n for (const [name, entry] of entries) {\r\n let currentValue: string | undefined;\r\n\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n currentValue = await fileDriver.get(name);\r\n } else {\r\n currentValue = await driver.get(name);\r\n }\r\n\r\n if (currentValue === undefined) {\r\n staleNames.push(name);\r\n }\r\n }\r\n\r\n if (staleNames.length === 0) {\r\n logger.success('No stale entries found. Everything is clean!');\r\n return;\r\n }\r\n\r\n logger.plain('');\r\n logger.info(`Found ${staleNames.length} stale ${staleNames.length === 1 ? 'entry' : 'entries'}:`);\r\n for (const name of staleNames) {\r\n logger.plain(` ${chalk.yellow('⚠')} ${name}`);\r\n }\r\n logger.plain('');\r\n\r\n if (!options.force) {\r\n const confirmed = await confirm('Remove these stale entries from manifest?');\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n return;\r\n }\r\n }\r\n\r\n const removed = manifest.removeMany(staleNames);\r\n logger.success(`Removed ${removed} stale ${removed === 1 ? 'entry' : 'entries'} from manifest.`);\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { readFileSync, writeFileSync, existsSync, appendFileSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport chalk from 'chalk';\r\nimport { detectShell, getShellName, type ShellType } from '../shell/detect.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { getHomeDir } from '../utils/platform.js';\r\n\r\n/** Shell config file paths */\r\nconst SHELL_CONFIGS: Record<ShellType, string> = {\r\n bash: '~/.bashrc',\r\n zsh: '~/.zshrc',\r\n fish: '~/.config/fish/config.fish',\r\n pwsh: '', // Determined dynamically via $PROFILE\r\n cmd: '', // Not applicable\r\n};\r\n\r\n/** Wrapper code for each shell */\r\nconst WRAPPER_CODE: Record<ShellType, string> = {\r\n bash: `\r\n# qenv shell integration\r\nqenv() { eval \"$(command qenv --shell-eval \"$@\")\"; }\r\n# end qenv`,\r\n zsh: `\r\n# qenv shell integration\r\nqenv() { eval \"$(command qenv --shell-eval \"$@\")\"; }\r\n# end qenv`,\r\n fish: `\r\n# qenv shell integration\r\nfunction qenv\r\n eval (command qenv --shell-eval $argv)\r\nend\r\n# end qenv`,\r\n pwsh: `\r\n# qenv shell integration\r\nfunction qenv { $result = & qenv.cmd --shell-eval @args; if ($result) { Invoke-Expression $result } }\r\n# end qenv`,\r\n cmd: '',\r\n};\r\n\r\n/** Markers for identifying qenv wrapper in config files */\r\nconst WRAPPER_START = '# qenv shell integration';\r\nconst WRAPPER_END = '# end qenv';\r\n\r\n/**\r\n * Get the shell config file path.\r\n */\r\nfunction getConfigPath(shell: ShellType): string | null {\r\n const home = getHomeDir();\r\n if (!home) return null;\r\n\r\n if (shell === 'pwsh') {\r\n // PowerShell profile path\r\n const psProfile = process.env.PROFILE;\r\n if (psProfile) return psProfile;\r\n // Default PowerShell profile locations\r\n if (process.platform === 'win32') {\r\n return resolve(process.env.USERPROFILE || home, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1');\r\n }\r\n return resolve(home, '.config', 'powershell', 'Microsoft.PowerShell_profile.ps1');\r\n }\r\n\r\n if (shell === 'cmd') {\r\n return null;\r\n }\r\n\r\n const configPath = SHELL_CONFIGS[shell];\r\n return configPath ? configPath.replace('~', home) : null;\r\n}\r\n\r\nexport function registerInitCommand(program: Command): void {\r\n program\r\n .command('init')\r\n .description('Install shell integration for --local mode support')\r\n .option('--shell <type>', 'Specify shell type (bash/zsh/fish/pwsh)')\r\n .option('--print', 'Print wrapper code without installing')\r\n .option('--uninstall', 'Remove shell integration')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv init\r\n $ qenv init --shell zsh\r\n $ qenv init --print\r\n $ qenv init --uninstall\r\n`)\r\n .action(async (options: {\r\n shell?: string;\r\n print?: boolean;\r\n uninstall?: boolean;\r\n }) => {\r\n try {\r\n const shell = (options.shell as ShellType) || detectShell();\r\n\r\n if (shell === 'cmd') {\r\n logger.error('Command Prompt (cmd) does not support shell integration.');\r\n logger.info('Please use PowerShell instead.');\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const wrapperCode = WRAPPER_CODE[shell];\r\n if (!wrapperCode) {\r\n logger.error(`Shell \"${shell}\" is not supported.`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // --print mode\r\n if (options.print) {\r\n logger.info(`Add the following to your ${getShellName(shell)} config:\\n`);\r\n logger.plain(wrapperCode);\r\n return;\r\n }\r\n\r\n const configPath = getConfigPath(shell);\r\n if (!configPath) {\r\n logger.error('Could not determine shell config file path.');\r\n logger.info('Use --print to see the wrapper code and add it manually.');\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // --uninstall mode\r\n if (options.uninstall) {\r\n if (!existsSync(configPath)) {\r\n logger.info('Shell config file not found. Nothing to uninstall.');\r\n return;\r\n }\r\n\r\n let content = readFileSync(configPath, 'utf-8');\r\n const startIdx = content.indexOf(WRAPPER_START);\r\n const endIdx = content.indexOf(WRAPPER_END);\r\n\r\n if (startIdx === -1) {\r\n logger.info('qenv shell integration not found. Nothing to uninstall.');\r\n return;\r\n }\r\n\r\n const before = content.slice(0, startIdx).trimEnd();\r\n const after = content.slice(endIdx + WRAPPER_END.length).trimStart();\r\n content = before + (after ? '\\n' + after : '') + '\\n';\r\n\r\n writeFileSync(configPath, content, 'utf-8');\r\n logger.success(`Removed qenv integration from ${configPath}`);\r\n logger.info('Restart your shell to apply changes.');\r\n return;\r\n }\r\n\r\n // Install mode\r\n let content = '';\r\n if (existsSync(configPath)) {\r\n content = readFileSync(configPath, 'utf-8');\r\n\r\n // Check if already installed\r\n if (content.includes(WRAPPER_START)) {\r\n logger.info('qenv shell integration is already installed.');\r\n logger.info(`Config file: ${configPath}`);\r\n return;\r\n }\r\n }\r\n\r\n appendFileSync(configPath, '\\n' + wrapperCode.trim() + '\\n', 'utf-8');\r\n\r\n logger.success(`Installed qenv integration in ${configPath}`);\r\n logger.info(`Shell: ${getShellName(shell)}`);\r\n logger.info('Restart your shell or run:');\r\n if (shell === 'fish') {\r\n logger.plain(` source ${configPath}`);\r\n } else if (shell === 'pwsh') {\r\n logger.plain(` . $PROFILE`);\r\n } else {\r\n logger.plain(` source ${configPath}`);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport chalk from 'chalk';\r\nimport { getSystemDriver, getDotenvDriver } from '../drivers/index.js';\r\nimport { manifest } from '../manifest/index.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { parseDotEnvLine, serializeDotEnv } from '../utils/validator.js';\r\nimport { outputShellEval, outputNoOp } from '../shell/eval.js';\r\nimport { detectShell } from '../shell/detect.js';\r\n\r\nexport function registerImportCommand(program: Command, isShellEval: boolean): void {\r\n program\r\n .command('import <file>')\r\n .description('Import variables from a .env file')\r\n .option('--local', 'Import to current shell session (requires qenv init)')\r\n .option('--dry-run', 'Preview changes without applying')\r\n .option('--overwrite', 'Overwrite existing variables')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv import .env\r\n $ qenv import .env.prod --dry-run\r\n $ qenv import .env --local\r\n $ qenv import .env --overwrite\r\n`)\r\n .action(async (file: string, options: {\r\n local?: boolean;\r\n dryRun?: boolean;\r\n overwrite?: boolean;\r\n }) => {\r\n try {\r\n const filePath = resolve(process.cwd(), file);\r\n\r\n if (!existsSync(filePath)) {\r\n logger.error(`File not found: ${filePath}`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const content = readFileSync(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n const vars: Record<string, string> = {};\r\n\r\n for (const line of lines) {\r\n const parsed = parseDotEnvLine(line);\r\n if (parsed) {\r\n vars[parsed.key] = parsed.value;\r\n }\r\n }\r\n\r\n const entries = Object.entries(vars);\r\n if (entries.length === 0) {\r\n logger.info(`No variables found in ${file}`);\r\n return;\r\n }\r\n\r\n // --dry-run mode\r\n if (options.dryRun) {\r\n logger.info(`Preview of import from ${file}:\\n`);\r\n for (const [key, value] of entries) {\r\n logger.plain(` ${chalk.green('+')} ${key}=${value}`);\r\n }\r\n logger.plain(`\\n Total: ${entries.length} variable${entries.length > 1 ? 's' : ''}`);\r\n return;\r\n }\r\n\r\n // --local mode\r\n if (options.local) {\r\n if (isShellEval) {\r\n const shell = detectShell();\r\n const evalParts: string[] = [];\r\n for (const [key, value] of entries) {\r\n const expressions: Record<string, string> = {\r\n bash: `export ${key}=\"${value}\"`,\r\n zsh: `export ${key}=\"${value}\"`,\r\n fish: `set -gx ${key} \"${value}\"`,\r\n pwsh: `$env:${key} = \"${value}\"`,\r\n cmd: `set \"${key}=${value}\"`,\r\n };\r\n evalParts.push(expressions[shell] || expressions['bash']);\r\n }\r\n const separator = shell === 'fish' ? '; ' : '; ';\r\n process.stdout.write(evalParts.join(separator));\r\n } else {\r\n logger.warn('--local requires qenv init. Run `qenv init` first.');\r\n }\r\n return;\r\n }\r\n\r\n // System import\r\n const driver = getSystemDriver();\r\n let imported = 0;\r\n let skipped = 0;\r\n\r\n for (const [key, value] of entries) {\r\n if (!options.overwrite) {\r\n const existing = await driver.get(key);\r\n if (existing !== undefined) {\r\n logger.warn(`Skipped ${key} (already exists). Use --overwrite to replace.`);\r\n skipped++;\r\n continue;\r\n }\r\n }\r\n\r\n await driver.set(key, value);\r\n manifest.set(key, 'system');\r\n imported++;\r\n }\r\n\r\n if (isShellEval) {\r\n outputNoOp();\r\n } else {\r\n logger.success(`Imported ${imported} variable${imported > 1 ? 's' : ''} from ${file}`);\r\n if (skipped > 0) {\r\n logger.info(`Skipped ${skipped} existing variable${skipped > 1 ? 's' : ''}.`);\r\n }\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n\r\nexport function registerExportCommand(program: Command): void {\r\n program\r\n .command('export [file]')\r\n .description('Export variables to .env format')\r\n .option('--all', 'Export all system environment variables')\r\n .option('--filter <prefix>', 'Only export variables matching prefix')\r\n .addHelpText('after', `\r\nExamples:\r\n $ qenv export\r\n $ qenv export .env.backup\r\n $ qenv export --all\r\n $ qenv export --filter REACT_APP_\r\n`)\r\n .action(async (file: string | undefined, options: {\r\n all?: boolean;\r\n filter?: string;\r\n }) => {\r\n try {\r\n let vars: Record<string, string> = {};\r\n\r\n if (options.all) {\r\n // Export all system env vars\r\n const driver = getSystemDriver();\r\n vars = await driver.list();\r\n } else {\r\n // Export manifest-tracked variables\r\n const manifestVars = manifest.getAll();\r\n const driver = getSystemDriver();\r\n\r\n for (const [name, entry] of Object.entries(manifestVars)) {\r\n let value: string | undefined;\r\n if (entry.scope === 'file' && entry.filePath) {\r\n const fileDriver = getDotenvDriver(entry.filePath);\r\n value = await fileDriver.get(name);\r\n } else {\r\n value = await driver.get(name);\r\n }\r\n if (value !== undefined) {\r\n vars[name] = value;\r\n }\r\n }\r\n }\r\n\r\n // Apply filter if specified\r\n if (options.filter) {\r\n const prefix = options.filter;\r\n const filtered: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (key.startsWith(prefix)) {\r\n filtered[key] = value;\r\n }\r\n }\r\n vars = filtered;\r\n }\r\n\r\n const entries = Object.entries(vars);\r\n if (entries.length === 0) {\r\n logger.info('No variables to export.');\r\n return;\r\n }\r\n\r\n const output = serializeDotEnv(vars);\r\n\r\n if (file) {\r\n const outPath = resolve(process.cwd(), file);\r\n writeFileSync(outPath, output + '\\n', 'utf-8');\r\n logger.success(`Exported ${entries.length} variable${entries.length > 1 ? 's' : ''} to ${file}`);\r\n } else {\r\n // Output to stdout\r\n logger.plain(output);\r\n }\r\n } catch (err: any) {\r\n logger.error(err.message || String(err));\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":["import_chalk","import_node_child_process","chalk","import_node_child_process","execSync","import_node_fs","Conf","driver","resolve","driver","validation","import_chalk","driver","vars","entries","chalk","import_chalk","import_node_readline","confirm","resolve","chalk","import_node_fs","import_node_path","content","import_node_fs","import_node_path","import_chalk","chalk","prefix","chalk"]}
|