@fredlackey/devutils 0.0.1

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 (200) hide show
  1. package/README.md +156 -0
  2. package/bin/dev.js +16 -0
  3. package/files/README.md +0 -0
  4. package/files/claude/.claude/commands/setup-context.md +3 -0
  5. package/files/monorepos/_archive/README.md +36 -0
  6. package/files/monorepos/_legacy/README.md +36 -0
  7. package/files/monorepos/ai-docs/README.md +33 -0
  8. package/files/monorepos/apps/README.md +24 -0
  9. package/files/monorepos/docs/README.md +40 -0
  10. package/files/monorepos/packages/README.md +25 -0
  11. package/files/monorepos/research/README.md +29 -0
  12. package/files/monorepos/scripts/README.md +24 -0
  13. package/package.json +39 -0
  14. package/src/cli.js +68 -0
  15. package/src/commands/README.md +41 -0
  16. package/src/commands/configure.js +199 -0
  17. package/src/commands/identity.js +1630 -0
  18. package/src/commands/ignore.js +247 -0
  19. package/src/commands/install.js +173 -0
  20. package/src/commands/setup.js +212 -0
  21. package/src/commands/status.js +223 -0
  22. package/src/completion.js +284 -0
  23. package/src/constants.js +45 -0
  24. package/src/ignore/claude-code.txt +10 -0
  25. package/src/ignore/docker.txt +18 -0
  26. package/src/ignore/linux.txt +23 -0
  27. package/src/ignore/macos.txt +36 -0
  28. package/src/ignore/node.txt +55 -0
  29. package/src/ignore/terraform.txt +37 -0
  30. package/src/ignore/vscode.txt +18 -0
  31. package/src/ignore/windows.txt +35 -0
  32. package/src/index.js +0 -0
  33. package/src/installs/README.md +399 -0
  34. package/src/installs/adobe-creative-cloud.js +44 -0
  35. package/src/installs/appcleaner.js +44 -0
  36. package/src/installs/atomicparsley.js +44 -0
  37. package/src/installs/aws-cli.js +44 -0
  38. package/src/installs/balena-etcher.js +44 -0
  39. package/src/installs/bambu-studio.js +44 -0
  40. package/src/installs/bash-completion.js +44 -0
  41. package/src/installs/bash.js +44 -0
  42. package/src/installs/beyond-compare.js +44 -0
  43. package/src/installs/build-essential.js +44 -0
  44. package/src/installs/caffeine.js +44 -0
  45. package/src/installs/camtasia.js +44 -0
  46. package/src/installs/chatgpt.js +44 -0
  47. package/src/installs/chrome-canary.js +44 -0
  48. package/src/installs/chromium.js +44 -0
  49. package/src/installs/claude-code.js +44 -0
  50. package/src/installs/curl.js +44 -0
  51. package/src/installs/cursor.js +44 -0
  52. package/src/installs/dbschema.js +44 -0
  53. package/src/installs/docker.js +44 -0
  54. package/src/installs/drawio.js +44 -0
  55. package/src/installs/elmedia-player.js +44 -0
  56. package/src/installs/ffmpeg.js +44 -0
  57. package/src/installs/gemini-cli.js +44 -0
  58. package/src/installs/git.js +44 -0
  59. package/src/installs/gitego.js +44 -0
  60. package/src/installs/go.js +44 -0
  61. package/src/installs/google-chrome.js +44 -0
  62. package/src/installs/gpg.js +141 -0
  63. package/src/installs/homebrew.js +44 -0
  64. package/src/installs/imageoptim.js +44 -0
  65. package/src/installs/jq.js +44 -0
  66. package/src/installs/keyboard-maestro.js +44 -0
  67. package/src/installs/latex.js +44 -0
  68. package/src/installs/lftp.js +44 -0
  69. package/src/installs/messenger.js +44 -0
  70. package/src/installs/microsoft-office.js +44 -0
  71. package/src/installs/microsoft-teams.js +44 -0
  72. package/src/installs/node.js +44 -0
  73. package/src/installs/nordpass.js +44 -0
  74. package/src/installs/nvm.js +44 -0
  75. package/src/installs/openssh.js +134 -0
  76. package/src/installs/pandoc.js +44 -0
  77. package/src/installs/pinentry.js +44 -0
  78. package/src/installs/pngyu.js +44 -0
  79. package/src/installs/postman.js +44 -0
  80. package/src/installs/safari-tech-preview.js +44 -0
  81. package/src/installs/sfnt2woff.js +44 -0
  82. package/src/installs/shellcheck.js +44 -0
  83. package/src/installs/slack.js +44 -0
  84. package/src/installs/snagit.js +44 -0
  85. package/src/installs/spotify.js +44 -0
  86. package/src/installs/studio-3t.js +44 -0
  87. package/src/installs/sublime-text.js +44 -0
  88. package/src/installs/superwhisper.js +44 -0
  89. package/src/installs/tailscale.js +44 -0
  90. package/src/installs/termius.js +44 -0
  91. package/src/installs/terraform.js +44 -0
  92. package/src/installs/tidal.js +44 -0
  93. package/src/installs/tmux.js +44 -0
  94. package/src/installs/tree.js +44 -0
  95. package/src/installs/vim.js +44 -0
  96. package/src/installs/vlc.js +44 -0
  97. package/src/installs/vscode.js +44 -0
  98. package/src/installs/whatsapp.js +44 -0
  99. package/src/installs/woff2.js +44 -0
  100. package/src/installs/xcode.js +44 -0
  101. package/src/installs/yarn.js +44 -0
  102. package/src/installs/yq.js +44 -0
  103. package/src/installs/yt-dlp.js +44 -0
  104. package/src/installs/zoom.js +44 -0
  105. package/src/scripts/README.md +95 -0
  106. package/src/scripts/afk.js +23 -0
  107. package/src/scripts/backup-all.js +24 -0
  108. package/src/scripts/backup-source.js +24 -0
  109. package/src/scripts/brewd.js +23 -0
  110. package/src/scripts/brewi.js +24 -0
  111. package/src/scripts/brewr.js +24 -0
  112. package/src/scripts/brews.js +24 -0
  113. package/src/scripts/brewu.js +23 -0
  114. package/src/scripts/c.js +23 -0
  115. package/src/scripts/ccurl.js +24 -0
  116. package/src/scripts/certbot-crontab-init.js +24 -0
  117. package/src/scripts/certbot-init.js +25 -0
  118. package/src/scripts/ch.js +23 -0
  119. package/src/scripts/claude-danger.js +23 -0
  120. package/src/scripts/clean-dev.js +24 -0
  121. package/src/scripts/clear-dns-cache.js +23 -0
  122. package/src/scripts/clone.js +25 -0
  123. package/src/scripts/code-all.js +24 -0
  124. package/src/scripts/count-files.js +24 -0
  125. package/src/scripts/count-folders.js +24 -0
  126. package/src/scripts/count.js +24 -0
  127. package/src/scripts/d.js +23 -0
  128. package/src/scripts/datauri.js +24 -0
  129. package/src/scripts/delete-files.js +24 -0
  130. package/src/scripts/docker-clean.js +24 -0
  131. package/src/scripts/dp.js +23 -0
  132. package/src/scripts/e.js +24 -0
  133. package/src/scripts/empty-trash.js +23 -0
  134. package/src/scripts/evm.js +25 -0
  135. package/src/scripts/fetch-github-repos.js +25 -0
  136. package/src/scripts/get-channel.js +24 -0
  137. package/src/scripts/get-course.js +26 -0
  138. package/src/scripts/get-dependencies.js +25 -0
  139. package/src/scripts/get-folder.js +26 -0
  140. package/src/scripts/get-tunes.js +25 -0
  141. package/src/scripts/get-video.js +24 -0
  142. package/src/scripts/git-backup.js +25 -0
  143. package/src/scripts/git-clone.js +25 -0
  144. package/src/scripts/git-pup.js +23 -0
  145. package/src/scripts/git-push.js +24 -0
  146. package/src/scripts/h.js +24 -0
  147. package/src/scripts/hide-desktop-icons.js +23 -0
  148. package/src/scripts/hide-hidden-files.js +23 -0
  149. package/src/scripts/install-dependencies-from.js +25 -0
  150. package/src/scripts/ips.js +26 -0
  151. package/src/scripts/iso.js +24 -0
  152. package/src/scripts/killni.js +23 -0
  153. package/src/scripts/ll.js +24 -0
  154. package/src/scripts/local-ip.js +23 -0
  155. package/src/scripts/m.js +24 -0
  156. package/src/scripts/map.js +24 -0
  157. package/src/scripts/mkd.js +24 -0
  158. package/src/scripts/ncu-update-all.js +24 -0
  159. package/src/scripts/nginx-init.js +28 -0
  160. package/src/scripts/npmi.js +23 -0
  161. package/src/scripts/o.js +24 -0
  162. package/src/scripts/org-by-date.js +24 -0
  163. package/src/scripts/p.js +23 -0
  164. package/src/scripts/packages.js +25 -0
  165. package/src/scripts/path.js +23 -0
  166. package/src/scripts/ports.js +23 -0
  167. package/src/scripts/q.js +23 -0
  168. package/src/scripts/refresh-files.js +26 -0
  169. package/src/scripts/remove-smaller-files.js +24 -0
  170. package/src/scripts/rename-files-with-date.js +25 -0
  171. package/src/scripts/resize-image.js +25 -0
  172. package/src/scripts/rm-safe.js +24 -0
  173. package/src/scripts/s.js +24 -0
  174. package/src/scripts/set-git-public.js +23 -0
  175. package/src/scripts/show-desktop-icons.js +23 -0
  176. package/src/scripts/show-hidden-files.js +23 -0
  177. package/src/scripts/tpa.js +23 -0
  178. package/src/scripts/tpo.js +23 -0
  179. package/src/scripts/u.js +23 -0
  180. package/src/scripts/vpush.js +23 -0
  181. package/src/scripts/y.js +23 -0
  182. package/src/utils/README.md +95 -0
  183. package/src/utils/common/apps.js +143 -0
  184. package/src/utils/common/display.js +157 -0
  185. package/src/utils/common/network.js +185 -0
  186. package/src/utils/common/os.js +202 -0
  187. package/src/utils/common/package-manager.js +301 -0
  188. package/src/utils/common/privileges.js +138 -0
  189. package/src/utils/common/shell.js +195 -0
  190. package/src/utils/macos/apps.js +228 -0
  191. package/src/utils/macos/brew.js +315 -0
  192. package/src/utils/ubuntu/apt.js +301 -0
  193. package/src/utils/ubuntu/desktop.js +292 -0
  194. package/src/utils/ubuntu/snap.js +302 -0
  195. package/src/utils/ubuntu/systemd.js +286 -0
  196. package/src/utils/windows/choco.js +327 -0
  197. package/src/utils/windows/env.js +246 -0
  198. package/src/utils/windows/registry.js +269 -0
  199. package/src/utils/windows/shell.js +240 -0
  200. package/src/utils/windows/winget.js +378 -0
