Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d5430f8
feat(migration): add mise dotfile classifier and reconcile targets
megalithic Jun 23, 2026
c49cf27
feat(migration): port generated Home Manager fragments to static files
megalithic Jun 23, 2026
4ce0d55
docs: add migration docs and Home Manager symlink chain notes
megalithic Jun 23, 2026
f6b5235
feat(migration): add mise bootstrap scaffold, scripts, tickets, and m…
megalithic Jun 23, 2026
aa74024
fix(migration): correct espanso cask binary path and add doctor checks
megalithic Jun 23, 2026
97f94b5
fix(migration): port git signing config fragment and validate 1Passwo…
megalithic Jun 23, 2026
23246c8
docs(migration): mark kanata and kanata-bar Nix-retained for v1
megalithic Jun 23, 2026
2a4686c
feat(migration): add custom flakes repo ticket for mise-nix consumption
megalithic Jun 23, 2026
bf53453
fix(migration): switch Okta Verify to Brew cask, keep check-only vali…
megalithic Jun 23, 2026
bd0565c
feat(migration): dry-run passes, add fish/small-config tickets, Brew …
megalithic Jun 23, 2026
39cf5c7
feat(migration): add fnox prototype with bash support and dry-run modes
megalithic Jun 23, 2026
2755899
feat(migration): port full Nix-generated fish config to static dotfiles
megalithic Jun 23, 2026
4d5b8e6
feat(migration): add static tool configs as mise dotfiles
megalithic Jun 23, 2026
f481c03
refactor(migration): switch to official NixOS nix-installer
megalithic Jun 23, 2026
3005e8f
feat(migration): implement one-command mise bootstrap with updated RE…
megalithic Jun 23, 2026
bcb67a1
feat(migration): add configurable dir, auto-clone, and argument suppo…
megalithic Jun 23, 2026
e8c0a0b
feat(migration): harden scripts for idempotent reruns and safe repeat…
megalithic Jun 24, 2026
6e49a31
feat(migration): close flakes prototype ticket with kanata and helium…
megalithic Jun 24, 2026
86fdc1d
docs(migration): close audit with 8/10 cutover blockers resolved
megalithic Jun 24, 2026
b19c505
docs(migration): document hostname-based config pattern and future pl…
megalithic Jun 24, 2026
0c09e9d
feat: add duti for managing default file-type handlers
megalithic Jun 24, 2026
e41150d
fix(helium): re-assert Preview as PDF handler after install via duti
megalithic Jun 24, 2026
99e59fb
fix(migration): expand $HOME in mise [env] vars to unblock nix from w…
megalithic Jun 24, 2026
c08b38f
feat: adds language servers and macshot
megalithic Jun 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ result
.init.local.lua
.direnv
.mise.local.toml
fnox.local.toml
mise/fnox/*.local.toml

todo.txt

Expand Down
44 changes: 44 additions & 0 deletions .tickets/mbm-55qf.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
id: mbm-55qf
status: closed
deps: []
links:
[
mbm-buez,
mbm-c3sd,
mbm-ju5m,
mbm-xqjv,
mbm-m0rs,
mbm-9ov0,
mbm-8afn,
mbm-qkmx,
]
created: 2026-06-22T21:33:33Z
type: feature
priority: 2
assignee: Seth Messer
tags: [ready-for-development]
---

# Implement mise dotfile symlink classifier preflight

Build a read-only preflight used by the mise bootstrap migration to inspect each target in mise.toml [dotfiles] before any link/adopt operation. It must follow symlink chains like ~/.config/ghostty -> /nix/store/...home-manager-files -> /nix/store/...hm_ghostty -> ~/.dotfiles/config/ghostty and classify final ownership. File hints: mise.toml, scripts/mise/doctor, scripts/mise/bootstrap-final, lat.md/migration/mise-parity-checklist.md, home/common/lib.nix.

## Acceptance Criteria

1. A script or doctor subcommand reads every mise.toml [dotfiles] target and prints a dry-run table with installed path, symlink chain, final target, and class.
2. Classes include repo-final, store-flake-source, store-generated, external-final, real-directory, real-file, missing, and conflict/unknown.
3. The script never mutates filesystem state and exits nonzero only for true conflicts or unreadable paths.
4. The report correctly identifies repo-final paths documented in lat.md/migration/mise-parity-checklist.md, including ghostty, hammerspoon, nvim, tmux, kitty, kanata macbook files, SSH config, and espanso app-support path.
5. lat.md/migration/mise-parity-checklist.md is updated if classification names or behavior change.
6. Existing validation still passes: lat_check and relevant shell lint/format checks.

## Notes

**2026-06-22T21:47:36Z**

Implemented read-only scripts/mise/dotfile-preflight and wired scripts/mise/doctor plus mise task dotfiles:preflight. Classifier reads mise.toml [dotfiles], follows full symlink chains, reports target/source/final/class/status, and exits nonzero only on unknown/conflict. Validation run found safe repo-final targets: ghostty, hammerspoon, kitty, nvim, tmux, ~/bin; missing safe targets: fnox config, ~/.config/ssh, ~/.config/espanso; needs handling: generated mise config, real fish/kanata/.local/bin dirs, store-flake git files. Also confirmed mise targets for SSH and espanso are wrong vs current ~/.ssh/config and ~/Library/Application Support/espanso ownership. Checks: scripts/mise/dotfile-preflight, --json, shellcheck doctor/bootstrap-final, lat_check. scripts/mise/doctor still exits 1 because fnox command missing on this host, unrelated to classifier.

**2026-06-22T21:48:53Z**

Follow-up: added inventory-only checks for documented repo-final paths not yet represented correctly in mise.toml: ~/.ssh/config, ~/Library/Application Support/espanso, and ~/.config/kanata/macbook\*.kbd. Latest preflight summary: safe=13, needs-handling=7, conflicts=0.
52 changes: 52 additions & 0 deletions .tickets/mbm-77a2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
id: mbm-77a2
status: closed
deps: 4:1:deps: 4:1:deps: [, mbm-8afn, mbm-b597]
links: [mbm-sskn, mbm-s5i1, mbm-9ov0]
created: 2026-06-23T16:43:19Z
type: feature
priority: 1
assignee: Seth Messer
tags: [mise, migration, fish]
---

# Port Nix-generated fish config to static mise dotfiles

Port all Home Manager-generated fish shell configuration to committed static files under mise/dotfiles/fish/. Current mise/dotfiles/fish/ is ~25 lines; HM generates 279-line config.fish + 20 functions + 3 plugins + keybindings + theme + completions.

Files to port:

- config.fish: shell init, PATH, PLUG_EDITOR, TMUX_SESSION, completions, keybindings, theme, ghostty integration, HM session vars (replaced with fnox/mise equivalents)
- conf.d/plugin-autopair.fish, plugin-done.fish, plugin-nix-env.fish (nix-env plugin may be retired)
- conf.d/devenv-tasks-run.fish
- functions/\*.fish (jj, fzf widgets, git-worktree, helium, nix-shell, ask, bind_bang, bind_dollar, fish_greeting, pr, sz, yy, etc.)

All content is static — no Nix interpolation needed. PATH references switch from Nix store to Brew/MAS paths. Secret loading switches from opnix to fnox.

## Acceptance Criteria

1. mise/dotfiles/fish/config.fish contains all shell init, PATH, PLUG_EDITOR, TMUX_SESSION, and keybindings from the HM-generated version.
2. mise/dotfiles/fish/conf.d/ contains all plugin and integration files (autopair, done, devenv-tasks-run). nix-env plugin may be intentionally removed.
3. mise/dotfiles/fish/functions/ contains all 20 fish functions (jj, fzf widgets, git-worktree, helium, etc.).
4. mise/dotfiles/fish/completions/ contains generated completions (jj, mix, git-worktree, etc.).
5. Theme file is committed under mise/dotfiles/fish/conf.d/ or mise/dotfiles/fish/theme.fish.
6. Ghostty shell integration is resolved (either via Brew ghostty or committed snippet).
7. Secret/env loading is wired to fnox (or documented as deferred to mbm-b597).
8. mise bootstrap --dry-run notes fish as expected conflict requiring --force-dotfiles after backup.
9. lat_check passes.

## Notes

**2026-06-23T17:43:21Z**

Ported all Nix-generated fish config to static mise/dotfiles/fish/:

1. config.fish (8.0KB) — complete port of HM's 279-line generated config: shell init, PATH (Brew paths), jj/mix/git-worktree completions, env vars, PLUG_EDITOR, TMUX_SESSION, abbreviations, aliases, fzf integration, keybindings (ctrl-a/e/y/v/s/c/d/b/o, bang shortcuts), Everforest theme, Ghostty integration (Brew cask path), zoxide/starship/mise/direnv init, conf.d sourcing.
2. 20 fish functions — all ported: \_\_git_worktree_names, \_fzf_preview_file, \_prompt_move_to_bottom, \_prompt_reset_mouse, ask, bind_bang, bind_dollar, fish_greeting, fzf-dir-widget, fzf-jj-bookmarks, git-worktree-cd/new/pr/prune, helium, jj, nix-shell, pr, sz (simplified — no HM session vars), yy.
3. 5 conf.d files: devenv-tasks-run, fnox (secret loading from mbm-b597), mise (mise+fnox activation), plugin-autopair, plugin-done.
4. nix-env plugin intentionally removed (no Nix shell management).
5. Nix store paths replaced with Brew/MAS equivalents (eza, trash, fzf, starship, ghostty, etc.).
6. OpNix secret paths replaced with fnox paths.
7. Fish syntax validated (fish -n passes).
8. Preflight: fish shows as real-directory (expected — requires --force-dotfiles after backup).
lat_check passed.
58 changes: 58 additions & 0 deletions .tickets/mbm-8afn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
id: mbm-8afn
status: closed
deps: []
links:
[
mbm-buez,
mbm-c3sd,
mbm-ju5m,
mbm-xqjv,
mbm-m0rs,
mbm-55qf,
mbm-9ov0,
mbm-qkmx,
]
created: 2026-06-22T21:33:34Z
type: task
priority: 2
assignee: Seth Messer
tags: [ready-for-development]
---

# Port generated Home Manager config fragments for mise bootstrap

Move or replace Home Manager-generated config fragments that current live configs depend on, using committed static files or small deterministic render scripts. Focus on generated files that are not repo-final symlinks. File hints: home/common/programs/hammerspoon/default.nix, home/common/programs/shade-next/default.nix, home/common/programs/tmux/default.nix, home/common/programs/starship/default.nix, home/common/programs/karabiner/default.nix, home/common/programs/pi-coding-agent/default.nix, scripts/mise/setup-pi, lat.md/migration/mise-parity-checklist.md.

## Acceptance Criteria

1. Required generated fragments are inventoried and assigned target owners: committed file, scripts/mise renderer, manual, or Nix-retained.
2. Hammerspoon fragment parity is handled for nix_path.lua and shade-next.lua without editing generated files at runtime.
3. Tmux nix.conf replacement or retain decision is implemented and documented.
4. Starship, shade, shade-next, karabiner, process-compose, sesame, and 1Password SSH agent generated config decisions are documented and implemented where needed for v1.
5. No launch/app reload occurs except explicitly safe validation commands.
6. lat_check passes after doc updates.

## Notes

**2026-06-23T13:03:08Z**

Implemented fragment porting for mbm-8afn:

1. Created committed static files under mise/fragments/ for 7 generated fragments:
- mise/fragments/hammerspoon/nix_path.lua (PATH + env vars)
- mise/fragments/hammerspoon/shade-next.lua (app info, chords, prefills)
- mise/fragments/tmux/nix.conf (fish shell path → Brew)
- mise/fragments/shade-next/config.toml (identity, paths, UI, keys)
- mise/fragments/sesame/config.jsonc (piSessionPaths)
- mise/fragments/process-compose/shortcuts.yaml
- mise/fragments/process-compose/theme.yaml
2. Added all fragment targets to mise.toml [dotfiles] as individual file links.
3. Documented full fragment inventory in lat.md/migration/mise-parity-checklist.md:
- 7 committed static files (implemented)
- starship/karabiner: already static
- shade v1, allowed_signers, 1Password SSH: Nix-retained
- Fish: deferred to per-file reconciliation
- Bash, surfingkeys, slk, HM plugins: deferred or Nix-retained
4. Preflight confirms all fragments classify correctly (store-flake-source/store-generated → needs-handling).
5. No destructive actions. lat_check passed. Preflight: safe=11, needs-handling=15, conflicts=0.
47 changes: 47 additions & 0 deletions .tickets/mbm-9ov0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
id: mbm-9ov0
status: closed
deps: 4:1:deps: 4:1:deps: 4:1:deps: 4:1:deps: 4:1:deps: [, mbm-55qf, mbm-qkmx, mbm-8afn, mbm-buez, mbm-c3sd]
links: [mbm-buez, mbm-c3sd, mbm-ju5m, mbm-xqjv, mbm-m0rs, mbm-55qf, mbm-8afn, mbm-qkmx, mbm-77a2, mbm-sskn, mbm-s5i1]
created: 2026-06-22T21:33:36Z
type: feature
priority: 2
assignee: Seth Messer
tags: [ready-for-development]
---

# Design and implement one-command mise bootstrap v1

Replace the README Nix-first installation path with a Mac-first one-command bootstrap once the preflight and critical blockers are ready. The command should be pasteable into Terminal.app, support fresh and partial systems, and repair or clearly report broken setup. File hints: README.md, scripts/install.sh, scripts/aarch64-darwin_bootstrap.sh, scripts/mise/bootstrap-final, scripts/mise/doctor, scripts/mise/ensure-determinate-nix, scripts/mise/ensure-homebrew, mise.toml.

## Acceptance Criteria

1. README documents a single curl/bash command for the mise migration bootstrap, with warnings and expected prompts.
2. Bootstrap detects hostname, prompts to confirm/correct megabookpro or workbookpro, and sets ComputerName, HostName, and LocalHostName.
3. Bootstrap detects Command Line Tools and EULA/MAS gates, automates safe parts, and clearly reports manual gates.
4. Bootstrap supports fresh and partially installed systems by running preflight before mutation and reporting conflicts.
5. Bootstrap is safe to rerun: repeated runs are idempotent or produce clear no-op/manual reports.
6. Mac-first v1 is explicit; UGREEN NAS and Raspberry Pi/Home Assistant are documented as future platform goals, not blockers.
7. No destructive bootstrap is run during implementation without explicit user approval.

## Notes

**2026-06-23T20:59:58Z**

Implemented one-command mise bootstrap v1:

1. README updated: single curl/bash one-liner, mise-first bootstrap documented, Nix retained for specific cases.
2. scripts/install.sh — full entry point script:
- Detects hostname, prompts to confirm megabookpro/workbookpro
- Checks/installs CLT, accepts Xcode license, installs Rosetta 2
- Clones or updates ~/.dotfiles
- Runs dotfile-preflight (classifier) + doctor (preflight)
- Shows plan, asks confirmation before each phase
- Installs Homebrew → Nix (official installer) → mise bootstrap
- Post-bootstrap: apps, pi setup, fnox secrets, helium, complex defaults
- Sets ComputerName/HostName/LocalHostName
- Reports next steps (shell restart, fnox token, Okta, kanata)
3. Idempotent: detects existing state, reports conflicts, skips installed components
4. Non-destructive: all mutations behind confirmation prompts
5. Mac-first v1; other platforms documented as future goals in README
6. Shellcheck clean, lat_check passes, no destructive commands run.
43 changes: 43 additions & 0 deletions .tickets/mbm-b597.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
id: mbm-b597
status: closed
deps: []
links: []
created: 2026-06-22T20:32:32Z
type: feature
priority: 2
assignee: Seth Messer
tags: [ready-for-development]
---

# Prototype fnox replacement for OpNix-rendered secrets

Make the fnox migration path concrete without committing plaintext secrets. The current plan is to keep 1Password as the vault, use fnox as user-land resolver, and render legacy files under ~/.config/fnox/secrets/ so Pi, shell startup, Apple notarization, and .s3cfg keep working while callers move away from OpNix paths.

Context: migration session chose fnox.jdx.dev to replace OpNix declarations while retaining 1Password.

File hints: mise/fnox/config.toml, scripts/mise/render-fnox-files, mise.toml task `fnox:render`, existing OpNix/secrets references under home/common/ and modules/.

## Acceptance Criteria

1. Existing OpNix-managed secret outputs used by this repo are inventoried with destination paths and consumers.
2. `mise/fnox/config.toml` contains placeholder-safe mappings for required secrets and no plaintext secret values.
3. `scripts/mise/render-fnox-files` can run in dry-run/check mode or otherwise validates prerequisites before writing.
4. Legacy output paths under ~/.config/fnox/secrets/ are documented so existing consumers can migrate gradually.
5. 1Password service account token handling is local-only/encrypted and never committed as plaintext.
6. `lat.md/migration/mise-bootstrap.md` is updated if the secrets ownership model changes; `lat_check` passes.

## Notes

**2026-06-23T16:47:57Z**

Implemented fnox prototype:

1. Secret inventory documented (5 common + 1 work): ENV_VARS_SH, S3CFG, APPLE_ID_EMAIL, APPLE_TEAM_ID, APPLE_NOTARYTOOL_PASSWORD, WORK_ENV_VARS_SH.
2. mise/fnox/config.toml: placeholder-safe (AGE_RECIPIENT_REPLACE_ME), all 1Password refs use op:// URIs, work secrets commented out.
3. scripts/mise/render-fnox-files: added --check, --dry-run, --inventory modes. Dry-run reports prerequisites without writing.
4. Shell init snippets: mise/dotfiles/fish/conf.d/fnox.fish (fish), mise/dotfiles/bash/fnox.sh (bash). Both load env-vars.sh, LAT*LLM*\*, apple secrets, work secrets. Replaces OpNix programs.{fish,bash,zsh} shell init.
5. Legacy output paths: ~/.config/fnox/secrets/env-vars.sh, ~/.s3cfg, ~/.config/fnox/secrets/apple-developer/\*. Documented in inventory.
6. Token: OP_SERVICE_ACCOUNT_TOKEN stays local/encrypted via fnox age provider, never committed.
7. mise.toml: added fnox:check, fnox:dry-run tasks; bash dotfile target for fnox.sh.
8. lat_check passed, shellcheck clean.
50 changes: 50 additions & 0 deletions .tickets/mbm-buez.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
id: mbm-buez
status: closed
deps: []
links:
[
mbm-c3sd,
mbm-ju5m,
mbm-xqjv,
mbm-m0rs,
mbm-55qf,
mbm-9ov0,
mbm-8afn,
mbm-qkmx,
]
created: 2026-06-22T21:33:35Z
type: task
priority: 2
assignee: Seth Messer
tags: [ready-for-development]
---

# Fix espanso migration path and launchd parity

Make espanso migration match current Home Manager behavior. Current Nix links config/espanso to ~/Library/Application Support/espanso and creates a launchd agent/log dirs. Current mise points at ~/.config/espanso and /opt/homebrew/bin/espanso, which may be wrong. File hints: home/common/programs/espanso/default.nix, home/common/services.nix, config/espanso, mise.toml, mise/Brewfile, scripts/mise/doctor.

## Acceptance Criteria

1. Confirm Homebrew espanso install type and real executable path without destructive app changes.
2. Update mise.toml or scripts/mise so espanso uses the correct config location and launchd ProgramArguments.
3. Ensure ~/Library/Logs/espanso exists before launchd starts.
4. Add doctor/preflight checks for config path, executable path, launchd label, and espanso status.
5. Run only non-destructive validation unless user approves starting/restarting espanso.
6. Update lat.md/migration/mise-parity-checklist.md with final espanso status and validation command.

## Notes

**2026-06-23T13:13:17Z**

Fixed espanso migration:

1. Verified espanso is a Brew cask (not formula): binary at /Applications/Espanso.app/Contents/MacOS/espanso, not /opt/homebrew/bin/espanso.
2. Added 'cask "espanso"' to mise/Brewfile.
3. Fixed mise launchd agent program path from /opt/homebrew/bin/espanso to /Applications/Espanso.app/Contents/MacOS/espanso.
4. Verified config path: ~/Library/Application Support/espanso (matches 'espanso path config' output).
5. Dotfile target already correct from mbm-qkmx.
6. Added comprehensive doctor checks: config symlink, binary path, espanso path/config/version, log dir, launchd agent (both Nix and mise labels).
7. Log dir ~/Library/Logs/espanso/ must exist before launchd start (documented in checklist).
8. Doctor confirms: config link OK, binary OK, config path match, version 2.3.0, log dir OK, Nix launchd agent running.
Validation: shellcheck clean, doctor espanso all-ok, lat_check passed. No destructive actions.
49 changes: 49 additions & 0 deletions .tickets/mbm-c3sd.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
id: mbm-c3sd
status: closed
deps: []
links:
[
mbm-buez,
mbm-ju5m,
mbm-xqjv,
mbm-m0rs,
mbm-55qf,
mbm-9ov0,
mbm-8afn,
mbm-qkmx,
]
created: 2026-06-22T21:33:36Z
type: task
priority: 2
assignee: Seth Messer
tags: [ready-for-development]
---

# Validate 1Password Brew and Aqua ownership for signing and secrets

Prove the mise target for 1Password is safe before removing nix-darwin ownership. Current Nix installs GUI to /Applications and op to /usr/local/bin/op, and git/jj signing uses /Applications/1Password.app/Contents/MacOS/op-ssh-sign. File hints: modules/darwin/\_1password.nix, home/common/programs/git, home/common/programs/jj, home/common/programs/ssh, mise/Brewfile, mise.toml, mise/fnox/config.toml, scripts/mise/render-fnox-files.

## Acceptance Criteria

1. Validate Brew cask installs 1Password.app in /Applications and preserves op-ssh-sign path.
2. Validate the mise/Aqua op CLI can integrate with the GUI and 1Password agent without conflicting with any Brew CLI.
3. Validate git and jj signing config points at a working op-ssh-sign path.
4. Validate fnox/1Password secret access works with the selected op/GUI setup.
5. Document Gatekeeper/Open Anyway behavior if it remains a manual first-launch step.
6. Update lat.md/migration/mise-parity-checklist.md with final status and validation evidence.

## Notes

**2026-06-23T13:24:30Z**

Validated 1Password Brew/Aqua ownership:

1. Brew cask installs to /Applications/1Password.app — same as Nix nix-darwin target. Confirmed via brew info --cask --json.
2. op-ssh-sign at /Applications/1Password.app/Contents/MacOS/op-ssh-sign (755, 1.4M) — embedded in app bundle, unaffected by install method.
3. SSH agent socket at ~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock — part of app container, independent of install method.
4. op CLI (Nix: /usr/local/bin/op v2.34.0) successfully talks to GUI: 'op account get' returns account details. Aqua op uses same local API.
5. Git/jj signing config not present in Nix code either — needs explicit gpg.ssh.program config pointing at op-ssh-sign for both Nix and mise.
6. fnox/1Password access via OP_SERVICE_ACCOUNT_TOKEN + op CLI — mechanism independent of op CLI install source.
7. Gatekeeper: Brew cask first launch may require System Settings > Privacy > Open Anyway — manual step, same as Nix.
Updated checklist: status safe, cutover blocker checked. lat_check passed.
Loading
Loading