dotfiles-tui 0.0.5

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 (204) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +4 -0
  3. data/.gitattributes +1 -0
  4. data/.github/workflows/publish-gem.yml +36 -0
  5. data/.gitignore +316 -0
  6. data/.shellcheckrc +1 -0
  7. data/.stow-local-ignore +23 -0
  8. data/.vscode/settings.json +2 -0
  9. data/Configs/aerospace/.config/aerospace/aerospace.toml +265 -0
  10. data/Configs/alacritty/.config/alacritty/alacritty.toml +31 -0
  11. data/Configs/conda/.condarc +1 -0
  12. data/Configs/continue/.continue/.continueignore +0 -0
  13. data/Configs/continue/.continue/.continuerc.json +3 -0
  14. data/Configs/continue/.continue/config.json +48 -0
  15. data/Configs/docker/.docker/completion/completion.zsh +3 -0
  16. data/Configs/editorconfig/.editorconfig +16 -0
  17. data/Configs/fzf/.fzf/completion/completion.zsh +8 -0
  18. data/Configs/git/.config/gitconfig/core +83 -0
  19. data/Configs/git/.config/gitconfig/home +20 -0
  20. data/Configs/git/.config/gitconfig/template.txt +7 -0
  21. data/Configs/git/.config/gitconfig/work +23 -0
  22. data/Configs/git/.gitconfig +25 -0
  23. data/Configs/gpg/.gnupg/.#lk0x000000015060b4e0.macBook.pro.24088 +2 -0
  24. data/Configs/gpg/.gnupg/gpg-agent.conf +3 -0
  25. data/Configs/gpg/.gnupg/openpgp-revocs.d/DE999E2ACEAE3E8EAD660459688CB4D444FB1024.rev +28 -0
  26. data/Configs/gpg/.gnupg/private-keys-v1.d/0FF407C984AC03CCC60D924C5B315977DF45D5D0.key +7 -0
  27. data/Configs/gpg/.gnupg/private-keys-v1.d/2B711D7C4A8BE25322C9966B73E6842F7E64CD38.key +7 -0
  28. data/Configs/gpg/.gnupg/pubring.kbx +0 -0
  29. data/Configs/gpg/.gnupg/trustdb.gpg +0 -0
  30. data/Configs/kitty/.config/kitty/current-theme.conf +80 -0
  31. data/Configs/kitty/.config/kitty/kitty.conf +93 -0
  32. data/Configs/nvim/.config/nvim/.stylua.toml +6 -0
  33. data/Configs/nvim/.config/nvim/README.md +9 -0
  34. data/Configs/nvim/.config/nvim/init.lua +37 -0
  35. data/Configs/nvim/.config/nvim/lazy-lock.json +29 -0
  36. data/Configs/nvim/.config/nvim/lua/chadrc.lua +17 -0
  37. data/Configs/nvim/.config/nvim/lua/configs/conform.lua +15 -0
  38. data/Configs/nvim/.config/nvim/lua/configs/lazy.lua +47 -0
  39. data/Configs/nvim/.config/nvim/lua/configs/lspconfig.lua +24 -0
  40. data/Configs/nvim/.config/nvim/lua/configs/null_ls.lua +27 -0
  41. data/Configs/nvim/.config/nvim/lua/mappings.lua +10 -0
  42. data/Configs/nvim/.config/nvim/lua/options.lua +6 -0
  43. data/Configs/nvim/.config/nvim/lua/plugins/init.lua +25 -0
  44. data/Configs/oh-my-posh/.config/oh-my-posh/theme/config.json +71 -0
  45. data/Configs/pip/.config/pip/pip.conf +3 -0
  46. data/Configs/python/.pythonrc +25 -0
  47. data/Configs/starship/.config/starship/starship.toml +134 -0
  48. data/Configs/starship/.config/starship/themes/frappe.toml +27 -0
  49. data/Configs/starship/.config/starship/themes/latte.toml +27 -0
  50. data/Configs/starship/.config/starship/themes/macchiato.toml +27 -0
  51. data/Configs/starship/.config/starship/themes/mocha.toml +27 -0
  52. data/Configs/tmux/.tmux.conf +21 -0
  53. data/Configs/wezterm/.config/wezterm/core/colors.lua +10 -0
  54. data/Configs/wezterm/.config/wezterm/core/font.lua +5 -0
  55. data/Configs/wezterm/.config/wezterm/core/helper.lua +22 -0
  56. data/Configs/wezterm/.config/wezterm/core/init.lua +20 -0
  57. data/Configs/wezterm/.config/wezterm/core/keybindings/init.lua +16 -0
  58. data/Configs/wezterm/.config/wezterm/core/keybindings/macos.lua +106 -0
  59. data/Configs/wezterm/.config/wezterm/core/keybindings/windows.lua +99 -0
  60. data/Configs/wezterm/.config/wezterm/core/launch.lua +41 -0
  61. data/Configs/wezterm/.config/wezterm/core/maximized.lua +5 -0
  62. data/Configs/wezterm/.config/wezterm/core/mousebindings.lua +23 -0
  63. data/Configs/wezterm/.config/wezterm/core/tab_title.lua +26 -0
  64. data/Configs/wezterm/.config/wezterm/core/window.lua +8 -0
  65. data/Configs/wezterm/.config/wezterm/wezterm.lua +83 -0
  66. data/Configs/zellij/.config/zellij/config.kdl +410 -0
  67. data/Configs/zellij/.config/zellij/layouts/default.kdl +159 -0
  68. data/Configs/zellij/.config/zellij/plugins/room.wasm +0 -0
  69. data/Configs/zellij/.config/zellij/plugins/zjstatus.wasm +0 -0
  70. data/Configs/zsh/.hushlogin +0 -0
  71. data/Configs/zsh/.localrc +42 -0
  72. data/Configs/zsh/.profile +3 -0
  73. data/Configs/zsh/.shellcheckrc +1 -0
  74. data/Configs/zsh/.zprofile +3 -0
  75. data/Configs/zsh/.zsh/autoload/backup_restore +84 -0
  76. data/Configs/zsh/.zsh/autoload/cat +8 -0
  77. data/Configs/zsh/.zsh/autoload/change_wallpaper +1 -0
  78. data/Configs/zsh/.zsh/autoload/clean_dstore +6 -0
  79. data/Configs/zsh/.zsh/autoload/clean_pycache +6 -0
  80. data/Configs/zsh/.zsh/autoload/convert_mkv_to_mp4 +14 -0
  81. data/Configs/zsh/.zsh/autoload/create_macos_installer +26 -0
  82. data/Configs/zsh/.zsh/autoload/download +71 -0
  83. data/Configs/zsh/.zsh/autoload/fail +2 -0
  84. data/Configs/zsh/.zsh/autoload/flush_dns +6 -0
  85. data/Configs/zsh/.zsh/autoload/info +1 -0
  86. data/Configs/zsh/.zsh/autoload/ls +8 -0
  87. data/Configs/zsh/.zsh/autoload/reset_beyond_compare +15 -0
  88. data/Configs/zsh/.zsh/autoload/reset_final_cut_pro +5 -0
  89. data/Configs/zsh/.zsh/autoload/reset_launch_pad +3 -0
  90. data/Configs/zsh/.zsh/autoload/reset_open_list +3 -0
  91. data/Configs/zsh/.zsh/autoload/speedup_terminal +6 -0
  92. data/Configs/zsh/.zsh/autoload/start_aria2_server +1 -0
  93. data/Configs/zsh/.zsh/autoload/success +1 -0
  94. data/Configs/zsh/.zsh/autoload/update_system +19 -0
  95. data/Configs/zsh/.zsh/autoload/user +1 -0
  96. data/Configs/zsh/.zsh/autoload/vim +9 -0
  97. data/Configs/zsh/.zsh/autoload/warn +1 -0
  98. data/Configs/zsh/.zsh/completion/aliases.zsh +3 -0
  99. data/Configs/zsh/.zsh/completion/completion.zsh +33 -0
  100. data/Configs/zsh/.zsh/completion/config.zsh +118 -0
  101. data/Configs/zsh/.zsh/completion/exports.zsh +108 -0
  102. data/Configs/zsh/.zsh/completion/fpath.zsh +8 -0
  103. data/Configs/zsh/.zsh_history +283 -0
  104. data/Configs/zsh/.zshenv +2 -0
  105. data/Configs/zsh/.zshrc +54 -0
  106. data/Gemfile +3 -0
  107. data/Gemfile.lock +87 -0
  108. data/Hooks/adguard/pre.rb +7 -0
  109. data/Hooks/aerospace/pre.rb +8 -0
  110. data/Hooks/aide/post.rb +7 -0
  111. data/Hooks/aide/pre.rb +7 -0
  112. data/Hooks/alacritty/pre.rb +7 -0
  113. data/Hooks/alfred/pre.rb +7 -0
  114. data/Hooks/atuin/post.rb +27 -0
  115. data/Hooks/atuin/pre.rb +7 -0
  116. data/Hooks/bartender/pre.rb +7 -0
  117. data/Hooks/bun/pre.rb +7 -0
  118. data/Hooks/carapace/pre.rb +7 -0
  119. data/Hooks/cargo/pre.rb +7 -0
  120. data/Hooks/choosy/pre.rb +7 -0
  121. data/Hooks/controld/pre.rb +7 -0
  122. data/Hooks/core/common.rb +36 -0
  123. data/Hooks/core/final.rb +23 -0
  124. data/Hooks/core/lib/configurator.rb +593 -0
  125. data/Hooks/core/lib/display.rb +120 -0
  126. data/Hooks/core/lib/hook_config.rb +96 -0
  127. data/Hooks/core/lib/hook_context.rb +124 -0
  128. data/Hooks/core/lib/hooks.rb +45 -0
  129. data/Hooks/core/lib/logger.rb +23 -0
  130. data/Hooks/core/lib/menu.rb +70 -0
  131. data/Hooks/core/lib/spinner.rb +50 -0
  132. data/Hooks/core/lib/system.rb +78 -0
  133. data/Hooks/core/lib/tweaks.rb +59 -0
  134. data/Hooks/core/library.rb +3 -0
  135. data/Hooks/core/pre.rb +17 -0
  136. data/Hooks/ctrld/pre.rb +7 -0
  137. data/Hooks/deskpad/pre.rb +7 -0
  138. data/Hooks/fonts/pre.rb +60 -0
  139. data/Hooks/ghostty/pre.rb +10 -0
  140. data/Hooks/git/post.rb +20 -0
  141. data/Hooks/git/pre.rb +7 -0
  142. data/Hooks/gpg/post.rb +16 -0
  143. data/Hooks/gpg/pre.rb +7 -0
  144. data/Hooks/ice-hidemenubar/pre.rb +7 -0
  145. data/Hooks/iterm/IC Green PPL.itermcolors +344 -0
  146. data/Hooks/iterm/chalkboard.webp +0 -0
  147. data/Hooks/iterm/com.googlecode.iterm2.plist +2371 -0
  148. data/Hooks/iterm/post.rb +7 -0
  149. data/Hooks/iterm/pre.rb +7 -0
  150. data/Hooks/jujutsu/post.rb +13 -0
  151. data/Hooks/jujutsu/pre.rb +7 -0
  152. data/Hooks/keka/pre.rb +7 -0
  153. data/Hooks/kitty/pre.rb +7 -0
  154. data/Hooks/lazyvim/pre.rb +7 -0
  155. data/Hooks/lima/pre.rb +7 -0
  156. data/Hooks/little-snitch/pre.rb +7 -0
  157. data/Hooks/microsoft-edge/pre.rb +7 -0
  158. data/Hooks/mos/pre.rb +7 -0
  159. data/Hooks/nvchad/pre.rb +7 -0
  160. data/Hooks/oh-my-posh/config.json +58 -0
  161. data/Hooks/oh-my-posh/post.rb +7 -0
  162. data/Hooks/oh-my-posh/pre.rb +7 -0
  163. data/Hooks/pearcleaner/pre.rb +7 -0
  164. data/Hooks/pycharm/pre.rb +7 -0
  165. data/Hooks/raindropio/pre.rb +7 -0
  166. data/Hooks/rectangle/RectangleConfig.json +258 -0
  167. data/Hooks/rectangle/com.knollsoft.Rectangle.plist +0 -0
  168. data/Hooks/rectangle/post.rb +22 -0
  169. data/Hooks/rectangle/pre.rb +7 -0
  170. data/Hooks/slack/pre.rb +7 -0
  171. data/Hooks/soundsource/pre.rb +7 -0
  172. data/Hooks/ssh/post.rb +8 -0
  173. data/Hooks/starship/pre.rb +7 -0
  174. data/Hooks/sublime_text/post.rb +25 -0
  175. data/Hooks/sublime_text/pre.rb +7 -0
  176. data/Hooks/swiftformat-for-xcode/pre.rb +7 -0
  177. data/Hooks/syncthing/pre.rb +7 -0
  178. data/Hooks/synology/pre.rb +7 -0
  179. data/Hooks/tailscale/pre.rb +7 -0
  180. data/Hooks/tmux/post.rb +7 -0
  181. data/Hooks/tmux/pre.rb +7 -0
  182. data/Hooks/topnotch/pre.rb +7 -0
  183. data/Hooks/transmission/pre.rb +7 -0
  184. data/Hooks/vscode/extensions.txt +16 -0
  185. data/Hooks/vscode/keybindings.json +26 -0
  186. data/Hooks/vscode/post.rb +29 -0
  187. data/Hooks/vscode/pre.rb +9 -0
  188. data/Hooks/vscode/settings.json +139 -0
  189. data/Hooks/vscode/style.css +29 -0
  190. data/Hooks/wezterm/pre.rb +7 -0
  191. data/Hooks/wins/pre.rb +7 -0
  192. data/Hooks/zed/pre.rb +7 -0
  193. data/Hooks/zellij/post.rb +7 -0
  194. data/Hooks/zellij/pre.rb +7 -0
  195. data/Hooks/zoxide/pre.rb +7 -0
  196. data/Hooks/zsh/pre.rb +19 -0
  197. data/LICENSE +21 -0
  198. data/README.md +100 -0
  199. data/bin/dotfiles-tui +6 -0
  200. data/bootstrap.rb +186 -0
  201. data/dotfiles-tui.gemspec +47 -0
  202. data/lib/dotfiles_tui/version.rb +5 -0
  203. data/lib/dotfiles_tui.rb +15 -0
  204. metadata +275 -0
