@sebastienrousseau/dotfiles 0.2.481 → 0.2.500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/CHANGELOG.md +122 -32
  2. package/LICENSE +1 -1
  3. package/README.md +211 -242
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +2 -2
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +58 -249
  9. package/docs/adr/ADR-004-cli-architecture.md +2 -2
  10. package/docs/adr/ADR-006-shell-selection.md +2 -2
  11. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  12. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  13. package/docs/adr/README.md +2 -3
  14. package/docs/architecture/ARCHITECTURE.md +113 -0
  15. package/docs/architecture/INTEROP.md +36 -0
  16. package/docs/architecture/REPO_LAYOUT.md +237 -0
  17. package/docs/architecture/WALKTHROUGH.md +82 -0
  18. package/docs/architecture/fleet-deployment.md +73 -0
  19. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  20. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  21. package/docs/{PLAN.md → archive/PLAN.md} +1 -1
  22. package/docs/guides/INSTALL.md +140 -0
  23. package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
  24. package/docs/guides/THEMING.md +222 -0
  25. package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
  26. package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
  27. package/docs/index.md +39 -0
  28. package/docs/interop/A2A.md +32 -0
  29. package/docs/manual/00-introduction.md +85 -0
  30. package/docs/manual/01-concepts/01-architecture.md +134 -0
  31. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  32. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  33. package/docs/manual/01-concepts/04-fleet.md +142 -0
  34. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  35. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  36. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  37. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  38. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  39. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  40. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  41. package/docs/manual/03-reference/02-config-files.md +259 -0
  42. package/docs/manual/03-reference/03-environment.md +120 -0
  43. package/docs/manual/03-reference/04-templates.md +184 -0
  44. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  45. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  46. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  47. package/docs/manual/04-cookbook/03-faq.md +167 -0
  48. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  49. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  50. package/docs/manual/05-appendices/C-glossary.md +36 -0
  51. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  52. package/docs/manual/05-appendices/E-license.md +34 -0
  53. package/docs/manual/_toc.yml +58 -0
  54. package/docs/manual/command-index.md +58 -0
  55. package/docs/manual/concept-index.md +164 -0
  56. package/docs/operations/ATTESTATION.md +39 -0
  57. package/docs/operations/MAINTENANCE.md +59 -0
  58. package/docs/operations/MIGRATION.md +101 -0
  59. package/docs/operations/OPERATIONS.md +164 -0
  60. package/docs/operations/RELIABILITY.md +116 -0
  61. package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
  62. package/docs/operations/TESTING.md +195 -0
  63. package/docs/operations/TRACEABILITY.md +31 -0
  64. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  65. package/docs/operations/VERSION_SYNC.md +344 -0
  66. package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
  67. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  68. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  69. package/docs/reference/FEATURES.md +62 -0
  70. package/docs/reference/FONTS.md +108 -0
  71. package/docs/reference/PROFILES.md +65 -0
  72. package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
  73. package/docs/reference/SCRIPTS.md +67 -0
  74. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  75. package/docs/reference/THEMES.md +113 -0
  76. package/docs/reference/TOOLS.md +105 -0
  77. package/docs/reference/UTILS.md +151 -0
  78. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  79. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  80. package/docs/security/COMPLIANCE.md +453 -0
  81. package/docs/security/ENCRYPTION.md +52 -0
  82. package/docs/security/FMEA.md +155 -0
  83. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  84. package/docs/security/KEYS.md +45 -0
  85. package/docs/security/MCP_POLICY.md +69 -0
  86. package/docs/security/POLICY_RELEASES.md +33 -0
  87. package/docs/security/README.md +24 -0
  88. package/docs/security/SECRETS.md +146 -0
  89. package/docs/security/SECURITY.md +41 -0
  90. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  91. package/docs/security/SOUP_REGISTER.md +32 -0
  92. package/docs/security/THREAT_MODEL.md +120 -0
  93. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  94. package/docs/themes/README.md +3 -17
  95. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  96. package/docs/themes/hero-shot.svg +78 -0
  97. package/dot_config/.module-manifest.json +69 -0
  98. package/dot_config/ai/identity.md +20 -0
  99. package/dot_config/ai/patterns/architect.md +14 -0
  100. package/dot_config/ai/patterns/hardener.md +13 -0
  101. package/dot_config/ai/patterns/refactor.md +13 -0
  102. package/dot_config/aider/aider.conf.yml +1 -1
  103. package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
  104. package/dot_config/atuin/config.toml +18 -1
  105. package/dot_config/bat/config +16 -1
  106. package/dot_config/claude/mcp_servers.json +3 -32
  107. package/dot_config/dotfiles/agent-card.json +29 -0
  108. package/dot_config/dotfiles/agent-profiles.json +92 -0
  109. package/dot_config/dotfiles/boot/README.md +1 -1
  110. package/dot_config/dotfiles/grub/README.md +1 -1
  111. package/dot_config/dotfiles/lock/README.md +1 -1
  112. package/dot_config/dotfiles/mcp-lock.json +33 -0
  113. package/dot_config/dotfiles/mcp-policy.json +52 -0
  114. package/dot_config/dotfiles/mcp-registry.json +47 -0
  115. package/dot_config/dotfiles/model-registry.json +20 -0
  116. package/dot_config/dotfiles/policy-bundles.json +38 -0
  117. package/dot_config/dotfiles/prompt-registry.json +16 -0
  118. package/dot_config/dotfiles/versions.env +18 -0
  119. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  120. package/dot_config/environment.d/90-wayland.conf +19 -0
  121. package/dot_config/firefox/user.js.tmpl +58 -0
  122. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  123. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  124. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  125. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  126. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  127. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  128. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  129. package/dot_config/fish/config.fish.tmpl +44 -0
  130. package/dot_config/fish/fish_plugins +1 -0
  131. package/dot_config/fish/functions/_.fish +3 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  133. package/dot_config/fish/functions/als.fish +46 -0
  134. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  135. package/dot_config/fish/functions/c.fish +3 -0
  136. package/dot_config/fish/functions/cat.fish +9 -0
  137. package/dot_config/fish/functions/d.fish +7 -0
  138. package/dot_config/fish/functions/dot.fish +34 -0
  139. package/dot_config/fish/functions/h.fish +3 -0
  140. package/dot_config/fish/functions/l.fish +7 -0
  141. package/dot_config/fish/functions/la.fish +7 -0
  142. package/dot_config/fish/functions/ll.fish +7 -0
  143. package/dot_config/fish/functions/log_error.fish +13 -0
  144. package/dot_config/fish/functions/log_info.fish +13 -0
  145. package/dot_config/fish/functions/lr.fish +7 -0
  146. package/dot_config/fish/functions/lra.fish +7 -0
  147. package/dot_config/fish/functions/ls.fish +7 -0
  148. package/dot_config/fish/functions/lt.fish +7 -0
  149. package/dot_config/fish/functions/lta.fish +7 -0
  150. package/dot_config/fish/functions/notify-run.fish +11 -0
  151. package/dot_config/fish/functions/q.fish +3 -0
  152. package/dot_config/fish/functions/silent-run.fish +7 -0
  153. package/dot_config/fish/functions/yy.fish +8 -0
  154. package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
  155. package/dot_config/foot/foot.ini.tmpl +33 -0
  156. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  157. package/dot_config/fzf/fzf.zsh +48 -0
  158. package/dot_config/ghostty/config.tmpl +69 -565
  159. package/dot_config/git/allowed_signers.tmpl +18 -0
  160. package/dot_config/git/commit-template +10 -0
  161. package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
  162. package/dot_config/goose/config.yaml +2 -2
  163. package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
  164. package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
  165. package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
  166. package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
  167. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  168. package/dot_config/just/justfile +18 -0
  169. package/dot_config/kanshi/config.tmpl +22 -0
  170. package/dot_config/kitty/kitty.conf.tmpl +44 -508
  171. package/dot_config/lazygit/config.yml +18 -6
  172. package/dot_config/mako/config +47 -0
  173. package/dot_config/micro/settings.json +3 -0
  174. package/dot_config/mimeapps.list +77 -0
  175. package/dot_config/mise/config.toml +63 -5
  176. package/dot_config/mongosh/mongoshrc.js +1 -0
  177. package/dot_config/mpv/input.conf +47 -0
  178. package/dot_config/mpv/mpv.conf +47 -0
  179. package/dot_config/niri/config.kdl.tmpl +327 -0
  180. package/dot_config/nushell/aliases.nu +18 -0
  181. package/dot_config/nushell/completions.nu.tmpl +52 -0
  182. package/dot_config/nushell/config.nu.tmpl +86 -0
  183. package/dot_config/nushell/env.nu.tmpl +94 -0
  184. package/dot_config/nushell/functions.nu.tmpl +17 -0
  185. package/dot_config/nvim/init.lua +14 -0
  186. package/dot_config/nvim/lazy-lock.json +45 -14
  187. package/dot_config/nvim/lua/config/autocmds.lua +45 -1
  188. package/dot_config/nvim/lua/config/keymaps.lua +13 -8
  189. package/dot_config/nvim/lua/config/lazy.lua +22 -12
  190. package/dot_config/nvim/lua/config/options.lua +1 -0
  191. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  192. package/dot_config/nvim/lua/plugins/coding.lua +11 -29
  193. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  194. package/dot_config/nvim/lua/plugins/dap.lua +215 -4
  195. package/dot_config/nvim/lua/plugins/editor.lua +6 -10
  196. package/dot_config/nvim/lua/plugins/git.lua +1 -0
  197. package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
  198. package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
  199. package/dot_config/nvim/lua/plugins/rust.lua +1 -0
  200. package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
  201. package/dot_config/nvim/lua/plugins/ui.lua +23 -51
  202. package/dot_config/paru/paru.conf +10 -0
  203. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  204. package/dot_config/pueue/pueue.yml +34 -0
  205. package/dot_config/raycast/README.md +1 -1
  206. package/dot_config/ripgrep/ripgreprc +21 -0
  207. package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
  208. package/dot_config/shell/05-core-safety.sh +47 -0
  209. package/dot_config/shell/10-secrets.sh +40 -0
  210. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  211. package/dot_config/shell/40-ls-colors.sh +48 -0
  212. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  213. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  214. package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
  215. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
  216. package/dot_config/shell/Brewfile.cli +8 -0
  217. package/dot_config/shell/README.md +9 -9
  218. package/dot_config/shell/als_data.txt.tmpl +65 -0
  219. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  220. package/dot_config/shell/custom/context_suggest.zsh +50 -50
  221. package/dot_config/shell/custom/error_analysis.zsh +29 -29
  222. package/dot_config/starship.toml.tmpl +85 -7
  223. package/dot_config/swaylock/config +43 -0
  224. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  225. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  226. package/dot_config/systemd/user/pueued.service +12 -0
  227. package/dot_config/systemd/user/ssh-agent.service +12 -0
  228. package/dot_config/tmux/tmux.conf.tmpl +80 -38
  229. package/dot_config/topgrade.toml.tmpl +54 -0
  230. package/dot_config/user-dirs.dirs +9 -0
  231. package/dot_config/vscode/settings.json.tmpl +9 -50
  232. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  233. package/dot_config/waybar/style.css.tmpl +211 -0
  234. package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
  235. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  236. package/dot_config/yazi/keymap.toml +67 -0
  237. package/dot_config/yazi/theme.toml +102 -0
  238. package/dot_config/zathura/zathurarc +52 -0
  239. package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
  240. package/dot_config/zsh/dot_zprofile +1 -7
  241. package/dot_config/zsh/dot_zshenv +2 -3
  242. package/dot_config/zsh/dot_zshrc.tmpl +368 -69
  243. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  244. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
  245. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
  246. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  247. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
  248. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  249. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  250. package/dot_local/bin/executable_ai-update +195 -0
  251. package/dot_local/bin/executable_ai_core +113 -91
  252. package/dot_local/bin/executable_antigravity +11 -0
  253. package/dot_local/bin/executable_b64 +61 -36
  254. package/dot_local/bin/executable_bm +77 -0
  255. package/dot_local/bin/executable_cb +39 -0
  256. package/dot_local/bin/executable_dot +543 -132
  257. package/dot_local/bin/executable_dot-ai +36 -0
  258. package/dot_local/bin/executable_dot-bootstrap +77 -0
  259. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  260. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  261. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  262. package/dot_local/bin/executable_dot-theme-sync +952 -0
  263. package/dot_local/bin/executable_dot_completion +2 -0
  264. package/dot_local/bin/executable_dtags +28 -0
  265. package/dot_local/bin/executable_epoch +43 -38
  266. package/dot_local/bin/executable_extract +32 -99
  267. package/dot_local/bin/executable_gbd +52 -0
  268. package/dot_local/bin/executable_gd +42 -0
  269. package/dot_local/bin/executable_git-ai-commit +35 -20
  270. package/dot_local/bin/executable_git-ai-diff +33 -18
  271. package/dot_local/bin/executable_gl +101 -0
  272. package/dot_local/bin/executable_hash +56 -18
  273. package/dot_local/bin/executable_hashsum +160 -0
  274. package/dot_local/bin/executable_hex +44 -8
  275. package/dot_local/bin/executable_jsonv +34 -10
  276. package/dot_local/bin/executable_jwt +22 -6
  277. package/dot_local/bin/executable_kill-port +18 -2
  278. package/dot_local/bin/executable_lorem +21 -6
  279. package/dot_local/bin/executable_mkscript +35 -0
  280. package/dot_local/bin/executable_monitor +56 -0
  281. package/dot_local/bin/{executable_ip → executable_myip} +16 -2
  282. package/dot_local/bin/executable_notify +22 -0
  283. package/dot_local/bin/executable_open +36 -0
  284. package/dot_local/bin/executable_pw +27 -0
  285. package/dot_local/bin/executable_rec-start +46 -0
  286. package/dot_local/bin/executable_rec-stop +35 -0
  287. package/dot_local/bin/executable_regex +49 -13
  288. package/dot_local/bin/executable_start-niri +8 -0
  289. package/dot_local/bin/executable_tmux-sessionizer +276 -149
  290. package/dot_local/bin/executable_tour +112 -74
  291. package/dot_local/bin/executable_up +21 -0
  292. package/dot_local/bin/executable_update +45 -11
  293. package/dot_local/bin/executable_uuid +37 -7
  294. package/dot_local/bin/executable_win +32 -0
  295. package/dot_local/bin/executable_yamlv +25 -7
  296. package/dot_local/share/bash-completion/completions/dot +62 -44
  297. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  298. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  299. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  300. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  301. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  302. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  303. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  304. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  305. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  306. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  307. package/dot_local/share/man/man1/dot.1 +149 -0
  308. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  309. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  310. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  311. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  312. package/dot_local/share/zsh/completions/_dot +283 -0
  313. package/install.sh +297 -210
  314. package/package.json +17 -5
  315. package/scripts/ci/check-copyright-headers.sh +96 -0
  316. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  317. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  318. package/scripts/ci/validate-ci-config.sh +41 -39
  319. package/scripts/demo/record.sh +3 -2
  320. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  321. package/scripts/diagnostics/alias-governance.sh +137 -0
  322. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  323. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  324. package/scripts/diagnostics/benchmark.sh +209 -29
  325. package/scripts/diagnostics/conflicts.sh +72 -0
  326. package/scripts/diagnostics/doctor-unified.sh +38 -0
  327. package/scripts/diagnostics/doctor.sh +491 -65
  328. package/scripts/diagnostics/drift-dashboard.sh +17 -6
  329. package/scripts/diagnostics/health.sh +351 -110
  330. package/scripts/diagnostics/history-analysis.sh +12 -4
  331. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  332. package/scripts/diagnostics/perf.sh +225 -0
  333. package/scripts/diagnostics/scorecard.sh +118 -0
  334. package/scripts/diagnostics/secret-governance.sh +58 -0
  335. package/scripts/diagnostics/security-score.sh +139 -93
  336. package/scripts/diagnostics/smoke-test.sh +87 -0
  337. package/scripts/diagnostics/snapshot.sh +89 -0
  338. package/scripts/diagnostics/verify.sh +107 -0
  339. package/scripts/diagnostics/verify_state.sh +2 -2
  340. package/scripts/diagnostics/version-locks.sh +79 -0
  341. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  342. package/scripts/docs/build-manual.sh +883 -0
  343. package/scripts/docs/check-manual.sh +213 -0
  344. package/scripts/dot/commands/agent.sh +465 -0
  345. package/scripts/dot/commands/ai.sh +416 -0
  346. package/scripts/dot/commands/aliases.sh +250 -0
  347. package/scripts/dot/commands/appearance.sh +21 -4
  348. package/scripts/dot/commands/core.sh +59 -4
  349. package/scripts/dot/commands/diagnostics.sh +132 -3
  350. package/scripts/dot/commands/fleet.sh +399 -0
  351. package/scripts/dot/commands/lint.sh +177 -0
  352. package/scripts/dot/commands/manual.sh +168 -0
  353. package/scripts/dot/commands/meta.sh +148 -17
  354. package/scripts/dot/commands/patterns.sh +54 -0
  355. package/scripts/dot/commands/restore.sh +57 -35
  356. package/scripts/dot/commands/secrets.sh +151 -9
  357. package/scripts/dot/commands/security.sh +3 -0
  358. package/scripts/dot/commands/tools.sh +268 -27
  359. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  360. package/scripts/dot/lib/bento.sh +49 -0
  361. package/scripts/dot/lib/log.sh +194 -0
  362. package/scripts/dot/lib/platform.sh +98 -0
  363. package/scripts/dot/lib/ui.sh +507 -0
  364. package/scripts/dot/lib/utils.sh +318 -18
  365. package/scripts/fonts/install-nerd-fonts.sh +19 -10
  366. package/scripts/fonts/patch-fonts.sh +1 -0
  367. package/scripts/git-hooks/install.sh +11 -0
  368. package/scripts/git-hooks/pre-commit +12 -0
  369. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  370. package/scripts/git-hooks/pre-push +29 -0
  371. package/scripts/git-hooks/prepare-commit-msg +29 -0
  372. package/scripts/lib/secrets_provider.sh +158 -0
  373. package/scripts/maintenance/check-updates.sh +131 -0
  374. package/scripts/ops/ai-setup.sh +55 -0
  375. package/scripts/ops/bundle.sh +77 -0
  376. package/scripts/ops/chaos.sh +49 -0
  377. package/scripts/ops/chezmoi-apply.sh +245 -17
  378. package/scripts/ops/chezmoi-diff.sh +1 -0
  379. package/scripts/ops/chezmoi-remove.sh +2 -0
  380. package/scripts/ops/chezmoi-update.sh +34 -2
  381. package/scripts/ops/heal-chezmoi.sh +51 -0
  382. package/scripts/ops/heal-system.sh +128 -0
  383. package/scripts/ops/heal-tools.sh +340 -0
  384. package/scripts/ops/heal.sh +98 -342
  385. package/scripts/ops/post-apply-repair.sh +106 -0
  386. package/scripts/ops/prewarm.sh +127 -0
  387. package/scripts/ops/release.sh +252 -0
  388. package/scripts/ops/rollback.sh +86 -28
  389. package/scripts/ops/setup.sh +137 -0
  390. package/scripts/ops/teleport.sh +2 -1
  391. package/scripts/qa/coverage-baseline.sh +60 -0
  392. package/scripts/qa/docs-coverage.sh +111 -0
  393. package/scripts/qa/reliability-audit.sh +138 -0
  394. package/scripts/qa/traceability-coverage.sh +116 -0
  395. package/scripts/qa/validate-examples.sh +26 -0
  396. package/scripts/qa/wsl-contract.sh +11 -0
  397. package/scripts/release/package-policy-bundles.sh +125 -0
  398. package/scripts/secrets/age-init.sh +1 -0
  399. package/scripts/secrets/create-secrets-file.sh +1 -0
  400. package/scripts/secrets/encrypt-ssh-key.sh +1 -0
  401. package/scripts/security/backup.sh +44 -4
  402. package/scripts/security/dns-doh.sh +36 -14
  403. package/scripts/security/encryption-check.sh +27 -12
  404. package/scripts/security/enforce-policies.sh +11 -16
  405. package/scripts/security/firewall.sh +76 -20
  406. package/scripts/security/lock-configs.sh +2 -2
  407. package/scripts/security/lock-screen.sh +40 -18
  408. package/scripts/security/manage-secrets.sh +42 -29
  409. package/scripts/security/ssh-cert.sh +203 -0
  410. package/scripts/security/telemetry-kill.sh +40 -18
  411. package/scripts/security/usb-safety.sh +37 -15
  412. package/scripts/theme/apply-gnome-theme.sh +87 -56
  413. package/scripts/theme/extract-theme.py +677 -0
  414. package/scripts/theme/install-boot-logo.sh +1 -0
  415. package/scripts/theme/install-catppuccin-themes.sh +57 -33
  416. package/scripts/theme/install-cursors.sh +1 -0
  417. package/scripts/theme/install-file-icons.sh +1 -0
  418. package/scripts/theme/install-grub-theme.sh +11 -1
  419. package/scripts/theme/install-lock-icon.sh +1 -0
  420. package/scripts/theme/merge-wallpaper.sh +141 -0
  421. package/scripts/theme/rebuild-themes.sh +309 -0
  422. package/scripts/theme/switch.sh +308 -137
  423. package/scripts/theme/wallpaper-rotate.sh +66 -12
  424. package/scripts/theme/wallpaper-sync.sh +386 -31
  425. package/scripts/tools/cmatrix.sh +1 -0
  426. package/scripts/tools/detect-collisions.py +1 -1
  427. package/scripts/tools/emoji-picker.sh +4 -1
  428. package/scripts/tools/figlet-banner.sh +1 -0
  429. package/scripts/tools/log-rotate.sh +2 -1
  430. package/scripts/tools/lolcat-wrap.sh +1 -0
  431. package/scripts/tools/pipes.sh +1 -0
  432. package/scripts/tuning/linux.sh +23 -13
  433. package/scripts/tuning/macos.sh +13 -4
  434. package/scripts/uninstall.sh +85 -0
  435. package/scripts/version-sync.sh +487 -0
  436. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  437. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  438. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  439. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  440. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  441. package/templates/projects/go/README.md +1 -1
  442. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  443. package/templates/projects/go/go.sum +0 -0
  444. package/templates/projects/molecule/README.md +1 -1
  445. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  446. package/templates/projects/node/README.md +1 -1
  447. package/templates/projects/node/package-lock.json +12 -0
  448. package/templates/projects/node/src/index.js +1 -0
  449. package/templates/projects/packer/README.md +1 -1
  450. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  451. package/templates/projects/python/README.md +1 -1
  452. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  453. package/templates/projects/python/tests/test_basic.py +1 -0
  454. package/docs/ARCHITECTURE.md +0 -229
  455. package/docs/COMPLIANCE.md +0 -47
  456. package/docs/FEATURES.md +0 -166
  457. package/docs/FONTS.md +0 -147
  458. package/docs/INSTALL.md +0 -119
  459. package/docs/KEYS.md +0 -40
  460. package/docs/OPERATIONS.md +0 -130
  461. package/docs/PR_DESCRIPTION.md +0 -149
  462. package/docs/SECRETS.md +0 -76
  463. package/docs/SECURITY.md +0 -30
  464. package/docs/SECURITY_CHECKLIST.md +0 -25
  465. package/docs/TASK.md +0 -99
  466. package/docs/TESTING.md +0 -190
  467. package/docs/TOOLS.md +0 -146
  468. package/docs/UTILS.md +0 -105
  469. package/docs/WALKTHROUGH.md +0 -165
  470. package/dot_config/clippy.toml +0 -55
  471. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  472. package/dot_config/firefox/user.js +0 -8
  473. package/dot_config/git/config.tmpl +0 -77
  474. package/dot_config/go/aliases.sh +0 -61
  475. package/dot_config/go/env.sh +0 -24
  476. package/dot_config/ice/README.md +0 -13
  477. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  478. package/dot_config/lsd/config.yaml +0 -19
  479. package/dot_config/nvim/snippets/all.lua +0 -9
  480. package/dot_config/nvim/snippets/python.lua +0 -16
  481. package/dot_config/shell/00-container-detect.sh +0 -53
  482. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  483. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  484. package/dot_config/shell/90-theme-switch.sh +0 -70
  485. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  486. package/dot_config/waybar/style.css +0 -8
  487. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  488. package/dot_local/bin/executable_zig-install +0 -89
  489. package/dot_local/bin/voice_ops +0 -7
  490. package/scripts/ops/health-check.sh +0 -380
  491. package/scripts/tests/README.md +0 -241
  492. package/scripts/tests/benchmark.sh +0 -91
  493. package/scripts/tests/framework/assertions.sh +0 -283
  494. package/scripts/tests/framework/mocks.sh +0 -201
  495. package/scripts/tests/framework/test_runner.sh +0 -189
  496. package/scripts/tests/integration/test_install.sh +0 -237
  497. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  498. package/scripts/tests/performance/regression_check.sh +0 -73
  499. package/scripts/tests/performance/stress_test.sh +0 -65
  500. package/scripts/tests/test-aliases.sh +0 -25
  501. package/scripts/tests/test-docker.sh +0 -48
  502. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  503. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  504. package/scripts/tests/unit/test_backup.sh +0 -227
  505. package/scripts/tests/unit/test_case_functions.sh +0 -238
  506. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  507. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  508. package/scripts/tests/unit/test_encode64.sh +0 -67
  509. package/scripts/tests/unit/test_environment.sh +0 -78
  510. package/scripts/tests/unit/test_extract.sh +0 -163
  511. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  512. package/scripts/tests/unit/test_genpass.sh +0 -298
  513. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  514. package/scripts/tests/unit/test_installers.sh +0 -172
  515. package/scripts/tests/unit/test_keygen.sh +0 -68
  516. package/scripts/tests/unit/test_logging.sh +0 -96
  517. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  518. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  519. package/scripts/tests/unit/test_prependpath.sh +0 -66
  520. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  521. package/scripts/tests/unit/test_rd.sh +0 -230
  522. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  523. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  524. package/scripts/tests/unit/test_template_validation.sh +0 -238
  525. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  526. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  527. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  528. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  529. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  530. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  531. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  532. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  533. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  534. package/scripts/tests/unit/test_zipf.sh +0 -76
  535. /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
  536. /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
  537. /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
  538. /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
  539. /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
  540. /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
  541. /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
  542. /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
  543. /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
  544. /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
  545. /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
  546. /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
