Repository navigation
feat: manage cmux and karabiner with nix #874
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 3 commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
2412b7c
feat: manage cmux and karabiner with nix
keito4 6a3133f
feat: manage cmux app settings with nix
keito4 d083ca1
feat: manage portable user dotfiles
keito4 e21659e
feat: add local config inventory agent command
keito4 11ecc5b
chore: sync macos cask app list
keito4 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| # Go configuration has been moved to dev container environments |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| export LDFLAGS="-L/opt/homebrew/opt/php@7.4/lib" | ||
| export CPPFLAGS="-I/opt/homebrew/opt/php@7.4/include" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| # Python/pyenv configuration has been moved to dev container environments |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| # ADR 0014: Manage cmux and Karabiner Configuration with Home Manager | ||
|
|
||
| ## Status | ||
|
|
||
| Accepted | ||
|
|
||
| ## Context | ||
|
|
||
| cmux and Karabiner are part of the local macOS development environment. They | ||
| affect terminal input behavior, especially Google Japanese Input shortcuts in | ||
| cmux and the Caps Lock to Control mapping. | ||
|
|
||
| These settings were previously applied directly under `~/.config/`, which made | ||
| them easy to lose during a machine rebuild and hard to review. ADR 0012 already | ||
| defines `nix/` as the source of truth for macOS packages and local environment | ||
| configuration. | ||
|
|
||
| ## Decision | ||
|
|
||
| Manage cmux and Karabiner user configuration through home-manager modules under | ||
| `nix/home/`. | ||
|
|
||
| - Install cmux through the nix-darwin Homebrew cask list. | ||
| - Keep Karabiner Elements and Google Japanese Input in the Homebrew cask list. | ||
| - Generate `~/.config/cmux/config` from home-manager and keep legacy terminal | ||
| keybind overrides empty so input-method shortcuts are not consumed by cmux. | ||
| - Generate `~/.config/cmux/cmux.json` from home-manager for app, automation, | ||
| notification, browser, sidebar, and terminal behavior that should be stable | ||
| across rebuilds. | ||
| - Generate `~/.config/ghostty/config` from home-manager for the terminal | ||
| rendering settings that cmux reads through Ghostty. | ||
| - Generate `~/.config/karabiner/karabiner.json` from home-manager. | ||
| - Keep the Karabiner virtual keyboard type as `jis` so Japanese-specific virtual | ||
| keys work. | ||
| - Explicitly map Caps Lock to left Control. | ||
| - Scope the cmux IME shortcut workaround to `com.cmuxterm.app` only: | ||
| - `Ctrl+Shift+J` sends the virtual Kana key. | ||
| - `Ctrl+Shift+;` and `Ctrl+Shift+'` send the virtual Eisuu key. | ||
|
|
||
| ## Consequences | ||
|
|
||
| `darwin-rebuild switch --flake ~/develop/github.com/keito4/config/nix` becomes | ||
| the source of truth for these local input settings. | ||
|
|
||
| Manual changes to `~/.config/cmux/config`, `~/.config/cmux/cmux.json`, | ||
| `~/.config/ghostty/config`, and `~/.config/karabiner/karabiner.json` will be | ||
| overwritten by home-manager. This is intentional so shortcut behavior and cmux | ||
| runtime behavior stay reproducible across machines. | ||
|
|
||
| The Karabiner workaround is app-scoped to avoid changing the same shortcuts in | ||
| other applications. |
57 changes: 57 additions & 0 deletions
57
docs/adr/0015-manage-portable-user-dotfiles-with-home-manager.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| # ADR 0015: Manage Portable User Dotfiles with Home Manager | ||
|
|
||
| ## Status | ||
|
|
||
| Accepted | ||
|
|
||
| ## Context | ||
|
|
||
| The macOS environment should be reproducible without using Apple's default | ||
| machine migration flow. ADR 0012 defines `nix/` as the source of truth for | ||
| macOS packages and local environment configuration, and ADR 0014 adds cmux and | ||
| Karabiner settings. | ||
|
|
||
| Several portable text configuration files still lived only in the user home | ||
| directory. These files affect daily shell behavior, local workflow tools, and | ||
| window management, so losing them during a rebuild would make a new machine feel | ||
| incomplete even if packages were installed. | ||
|
|
||
| Some home-directory files are not safe to manage in git because they contain | ||
| credentials, tokens, session state, app databases, histories, or | ||
| machine-specific runtime data. | ||
|
|
||
| ## Decision | ||
|
|
||
| Manage portable, non-secret user dotfiles through `nix/home/dotfiles.nix`. | ||
|
|
||
| - Source reusable zsh config fragments and functions from the repository. | ||
| - Source AeroSpace configuration from `dot/aerospace.toml`. | ||
| - Source small workflow-tool configs for act, Agent Deck, Graphite aliases, and | ||
| Codespaces secret repository selection. | ||
| - Source global git ignore and peco configuration from the repository. | ||
| - Use `force = true` for these files so home-manager can take ownership of | ||
| existing files during a rebuild. | ||
|
|
||
| Do not manage secret or stateful files in git. Specifically keep the following | ||
| outside this repository: | ||
|
|
||
| - SSH keys and `~/.ssh/config` | ||
| - cloud auth files under `~/.aws`, `~/.azure`, and `~/.config/gcloud` | ||
| - GitHub auth files such as `~/.config/gh/hosts.yml` | ||
| - token-bearing CLI configs such as Graphite `user_config` and npm auth config | ||
| - Claude/Codex auth, session, history, cache, and SQLite state | ||
| - application databases, browser profiles, and update caches | ||
|
|
||
| ## Consequences | ||
|
|
||
| `darwin-rebuild switch --flake ~/develop/github.com/keito4/config/nix` can | ||
| restore a larger portion of the user environment on a new machine without | ||
| copying the old machine's home directory. | ||
|
|
||
| Manual edits to managed dotfiles will be overwritten on the next home-manager | ||
| activation. Changes should be made in this repository first, then applied with | ||
| the Nix switch command. | ||
|
|
||
| Authentication and app state still require explicit sign-in or a separate | ||
| secrets/bootstrap process. This keeps the repository reviewable and avoids | ||
| encoding machine-specific runtime state as configuration. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,206 @@ | ||
| # Place a copy of this config to ~/.aerospace.toml | ||
| # After that, you can edit ~/.aerospace.toml to your liking | ||
|
|
||
| # You can use it to add commands that run after AeroSpace startup. | ||
| # Available commands : https://nikitabobko.github.io/AeroSpace/commands | ||
| after-startup-command = [] | ||
|
|
||
| # Start AeroSpace at login | ||
| start-at-login = false | ||
|
|
||
| # Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization | ||
| enable-normalization-flatten-containers = true | ||
| enable-normalization-opposite-orientation-for-nested-containers = true | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/guide#layouts | ||
| # The 'accordion-padding' specifies the size of accordion padding | ||
| # You can set 0 to disable the padding feature | ||
| accordion-padding = 30 | ||
|
|
||
| # Possible values: tiles|accordion | ||
| default-root-container-layout = 'tiles' | ||
|
|
||
| # Possible values: horizontal|vertical|auto | ||
| # 'auto' means: wide monitor (anything wider than high) gets horizontal orientation, | ||
| # tall monitor (anything higher than wide) gets vertical orientation | ||
| default-root-container-orientation = 'auto' | ||
|
|
||
| # Mouse follows focus when focused monitor changes | ||
| # Drop it from your config, if you don't like this behavior | ||
| # See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks | ||
| # See https://nikitabobko.github.io/AeroSpace/commands#move-mouse | ||
| # Fallback value (if you omit the key): on-focused-monitor-changed = [] | ||
| on-focused-monitor-changed = ['move-mouse monitor-lazy-center'] | ||
|
|
||
| # You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag | ||
| # Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key | ||
| # Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app | ||
| automatically-unhide-macos-hidden-apps = false | ||
|
|
||
| # Possible values: (qwerty|dvorak|colemak) | ||
| # See https://nikitabobko.github.io/AeroSpace/guide#key-mapping | ||
| [key-mapping] | ||
| preset = 'qwerty' | ||
|
|
||
| # Gaps between windows (inner-*) and between monitor edges (outer-*). | ||
| # Possible values: | ||
| # - Constant: gaps.outer.top = 8 | ||
| # - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24] | ||
| # In this example, 24 is a default value when there is no match. | ||
| # Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'. | ||
| # See: | ||
| # https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors | ||
| [gaps] | ||
| inner.horizontal = 0 | ||
| inner.vertical = 0 | ||
| outer.left = 0 | ||
| outer.bottom = 0 | ||
| outer.top = 0 | ||
| outer.right = 0 | ||
|
|
||
| # 'main' binding mode declaration | ||
| # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes | ||
| # 'main' binding mode must be always presented | ||
| # Fallback value (if you omit the key): mode.main.binding = {} | ||
| [mode.main.binding] | ||
|
|
||
| # All possible keys: | ||
| # - Letters. a, b, c, ..., z | ||
| # - Numbers. 0, 1, 2, ..., 9 | ||
| # - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9 | ||
| # - F-keys. f1, f2, ..., f20 | ||
| # - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, | ||
| # backtick, leftSquareBracket, rightSquareBracket, space, enter, esc, | ||
| # backspace, tab, pageUp, pageDown, home, end, forwardDelete, | ||
| # sectionSign (ISO keyboards only, european keyboards only) | ||
| # - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual, | ||
| # keypadMinus, keypadMultiply, keypadPlus | ||
| # - Arrows. left, down, up, right | ||
|
|
||
| # All possible modifiers: cmd, alt, ctrl, shift | ||
|
|
||
| # All possible commands: https://nikitabobko.github.io/AeroSpace/commands | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget | ||
| # You can uncomment the following lines to open up terminal with alt + enter shortcut | ||
| # (like in i3) | ||
| # alt-enter = '''exec-and-forget osascript -e ' | ||
| # tell application "Terminal" | ||
| # do script | ||
| # activate | ||
| # end tell' | ||
| # ''' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#layout | ||
| alt-slash = 'layout tiles horizontal vertical' | ||
| alt-comma = 'layout accordion horizontal vertical' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#focus | ||
| alt-h = 'focus left' | ||
| alt-j = 'focus down' | ||
| alt-k = 'focus up' | ||
| alt-l = 'focus right' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#move | ||
| alt-shift-h = 'move left' | ||
| alt-shift-j = 'move down' | ||
| alt-shift-k = 'move up' | ||
| alt-shift-l = 'move right' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#resize | ||
| alt-minus = 'resize smart -50' | ||
| alt-equal = 'resize smart +50' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#workspace | ||
| alt-1 = 'workspace 1' | ||
| alt-2 = 'workspace 2' | ||
| alt-3 = 'workspace 3' | ||
| alt-4 = 'workspace 4' | ||
| alt-5 = 'workspace 5' | ||
| alt-6 = 'workspace 6' | ||
| alt-7 = 'workspace 7' | ||
| alt-8 = 'workspace 8' | ||
| alt-9 = 'workspace 9' | ||
| alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need | ||
| alt-b = 'workspace B' | ||
| alt-c = 'workspace C' | ||
| alt-d = 'workspace D' | ||
| alt-e = 'workspace E' | ||
| alt-f = 'workspace F' | ||
| alt-g = 'workspace G' | ||
| alt-i = 'workspace I' | ||
| alt-m = 'workspace M' | ||
| alt-n = 'workspace N' | ||
| alt-o = 'workspace O' | ||
| alt-p = 'workspace P' | ||
| alt-q = 'workspace Q' | ||
| alt-r = 'workspace R' | ||
| alt-s = 'workspace S' | ||
| alt-t = 'workspace T' | ||
| alt-u = 'workspace U' | ||
| alt-v = 'workspace V' | ||
| alt-w = 'workspace W' | ||
| alt-x = 'workspace X' | ||
| alt-y = 'workspace Y' | ||
| alt-z = 'workspace Z' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace | ||
| alt-shift-1 = 'move-node-to-workspace 1' | ||
| alt-shift-2 = 'move-node-to-workspace 2' | ||
| alt-shift-3 = 'move-node-to-workspace 3' | ||
| alt-shift-4 = 'move-node-to-workspace 4' | ||
| alt-shift-5 = 'move-node-to-workspace 5' | ||
| alt-shift-6 = 'move-node-to-workspace 6' | ||
| alt-shift-7 = 'move-node-to-workspace 7' | ||
| alt-shift-8 = 'move-node-to-workspace 8' | ||
| alt-shift-9 = 'move-node-to-workspace 9' | ||
| alt-shift-a = 'move-node-to-workspace A' | ||
| alt-shift-b = 'move-node-to-workspace B' | ||
| alt-shift-c = 'move-node-to-workspace C' | ||
| alt-shift-d = 'move-node-to-workspace D' | ||
| alt-shift-e = 'move-node-to-workspace E' | ||
| alt-shift-f = 'move-node-to-workspace F' | ||
| alt-shift-g = 'move-node-to-workspace G' | ||
| alt-shift-i = 'move-node-to-workspace I' | ||
| alt-shift-m = 'move-node-to-workspace M' | ||
| alt-shift-n = 'move-node-to-workspace N' | ||
| alt-shift-o = 'move-node-to-workspace O' | ||
| alt-shift-p = 'move-node-to-workspace P' | ||
| alt-shift-q = 'move-node-to-workspace Q' | ||
| alt-shift-r = 'move-node-to-workspace R' | ||
| alt-shift-s = 'move-node-to-workspace S' | ||
| alt-shift-t = 'move-node-to-workspace T' | ||
| alt-shift-u = 'move-node-to-workspace U' | ||
| alt-shift-v = 'move-node-to-workspace V' | ||
| alt-shift-w = 'move-node-to-workspace W' | ||
| alt-shift-x = 'move-node-to-workspace X' | ||
| alt-shift-y = 'move-node-to-workspace Y' | ||
| alt-shift-z = 'move-node-to-workspace Z' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth | ||
| alt-tab = 'workspace-back-and-forth' | ||
| # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor | ||
| alt-shift-tab = 'move-workspace-to-monitor --wrap-around next' | ||
|
|
||
| # See: https://nikitabobko.github.io/AeroSpace/commands#mode | ||
| alt-shift-semicolon = 'mode service' | ||
|
|
||
| # 'service' binding mode declaration. | ||
| # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes | ||
| [mode.service.binding] | ||
| esc = ['reload-config', 'mode main'] | ||
| r = ['flatten-workspace-tree', 'mode main'] # reset layout | ||
| f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout | ||
| backspace = ['close-all-windows-but-current', 'mode main'] | ||
|
|
||
| # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2 | ||
| #s = ['layout sticky tiling', 'mode main'] | ||
|
|
||
| alt-shift-h = ['join-with left', 'mode main'] | ||
| alt-shift-j = ['join-with down', 'mode main'] | ||
| alt-shift-k = ['join-with up', 'mode main'] | ||
| alt-shift-l = ['join-with right', 'mode main'] | ||
|
|
||
| down = 'volume down' | ||
| up = 'volume up' | ||
| shift-down = ['volume set 0', 'mode main'] | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| -P ubuntu-latest=catthehacker/ubuntu:act-latest | ||
| -P ubuntu-22.04=catthehacker/ubuntu:act-22.04 | ||
| -P ubuntu-20.04=catthehacker/ubuntu:act-20.04 | ||
| -P ubuntu-18.04=catthehacker/ubuntu:act-18.04 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| # Agent Deck Configuration | ||
| # All options: https://github.com/asheshgoplani/agent-deck/blob/main/skills/agent-deck/references/config-reference.md | ||
|
|
||
| default_tool = "claude" | ||
| theme = "dark" | ||
|
|
||
| [claude] | ||
| dangerous_mode = false | ||
|
|
||
| [global_search] | ||
| enabled = true | ||
| tier = "auto" | ||
| recent_days = 90 | ||
|
|
||
| [logs] | ||
| max_size_mb = 10 | ||
| max_lines = 10000 | ||
|
|
||
| [instances] | ||
| allow_multiple = true |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| OYKOT-jp/nomad_japan | ||
| keito4/effectuation |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| # Edit this file to configure aliases for Graphite commands. | ||
| # If you delete this file, it will be recreated with the default aliases. | ||
| # The first word of each line is the alias, and the rest is the command. | ||
| # Lines starting with # are ignored. | ||
|
|
||
| # The aliases for ss, ls, and ll are defined by default and must be overridden to be disabled. | ||
| # They are shown below to demonstrate the formatting. | ||
|
|
||
| ls log short | ||
| ll log long | ||
| ss submit --stack |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update the header comments to match Home Manager ownership.
Line 1 and Line 2 currently tell users to copy/edit
~/.aerospace.tomlmanually, but this file is declaratively managed and force-overwritten by Home Manager (nix/home/dotfiles.nixLine 4-Line 7 and Line 11). Please replace this guidance to prevent confusing, non-persistent manual edits.Suggested edit
📝 Committable suggestion
🤖 Prompt for AI Agents