@@ -0,0 +1,26 @@
1
+ [
2
+ {
3
+ "key": "ctrl+shift+e",
4
+ "command": "workbench.view.explorer"
5
+ },
6
+ {
7
+ "key": "ctrl+shift+g",
8
+ "command": "workbench.view.scm"
9
+ },
10
+ {
11
+ "key": "ctrl+shift+f",
12
+ "command": "workbench.action.findInFiles"
13
+ },
14
+ {
15
+ "key": "ctrl+shift+x",
16
+ "command": "workbench.view.extensions"
17
+ },
18
+ {
19
+ "key": "ctrl+shift+t",
20
+ "command": "workbench.view.extension.test"
21
+ },
22
+ {
23
+ "key": "ctrl+shift+d",
24
+ "command": "workbench.view.debug"
25
+ }
26
+ ]
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative '../core/common'
5
+
6
+ Bootstrap::Hooks.run('vscode', stage: :post) do |hook|
7
+ code_binary = `command -v code`.strip
8
+ next if code_binary.empty?
9
+
10
+ extensions_file = hook.hook_path('extensions.txt')
11
+ if File.exist?(extensions_file)
12
+ File.read(extensions_file).split.each do |extension|
13
+ next if extension.strip.empty?
14
+
15
+ hook.run("#{code_binary} --install-extension #{extension.strip} --force", allow_failure: true)
16
+ end
17
+ end
18
+
19
+ user_dir = File.join(Dir.home, 'Library', 'Application Support', 'Code', 'User')
20
+ FileUtils.mkdir_p(user_dir)
21
+
22
+ %w[keybindings.json settings.json style.css].each do |file_name|
23
+ source = hook.hook_path(file_name)
24
+ next unless File.exist?(source)
25
+
26
+ destination = File.join(user_dir, file_name)
27
+ hook.copy(source, destination)
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative '../core/common'
5
+
6
+ Bootstrap::Hooks.run('vscode', stage: :pre) do |hook|
7
+ user_dir = File.join(Dir.home, 'Library', 'Application Support', 'Code', 'User')
8
+ FileUtils.mkdir_p(user_dir)
9
+ end
@@ -0,0 +1,139 @@
1
+ {
2
+ "vscode_custom_css.statusbar": false,
3
+ "vscode_custom_css.imports": [
4
+ "file:///Users/narender/Library/Application Support/Code/User/style.css"
5
+ ],
6
+ "[css]": {
7
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
8
+ },
9
+ "[html]": {
10
+ "editor.defaultFormatter": "vscode.html-language-features"
11
+ },
12
+ "[jsonc]": {
13
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
14
+ },
15
+ "[typescriptreact]": {
16
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
17
+ },
18
+ "breadcrumbs.enabled": false,
19
+ "chat.editor.fontSize": 14,
20
+ "chat.editor.wordWrap": "on",
21
+ "diffEditor.hideUnchangedRegions.enabled": true,
22
+ "diffEditor.ignoreTrimWhitespace": false,
23
+ "editor.bracketPairColorization.enabled": false,
24
+ "editor.folding": true,
25
+ "editor.foldingStrategy": "auto",
26
+ "editor.fontFamily": "Cascadia Code, Consolas, 'Courier New', monospace",
27
+ "editor.fontLigatures": true,
28
+ "editor.fontSize": 14,
29
+ "editor.fontWeight": "400",
30
+ "editor.formatOnSave": true,
31
+ "editor.glyphMargin": false,
32
+ "editor.guides.highlightActiveBracketPair": true,
33
+ "editor.guides.indentation": false,
34
+ "editor.hideCursorInOverviewRuler": true,
35
+ "editor.inlineSuggest.enabled": true,
36
+ "editor.lightbulb.enabled": "off",
37
+ "editor.lineNumbers": "on",
38
+ "editor.linkedEditing": true,
39
+ "editor.matchBrackets": "never",
40
+ "editor.minimap.autohide": true,
41
+ "editor.minimap.maxColumn": 80,
42
+ "editor.minimap.renderCharacters": false,
43
+ "editor.multiCursorModifier": "alt",
44
+ "editor.occurrencesHighlight": "off",
45
+ "editor.overviewRulerBorder": false,
46
+ "editor.padding.top": 10,
47
+ "editor.renderWhitespace": "none",
48
+ "editor.scrollbar.horizontal": "hidden",
49
+ "editor.scrollbar.vertical": "auto",
50
+ "editor.scrollbar.verticalScrollbarSize": 0,
51
+ "editor.showFoldingControls": "mouseover",
52
+ "editor.suggestSelection": "first",
53
+ "explorer.compactFolders": false,
54
+ "explorer.fileNesting.enabled": true,
55
+ "explorer.fileNesting.expand": false,
56
+ "explorer.openEditors.visible": 1,
57
+ "files.autoSave": "afterDelay",
58
+ "files.autoSaveDelay": 10000,
59
+ "files.exclude": {
60
+ "/.classpath": true,
61
+ "/.factorypath": true,
62
+ "/.project": true,
63
+ "/.settings": true
64
+ },
65
+ "files.watcherExclude": {
66
+ "/.git/objects/": true,
67
+ "/node_modules/": true
68
+ },
69
+ "git.autofetch": true,
70
+ "redhat.telemetry.enabled": false,
71
+ "scm.diffDecorations": "none",
72
+ "scm.showIncomingChanges": "always",
73
+ "scm.showOutgoingChanges": "always",
74
+ "terminal.integrated.cursorStyle": "block",
75
+ "terminal.integrated.defaultLocation": "view",
76
+ "terminal.integrated.defaultProfile.windows": "PowerShell",
77
+ "terminal.integrated.env.windows": {},
78
+ "terminal.integrated.fontFamily": "FiraCode Nerd Font, Consolas, 'Courier New', monospace",
79
+ "terminal.integrated.fontSize": 14,
80
+ "terminal.integrated.fontWeight": "500",
81
+ "terminal.integrated.gpuAcceleration": "on",
82
+ "terminal.integrated.lineHeight": 1.1,
83
+ "terminal.integrated.persistentSessionReviveProcess": "onExitAndWindowClose",
84
+ "terminal.integrated.profiles.windows": {
85
+ "Command Prompt": {
86
+ "args": [],
87
+ "icon": "terminal-powershell",
88
+ "path": [
89
+ "${env:windir}\\Sysnative\\powershell",
90
+ "${env:windir}\\System32\\powershell.exe"
91
+ ]
92
+ },
93
+ "Git Bash": {
94
+ "source": "Git Bash"
95
+ },
96
+ "PowerShell": {
97
+ "icon": "terminal-powershell",
98
+ "source": "PowerShell"
99
+ }
100
+ },
101
+ "terminal.integrated.scrollback": 10000,
102
+ "terminal.integrated.shellIntegration.decorationsEnabled": "never",
103
+ "terminal.integrated.tabs.enabled": true,
104
+ "terminal.integrated.tabs.location": "right",
105
+ "window.autoDetectColorScheme": true,
106
+ "window.commandCenter": true,
107
+ "window.density.editorTabHeight": "compact",
108
+ "window.newWindowDimensions": "inherit",
109
+ "window.zoomPerWindow": true,
110
+ "workbench.activityBar.location": "hidden",
111
+ "workbench.colorCustomizations": {
112
+ "[mono-cl]": {
113
+ "editorLineNumber.foreground": "#4b4b4b"
114
+ },
115
+ "[Violaceous (rainglow)]": {
116
+ "editorGutter.background": "#242038",
117
+ "terminal.background": "#242038",
118
+ "titleBar.activeBackground": "#242038",
119
+ "titleBar.activeForeground": "#ffffff"
120
+ },
121
+ "window.titleBarStyle": ""
122
+ },
123
+ "workbench.colorTheme": "Catppuccin Mocha",
124
+ "workbench.editor.enablePreview": true,
125
+ "workbench.iconTheme": "catppuccin-mocha",
126
+ "workbench.layoutControl.enabled": false,
127
+ "workbench.layoutControl.type": "both",
128
+ "workbench.panel.defaultLocation": "bottom",
129
+ "workbench.preferredDarkColorTheme": "Catppuccin Mocha",
130
+ "workbench.preferredHighContrastLightColorTheme": "Catppuccin Mocha",
131
+ "workbench.preferredLightColorTheme": "Catppuccin Mocha",
132
+ "workbench.productIconTheme": "fluent-icons",
133
+ "workbench.reduceMotion": "on",
134
+ "workbench.sideBar.location": "left",
135
+ "workbench.startupEditor": "none",
136
+ "workbench.statusBar.visible": false,
137
+ "workbench.tree.renderIndentGuides": "none",
138
+ "workbench.view.alwaysShowHeaderActions": true
139
+ }
@@ -0,0 +1,29 @@
1
+ .quick-input-widget {
2
+ position: fixed !important;
3
+ top: 45% !important;
4
+ left: 65% !important;
5
+ transform: translate(-50%, -50%) !important;
6
+ width: 50% !important;
7
+ background-color: #0ff !important; /* Neon blue background */
8
+ box-shadow: 0 0 10px #0ff, 0 0 20px #0ff, 0 0 30px #0ff, 0 0 40px #0ff !important; /* Neon blue glow */
9
+ color: #000 !important; /* Text color */
10
+ }
11
+
12
+ /* Adjust the color of the items in the input widget list */
13
+ .quick-input-widget .quick-input-list .monaco-list-row {
14
+ color: #fff !important; /* White text color for better readability */
15
+ background-color: #333 !important; /* Dark background for contrast */
16
+ }
17
+
18
+ /* Adjust the color of the selected item */
19
+ .quick-input-widget .quick-input-list .monaco-list-row.focused {
20
+ background-color: #555 !important; /* Slightly lighter background for the selected item */
21
+ color: #0ff !important; /* Neon blue text color for the selected item */
22
+ }
23
+
24
+ .activity-bar .monaco-action-bar .actions-container {
25
+ display: flex;
26
+ flex-direction: column-reverse;
27
+ height: 100%;
28
+ justify-content: flex-end;
29
+ }
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('wezterm', stage: :pre) do |_hook|
6
+ # No actions defined. Enable this hook via config/hooks.yml when needed.
7
+ end
data/Hooks/wins/pre.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('wins', stage: :pre) do |_hook|
6
+ # No actions defined. Enable this hook via config/hooks.yml when needed.
7
+ end
data/Hooks/zed/pre.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('zed', stage: :pre) do |hook|
6
+ hook.run('/opt/homebrew/bin/brew install --quiet --cask zed')
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('zellij', stage: :post) do |_hook|
6
+ # No post actions defined.
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('zellij', stage: :pre) do |_hook|
6
+ # No actions defined. Enable this hook via config/hooks.yml when needed.
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('zoxide', stage: :pre) do |hook|
6
+ hook.run('/opt/homebrew/bin/brew install --formula zoxide')
7
+ end
data/Hooks/zsh/pre.rb ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/common'
4
+
5
+ Bootstrap::Hooks.run('zsh', stage: :pre) do |hook|
6
+ zap_dir = File.join(Dir.home, '.local', 'share', 'zap')
7
+ unless Dir.exist?(zap_dir)
8
+ hook.run('curl -s https://raw.githubusercontent.com/zap-zsh/zap/master/install.zsh | zsh -s -- --branch release-v1', allow_failure: true)
9
+ end
10
+
11
+ zap_script = File.join(ENV.fetch('XDG_DATA_HOME', File.join(Dir.home, '.local', 'share')), 'zap', 'zap.zsh')
12
+ if File.exist?(zap_script) && File.exist?(File.join(Dir.home, '.zshrc'))
13
+ hook.remove_path(File.join(Dir.home, '.zshrc'))
14
+ end
15
+
16
+ %w[.zprofile .profile .zshenv .zsh_history].each do |file|
17
+ hook.remove_path(File.join(Dir.home, file))
18
+ end
19
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Narender
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # Dotfiles TUI
2
+
3
+ A beautiful, interactive terminal UI for managing dotfiles, installing packages, and bootstrapping your development environment.
4
+
5
+ ## Installation
6
+
7
+ ### From RubyGems (Recommended)
8
+
9
+ ```bash
10
+ gem install dotfiles-tui
11
+ ```
12
+
13
+ ### From Source
14
+
15
+ ```bash
16
+ git clone https://github.com/yourusername/dotfiles.git
17
+ cd dotfiles/dotfiles.ruby
18
+ gem build dotfiles-tui.gemspec
19
+ gem install ./dotfiles-tui-0.0.1.gem
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ Simply run the command to launch the interactive menu:
25
+
26
+ ```bash
27
+ dotfiles-tui
28
+ ```
29
+
30
+ ### Command-line Options
31
+
32
+ ```bash
33
+ dotfiles-tui [options]
34
+
35
+ Options:
36
+ -a, --all Run all tasks (Link → Install → Link)
37
+ -l, --link Run stow for linking
38
+ -u, --unlink Run stow for unlinking
39
+ -c, --cask Run cask installer
40
+ -f, --formula Run formula installer
41
+ -m, --mos Install Mac App Store Apps
42
+ -d, --dry-run Run in dry-run mode (no changes)
43
+ --secrets-path PATH Path to secrets directory (default: ~/Documents/Secrets)
44
+ -h, --help Display help message
45
+ ```
46
+
47
+ ### Examples
48
+
49
+ ```bash
50
+ # Interactive mode (default)
51
+ dotfiles-tui
52
+
53
+ # Install formulae only
54
+ dotfiles-tui --formula
55
+
56
+ # Dry run to see what would happen
57
+ dotfiles-tui --all --dry-run
58
+
59
+ # Link configs with custom secrets path
60
+ dotfiles-tui --link --secrets-path ~/my-secrets
61
+ ```
62
+
63
+ ## Features
64
+
65
+ - 🎨 **Beautiful TUI** with animated spinners and clean output
66
+ - 📦 **Smart Installation** - skips already installed packages
67
+ - 🔗 **Intelligent Linking** - detects existing symlinks
68
+ - 🔐 **Secrets Management** - inject private configs from external directory
69
+ - ⚡ **Fast** - optimized to skip redundant operations
70
+ - 🧪 **Dry Run Mode** - preview changes before applying
71
+
72
+ ## Requirements
73
+
74
+ - Ruby >= 2.7.0
75
+ - macOS (for Homebrew features)
76
+ - GNU Stow (auto-installed if missing)
77
+
78
+ ## Development
79
+
80
+ ### Building Locally
81
+
82
+ ```bash
83
+ gem build dotfiles-tui.gemspec
84
+ gem install ./dotfiles-tui-0.0.1.gem
85
+ ```
86
+
87
+ ### Publishing
88
+
89
+ The gem is automatically published to RubyGems when you push a version tag:
90
+
91
+ ```bash
92
+ # Update version in lib/dotfiles_tui/version.rb
93
+ # Commit changes
94
+ git tag v0.0.1
95
+ git push origin v0.0.1
96
+ ```
97
+
98
+ ## License
99
+
100
+ MIT License - see [LICENSE](LICENSE) for details
data/bin/dotfiles-tui ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/dotfiles_tui'
5
+
6
+ DotfilesTui.run
data/bootstrap.rb ADDED
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ # Set up the Bundler environment
6
+ require 'bundler/setup'
7
+ require 'optparse'
8
+
9
+ require_relative './Hooks/core/common'
10
+ require_relative './Hooks/core/library'
11
+
12
+ # Load .env file if it exists
13
+ env_file = File.join(File.expand_path(__dir__), '.env')
14
+ if File.exist?(env_file)
15
+ File.foreach(env_file) do |line|
16
+ next if line.strip.start_with?('#') || line.strip.empty?
17
+
18
+ key, value = line.strip.split('=', 2)
19
+ ENV[key] = value if key && value
20
+ end
21
+ end
22
+
23
+
24
+ module Bootstrap
25
+ SCRIPT_DIR = File.expand_path(__dir__)
26
+ HOOKS_DIR = File.join(SCRIPT_DIR, 'Hooks')
27
+ CONFIGS_DIR = File.join(SCRIPT_DIR, 'Configs')
28
+ CORE_DIR = File.join(HOOKS_DIR, 'core')
29
+
30
+ ENV['SCRIPT_DIR'] = SCRIPT_DIR
31
+ ENV['HOOKS_DIR'] = HOOKS_DIR
32
+ ENV['CONFIGS_DIR'] = CONFIGS_DIR
33
+ ENV['CORE_DIR'] = CORE_DIR
34
+
35
+ class CLI
36
+ attr_reader :options
37
+
38
+ def initialize
39
+ @options = {
40
+ link: false,
41
+ unlink: false,
42
+ cask: false,
43
+ formula: false,
44
+ mos: false,
45
+ dry_run: false,
46
+ all: false,
47
+ secrets_path: File.join(Dir.home, 'Documents', 'Secrets')
48
+ }
49
+ end
50
+
51
+ def run
52
+ parse_arguments
53
+ validate_options
54
+ execute
55
+ end
56
+
57
+ private
58
+
59
+ def display_help
60
+ puts <<~HELP
61
+ Usage: bootstrap.rb [options]
62
+ Options:
63
+ -a, --all Run all tasks (Link -> Install -> Link)
64
+ -l, --link Run stow for linking
65
+ -u, --unlink Run stow for unlinking
66
+ -c, --cask Run cask installer
67
+ -f, --formula Run formula installer
68
+ -m, --mos Install Mac App Store Apps
69
+ -d, --dry-run Run in dry-run mode (no changes)
70
+ --secrets-path PATH Path to secrets directory (default: ~/Documents/Secrets)
71
+ -h, --help Display this help message
72
+ HELP
73
+ exit
74
+ end
75
+
76
+ def parse_arguments
77
+ OptionParser.new do |opts|
78
+ opts.banner = 'Usage: bootstrap.rb [options]'
79
+
80
+ opts.on('-a', '--all', 'Run all tasks') { @options[:all] = true }
81
+ opts.on('-l', '--link', 'Run stow for linking') { @options[:link] = true }
82
+ opts.on('-u', '--unlink', 'Run stow for unlinking') { @options[:unlink] = true }
83
+ opts.on('-c', '--cask', 'Run cask installer') { @options[:cask] = true }
84
+ opts.on('-f', '--formula', 'Run formula installer') { @options[:formula] = true }
85
+ opts.on('-m', '--mos', 'Install Mac App Store Apps') { @options[:mos] = true }
86
+ opts.on('-d', '--dry-run', 'Run in dry-run mode') { @options[:dry_run] = true }
87
+ opts.on('--secrets-path PATH', 'Path to secrets directory') { |path| @options[:secrets_path] = path }
88
+ opts.on('-h', '--help', 'Display help') { display_help }
89
+
90
+ opts.parse!
91
+ end
92
+ end
93
+
94
+ def validate_options
95
+ # If no options provided, show interactive menu
96
+ unless @options.values.any? { |v| v == true } # Check if any boolean flag is set
97
+ require_relative 'Hooks/core/lib/menu'
98
+
99
+ menu_options = [
100
+ { label: 'Install Everything (Recommended)', value: :all },
101
+ { label: 'Link Configs Only', value: :link },
102
+ { label: 'Install Formulae', value: :formula },
103
+ { label: 'Install Casks', value: :cask },
104
+ { label: 'Install App Store Apps', value: :mos },
105
+ { label: 'Unlink Configs', value: :unlink },
106
+ { label: 'Dry Run (Test All)', value: :dry_run },
107
+ { label: 'Exit', value: :exit }
108
+ ]
109
+
110
+ selection = Bootstrap::Menu.new(menu_options).show
111
+
112
+ if selection == :exit
113
+ exit
114
+ elsif selection == :dry_run
115
+ @options[:dry_run] = true
116
+ @options[:all] = true
117
+ else
118
+ @options[selection] = true
119
+ end
120
+ end
121
+
122
+ if @options[:all]
123
+ return
124
+ end
125
+
126
+ if @options[:link] && @options[:unlink]
127
+ abort 'Error: Cannot specify --link and --unlink together.'
128
+ end
129
+
130
+ if @options[:cask] && @options[:unlink]
131
+ abort 'Error: Cannot specify --cask and --unlink together.'
132
+ end
133
+
134
+ if @options[:formula] && @options[:unlink]
135
+ abort 'Error: Cannot specify --formula and --unlink together.'
136
+ end
137
+ end
138
+
139
+ def execute
140
+ Bootstrap::Logger.init
141
+ configurator = Bootstrap::Configurator.new(dry_run: @options[:dry_run])
142
+ run_all = @options[:all]
143
+
144
+ # 0. Inject Secrets
145
+ if run_all || @options[:link]
146
+ configurator.inject_secrets(@options[:secrets_path])
147
+ end
148
+
149
+ # 1. Prerequisites & Install
150
+ if run_all || @options[:formula] || @options[:cask] || @options[:mos]
151
+ Bootstrap::Display.header('Installing prerequisites')
152
+ configurator.pre_requisite
153
+ end
154
+
155
+ # 2. Install Formulae
156
+ if run_all || @options[:formula]
157
+ configurator.install_brew_formulas
158
+ end
159
+
160
+ # 3. Install Casks
161
+ if run_all || @options[:cask]
162
+ configurator.install_brew_casks
163
+ end
164
+
165
+ # 4. Install MOS Apps
166
+ if run_all || @options[:mos]
167
+ configurator.install_mas_apps
168
+ end
169
+
170
+ # 5. Unlink (only if explicitly requested)
171
+ if @options[:unlink]
172
+ configurator.unlink_configs
173
+ end
174
+
175
+ # 6. Link (Final)
176
+ if run_all || @options[:link]
177
+ Bootstrap::Display.header('Linking Configs')
178
+ configurator.link_configs
179
+ end
180
+
181
+ Bootstrap::Display.success('All tasks completed successfully!')
182
+ end
183
+ end
184
+ end
185
+
186
+ Bootstrap::CLI.new.run
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/dotfiles_tui/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'dotfiles-tui'
7
+ spec.version = DotfilesTui::VERSION
8
+ spec.authors = ['Narender']
9
+ spec.email = ['narender@slrsoft.com']
10
+
11
+ spec.summary = 'A TUI-based dotfiles bootstrap and management tool'
12
+ spec.description = 'Interactive terminal UI for managing dotfiles, installing packages via Homebrew, and linking configurations with GNU Stow'
13
+ spec.homepage = 'https://github.com/mr-narender/dotfiles-tui'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 2.6.0'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = spec.homepage
19
+ spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/main/CHANGELOG.md"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # Use git to get all tracked files, which respects .gitignore
23
+ spec.files = if Dir.exist?('.git')
24
+ `git ls-files -z`.split("\x0").reject do |f|
25
+ f.match(%r{^(test|spec|features)/}) ||
26
+ f.include?('_Conflict') ||
27
+ f.start_with?('config/') ||
28
+ f == 'config'
29
+ end
30
+ else
31
+ Dir.glob('{bin,lib,Hooks,Configs}/**/*', File::FNM_DOTMATCH).reject do |f|
32
+ File.directory?(f) ||
33
+ f.include?('.DS_Store') ||
34
+ f.include?('_Conflict')
35
+ end + %w[bootstrap.rb Gemfile Gemfile.lock README.md LICENSE]
36
+ end
37
+
38
+ spec.bindir = 'bin'
39
+ spec.executables = ['dotfiles-tui']
40
+ spec.require_paths = ['lib']
41
+
42
+ # Runtime dependencies
43
+ spec.add_dependency 'childprocess', '~> 4.1'
44
+
45
+ # Development dependencies
46
+ spec.add_development_dependency 'rake', '~> 13.0'
47
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DotfilesTui
4
+ VERSION = '0.0.5'
5
+ end