Skip to content

feat: use --settings CLI param to override settings.json env conflicts - #85

Merged
guyskk merged 2 commits into
mainfrom
feat/settings-env-override
Jun 9, 2026
Merged

guyskk merged 2 commits into
mainfrom
feat/settings-env-override

Conversation

@guyskk

@guyskk guyskk commented Jun 9, 2026 •

Copy link
Copy Markdown
Owner

Summary

Replace the hard guard (refuse-to-start) approach with automatic override via Claude Code's --settings CLI parameter.

Key Discovery

--settings has "Command line arguments" priority (level 2), which is higher than User settings (level 5, ~/.claude/settings.json). The env from --settings merges with settings.json env, with same-name keys overridden by --settings, different keys preserved.

Empirical proof: docs/discuss-20260609-env-override.md

Changes

  • Remove checkSettingsEnvConflict() and checkValidateEnvConflict()
  • Remove FilterUserEnvForSettings(), DetectSettingsEnvConflicts(), FormatEnvConflictError() and env_guard.go
  • Add buildProviderSettingsJSON() to serialize provider env as --settings JSON with env var expansion
  • SwitchWithHook() now preserves user's complete env in settings.json
  • runClaude() passes provider env via --settings parameter

Behavior Change

Before After
settings.json env conflict → error and abort settings.json env conflict → --settings auto-override
settings.json conflicting keys filtered/deleted settings.json preserves user's complete env
User must manually clean settings.json User needs no action

Verification (7 scenarios, real claude 2.1.169 process)

  1. Conflict override: settings.json ANTHROPIC_BASE_URL overridden by --settings ✅
  2. Non-conflict preserve: settings.json CCC_TEST_CLAUDE_VAR preserved ✅
  3. ANTHROPIC_MODEL preserve: settings.json ANTHROPIC_MODEL preserved when provider has no such key ✅
  4. Mixed conflict+non-conflict: conflict key overridden, non-conflict key preserved ✅
  5. Multiple CLAUDE_/ANTHROPIC_ preserve: all preserved when provider has no such keys ✅
  6. Process env preserve: process env ANTHROPIC_* keys preserved ✅
  7. Full chain (simulated ccc): provider env overrides conflict keys, non-conflict keys preserved ✅

Testing

  • All 133 tests pass
  • Lint, test, build all pass via ./check.sh
  • New tests for buildProviderSettingsJSON() (nil, empty, single key, multiple keys, special chars, env var expansion)

guyskk added 2 commits June 9, 2026 11:39
Replace the hard guard (refuse-to-start) approach with automatic
override via Claude Code's --settings CLI parameter.

Key discovery: --settings has 'Command line arguments' priority
(level 2), which is higher than User settings (level 5,
~/.claude/settings.json). The env from --settings merges with
settings.json env, with same-name keys overridden by --settings.

Changes:
- Remove checkSettingsEnvConflict() and checkValidateEnvConflict()
- Remove FilterUserEnvForSettings(), DetectSettingsEnvConflicts(),
  FormatEnvConflictError() and env_guard.go
- Add buildProviderSettingsJSON() to serialize provider env as
  --settings JSON with env var expansion
- SwitchWithHook() now preserves user's complete env in settings.json
- runClaude() passes provider env via --settings parameter

Behavior change:
- Before: settings.json env conflict → error and abort
- After: settings.json env conflict → --settings auto-override

See docs/discuss-20260609-env-override.md for empirical proof.
@guyskk
guyskk merged commit dde884c into main Jun 9, 2026
3 checks passed
@guyskk
guyskk deleted the feat/settings-env-override branch June 9, 2026 06:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant