feat: manage claude settings.json via chezmoi modify_ script - #861
Conversation
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 20 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (8)
📝 WalkthroughWalkthroughAdds a new chezmoi template file defining default Claude settings (model, permissions, sandboxing, status line, worktree config) and a modify-template that merges stdin-provided overrides with these defaults using mergeOverwrite, outputting pretty-printed JSON. ChangesClaude settings configuration
Estimated code review effort: 2 (Simple) | ~10 minutes Sequence Diagram(s)sequenceDiagram
participant Chezmoi
participant ModifySettings as modify_settings.json
participant ClaudeSettings as claude-settings.json
Chezmoi->>ModifySettings: apply .chezmoi.stdin
ModifySettings->>ModifySettings: parse stdin JSON if non-empty
ModifySettings->>ClaudeSettings: load default settings template
ModifySettings->>ModifySettings: mergeOverwrite(defaults, stdin overrides)
ModifySettings-->>Chezmoi: output merged pretty JSON
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
✅
|
| Descriptor | Linter | Files | Fixed | Errors | Warnings | Elapsed time |
|---|---|---|---|---|---|---|
| ✅ BASH | shfmt | 3 | 0 | 0 | 0 | 0.01s |
| prettier | 8 | 0 | 1 | 0 | 0.44s | |
| markdownlint | 6 | 0 | 2 | 0 | 0.51s | |
| ✅ MARKDOWN | markdown-table-formatter | 6 | 0 | 0 | 0 | 0.14s |
| ✅ YAML | prettier | 10 | 0 | 0 | 0 | 0.45s |
Detailed Issues
⚠️ MARKDOWN / markdownlint - 2 errors
chezmoi/private_dot_claude/modify_CLAUDE.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "{{- /*chezmoi:modify-template*..."]
chezmoi/private_dot_config/opencode/modify_AGENTS.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "{{- /*chezmoi:modify-template*..."]
⚠️ JSON / prettier - 1 error
chezmoi/.chezmoitemplates/claude-settings.json 62ms (unchanged)
chezmoi/.chezmoitemplates/opencode-tui.json 2ms (unchanged)
chezmoi/.chezmoitemplates/opencode.json 4ms (unchanged)
[error] chezmoi/private_dot_claude/modify_settings.json: SyntaxError: Unexpected token (1:2)
[error] > 1 | {{- /* chezmoi:modify-template */ -}}
[error] | ^
[error] 2 | {{- $current := dict -}}
[error] 3 | {{- if .chezmoi.stdin | trim -}}
[error] 4 | {{- $current = fromJson .chezmoi.stdin -}}
chezmoi/private_dot_config/mcp/mcp_servers.json 4ms (unchanged)
[error] chezmoi/private_dot_config/opencode/modify_opencode.json: SyntaxError: Unexpected token (1:2)
[error] > 1 | {{- /* chezmoi:modify-template */ -}}
[error] | ^
[error] 2 | {{- $current := dict -}}
[error] 3 | {{- if .chezmoi.stdin | trim -}}
[error] 4 | {{- $current = fromJson .chezmoi.stdin -}}
[error] chezmoi/private_dot_config/opencode/modify_tui.json: SyntaxError: Unexpected token (1:2)
[error] > 1 | {{- /* chezmoi:modify-template */ -}}
[error] | ^
[error] 2 | {{- $current := dict -}}
[error] 3 | {{- if .chezmoi.stdin | trim -}}
[error] 4 | {{- $current = fromJson .chezmoi.stdin -}}
renovate.json 5ms (unchanged)
Notices
📣 MegaLinter 9.5.0 is out! Discover the new features and security recommendations in the release announcement. (Skip this info by defining SECURITY_SUGGESTIONS: false)
See detailed reports in MegaLinter artifacts
Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)
- Documentation: Custom Flavors
- Command:
npx mega-linter-runner@9.5.0 --custom-flavor-setup --custom-flavor-linters BASH_SHFMT,JSON_PRETTIER,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,YAML_PRETTIER

Show us your support by starring ⭐ the repository
There was a problem hiding this comment.
Code Review
This pull request introduces a template for Claude Code settings (claude-settings.json) along with a chezmoi modify template (modify_settings.json) to merge these settings. The review feedback suggests optimizing the status line command by removing npx to avoid performance overhead, adding a JSON schema for editor autocomplete, and removing trailing slashes from sandbox directory paths to ensure compatibility across different sandboxing backends.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
✅
|
| Descriptor | Linter | Files | Fixed | Errors | Warnings | Elapsed time |
|---|---|---|---|---|---|---|
| ✅ BASH | bash-exec | 3 | 0 | 0 | 0.01s | |
| ✅ BASH | shellcheck | 3 | 0 | 0 | 0.13s | |
| ✅ REPOSITORY | checkov | yes | no | no | 22.91s | |
| ✅ REPOSITORY | devskim | yes | no | no | 2.53s | |
| ✅ REPOSITORY | dustilock | yes | no | no | 0.09s | |
| ✅ REPOSITORY | gitleaks | yes | no | no | 1.41s | |
| ✅ REPOSITORY | grype | yes | no | no | 47.37s | |
| ✅ REPOSITORY | kingfisher | yes | no | no | 10.02s | |
| osv-scanner | yes | 1 | no | 0.2s | ||
| ✅ REPOSITORY | secretlint | yes | no | no | 1.73s | |
| ✅ REPOSITORY | syft | yes | no | no | 1.75s | |
| ✅ REPOSITORY | trivy | yes | no | no | 9.8s | |
| ✅ REPOSITORY | trivy-sbom | yes | no | no | 0.16s | |
| ✅ REPOSITORY | trufflehog | yes | no | no | 4.51s |
Detailed Issues
⚠️ REPOSITORY / osv-scanner - 1 error
Scanning dir .
Starting filesystem walk for root: /
End status: 41 dirs visited, 139 inodes visited, 0 Extract calls, 8.013258ms elapsed, 8.013458ms wall time
No package sources found, --help for usage information.
Notices
📣 MegaLinter 9.5.0 is out! Discover the new features and security recommendations in the release announcement. (Skip this info by defining SECURITY_SUGGESTIONS: false)
See detailed reports in MegaLinter artifacts
Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)
- Documentation: Custom Flavors
- Command:
npx mega-linter-runner@9.5.0 --custom-flavor-setup --custom-flavor-linters BASH_EXEC,BASH_SHELLCHECK,REPOSITORY_CHECKOV,REPOSITORY_DEVSKIM,REPOSITORY_DUSTILOCK,REPOSITORY_GITLEAKS,REPOSITORY_GRYPE,REPOSITORY_OSV_SCANNER,REPOSITORY_SECRETLINT,REPOSITORY_SYFT,REPOSITORY_TRIVY,REPOSITORY_TRIVY_SBOM,REPOSITORY_TRUFFLEHOG,REPOSITORY_KINGFISHER