@@ -1,187 +1,314 @@
1
1
  #!/usr/bin/env bash
2
- # tmux-sessionizer - Fuzzy session switcher for tmux
3
- #
4
- # This script provides a fuzzy-finder interface for switching between
5
- # tmux sessions and creating new sessions from project directories.
6
- #
7
- # Usage:
8
- # tmux-sessionizer [directory]
9
- #
10
- # If no directory is provided, uses fzf to select from:
11
- # - Existing tmux sessions
12
- # - Project directories from configured paths
13
- #
14
- # Configuration:
15
- # Set TMUX_SESSIONIZER_DIRS to customise search paths (colon-separated)
16
- # Default: ~/projects:~/work:~/src:~/.dotfiles
17
- #
18
- # References:
19
- # - ThePrimeagen's original: https://github.com/ThePrimeagen/.dotfiles
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## tmux-sessionizer — Fuzzy project session manager for tmux.
4
+ ##
5
+ ## Combines zoxide frecency, project directories, and active sessions
6
+ ## into a single fzf picker with live previews.
7
+ ##
8
+ ## # Usage
9
+ ## tmux-sessionizer # Interactive picker
10
+ ## tmux-sessionizer /path/to/project # Create/switch directly
11
+ ## tmux-sessionizer --kill # Kill a session interactively
12
+ ##
13
+ ## # Configuration
14
+ ## TMUX_SESSIONIZER_DIRS Search paths (colon-separated)
15
+ ## Default: ~/projects:~/work:~/src:~/.dotfiles
16
+ ##
17
+ ## # Keybindings (inside fzf)
18
+ ## Enter Switch to session
19
+ ## Ctrl-X Kill selected session
20
+ ## Ctrl-N New session from directory
21
+ ## Ctrl-R Refresh list
20
22
 