@@ -0,0 +1,378 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Windows Package Manager (winget) Utilities
5
+ *
6
+ * Windows-specific utilities for interacting with winget.
7
+ */
8
+
9
+ const shell = require('../common/shell');
10
+
11
+ /**
12
+ * Checks if winget is available
13
+ * @returns {boolean}
14
+ */
15
+ function isInstalled() {
16
+ return shell.commandExists('winget');
17
+ }
18
+
19
+ /**
20
+ * Returns the installed winget version
21
+ * @returns {Promise<string|null>}
22
+ */
23
+ async function getVersion() {
24
+ if (!isInstalled()) {
25
+ return null;
26
+ }
27
+
28
+ const result = await shell.exec('winget --version');
29
+ if (result.code === 0) {
30
+ // Output: "v1.6.2771"
31
+ return result.stdout.trim().replace(/^v/, '');
32
+ }
33
+ return null;
34
+ }
35
+
36
+ /**
37
+ * Installs a package via winget
38
+ * @param {string} packageName - The package name or ID to install
39
+ * @param {Object} [options] - Installation options
40
+ * @param {boolean} [options.silent=true] - Silent installation
41
+ * @param {string} [options.version] - Specific version to install
42
+ * @param {string} [options.source] - Package source (winget, msstore)
43
+ * @returns {Promise<{ success: boolean, output: string }>}
44
+ */
45
+ async function install(packageName, options = {}) {
46
+ if (!isInstalled()) {
47
+ return {
48
+ success: false,
49
+ output: 'winget is not available'
50
+ };
51
+ }
52
+
53
+ let command = `winget install "${packageName}" --accept-package-agreements --accept-source-agreements`;
54
+
55
+ if (options.silent !== false) {
56
+ command += ' --silent';
57
+ }
58
+
59
+ if (options.version) {
60
+ command += ` --version "${options.version}"`;
61
+ }
62
+
63
+ if (options.source) {
64
+ command += ` --source ${options.source}`;
65
+ }
66
+
67
+ const result = await shell.exec(command);
68
+ return {
69
+ success: result.code === 0,
70
+ output: result.stdout || result.stderr
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Removes a package via winget
76
+ * @param {string} packageName - The package name or ID to remove
77
+ * @param {Object} [options] - Removal options
78
+ * @param {boolean} [options.silent=true] - Silent uninstallation
79
+ * @returns {Promise<{ success: boolean, output: string }>}
80
+ */
81
+ async function uninstall(packageName, options = {}) {
82
+ if (!isInstalled()) {
83
+ return {
84
+ success: false,
85
+ output: 'winget is not available'
86
+ };
87
+ }
88
+
89
+ let command = `winget uninstall "${packageName}"`;
90
+
91
+ if (options.silent !== false) {
92
+ command += ' --silent';
93
+ }
94
+
95
+ const result = await shell.exec(command);
96
+ return {
97
+ success: result.code === 0,
98
+ output: result.stdout || result.stderr
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Checks if a package is installed
104
+ * @param {string} packageName - The package name or ID to check
105
+ * @returns {Promise<boolean>}
106
+ */
107
+ async function isPackageInstalled(packageName) {
108
+ if (!isInstalled()) {
109
+ return false;
110
+ }
111
+
112
+ const result = await shell.exec(`winget list --exact --id "${packageName}"`);
113
+ // Check if the output contains the package
114
+ if (result.code === 0 && result.stdout.includes(packageName)) {
115
+ return true;
116
+ }
117
+
118
+ // Try by name if ID didn't match
119
+ const nameResult = await shell.exec(`winget list --exact --name "${packageName}"`);
120
+ return nameResult.code === 0 && nameResult.stdout.includes(packageName);
121
+ }
122
+
123
+ /**
124
+ * Returns the installed version of a package
125
+ * @param {string} packageName - The package name or ID
126
+ * @returns {Promise<string|null>}
127
+ */
128
+ async function getPackageVersion(packageName) {
129
+ if (!isInstalled()) {
130
+ return null;
131
+ }
132
+
133
+ const result = await shell.exec(`winget list --exact --id "${packageName}"`);
134
+ if (result.code !== 0) {
135
+ return null;
136
+ }
137
+
138
+ // Parse the output to find the version
139
+ // Output format is a table with columns: Name, Id, Version, Available, Source
140
+ const lines = result.stdout.split('\n').filter(Boolean);
141
+ for (const line of lines) {
142
+ if (line.includes(packageName)) {
143
+ // Find version column (typically after the ID)
144
+ const parts = line.split(/\s{2,}/);
145
+ if (parts.length >= 3) {
146
+ return parts[2].trim();
147
+ }
148
+ }
149
+ }
150
+
151
+ return null;
152
+ }
153
+
154
+ /**
155
+ * Upgrades a package
156
+ * @param {string} packageName - The package name or ID to upgrade
157
+ * @param {Object} [options] - Upgrade options
158
+ * @param {boolean} [options.silent=true] - Silent upgrade
159
+ * @returns {Promise<{ success: boolean, output: string }>}
160
+ */
161
+ async function upgrade(packageName, options = {}) {
162
+ if (!isInstalled()) {
163
+ return {
164
+ success: false,
165
+ output: 'winget is not available'
166
+ };
167
+ }
168
+
169
+ let command = `winget upgrade "${packageName}" --accept-package-agreements --accept-source-agreements`;
170
+
171
+ if (options.silent !== false) {
172
+ command += ' --silent';
173
+ }
174
+
175
+ const result = await shell.exec(command);
176
+ return {
177
+ success: result.code === 0,
178
+ output: result.stdout || result.stderr
179
+ };
180
+ }
181
+
182
+ /**
183
+ * Upgrades all packages
184
+ * @returns {Promise<{ success: boolean, output: string }>}
185
+ */
186
+ async function upgradeAll() {
187
+ if (!isInstalled()) {
188
+ return {
189
+ success: false,
190
+ output: 'winget is not available'
191
+ };
192
+ }
193
+
194
+ const result = await shell.exec('winget upgrade --all --accept-package-agreements --accept-source-agreements');
195
+ return {
196
+ success: result.code === 0,
197
+ output: result.stdout || result.stderr
198
+ };
199
+ }
200
+
201
+ /**
202
+ * Searches the winget repository
203
+ * @param {string} query - The search query
204
+ * @returns {Promise<Array<{ name: string, id: string, version: string }>>}
205
+ */
206
+ async function search(query) {
207
+ if (!isInstalled()) {
208
+ return [];
209
+ }
210
+
211
+ const result = await shell.exec(`winget search "${query}"`);
212
+ if (result.code !== 0) {
213
+ return [];
214
+ }
215
+
216
+ const packages = [];
217
+ const lines = result.stdout.split('\n').filter(Boolean);
218
+
219
+ // Skip header lines (usually first 2)
220
+ let dataStarted = false;
221
+ for (const line of lines) {
222
+ // Look for separator line to know when data starts
223
+ if (line.includes('---')) {
224
+ dataStarted = true;
225
+ continue;
226
+ }
227
+
228
+ if (!dataStarted) continue;
229
+
230
+ // Parse columns (separated by multiple spaces)
231
+ const parts = line.split(/\s{2,}/).filter(Boolean);
232
+ if (parts.length >= 2) {
233
+ packages.push({
234
+ name: parts[0].trim(),
235
+ id: parts[1].trim(),
236
+ version: parts[2] ? parts[2].trim() : ''
237
+ });
238
+ }
239
+ }
240
+
241
+ return packages;
242
+ }
243
+
244
+ /**
245
+ * Lists installed packages
246
+ * @returns {Promise<Array<{ name: string, id: string, version: string }>>}
247
+ */
248
+ async function list() {
249
+ if (!isInstalled()) {
250
+ return [];
251
+ }
252
+
253
+ const result = await shell.exec('winget list');
254
+ if (result.code !== 0) {
255
+ return [];
256
+ }
257
+
258
+ const packages = [];
259
+ const lines = result.stdout.split('\n').filter(Boolean);
260
+
261
+ let dataStarted = false;
262
+ for (const line of lines) {
263
+ if (line.includes('---')) {
264
+ dataStarted = true;
265
+ continue;
266
+ }
267
+
268
+ if (!dataStarted) continue;
269
+
270
+ const parts = line.split(/\s{2,}/).filter(Boolean);
271
+ if (parts.length >= 2) {
272
+ packages.push({
273
+ name: parts[0].trim(),
274
+ id: parts[1].trim(),
275
+ version: parts[2] ? parts[2].trim() : ''
276
+ });
277
+ }
278
+ }
279
+
280
+ return packages;
281
+ }
282
+
283
+ /**
284
+ * Gets information about a package
285
+ * @param {string} packageName - The package name or ID
286
+ * @returns {Promise<string|null>}
287
+ */
288
+ async function info(packageName) {
289
+ if (!isInstalled()) {
290
+ return null;
291
+ }
292
+
293
+ const result = await shell.exec(`winget show "${packageName}"`);
294
+ if (result.code === 0) {
295
+ return result.stdout;
296
+ }
297
+ return null;
298
+ }
299
+
300
+ /**
301
+ * Lists packages with available upgrades
302
+ * @returns {Promise<Array<{ name: string, id: string, currentVersion: string, availableVersion: string }>>}
303
+ */
304
+ async function listUpgradable() {
305
+ if (!isInstalled()) {
306
+ return [];
307
+ }
308
+
309
+ const result = await shell.exec('winget upgrade');
310
+ if (result.code !== 0) {
311
+ return [];
312
+ }
313
+
314
+ const packages = [];
315
+ const lines = result.stdout.split('\n').filter(Boolean);
316
+
317
+ let dataStarted = false;
318
+ for (const line of lines) {
319
+ if (line.includes('---')) {
320
+ dataStarted = true;
321
+ continue;
322
+ }
323
+
324
+ if (!dataStarted) continue;
325
+
326
+ // Skip summary lines
327
+ if (line.includes('upgrades available') || line.includes('winget upgrade')) {
328
+ continue;
329
+ }
330
+
331
+ const parts = line.split(/\s{2,}/).filter(Boolean);
332
+ if (parts.length >= 4) {
333
+ packages.push({
334
+ name: parts[0].trim(),
335
+ id: parts[1].trim(),
336
+ currentVersion: parts[2].trim(),
337
+ availableVersion: parts[3].trim()
338
+ });
339
+ }
340
+ }
341
+
342
+ return packages;
343
+ }
344
+
345
+ /**
346
+ * Updates winget sources
347
+ * @returns {Promise<{ success: boolean, output: string }>}
348
+ */
349
+ async function updateSources() {
350
+ if (!isInstalled()) {
351
+ return {
352
+ success: false,
353
+ output: 'winget is not available'
354
+ };
355
+ }
356
+
357
+ const result = await shell.exec('winget source update');
358
+ return {
359
+ success: result.code === 0,
360
+ output: result.stdout || result.stderr
361
+ };
362
+ }
363
+
364
+ module.exports = {
365
+ isInstalled,
366
+ getVersion,
367
+ install,
368
+ uninstall,
369
+ isPackageInstalled,
370
+ getPackageVersion,
371
+ upgrade,
372
+ upgradeAll,
373
+ search,
374
+ list,
375
+ info,
376
+ listUpgradable,
377
+ updateSources
378
+ };