Show us your support by starring ⭐ the repository
✅
|
| Descriptor | Linter | Files | Fixed | Errors | Warnings | Elapsed time |
|---|---|---|---|---|---|---|
| ✅ ACTION | actionlint | 5 | 0 | 0 | 0.36s | |
| ✅ ACTION | zizmor | 5 | 0 | 0 | 0 | 0.84s |
| ✅ BASH | bash-exec | 3 | 0 | 0 | 0.01s | |
| ✅ BASH | shellcheck | 3 | 0 | 0 | 0.12s | |
| ✅ BASH | shfmt | 3 | 0 | 0 | 0 | 0.02s |
| ✅ COPYPASTE | jscpd | yes | no | no | 0.82s | |
| ✅ EDITORCONFIG | editorconfig-checker | 67 | 0 | 0 | 0.06s | |
| prettier | 8 | 0 | 1 | 0 | 0.39s | |
| ✅ JSON | v8r | 8 | 0 | 0 | 3.54s | |
| markdownlint | 6 | 0 | 2 | 0 | 0.7s | |
| ✅ MARKDOWN | markdown-table-formatter | 6 | 0 | 0 | 0 | 0.27s |
| ✅ REPOSITORY | checkov | yes | no | no | 23.09s | |
| ✅ REPOSITORY | gitleaks | yes | no | no | 1.08s | |
| ✅ REPOSITORY | git_diff | yes | no | no | 0.04s | |
| ✅ REPOSITORY | grype | yes | no | no | 46.6s | |
| osv-scanner | yes | 1 | no | 0.18s | ||
| ✅ REPOSITORY | secretlint | yes | no | no | 1.29s | |
| ✅ REPOSITORY | syft | yes | no | no | 2.62s | |
| ✅ REPOSITORY | trivy | yes | no | no | 12.67s | |
| ✅ REPOSITORY | trivy-sbom | yes | no | no | 0.22s | |
| ✅ REPOSITORY | trufflehog | yes | no | no | 3.79s | |
| lychee | 24 | 2 | 0 | 0.9s | ||
| ✅ YAML | prettier | 10 | 0 | 0 | 0 | 0.54s |
| ✅ YAML | v8r | 10 | 0 | 0 | 7.47s | |
| ✅ YAML | yamllint | 10 | 0 | 0 | 0.56s |
Detailed Issues
⚠️ SPELL / lychee - 2 errors
📝 Summary
---------------------
🔍 Total...........21
🔗 Unique..........16
✅ Successful......19
⏳ Timeouts.........0
🔀 Redirected.......4
👻 Excluded.........0
❓ Unknown..........0
🚫 Errors...........2
⛔ Unsupported......2
Errors in chezmoi/.chezmoitemplates/opencode.json
[406] https://mcp.deepwiki.com/mcp (at 23:15) | Rejected status code: 406 Not Acceptable
Errors in chezmoi/private_dot_config/mcp/mcp_servers.json
[406] https://mcp.deepwiki.com/mcp (at 11:15) | Rejected status code: 406 Not Acceptable
Hint: Followed 4 redirects. You might want to consider replacing redirecting URLs with the resolved URLs. Use verbose mode (`-v`/`-vv`) to see redirection details.
Hint: You can configure accepted/rejected response codes with `-a` or `--accept`
⚠️ MARKDOWN / markdownlint - 2 errors
chezmoi/private_dot_claude/modify_CLAUDE.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "{{- /*chezmoi:modify-template*..."]
chezmoi/private_dot_config/opencode/modify_AGENTS.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "{{- /*chezmoi:modify-template*..."]
⚠️ REPOSITORY / osv-scanner - 1 error
Scanning dir .
Starting filesystem walk for root: /
End status: 41 dirs visited, 139 inodes visited, 0 Extract calls, 3.385496ms elapsed, 3.385706ms wall time
No package sources found, --help for usage information.
⚠️ JSON / prettier - 1 error
chezmoi/.chezmoitemplates/claude-settings.json 56ms (unchanged)
chezmoi/.chezmoitemplates/opencode-tui.json 3ms (unchanged)
chezmoi/.chezmoitemplates/opencode.json 6ms (unchanged)
[error] chezmoi/private_dot_claude/modify_settings.json: SyntaxError: Unexpected token (1:2)
[error] > 1 | {{- /* chezmoi:modify-template */ -}}
[error] | ^
[error] 2 | {{- $current := dict -}}
[error] 3 | {{- if .chezmoi.stdin | trim -}}
[error] 4 | {{- $current = fromJson .chezmoi.stdin -}}
chezmoi/private_dot_config/mcp/mcp_servers.json 3ms (unchanged)
[error] chezmoi/private_dot_config/opencode/modify_opencode.json: SyntaxError: Unexpected token (1:2)
[error] > 1 | {{- /* chezmoi:modify-template */ -}}
[error] | ^
[error] 2 | {{- $current := dict -}}
[error] 3 | {{- if .chezmoi.stdin | trim -}}
[error] 4 | {{- $current = fromJson .chezmoi.stdin -}}
[error] chezmoi/private_dot_config/opencode/modify_tui.json: SyntaxError: Unexpected token (1:2)
[error] > 1 | {{- /* chezmoi:modify-template */ -}}
[error] | ^
[error] 2 | {{- $current := dict -}}
[error] 3 | {{- if .chezmoi.stdin | trim -}}
[error] 4 | {{- $current = fromJson .chezmoi.stdin -}}
renovate.json 8ms (unchanged)
Notices
📣 MegaLinter 9.5.0 is out! Discover the new features and security recommendations in the release announcement. (Skip this info by defining SECURITY_SUGGESTIONS: false)
See detailed reports in MegaLinter artifacts
Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)
- Documentation: Custom Flavors
- Command:
npx mega-linter-runner@9.5.0 --custom-flavor-setup --custom-flavor-linters ACTION_ACTIONLINT,ACTION_ZIZMOR,BASH_EXEC,BASH_SHELLCHECK,BASH_SHFMT,COPYPASTE_JSCPD,EDITORCONFIG_EDITORCONFIG_CHECKER,JSON_V8R,JSON_PRETTIER,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,REPOSITORY_CHECKOV,REPOSITORY_GIT_DIFF,REPOSITORY_GITLEAKS,REPOSITORY_GRYPE,REPOSITORY_OSV_SCANNER,REPOSITORY_SECRETLINT,REPOSITORY_SYFT,REPOSITORY_TRIVY,REPOSITORY_TRIVY_SBOM,REPOSITORY_TRUFFLEHOG,SPELL_LYCHEE,YAML_PRETTIER,YAML_YAMLLINT,YAML_V8R

