The legacy CLAUDE_CONFIG_DIR name was the only way to point openclaude
at a non-default config home, which leaked Anthropic branding for a
fork that has otherwise rebranded to OpenClaude. Add OPENCLAUDE_CONFIG_DIR
as the preferred name. CLAUDE_CONFIG_DIR continues to work for
backward compatibility; when both are set with different values,
OPENCLAUDE_CONFIG_DIR wins and a one-time warning is logged.
- src/utils/envUtils.ts: introduce resolveConfigDirEnv() that picks
OPENCLAUDE_CONFIG_DIR over CLAUDE_CONFIG_DIR and emits a conflict
warning. Memoize cache key now tracks both env vars so changing
either invalidates the cached result.
- src/utils/env.ts: getGlobalClaudeFile() previously read
CLAUDE_CONFIG_DIR directly, missing the new alias. Route through
resolveConfigDirEnv() so the global config file path follows the
same precedence.
- src/utils/secureStorage/macOsKeychainHelpers.ts: the "is default
dir" check used by keychain service-name scoping now considers
both env vars.
- src/utils/swarm/spawnUtils.ts: forward OPENCLAUDE_CONFIG_DIR to
teammate processes alongside the legacy var.
- src/utils/openclaudePaths.test.ts: +6 unit tests covering the new
alias, fallthrough, conflict warning, and resolveConfigDirEnv()
in isolation.
- .env.example: document both env vars and the precedence rule.
Verified locally on Linux: with only OPENCLAUDE_CONFIG_DIR set, with
only CLAUDE_CONFIG_DIR set (legacy still works), with both set
matching (silent), with both set conflicting (warn once + OPENCLAUDE
wins), with neither set (default ~/.openclaude). Memo cache
invalidates across 4 sequential env transitions. Built dist/cli.mjs
honors the new var and emits the conflict warning to the user.
* fix: OAuth tokens secure storage for Windows & Linux
* fix: OAuth tokens secure storage for Windows & Linux #215
* fix: OAuth tokens secure storage for Windows & Linux #215
* fix: OAuth tokens secure storage for Windows & Linux #215
Squash the current repository state back into one baseline commit while
preserving the README reframing and repository contents.
Constraint: User explicitly requested a single squashed commit with subject "asdf"
Confidence: high
Scope-risk: broad
Reversibility: clean
Directive: This commit intentionally rewrites published history; coordinate before future force-pushes
Tested: git status clean; local history rewritten to one commit; force-pushed main to origin and instructkr
Not-tested: Fresh clone verification after push