llm-config-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/bin/llm-config.d.ts +2 -0
  2. package/dist/bin/llm-config.js +4 -0
  3. package/dist/bin/llm-config.js.map +1 -0
  4. package/dist/cli/commands/clear.d.ts +2 -0
  5. package/dist/cli/commands/clear.js +39 -0
  6. package/dist/cli/commands/clear.js.map +1 -0
  7. package/dist/cli/commands/doctor.d.ts +2 -0
  8. package/dist/cli/commands/doctor.js +41 -0
  9. package/dist/cli/commands/doctor.js.map +1 -0
  10. package/dist/cli/commands/env-clean.d.ts +2 -0
  11. package/dist/cli/commands/env-clean.js +27 -0
  12. package/dist/cli/commands/env-clean.js.map +1 -0
  13. package/dist/cli/commands/get.d.ts +2 -0
  14. package/dist/cli/commands/get.js +26 -0
  15. package/dist/cli/commands/get.js.map +1 -0
  16. package/dist/cli/commands/init.d.ts +2 -0
  17. package/dist/cli/commands/init.js +44 -0
  18. package/dist/cli/commands/init.js.map +1 -0
  19. package/dist/cli/commands/restore.d.ts +2 -0
  20. package/dist/cli/commands/restore.js +25 -0
  21. package/dist/cli/commands/restore.js.map +1 -0
  22. package/dist/cli/commands/set.d.ts +2 -0
  23. package/dist/cli/commands/set.js +38 -0
  24. package/dist/cli/commands/set.js.map +1 -0
  25. package/dist/cli/index.d.ts +1 -0
  26. package/dist/cli/index.js +24 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/core/change-plan.d.ts +10 -0
  29. package/dist/core/change-plan.js +73 -0
  30. package/dist/core/change-plan.js.map +1 -0
  31. package/dist/core/paths.d.ts +7 -0
  32. package/dist/core/paths.js +21 -0
  33. package/dist/core/paths.js.map +1 -0
  34. package/dist/core/redact.d.ts +1 -0
  35. package/dist/core/redact.js +10 -0
  36. package/dist/core/redact.js.map +1 -0
  37. package/dist/core/types.d.ts +72 -0
  38. package/dist/core/types.js +2 -0
  39. package/dist/core/types.js.map +1 -0
  40. package/dist/fs/atomic.d.ts +1 -0
  41. package/dist/fs/atomic.js +10 -0
  42. package/dist/fs/atomic.js.map +1 -0
  43. package/dist/fs/backup.d.ts +1 -0
  44. package/dist/fs/backup.js +16 -0
  45. package/dist/fs/backup.js.map +1 -0
  46. package/dist/providers/base.d.ts +17 -0
  47. package/dist/providers/base.js +2 -0
  48. package/dist/providers/base.js.map +1 -0
  49. package/dist/providers/claude-code.d.ts +2 -0
  50. package/dist/providers/claude-code.js +118 -0
  51. package/dist/providers/claude-code.js.map +1 -0
  52. package/dist/providers/codex.d.ts +2 -0
  53. package/dist/providers/codex.js +215 -0
  54. package/dist/providers/codex.js.map +1 -0
  55. package/dist/providers/openclaw.d.ts +2 -0
  56. package/dist/providers/openclaw.js +215 -0
  57. package/dist/providers/openclaw.js.map +1 -0
  58. package/dist/providers/registry.d.ts +5 -0
  59. package/dist/providers/registry.js +19 -0
  60. package/dist/providers/registry.js.map +1 -0
  61. package/dist/shells/cleanup.d.ts +6 -0
  62. package/dist/shells/cleanup.js +42 -0
  63. package/dist/shells/cleanup.js.map +1 -0
  64. package/dist/shells/discovery.d.ts +4 -0
  65. package/dist/shells/discovery.js +19 -0
  66. package/dist/shells/discovery.js.map +1 -0
  67. package/dist/shells/managed-blocks.d.ts +10 -0
  68. package/dist/shells/managed-blocks.js +80 -0
  69. package/dist/shells/managed-blocks.js.map +1 -0
  70. package/dist/tests/provider-registry.test.d.ts +1 -0
  71. package/dist/tests/provider-registry.test.js +24 -0
  72. package/dist/tests/provider-registry.test.js.map +1 -0
  73. package/dist/tests/restore.test.d.ts +1 -0
  74. package/dist/tests/restore.test.js +95 -0
  75. package/dist/tests/restore.test.js.map +1 -0
  76. package/dist/tests/shell-cleanup.test.d.ts +1 -0
  77. package/dist/tests/shell-cleanup.test.js +70 -0
  78. package/dist/tests/shell-cleanup.test.js.map +1 -0
  79. package/package.json +35 -0
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from '../cli/index.js';
3
+ void runCli(process.argv);
4
+ //# sourceMappingURL=llm-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-config.js","sourceRoot":"","sources":["../../src/bin/llm-config.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerClearCommand(program: Command): void;
@@ -0,0 +1,39 @@
1
+ import { executePlan, renderPlan } from '../../core/change-plan.js';
2
+ import { planShellCleanup } from '../../shells/cleanup.js';
3
+ import { getProvider } from '../../providers/registry.js';
4
+ export function registerClearCommand(program) {
5
+ program
6
+ .command('clear')
7
+ .description('Clear provider configuration')
8
+ .argument('<provider>', 'Provider name')
9
+ .option('--dry-run', 'Preview without writing files')
10
+ .option('--backup', 'Create backup before writing')
11
+ .option('--shell-file <path>', 'Shell file for fallback env management')
12
+ .option('--home-dir <path>', 'Override HOME for provider discovery')
13
+ .option('--env', 'Also clear managed environment block entries for this provider')
14
+ .action(async (providerInput, options) => {
15
+ const provider = getProvider(providerInput);
16
+ const plan = await provider.planClear({
17
+ shellFile: options.shellFile,
18
+ homeDir: options.homeDir,
19
+ backup: options.backup,
20
+ });
21
+ console.log(renderPlan(plan));
22
+ for (const line of await executePlan(plan, options)) {
23
+ console.log(line);
24
+ }
25
+ if (options.env) {
26
+ const current = await provider.readCurrent({ shellFile: options.shellFile, homeDir: options.homeDir });
27
+ const envPlan = await planShellCleanup({
28
+ shellFile: options.shellFile ?? current.state.fallbackTarget?.shellFile,
29
+ provider: provider.id,
30
+ backup: options.backup,
31
+ });
32
+ console.log(renderPlan(envPlan));
33
+ for (const line of await executePlan(envPlan, options)) {
34
+ console.log(line);
35
+ }
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=clear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/cli/commands/clear.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;SACnE,MAAM,CAAC,OAAO,EAAE,gEAAgE,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,aAAqB,EAAE,OAMrC,EAAE,EAAE;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACvG,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC;gBACrC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS;gBACvE,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command): void;
@@ -0,0 +1,41 @@
1
+ import pc from 'picocolors';
2
+ import { redactSecret } from '../../core/redact.js';
3
+ import { getProvider, listProviders } from '../../providers/registry.js';
4
+ async function printDoctor(providerInput, shellFile, homeDir) {
5
+ const provider = getProvider(providerInput);
6
+ const result = await provider.doctor({ shellFile, homeDir });
7
+ console.log(pc.bold(provider.displayName));
8
+ console.log(`Supported: ${result.supported ? 'yes' : 'no'}`);
9
+ console.log(`Confidence: ${result.target.confidence}`);
10
+ console.log(`Active source: ${result.state.activeSource}`);
11
+ console.log(`Active target: ${result.state.activeTarget?.path ?? '(none)'}`);
12
+ console.log(`Official target detected: ${result.state.officialTargetDetected ? 'yes' : 'no'}`);
13
+ console.log(`Official target: ${result.state.officialTarget?.path ?? '(not detected)'}`);
14
+ console.log(`Fallback target: ${result.state.fallbackTarget?.path ?? '(not available)'}`);
15
+ console.log(`Fallback override active: ${result.state.fallbackOverrideActive ? 'yes' : 'no'}`);
16
+ console.log(`Can restore official: ${result.state.canRestoreOfficial ? 'yes' : 'no'}`);
17
+ console.log(`API key: ${redactSecret(result.values.apiKey)}`);
18
+ console.log(`Base URL: ${result.values.baseUrl ?? '(not set)'}`);
19
+ for (const message of result.messages) {
20
+ console.log(`- ${message}`);
21
+ }
22
+ }
23
+ export function registerDoctorCommand(program) {
24
+ program
25
+ .command('doctor')
26
+ .description('Inspect provider support and configuration targets')
27
+ .argument('[provider]', 'Provider name')
28
+ .option('--shell-file <path>', 'Shell file for fallback env management')
29
+ .option('--home-dir <path>', 'Override HOME for provider discovery')
30
+ .action(async (providerInput, options) => {
31
+ if (providerInput) {
32
+ await printDoctor(providerInput, options.shellFile, options.homeDir);
33
+ return;
34
+ }
35
+ for (const provider of listProviders()) {
36
+ await printDoctor(provider.id, options.shellFile, options.homeDir);
37
+ console.log('');
38
+ }
39
+ });
40
+ }
41
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerEnvCleanCommand(program: Command): void;
@@ -0,0 +1,27 @@
1
+ import { executePlan, renderPlan } from '../../core/change-plan.js';
2
+ import { discoverShellFiles } from '../../shells/discovery.js';
3
+ import { planShellCleanup } from '../../shells/cleanup.js';
4
+ export function registerEnvCleanCommand(program) {
5
+ const env = program.command('env').description('Managed environment block commands');
6
+ env
7
+ .command('clean')
8
+ .description('Remove managed environment variables only')
9
+ .option('--provider <name>', 'Limit cleanup to one provider')
10
+ .option('--dry-run', 'Preview without writing files')
11
+ .option('--backup', 'Create backup before writing')
12
+ .option('--shell-file <path>', 'Shell file to clean')
13
+ .option('--home-dir <path>', 'Override HOME for shell discovery')
14
+ .action(async (options) => {
15
+ const [shellFile] = await discoverShellFiles({ preferred: options.shellFile, homeDir: options.homeDir });
16
+ const plan = await planShellCleanup({
17
+ shellFile,
18
+ provider: options.provider,
19
+ backup: options.backup,
20
+ });
21
+ console.log(renderPlan(plan));
22
+ for (const line of await executePlan(plan, options)) {
23
+ console.log(line);
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=env-clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-clean.js","sourceRoot":"","sources":["../../../src/cli/commands/env-clean.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAErF,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;SAC5D,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SACpD,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAMd,EAAE,EAAE;QACH,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACzG,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;YAClC,SAAS;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerGetCommand(program: Command): void;
@@ -0,0 +1,26 @@
1
+ import pc from 'picocolors';
2
+ import { redactSecret } from '../../core/redact.js';
3
+ import { getProvider } from '../../providers/registry.js';
4
+ export function registerGetCommand(program) {
5
+ program
6
+ .command('get')
7
+ .description('Show current provider configuration')
8
+ .argument('<provider>', 'Provider name')
9
+ .option('--shell-file <path>', 'Shell file for fallback env management')
10
+ .option('--home-dir <path>', 'Override HOME for provider discovery')
11
+ .action(async (providerInput, options) => {
12
+ const provider = getProvider(providerInput);
13
+ const result = await provider.readCurrent({ shellFile: options.shellFile, homeDir: options.homeDir });
14
+ console.log(pc.bold(`${provider.displayName}`));
15
+ console.log(`Active source: ${result.state.activeSource}`);
16
+ console.log(`Confidence: ${result.target.confidence}`);
17
+ console.log(`Active target: ${result.state.activeTarget?.path ?? '(none)'}`);
18
+ console.log(`Official target: ${result.state.officialTarget?.path ?? '(not detected)'}`);
19
+ console.log(`Fallback target: ${result.state.fallbackTarget?.path ?? '(not available)'}`);
20
+ console.log(`Fallback override active: ${result.state.fallbackOverrideActive ? 'yes' : 'no'}`);
21
+ console.log(`Can restore official: ${result.state.canRestoreOfficial ? 'yes' : 'no'}`);
22
+ console.log(`API key: ${redactSecret(result.values.apiKey)}`);
23
+ console.log(`Base URL: ${result.values.baseUrl ?? '(not set)'}`);
24
+ });
25
+ }
26
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/cli/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,aAAqB,EAAE,OAAiD,EAAE,EAAE;QACzF,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,IAAI,gBAAgB,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,IAAI,iBAAiB,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,44 @@
1
+ import { input, password, select } from '@inquirer/prompts';
2
+ import { executePlan, renderPlan } from '../../core/change-plan.js';
3
+ import { getProvider } from '../../providers/registry.js';
4
+ export function registerInitCommand(program) {
5
+ program
6
+ .command('init')
7
+ .description('Interactively initialize provider configuration')
8
+ .option('--dry-run', 'Preview without writing files')
9
+ .option('--backup', 'Create backup before writing')
10
+ .option('--shell-file <path>', 'Shell file for fallback env management')
11
+ .option('--home-dir <path>', 'Override HOME for provider discovery')
12
+ .action(async (options) => {
13
+ const providerName = await select({
14
+ message: 'Choose a provider',
15
+ choices: [
16
+ { name: 'Claude Code', value: 'claude-code' },
17
+ { name: 'Codex', value: 'codex' },
18
+ { name: 'OpenClaw', value: 'openclaw' },
19
+ ],
20
+ });
21
+ const apiKey = await password({ message: 'API key', mask: '*' });
22
+ const baseUrl = await input({ message: 'Base URL (optional)' });
23
+ const provider = getProvider(providerName);
24
+ const doctor = await provider.doctor({ shellFile: options.shellFile, homeDir: options.homeDir });
25
+ if (doctor.state.officialTargetDetected && provider.id !== 'claude-code') {
26
+ console.log(`Detected official target at ${doctor.state.officialTarget?.path}; init will write a managed fallback override instead of changing the official config.`);
27
+ }
28
+ const plan = await provider.planSet({
29
+ values: {
30
+ apiKey: apiKey || undefined,
31
+ baseUrl: baseUrl || undefined,
32
+ },
33
+ shellFile: options.shellFile,
34
+ homeDir: options.homeDir,
35
+ backup: options.backup,
36
+ });
37
+ console.log(renderPlan(plan));
38
+ const outputs = await executePlan(plan, options);
39
+ for (const line of outputs) {
40
+ console.log(line);
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,OAAqF,EAAE,EAAE;QACtG,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC;YAChC,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;gBAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;gBACjC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;aACxC;SACF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,IAAI,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,QAAQ,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,wFAAwF,CAAC,CAAC;QACxK,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YAClC,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,IAAI,SAAS;gBAC3B,OAAO,EAAE,OAAO,IAAI,SAAS;aAC9B;YACD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerRestoreCommand(program: Command): void;
@@ -0,0 +1,25 @@
1
+ import { executePlan, renderPlan } from '../../core/change-plan.js';
2
+ import { getProvider } from '../../providers/registry.js';
3
+ export function registerRestoreCommand(program) {
4
+ program
5
+ .command('restore')
6
+ .description('Restore provider behavior back to detected official configuration when possible')
7
+ .argument('<provider>', 'Provider name')
8
+ .option('--dry-run', 'Preview without writing files')
9
+ .option('--backup', 'Create backup before writing')
10
+ .option('--shell-file <path>', 'Shell file for fallback env management')
11
+ .option('--home-dir <path>', 'Override HOME for provider discovery')
12
+ .action(async (providerInput, options) => {
13
+ const provider = getProvider(providerInput);
14
+ const plan = await provider.planRestoreOfficial({
15
+ shellFile: options.shellFile,
16
+ homeDir: options.homeDir,
17
+ backup: options.backup,
18
+ });
19
+ console.log(renderPlan(plan));
20
+ for (const line of await executePlan(plan, options)) {
21
+ console.log(line);
22
+ }
23
+ });
24
+ }
25
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/cli/commands/restore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iFAAiF,CAAC;SAC9F,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,aAAqB,EAAE,OAKrC,EAAE,EAAE;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC;YAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSetCommand(program: Command): void;
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { executePlan, renderPlan } from '../../core/change-plan.js';
3
+ import { getProvider } from '../../providers/registry.js';
4
+ const argsSchema = z.object({
5
+ apiKey: z.string().optional(),
6
+ baseUrl: z.string().url().optional(),
7
+ });
8
+ export function registerSetCommand(program) {
9
+ program
10
+ .command('set')
11
+ .description('Set provider configuration')
12
+ .argument('<provider>', 'Provider name')
13
+ .option('--api-key <value>', 'API key')
14
+ .option('--base-url <url>', 'Base URL')
15
+ .option('--dry-run', 'Preview without writing files')
16
+ .option('--backup', 'Create backup before writing')
17
+ .option('--shell-file <path>', 'Shell file for fallback env management')
18
+ .option('--home-dir <path>', 'Override HOME for provider discovery')
19
+ .action(async (providerInput, options) => {
20
+ const provider = getProvider(providerInput);
21
+ const values = argsSchema.parse({
22
+ apiKey: options.apiKey,
23
+ baseUrl: options.baseUrl,
24
+ });
25
+ const plan = await provider.planSet({
26
+ values,
27
+ shellFile: options.shellFile,
28
+ homeDir: options.homeDir,
29
+ backup: options.backup,
30
+ });
31
+ console.log(renderPlan(plan));
32
+ const outputs = await executePlan(plan, options);
33
+ for (const line of outputs) {
34
+ console.log(line);
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/cli/commands/set.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,mBAAmB,EAAE,SAAS,CAAC;SACtC,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC;SACtC,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,aAAqB,EAAE,OAOrC,EAAE,EAAE;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YAClC,MAAM;YACN,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runCli(argv: string[]): Promise<void>;
@@ -0,0 +1,24 @@
1
+ import { Command } from 'commander';
2
+ import { registerClearCommand } from './commands/clear.js';
3
+ import { registerDoctorCommand } from './commands/doctor.js';
4
+ import { registerEnvCleanCommand } from './commands/env-clean.js';
5
+ import { registerGetCommand } from './commands/get.js';
6
+ import { registerInitCommand } from './commands/init.js';
7
+ import { registerRestoreCommand } from './commands/restore.js';
8
+ import { registerSetCommand } from './commands/set.js';
9
+ export async function runCli(argv) {
10
+ const program = new Command();
11
+ program
12
+ .name('llm-config')
13
+ .description('Configure Claude Code, Codex, and OpenClaw API settings')
14
+ .version('0.1.0');
15
+ registerInitCommand(program);
16
+ registerSetCommand(program);
17
+ registerGetCommand(program);
18
+ registerClearCommand(program);
19
+ registerRestoreCommand(program);
20
+ registerDoctorCommand(program);
21
+ registerEnvCleanCommand(program);
22
+ await program.parseAsync(argv);
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,yDAAyD,CAAC;SACtE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ChangePlan, ExecutePlanOptions } from './types.js';
2
+ export declare function planFileWrite(args: {
3
+ path: string;
4
+ nextContent: string;
5
+ provider: ChangePlan['provider'];
6
+ summary: string;
7
+ backup?: boolean;
8
+ }): Promise<ChangePlan>;
9
+ export declare function renderPlan(plan: ChangePlan): string;
10
+ export declare function executePlan(plan: ChangePlan, options?: ExecutePlanOptions): Promise<string[]>;
@@ -0,0 +1,73 @@
1
+ import fs from 'node:fs/promises';
2
+ import pc from 'picocolors';
3
+ import { createBackup } from '../fs/backup.js';
4
+ import { writeFileAtomic } from '../fs/atomic.js';
5
+ async function readIfExists(filePath) {
6
+ try {
7
+ return await fs.readFile(filePath, 'utf8');
8
+ }
9
+ catch (error) {
10
+ if (error.code === 'ENOENT') {
11
+ return '';
12
+ }
13
+ throw error;
14
+ }
15
+ }
16
+ export async function planFileWrite(args) {
17
+ const before = await readIfExists(args.path);
18
+ return {
19
+ provider: args.provider,
20
+ summary: args.summary,
21
+ changes: [
22
+ {
23
+ type: 'write-file',
24
+ path: args.path,
25
+ before,
26
+ after: args.nextContent,
27
+ createIfMissing: true,
28
+ backup: args.backup,
29
+ },
30
+ ],
31
+ };
32
+ }
33
+ export function renderPlan(plan) {
34
+ const lines = [pc.bold(plan.summary)];
35
+ for (const change of plan.changes) {
36
+ if (change.type === 'notice') {
37
+ lines.push(`- ${change.message}`);
38
+ continue;
39
+ }
40
+ const status = change.before === '' ? 'create' : change.before === change.after ? 'keep' : 'update';
41
+ lines.push(`- ${status} ${change.path}`);
42
+ }
43
+ return lines.join('\n');
44
+ }
45
+ export async function executePlan(plan, options = {}) {
46
+ const outputs = [];
47
+ for (const change of plan.changes) {
48
+ if (change.type === 'notice') {
49
+ outputs.push(change.message);
50
+ continue;
51
+ }
52
+ outputs.push(await executeFileChange(change, options));
53
+ }
54
+ return outputs;
55
+ }
56
+ async function executeFileChange(change, options) {
57
+ if (change.before === change.after) {
58
+ return `No changes for ${change.path}`;
59
+ }
60
+ if (options.dryRun) {
61
+ return `Dry run: would write ${change.path}`;
62
+ }
63
+ if (options.backup ?? change.backup) {
64
+ const backupPath = await createBackup(change.path);
65
+ if (backupPath) {
66
+ await writeFileAtomic(change.path, change.after);
67
+ return `Updated ${change.path} (backup: ${backupPath})`;
68
+ }
69
+ }
70
+ await writeFileAtomic(change.path, change.after);
71
+ return `Updated ${change.path}`;
72
+ }
73
+ //# sourceMappingURL=change-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-plan.js","sourceRoot":"","sources":["../../src/core/change-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface PathOptions {
2
+ homeDir?: string;
3
+ }
4
+ export declare function getHomeDir(options?: PathOptions): string;
5
+ export declare function resolveInHome(relativePath: string, options?: PathOptions): string;
6
+ export declare function getClaudeSettingsPath(options?: PathOptions): string;
7
+ export declare function getCandidateShellFiles(options?: PathOptions): string[];
@@ -0,0 +1,21 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ export function getHomeDir(options = {}) {
4
+ return options.homeDir ?? os.homedir();
5
+ }
6
+ export function resolveInHome(relativePath, options = {}) {
7
+ return path.join(getHomeDir(options), relativePath);
8
+ }
9
+ export function getClaudeSettingsPath(options = {}) {
10
+ return resolveInHome('.claude/settings.json', options);
11
+ }
12
+ export function getCandidateShellFiles(options = {}) {
13
+ return [
14
+ '.zshrc',
15
+ '.zprofile',
16
+ '.bashrc',
17
+ '.bash_profile',
18
+ '.profile',
19
+ ].map((file) => resolveInHome(file, options));
20
+ }
21
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,UAAU,UAAU,CAAC,UAAuB,EAAE;IAClD,OAAO,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,UAAuB,EAAE;IAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAuB,EAAE;IAC7D,OAAO,aAAa,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAuB,EAAE;IAC9D,OAAO;QACL,QAAQ;QACR,WAAW;QACX,SAAS;QACT,eAAe;QACf,UAAU;KACX,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function redactSecret(value?: string): string;
@@ -0,0 +1,10 @@
1
+ export function redactSecret(value) {
2
+ if (!value) {
3
+ return '(not set)';
4
+ }
5
+ if (value.length <= 8) {
6
+ return '*'.repeat(value.length);
7
+ }
8
+ return `${value.slice(0, 4)}…${value.slice(-4)}`;
9
+ }
10
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/core/redact.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,72 @@
1
+ export type ProviderId = 'claude-code' | 'codex' | 'openclaw';
2
+ export type Confidence = 'official' | 'fallback';
3
+ export type ActiveConfigSource = 'official' | 'fallback' | 'none';
4
+ export type ConfigField = 'apiKey' | 'baseUrl';
5
+ export interface ProviderValues {
6
+ apiKey?: string;
7
+ baseUrl?: string;
8
+ }
9
+ export interface ManagedEnvEntry {
10
+ key: string;
11
+ value: string;
12
+ provider: ProviderId;
13
+ }
14
+ export interface ConfigTarget {
15
+ kind: 'json-env' | 'managed-shell-env';
16
+ confidence: Confidence;
17
+ path?: string;
18
+ shellFile?: string;
19
+ description: string;
20
+ }
21
+ export interface ProviderState {
22
+ officialTarget?: ConfigTarget;
23
+ fallbackTarget?: ConfigTarget;
24
+ activeTarget?: ConfigTarget;
25
+ activeSource: ActiveConfigSource;
26
+ officialTargetDetected: boolean;
27
+ fallbackOverrideActive: boolean;
28
+ canRestoreOfficial: boolean;
29
+ }
30
+ export interface ProviderReadResult {
31
+ provider: ProviderId;
32
+ target: ConfigTarget;
33
+ state: ProviderState;
34
+ values: ProviderValues;
35
+ found: boolean;
36
+ }
37
+ export interface ProviderDoctorResult {
38
+ provider: ProviderId;
39
+ supported: boolean;
40
+ target: ConfigTarget;
41
+ state: ProviderState;
42
+ messages: string[];
43
+ values: ProviderValues;
44
+ }
45
+ export interface PlannedFileChange {
46
+ type: 'write-file';
47
+ path: string;
48
+ before: string;
49
+ after: string;
50
+ createIfMissing?: boolean;
51
+ backup?: boolean;
52
+ }
53
+ export interface PlannedNotice {
54
+ type: 'notice';
55
+ message: string;
56
+ }
57
+ export type PlannedChange = PlannedFileChange | PlannedNotice;
58
+ export interface ChangePlan {
59
+ provider: ProviderId;
60
+ summary: string;
61
+ changes: PlannedChange[];
62
+ }
63
+ export interface ExecutePlanOptions {
64
+ dryRun?: boolean;
65
+ backup?: boolean;
66
+ }
67
+ export interface CommandFlags {
68
+ dryRun?: boolean;
69
+ backup?: boolean;
70
+ shellFile?: string;
71
+ homeDir?: string;
72
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare function writeFileAtomic(filePath: string, content: string): Promise<void>;
@@ -0,0 +1,10 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ export async function writeFileAtomic(filePath, content) {
5
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
6
+ const tempPath = `${filePath}.${randomUUID()}.tmp`;
7
+ await fs.writeFile(tempPath, content, 'utf8');
8
+ await fs.rename(tempPath, filePath);
9
+ }
10
+ //# sourceMappingURL=atomic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic.js","sourceRoot":"","sources":["../../src/fs/atomic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,UAAU,EAAE,MAAM,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function createBackup(filePath: string): Promise<string | undefined>;
@@ -0,0 +1,16 @@
1
+ import fs from 'node:fs/promises';
2
+ export async function createBackup(filePath) {
3
+ try {
4
+ const current = await fs.readFile(filePath, 'utf8');
5
+ const backupPath = `${filePath}.bak.${Date.now()}`;
6
+ await fs.writeFile(backupPath, current, 'utf8');
7
+ return backupPath;
8
+ }
9
+ catch (error) {
10
+ if (error.code === 'ENOENT') {
11
+ return undefined;
12
+ }
13
+ throw error;
14
+ }
15
+ }
16
+ //# sourceMappingURL=backup.js.map