Show us your support by starring ⭐ the repository
- add json schema reference for editor autocomplete - replace npx invocation with direct context-mode command - remove trailing slashes from sandbox allowWrite paths Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
context-mode is not installed globally, only available via npx Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request configures Claude Code and Opencode settings, including agent plugins, skills, and custom templates. The feedback highlights a critical issue where AWS Bedrock model IDs in the Claude settings need to be prefixed with anthropic. or us.anthropic. instead of bedrock. to prevent resolution errors. Additionally, it is recommended to add checks for the existence of npm and npx in the setup scripts to avoid execution failures on systems where Node.js is not installed.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| fi | ||
|
|
||
| if ! command -v opencode >/dev/null; then | ||
| npm install --global opencode-ai |
Summary
chezmoi/.chezmoitemplates/claude-settings.jsonwith the desired Claude Code settings (model, fallback, env, permissions, sandbox, hooks, etc.) — credentials excluded since the repo is publicchezmoi/private_dot_claude/modify_settings.jsonusing the samemergeOverwritepattern asmodify_opencode.json, sochezmoi applydeep-merges the template over the live file without clobbering runtime-managed keys (enabledPlugins,extraKnownMarketplaces, credential env vars)Settings included
model,fallbackModel,modelOverrides(trimmed to active models with[1m]context)env(non-credential env vars: model IDs, OTEL config, feature flags)autoCompactEnabled,awaySummaryEnabled,fileCheckpointingEnabled,preferredNotifChannelpermissions(allow/ask lists,disableBypassPermissionsMode)sandbox(enabled, weaker network isolation, generalisedallowWritepaths)statusLine,worktreeTest plan
chezmoi diff ~/.claude/settings.json— should show no diff (or only credential fields)chezmoi apply— settings.json restored with correct values after wipe🤖 Generated with Claude Code
Summary by CodeRabbit