21
23
  set -euo pipefail
22
24
 
23
- # Configuration
25
+ # --- Configuration ---
24
26
  SESSIONIZER_DIRS="${TMUX_SESSIONIZER_DIRS:-$HOME/projects:$HOME/work:$HOME/src:$HOME/.dotfiles}"
25
27
 
26
- # Colours for output
27
- readonly RED='\033[0;31m'
28
- readonly GREEN='\033[0;32m'
29
- readonly NC='\033[0m' # No Colour
28
+ # --- Colors ---
29
+ readonly DIM=$'\033[2m'
30
+ readonly BOLD=$'\033[1m'
31
+ readonly GREEN=$'\033[32m'
32
+ readonly BLUE=$'\033[34m'
33
+ readonly RED=$'\033[31m'
34
+ readonly NC=$'\033[0m'
30
35
 
31
- log_error() {
32
- echo -e "${RED}Error:${NC} $1" >&2
33
- }
36
+ # --- Dependency checks ---
37
+ for cmd in fzf tmux; do
38
+ if ! command -v "$cmd" &>/dev/null; then
39
+ echo "${RED}Error:${NC} $cmd required" >&2
40
+ exit 1
41
+ fi
42
+ done
34
43
 
35
- log_info() {
36
- echo -e "${GREEN}Info:${NC} $1"
44
+ # --- Helper functions ---
45
+
46
+ # Get project directories from configured paths
47
+ get_project_dirs() {
48
+ local paths
49
+ IFS=':' read -ra paths <<<"$SESSIONIZER_DIRS"
50
+ for path in "${paths[@]}"; do
51
+ local expanded="${path/#\~/$HOME}"
52
+ [[ -d "$expanded" ]] && find "$expanded" -mindepth 1 -maxdepth 2 -type d 2>/dev/null | head -200
53
+ done
37
54
  }
38
55
 
39
- # Check dependencies
40
- if ! command -v fzf &>/dev/null; then
41
- log_error "fzf is required but not installed."
42
- exit 1
43
- fi
56
+ # Get zoxide frecency results (most visited directories)
57
+ get_zoxide_dirs() {
58
+ if command -v zoxide &>/dev/null; then
59
+ zoxide query --list 2>/dev/null | head -20
60
+ fi
61
+ }
44
62
 
45
- if ! command -v tmux &>/dev/null; then
46
- log_error "tmux is required but not installed."
47
- exit 1
48
- fi
49
-
50
- # Get list of directories to search (as newline-separated list for safe iteration)
51
- get_search_dirs() {
52
- local paths
53
- IFS=':' read -ra paths <<< "$SESSIONIZER_DIRS"
54
- for path in "${paths[@]}"; do
55
- # Expand tilde
56
- local expanded_path="${path/#\~/$HOME}"
57
- if [[ -d "$expanded_path" ]]; then
58
- printf '%s\n' "$expanded_path"
59
- fi
60
- done
63
+ # Get active tmux sessions with metadata
64
+ get_sessions() {
65
+ tmux list-sessions -F "#{session_name}|#{session_windows}w|#{?session_attached,attached,}" 2>/dev/null || true
61
66
  }
62
67
 
63
- # Get list of project directories
64
- get_projects() {
65
- local search_dirs
66
- search_dirs=$(get_search_dirs)
68
+ # Build the combined list with icons and labels
69
+ build_list() {
70
+ local sessions projects zoxide_dirs
67
71
 
68
- if [[ -z "$search_dirs" ]]; then
69
- return
70
- fi
72
+ # Active sessions (top priority, green icon)
73
+ sessions=$(get_sessions)
74
+ if [[ -n "$sessions" ]]; then
75
+ while IFS='|' read -r name windows attached; do
76
+ local icon="● "
77
+ local suffix="${DIM}${windows}${NC}"
78
+ [[ -n "$attached" ]] && suffix="${suffix} ${GREEN}${attached}${NC}"
79
+ printf '%b\n' "${GREEN}${icon}${NC}${BOLD}${name}${NC} ${suffix}"
80
+ done <<<"$sessions"
81
+ fi
82
+
83
+ # Zoxide frecent directories (blue icon, deduplicated against sessions)
84
+ zoxide_dirs=$(get_zoxide_dirs)
85
+ if [[ -n "$zoxide_dirs" ]]; then
86
+ while IFS= read -r dir; do
87
+ [[ ! -d "$dir" ]] && continue
88
+ local name
89
+ name=$(basename "$dir" | tr '.' '_' | tr -cd '[:alnum:]._-')
90
+ # Skip if already an active session
91
+ if tmux has-session -t="$name" 2>/dev/null; then
92
+ continue
93
+ fi
94
+ printf '%b\n' "${BLUE}◆ ${NC}${name} ${DIM}${dir}${NC}"
95
+ done <<<"$zoxide_dirs"
96
+ fi
71
97
 
72
- # Find directories (1-2 levels deep) - iterate safely over newline-separated dirs
98
+ # Project directories (dim icon, deduplicated)
99
+ projects=$(get_project_dirs)
100
+ if [[ -n "$projects" ]]; then
73
101
  while IFS= read -r dir; do
74
- find "$dir" -mindepth 1 -maxdepth 2 -type d 2>/dev/null
75
- done <<< "$search_dirs" | sort -u
102
+ local name
103
+ name=$(basename "$dir" | tr '.' '_' | tr -cd '[:alnum:]._-')
104
+ # Skip if already listed
105
+ if tmux has-session -t="$name" 2>/dev/null; then
106
+ continue
107
+ fi
108
+ # Skip if already in zoxide list
109
+ if [[ -n "$zoxide_dirs" ]] && echo "$zoxide_dirs" | grep -qF "$dir"; then
110
+ continue
111
+ fi
112
+ printf '%b\n' "${DIM}○ ${NC}${name} ${DIM}${dir}${NC}"
113
+ done <<<"$projects"
114
+ fi
76
115
  }
77
116
 
78
- # Get list of existing tmux sessions
79
- get_sessions() {
80
- tmux list-sessions -F "#{session_name}" 2>/dev/null || true
117
+ # Format session name from path
118
+ format_name() {
119
+ [[ -n "${1:-}" ]] || return 1 # R5: validate input
120
+ local dir="$1"
121
+ basename "$dir" | tr '.' '_' | tr -cd '[:alnum:]._-' | head -c 32
81
122
  }
82
123
 
83
- # Format session name from directory path (sanitized for tmux)
84
- format_session_name() {
85
- local dir="$1"
86
- local name
124
+ # Resolve the actual path from a selection line
125
+ resolve_selection() {
126
+ [[ -n "${1:-}" ]] || return 1 # R5: validate input
127
+ local line="$1"
128
+ # Strip ANSI codes
129
+ local clean
130
+ clean=$(echo "$line" | sed 's/\x1b\[[0-9;]*m//g')
87
131
 
88
- # Get basename, replace dots with underscores, and strip unsafe chars
89
- name=$(basename "$dir" | tr '.' '_' | tr -cd '[:alnum:]._-')
132
+ # Extract the name (second field after icon)
133
+ local name path
134
+ name=$(echo "$clean" | awk '{print $2}')
135
+ path=$(echo "$clean" | awk '{print $3}')
90
136
 
91
- # Remove leading numbers/dashes for cleaner names
92
- name="${name##[0-9_-]}"
93
- name="${name##[0-9_-]}"
94
- name="${name##[0-9_-]}"
137
+ # If it's an active session, just return the name
138
+ if tmux has-session -t="$name" 2>/dev/null; then
139
+ echo "session:$name"
140
+ return
141
+ fi
95
142
 
96
- # If name is empty after cleanup, use sanitized full basename
97
- if [[ -z "$name" ]]; then
98
- name=$(basename "$dir" | tr -cd '[:alnum:]._-')
143
+ # If path exists, return it
144
+ if [[ -n "$path" && -d "$path" ]]; then
145
+ echo "dir:$path"
146
+ return
147
+ fi
148
+
149
+ # Try to find the directory by name
150
+ local found
151
+ found=$(get_project_dirs 2>/dev/null | grep "/${name}$" | head -1)
152
+ if [[ -n "$found" ]]; then
153
+ echo "dir:$found"
154
+ return
155
+ fi
156
+
157
+ # Try zoxide
158
+ if command -v zoxide &>/dev/null; then
159
+ found=$(zoxide query "$name" 2>/dev/null || true)
160
+ if [[ -n "$found" && -d "$found" ]]; then
161
+ echo "dir:$found"
162
+ return
99
163
  fi
164
+ fi
100
165
 
101
- # Limit length for safety
102
- echo "${name:0:32}"
166
+ echo "name:$name"
103
167
  }
104
168
 
105
- # Switch to or create a tmux session
106
- switch_to_session() {
107
- local selected="$1"
108
- local session_name
169
+ # Switch to or create a session
170
+ switch_to() {
171
+ [[ -n "${1:-}" ]] || return 1 # R5: validate input
172
+ local target="$1"
173
+ local type="${target%%:*}"
174
+ local value="${target#*:}"
109
175
 
110
- if [[ -z "$selected" ]]; then
111
- log_error "No selection made."
112
- exit 0
113
- fi
176
+ local session_name
114
177
 
115
- # Check if selection is an existing session
116
- if tmux has-session -t="$selected" 2>/dev/null; then
117
- session_name="$selected"
118
- else
119
- # It's a directory - create or switch to session
120
- if [[ ! -d "$selected" ]]; then
121
- log_error "Directory does not exist: $selected"
122
- exit 1
123
- fi
124
-
125
- session_name=$(format_session_name "$selected")
126
-
127
- # Create session if it doesn't exist
128
- if ! tmux has-session -t="$session_name" 2>/dev/null; then
129
- tmux new-session -ds "$session_name" -c "$selected"
130
- log_info "Created new session: $session_name"
131
- fi
132
- fi
178
+ case "$type" in
179
+ session)
180
+ session_name="$value"
181
+ ;;
182
+ dir)
183
+ session_name=$(format_name "$value")
184
+ if ! tmux has-session -t="$session_name" 2>/dev/null; then
185
+ tmux new-session -ds "$session_name" -c "$value"
186
+ # Record in zoxide
187
+ command -v zoxide &>/dev/null && zoxide add "$value" 2>/dev/null || true
188
+ fi
189
+ ;;
190
+ name)
191
+ session_name="$value"
192
+ if ! tmux has-session -t="$session_name" 2>/dev/null; then
193
+ tmux new-session -ds "$session_name"
194
+ fi
195
+ ;;
196
+ esac
197
+
198
+ if [[ -z "${TMUX:-}" ]]; then
199
+ tmux attach-session -t "$session_name"
200
+ else
201
+ tmux switch-client -t "$session_name"
202
+ fi
203
+ }
204
+
205
+ # Kill a session interactively
206
+ kill_session() {
207
+ local sessions
208
+ sessions=$(tmux list-sessions -F "#{session_name}" 2>/dev/null || true)
209
+ if [[ -z "$sessions" ]]; then
210
+ echo "No active sessions."
211
+ return
212
+ fi
213
+
214
+ local selected
215
+ selected=$(echo "$sessions" | fzf \
216
+ --header "Kill session" \
217
+ --prompt "Session > " \
218
+ --height 40% \
219
+ --reverse \
220
+ --no-preview \
221
+ --no-sort) || return 0
222
+
223
+ if [[ -n "$selected" ]]; then
224
+ tmux kill-session -t "$selected"
225
+ echo "${RED}Killed:${NC} $selected"
226
+ fi
227
+ }
133
228
 
134
- # Switch to the session
135
- if [[ -z "${TMUX:-}" ]]; then
136
- # Not inside tmux - attach directly
137
- tmux attach-session -t "$session_name"
138
- else
139
- # Inside tmux - switch client
140
- tmux switch-client -t "$session_name"
229
+ # --- Preview command for fzf ---
230
+ preview_cmd() {
231
+ local line="$1"
232
+ local clean
233
+ clean=$(echo "$line" | sed 's/\x1b\[[0-9;]*m//g')
234
+ local name path
235
+ name=$(echo "$clean" | awk '{print $2}')
236
+ path=$(echo "$clean" | awk '{print $3}')
237
+
238
+ # If it's an active session, show pane content
239
+ if tmux has-session -t="$name" 2>/dev/null; then
240
+ echo "━━━ Session: $name ━━━"
241
+ tmux list-windows -t "$name" -F " #I: #W #{?window_active,●,○}" 2>/dev/null
242
+ echo ""
243
+ tmux capture-pane -pt "$name" -p 2>/dev/null | head -20
244
+ elif [[ -n "$path" && -d "$path" ]]; then
245
+ echo "━━━ Directory: $path ━━━"
246
+ # Show git info if available
247
+ if [[ -d "$path/.git" ]]; then
248
+ echo " Branch: $(git -C "$path" branch --show-current 2>/dev/null)"
249
+ echo " Commits: $(git -C "$path" rev-list --count HEAD 2>/dev/null)"
250
+ echo ""
141
251
  fi
252
+ ls -la "$path" 2>/dev/null | head -15
253
+ else
254
+ echo "No preview available"
255
+ fi
142
256
  }
257
+ export -f preview_cmd
143
258
 
144
- # Main function
259
+ # --- Main ---
145
260
  main() {
146
- local selected
147
-
148
- # If argument provided, use it directly
149
- if [[ $# -eq 1 ]]; then
150
- selected="$1"
151
- else
152
- # Build selection list: existing sessions + project directories
153
- local sessions projects combined
154
-
155
- sessions=$(get_sessions)
156
- projects=$(get_projects)
157
-
158
- # Combine and deduplicate
159
- if [[ -n "$sessions" ]] && [[ -n "$projects" ]]; then
160
- combined=$(printf "%s\n%s" "$sessions" "$projects" | sort -u)
161
- elif [[ -n "$sessions" ]]; then
162
- combined="$sessions"
163
- elif [[ -n "$projects" ]]; then
164
- combined="$projects"
165
- else
166
- log_error "No sessions or project directories found."
167
- exit 1
168
- fi
169
-
170
- # Use fzf for selection
171
- selected=$(echo "$combined" | fzf \
172
- --height=50% \
173
- --layout=reverse \
174
- --border=rounded \
175
- --prompt="Session > " \
176
- --header="Select a session or directory" \
177
- --preview='if [ -d {} ]; then ls -la {}; else tmux capture-pane -pt {} -p 2>/dev/null | head -20; fi' \
178
- --preview-window=right:50%:wrap \
179
- --bind='ctrl-d:preview-page-down' \
180
- --bind='ctrl-u:preview-page-up' \
181
- ) || exit 0
182
- fi
261
+ # Handle flags
262
+ case "${1:-}" in
263
+ --kill | -k)
264
+ kill_session
265
+ return
266
+ ;;
267
+ --help | -h)
268
+ echo "${BOLD}tmux-sessionizer${NC} fuzzy project session manager"
269
+ echo ""
270
+ echo "Usage: tmux-sessionizer [path | --kill | --help]"
271
+ echo ""
272
+ echo "Keybindings:"
273
+ echo " Enter Switch to session"
274
+ echo " Ctrl-X Kill selected session"
275
+ return
276
+ ;;
277
+ esac
278
+
279
+ # Direct path argument
280
+ if [[ $# -eq 1 && -d "$1" ]]; then
281
+ switch_to "dir:$1"
282
+ return
283
+ fi
284
+
285
+ # Interactive picker
286
+ local list
287
+ list=$(build_list)
288
+
289
+ if [[ -z "$list" ]]; then
290
+ echo "${RED}No sessions or directories found.${NC}" >&2
291
+ exit 1
292
+ fi
293
+
294
+ local selected
295
+ selected=$(
296
+ printf '%b\n' "$list" | fzf \
297
+ --ansi \
298
+ --header "tmux sessions (Ctrl-X: kill)" \
299
+ --prompt "❱ " \
300
+ --height 60% \
301
+ --reverse \
302
+ --no-sort \
303
+ --no-preview \
304
+ --bind "ctrl-x:execute-silent(tmux kill-session -t {2} 2>/dev/null)+reload(bash -c 'source $0; build_list')"
305
+ ) || exit 0
183
306
 
184
- switch_to_session "$selected"
307
+ if [[ -n "$selected" ]]; then
308
+ local target
309
+ target=$(resolve_selection "$selected")
310
+ switch_to "$target"
311
+ fi
185
312
  }
186
313
 
187
314
  main "$@"