Skip to content

refactor(config): Generate viper defaults via reflection over DefaultConfig()#436

Merged
edenreich merged 1 commit intomainfrom
refactor/viper-defaults-via-reflection
Apr 26, 2026
Merged

refactor(config): Generate viper defaults via reflection over DefaultConfig()#436
edenreich merged 1 commit intomainfrom
refactor/viper-defaults-via-reflection

Conversation

@edenreich
Copy link
Copy Markdown
Contributor

@edenreich edenreich commented Apr 26, 2026

Summary

  • The hand-maintained v.SetDefault block in initConfig() had drifted out of sync with config.DefaultConfig(), leaving 50 leaf paths and 28 fields silently returning zero values instead of their documented defaults. Affected: entire storage.*, client.retry.*, image.*, mcp.*, scm.* sections, plus init.prompt, chat.keybindings.bindings, tools.web_fetch.cache.*, tools.sandbox.*, most of tools.github.*, and conversation.title_generation.*.
  • Replace 240 lines of hand-written defaults with registerConfigDefaults() in cmd/defaults.go — a reflection walker over mapstructure tags. config.DefaultConfig() is now the single source of truth and additions to Config are picked up automatically.
  • Add two regression tests in cmd/root_defaults_test.go that guarantee viper stays in sync with DefaultConfig():
    • TestViperDefaultsCoverNonZeroConfigDefaults: every non-zero leaf in DefaultConfig() must appear in V.AllKeys() after initConfig().
    • TestViperUnmarshalReproducesDefaultConfig: round-tripping viper through Unmarshal must equal DefaultConfig() field-for-field.

Net diff: cmd/root.go shrank from ~440 to 204 lines; // nolint:funlen removed.

…Config()

The hand-maintained v.SetDefault block in initConfig() had drifted out of
sync with config.DefaultConfig(), leaving 50 leaf paths and 28 fields
(entire storage.*, client.retry.*, image.*, mcp.*, scm.* sections among
others) silently returning zero values instead of their documented
defaults. Replace it with a reflection-based registerConfigDefaults() that
walks any mapstructure-tagged struct, plus two regression tests that
guarantee viper stays in sync with DefaultConfig().
@edenreich edenreich merged commit 85c6e0a into main Apr 26, 2026
11 checks passed
@edenreich edenreich deleted the refactor/viper-defaults-via-reflection branch April 26, 2026 17:08
ig-semantic-release-bot Bot pushed a commit that referenced this pull request Apr 27, 2026
## [0.104.1](v0.104.0...v0.104.1) (2026-04-27)

### 🐛 Bug Fixes

* **ui:** Restore typing while agent is busy ([#455](#455)) ([92840d6](92840d6)), closes [#410](#410)
* **services:** Trigger auto-compact from gateway-reported tokens ([#454](#454)) ([1fc19dd](1fc19dd))
* **config:** Update model context windows and pricing for current model lineup ([#452](#452)) ([655f9f8](655f9f8))

### ♻️ Code Refactoring

* **config:** Centralize config loading and remove service indirection ([#443](#443)) ([babf173](babf173))
* **config:** Centralize sub-config definitions and consolidate prompts ([#448](#448)) ([9979ac7](9979ac7))
* Extract keybindings configuration to separate file ([#438](#438)) ([6d04195](6d04195))
* **config:** Generate viper defaults via reflection over DefaultConfig() ([#436](#436)) ([85c6e0a](85c6e0a))
* **config:** Make tool prompts configurable via prompts.yaml ([#450](#450)) ([9fc1bb5](9fc1bb5)), closes [#446](#446)
* Move channels to separate channels.yaml config ([#444](#444)) ([aa43e0e](aa43e0e)), closes [#441](#441)
* Move computer_use to a separate config ([#447](#447)) ([a762c64](a762c64)), closes [#444](#444)
* Move prompts to separate prompts.yaml config ([#442](#442)) ([45e4fb6](45e4fb6))
* **config:** Unify sub-configs behind CollectionConfig + utils.{Load,Save}YAML ([#445](#445)) ([aab481c](aab481c))

### 📚 Documentation

* Add directory-structure reference ([#451](#451)) ([95d26f8](95d26f8))

### 👷 CI/CD

* Reduce runs of nix ([acac364](acac364))

### 🧹 Maintenance

* **deps:** Bump modernc.org/sqlite from 1.49.1 to 1.50.0 ([#449](#449)) ([06a535d](06a535d))
* **nix:** Update package to v0.104.0 ([#432](#432)) ([5564697](5564697))
@ig-semantic-release-bot
Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.104.1 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant