@fredlackey/devutils 0.0.17 → 0.0.19
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.
- package/README.md +32 -150
- package/package.json +5 -82
- package/bin/dev.js +0 -16
- package/files/README.md +0 -0
- package/files/claude/.claude/commands/setup-context.md +0 -3
- package/files/monorepos/_archive/README.md +0 -36
- package/files/monorepos/_legacy/README.md +0 -36
- package/files/monorepos/ai-docs/README.md +0 -33
- package/files/monorepos/apps/README.md +0 -24
- package/files/monorepos/docs/README.md +0 -40
- package/files/monorepos/packages/README.md +0 -25
- package/files/monorepos/research/README.md +0 -29
- package/files/monorepos/scripts/README.md +0 -24
- package/src/cli.js +0 -72
- package/src/commands/README.md +0 -41
- package/src/commands/configure.js +0 -199
- package/src/commands/identity.js +0 -1630
- package/src/commands/ignore.js +0 -247
- package/src/commands/install.js +0 -526
- package/src/commands/setup.js +0 -246
- package/src/commands/status.js +0 -223
- package/src/commands/update.js +0 -142
- package/src/commands/version.js +0 -100
- package/src/completion.js +0 -284
- package/src/constants.js +0 -45
- package/src/ignore/claude-code.txt +0 -10
- package/src/ignore/docker.txt +0 -18
- package/src/ignore/linux.txt +0 -23
- package/src/ignore/macos.txt +0 -36
- package/src/ignore/node.txt +0 -55
- package/src/ignore/terraform.txt +0 -37
- package/src/ignore/vscode.txt +0 -18
- package/src/ignore/windows.txt +0 -35
- package/src/index.js +0 -0
- package/src/installs/README.md +0 -399
- package/src/installs/adobe-creative-cloud.js +0 -546
- package/src/installs/adobe-creative-cloud.md +0 -605
- package/src/installs/appcleaner.js +0 -321
- package/src/installs/appcleaner.md +0 -699
- package/src/installs/apt-transport-https.js +0 -390
- package/src/installs/apt-transport-https.md +0 -678
- package/src/installs/atomicparsley.js +0 -642
- package/src/installs/atomicparsley.md +0 -795
- package/src/installs/aws-cli.js +0 -797
- package/src/installs/aws-cli.md +0 -727
- package/src/installs/balena-etcher.js +0 -710
- package/src/installs/balena-etcher.md +0 -761
- package/src/installs/bambu-studio.js +0 -1143
- package/src/installs/bambu-studio.md +0 -780
- package/src/installs/bash-completion.js +0 -575
- package/src/installs/bash-completion.md +0 -833
- package/src/installs/bash.js +0 -417
- package/src/installs/bash.md +0 -993
- package/src/installs/beyond-compare.js +0 -603
- package/src/installs/beyond-compare.md +0 -813
- package/src/installs/brave-browser.js +0 -968
- package/src/installs/brave-browser.md +0 -650
- package/src/installs/build-essential.js +0 -529
- package/src/installs/build-essential.md +0 -977
- package/src/installs/ca-certificates.js +0 -618
- package/src/installs/ca-certificates.md +0 -937
- package/src/installs/caffeine.js +0 -508
- package/src/installs/caffeine.md +0 -839
- package/src/installs/camtasia.js +0 -596
- package/src/installs/camtasia.md +0 -762
- package/src/installs/chatgpt.js +0 -476
- package/src/installs/chatgpt.md +0 -814
- package/src/installs/chocolatey.js +0 -456
- package/src/installs/chocolatey.md +0 -661
- package/src/installs/chrome-canary.js +0 -419
- package/src/installs/chrome-canary.md +0 -641
- package/src/installs/chromium.js +0 -667
- package/src/installs/chromium.md +0 -838
- package/src/installs/claude-code.js +0 -576
- package/src/installs/claude-code.md +0 -1173
- package/src/installs/cloudflare-warp.js +0 -900
- package/src/installs/cloudflare-warp.md +0 -1047
- package/src/installs/comet-browser.js +0 -588
- package/src/installs/comet-browser.md +0 -731
- package/src/installs/curl.js +0 -379
- package/src/installs/curl.md +0 -714
- package/src/installs/cursor.js +0 -579
- package/src/installs/cursor.md +0 -970
- package/src/installs/dbeaver.js +0 -924
- package/src/installs/dbeaver.md +0 -939
- package/src/installs/dbschema.js +0 -692
- package/src/installs/dbschema.md +0 -925
- package/src/installs/dependencies.md +0 -453
- package/src/installs/development-tools.js +0 -600
- package/src/installs/development-tools.md +0 -977
- package/src/installs/docker.js +0 -1029
- package/src/installs/docker.md +0 -1109
- package/src/installs/drawio.js +0 -1019
- package/src/installs/drawio.md +0 -795
- package/src/installs/elmedia-player.js +0 -347
- package/src/installs/elmedia-player.md +0 -556
- package/src/installs/ffmpeg.js +0 -889
- package/src/installs/ffmpeg.md +0 -852
- package/src/installs/file.js +0 -464
- package/src/installs/file.md +0 -987
- package/src/installs/gemini-cli.js +0 -811
- package/src/installs/gemini-cli.md +0 -1153
- package/src/installs/git.js +0 -400
- package/src/installs/git.md +0 -907
- package/src/installs/gitego.js +0 -949
- package/src/installs/gitego.md +0 -1172
- package/src/installs/go.js +0 -931
- package/src/installs/go.md +0 -958
- package/src/installs/google-antigravity.js +0 -913
- package/src/installs/google-antigravity.md +0 -1075
- package/src/installs/google-chrome.js +0 -833
- package/src/installs/google-chrome.md +0 -862
- package/src/installs/gpg.js +0 -480
- package/src/installs/gpg.md +0 -1056
- package/src/installs/homebrew.js +0 -1033
- package/src/installs/homebrew.md +0 -988
- package/src/installs/imageoptim.js +0 -968
- package/src/installs/imageoptim.md +0 -1119
- package/src/installs/installers.json +0 -4032
- package/src/installs/installers.json.tmp +0 -3953
- package/src/installs/jq.js +0 -400
- package/src/installs/jq.md +0 -809
- package/src/installs/keyboard-maestro.js +0 -719
- package/src/installs/keyboard-maestro.md +0 -825
- package/src/installs/kiro.js +0 -864
- package/src/installs/kiro.md +0 -1015
- package/src/installs/latex.js +0 -789
- package/src/installs/latex.md +0 -1095
- package/src/installs/lftp.js +0 -356
- package/src/installs/lftp.md +0 -907
- package/src/installs/lsb-release.js +0 -346
- package/src/installs/lsb-release.md +0 -814
- package/src/installs/messenger.js +0 -847
- package/src/installs/messenger.md +0 -900
- package/src/installs/microsoft-office.js +0 -568
- package/src/installs/microsoft-office.md +0 -760
- package/src/installs/microsoft-teams.js +0 -801
- package/src/installs/microsoft-teams.md +0 -886
- package/src/installs/moom.js +0 -326
- package/src/installs/moom.md +0 -570
- package/src/installs/node.js +0 -904
- package/src/installs/node.md +0 -1153
- package/src/installs/nordpass.js +0 -716
- package/src/installs/nordpass.md +0 -921
- package/src/installs/nordvpn.js +0 -892
- package/src/installs/nordvpn.md +0 -1052
- package/src/installs/nvm.js +0 -995
- package/src/installs/nvm.md +0 -1057
- package/src/installs/ohmyzsh.js +0 -529
- package/src/installs/ohmyzsh.md +0 -1094
- package/src/installs/openssh.js +0 -804
- package/src/installs/openssh.md +0 -1056
- package/src/installs/pandoc.js +0 -662
- package/src/installs/pandoc.md +0 -1036
- package/src/installs/parallels-desktop.js +0 -431
- package/src/installs/parallels-desktop.md +0 -446
- package/src/installs/pinentry.js +0 -510
- package/src/installs/pinentry.md +0 -1142
- package/src/installs/pngyu.js +0 -869
- package/src/installs/pngyu.md +0 -896
- package/src/installs/postman.js +0 -799
- package/src/installs/postman.md +0 -940
- package/src/installs/procps.js +0 -425
- package/src/installs/procps.md +0 -851
- package/src/installs/safari-tech-preview.js +0 -374
- package/src/installs/safari-tech-preview.md +0 -533
- package/src/installs/sfnt2woff.js +0 -658
- package/src/installs/sfnt2woff.md +0 -795
- package/src/installs/shellcheck.js +0 -481
- package/src/installs/shellcheck.md +0 -1005
- package/src/installs/slack.js +0 -741
- package/src/installs/slack.md +0 -865
- package/src/installs/snagit.js +0 -585
- package/src/installs/snagit.md +0 -844
- package/src/installs/software-properties-common.js +0 -372
- package/src/installs/software-properties-common.md +0 -805
- package/src/installs/spotify.js +0 -877
- package/src/installs/spotify.md +0 -901
- package/src/installs/studio-3t.js +0 -823
- package/src/installs/studio-3t.md +0 -918
- package/src/installs/sublime-text.js +0 -804
- package/src/installs/sublime-text.md +0 -914
- package/src/installs/superwhisper.js +0 -706
- package/src/installs/superwhisper.md +0 -630
- package/src/installs/tailscale.js +0 -745
- package/src/installs/tailscale.md +0 -1100
- package/src/installs/tar.js +0 -389
- package/src/installs/tar.md +0 -946
- package/src/installs/termius.js +0 -798
- package/src/installs/termius.md +0 -844
- package/src/installs/terraform.js +0 -779
- package/src/installs/terraform.md +0 -899
- package/src/installs/tfenv.js +0 -778
- package/src/installs/tfenv.md +0 -1091
- package/src/installs/tidal.js +0 -771
- package/src/installs/tidal.md +0 -864
- package/src/installs/tmux.js +0 -346
- package/src/installs/tmux.md +0 -1030
- package/src/installs/tree.js +0 -411
- package/src/installs/tree.md +0 -833
- package/src/installs/unzip.js +0 -460
- package/src/installs/unzip.md +0 -879
- package/src/installs/vim.js +0 -421
- package/src/installs/vim.md +0 -1040
- package/src/installs/vlc.js +0 -821
- package/src/installs/vlc.md +0 -927
- package/src/installs/vscode.js +0 -843
- package/src/installs/vscode.md +0 -1002
- package/src/installs/wget.js +0 -420
- package/src/installs/wget.md +0 -791
- package/src/installs/whatsapp.js +0 -729
- package/src/installs/whatsapp.md +0 -854
- package/src/installs/winpty.js +0 -352
- package/src/installs/winpty.md +0 -620
- package/src/installs/woff2.js +0 -553
- package/src/installs/woff2.md +0 -977
- package/src/installs/wsl.js +0 -572
- package/src/installs/wsl.md +0 -699
- package/src/installs/xcode-clt.js +0 -520
- package/src/installs/xcode-clt.md +0 -351
- package/src/installs/xcode.js +0 -560
- package/src/installs/xcode.md +0 -573
- package/src/installs/yarn.js +0 -824
- package/src/installs/yarn.md +0 -1074
- package/src/installs/yq.js +0 -654
- package/src/installs/yq.md +0 -944
- package/src/installs/yt-dlp.js +0 -701
- package/src/installs/yt-dlp.md +0 -946
- package/src/installs/yum-utils.js +0 -297
- package/src/installs/yum-utils.md +0 -648
- package/src/installs/zoom.js +0 -759
- package/src/installs/zoom.md +0 -884
- package/src/installs/zsh.js +0 -455
- package/src/installs/zsh.md +0 -1008
- package/src/scripts/README.md +0 -617
- package/src/scripts/STATUS.md +0 -208
- package/src/scripts/afk.js +0 -411
- package/src/scripts/backup-all.js +0 -746
- package/src/scripts/backup-source.js +0 -727
- package/src/scripts/brewd.js +0 -389
- package/src/scripts/brewi.js +0 -520
- package/src/scripts/brewr.js +0 -527
- package/src/scripts/brews.js +0 -477
- package/src/scripts/brewu.js +0 -504
- package/src/scripts/c.js +0 -201
- package/src/scripts/ccurl.js +0 -341
- package/src/scripts/certbot-crontab-init.js +0 -504
- package/src/scripts/certbot-init.js +0 -657
- package/src/scripts/ch.js +0 -355
- package/src/scripts/claude-danger.js +0 -268
- package/src/scripts/clean-dev.js +0 -435
- package/src/scripts/clear-dns-cache.js +0 -541
- package/src/scripts/clone.js +0 -435
- package/src/scripts/code-all.js +0 -437
- package/src/scripts/count-files.js +0 -211
- package/src/scripts/count-folders.js +0 -211
- package/src/scripts/count.js +0 -264
- package/src/scripts/d.js +0 -219
- package/src/scripts/datauri.js +0 -389
- package/src/scripts/delete-files.js +0 -380
- package/src/scripts/docker-clean.js +0 -426
- package/src/scripts/dp.js +0 -442
- package/src/scripts/e.js +0 -390
- package/src/scripts/empty-trash.js +0 -513
- package/src/scripts/evm.js +0 -444
- package/src/scripts/fetch-github-repos.js +0 -456
- package/src/scripts/get-channel.js +0 -345
- package/src/scripts/get-course.js +0 -399
- package/src/scripts/get-dependencies.js +0 -306
- package/src/scripts/get-folder.js +0 -799
- package/src/scripts/get-tunes.js +0 -426
- package/src/scripts/get-video.js +0 -367
- package/src/scripts/git-backup.js +0 -577
- package/src/scripts/git-clone.js +0 -493
- package/src/scripts/git-pup.js +0 -319
- package/src/scripts/git-push.js +0 -396
- package/src/scripts/h.js +0 -622
- package/src/scripts/hide-desktop-icons.js +0 -499
- package/src/scripts/hide-hidden-files.js +0 -538
- package/src/scripts/install-dependencies-from.js +0 -456
- package/src/scripts/ips.js +0 -663
- package/src/scripts/iso.js +0 -370
- package/src/scripts/killni.js +0 -577
- package/src/scripts/ll.js +0 -467
- package/src/scripts/local-ip.js +0 -325
- package/src/scripts/m.js +0 -524
- package/src/scripts/map.js +0 -309
- package/src/scripts/mkd.js +0 -351
- package/src/scripts/ncu-update-all.js +0 -457
- package/src/scripts/nginx-init.js +0 -718
- package/src/scripts/npmi.js +0 -382
- package/src/scripts/o.js +0 -511
- package/src/scripts/org-by-date.js +0 -338
- package/src/scripts/p.js +0 -224
- package/src/scripts/packages.js +0 -330
- package/src/scripts/path.js +0 -225
- package/src/scripts/ports.js +0 -597
- package/src/scripts/q.js +0 -305
- package/src/scripts/refresh-files.js +0 -394
- package/src/scripts/remove-smaller-files.js +0 -516
- package/src/scripts/rename-files-with-date.js +0 -533
- package/src/scripts/resize-image.js +0 -539
- package/src/scripts/rm-safe.js +0 -669
- package/src/scripts/s.js +0 -540
- package/src/scripts/set-git-public.js +0 -365
- package/src/scripts/show-desktop-icons.js +0 -475
- package/src/scripts/show-hidden-files.js +0 -472
- package/src/scripts/tpa.js +0 -280
- package/src/scripts/tpo.js +0 -280
- package/src/scripts/u.js +0 -505
- package/src/scripts/vpush.js +0 -437
- package/src/scripts/y.js +0 -283
- package/src/utils/README.md +0 -95
- package/src/utils/common/apps.js +0 -143
- package/src/utils/common/display.js +0 -157
- package/src/utils/common/network.js +0 -185
- package/src/utils/common/os.js +0 -294
- package/src/utils/common/package-manager.js +0 -301
- package/src/utils/common/privileges.js +0 -138
- package/src/utils/common/shell.js +0 -216
- package/src/utils/macos/apps.js +0 -228
- package/src/utils/macos/brew.js +0 -315
- package/src/utils/ubuntu/apt.js +0 -307
- package/src/utils/ubuntu/desktop.js +0 -292
- package/src/utils/ubuntu/snap.js +0 -344
- package/src/utils/ubuntu/systemd.js +0 -286
- package/src/utils/windows/choco.js +0 -465
- package/src/utils/windows/env.js +0 -246
- package/src/utils/windows/registry.js +0 -269
- package/src/utils/windows/shell.js +0 -240
- package/src/utils/windows/winget.js +0 -489
package/src/commands/setup.js
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview Setup command - Install essential tools required for DevUtils CLI to function.
|
|
5
|
-
* This includes git, ssh-keygen, gpg, and other core dependencies.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { Command } = require('commander');
|
|
9
|
-
const readline = require('readline');
|
|
10
|
-
|
|
11
|
-
const shell = require('../utils/common/shell');
|
|
12
|
-
const osUtils = require('../utils/common/os');
|
|
13
|
-
|
|
14
|
-
// Essential tools that DevUtils CLI requires (shared across all platforms)
|
|
15
|
-
const CORE_TOOLS = [
|
|
16
|
-
{
|
|
17
|
-
name: 'git',
|
|
18
|
-
command: 'git',
|
|
19
|
-
description: 'Version control system',
|
|
20
|
-
install: 'git'
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: 'ssh-keygen',
|
|
24
|
-
command: 'ssh-keygen',
|
|
25
|
-
description: 'SSH key generation',
|
|
26
|
-
install: 'openssh'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
name: 'gpg',
|
|
30
|
-
command: 'gpg',
|
|
31
|
-
description: 'GPG encryption and signing',
|
|
32
|
-
install: 'gpg'
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: 'curl',
|
|
36
|
-
command: 'curl',
|
|
37
|
-
description: 'Data transfer tool',
|
|
38
|
-
install: 'curl'
|
|
39
|
-
}
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
// Homebrew is required on macOS before installing other tools
|
|
43
|
-
const HOMEBREW_TOOL = {
|
|
44
|
-
name: 'brew',
|
|
45
|
-
command: 'brew',
|
|
46
|
-
description: 'Package manager (required)',
|
|
47
|
-
install: 'homebrew'
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Get the list of essential tools for the current platform.
|
|
52
|
-
* On macOS, Homebrew is included first since other tools depend on it.
|
|
53
|
-
* @returns {Array<object>} Array of tool definitions
|
|
54
|
-
*/
|
|
55
|
-
function getEssentialTools() {
|
|
56
|
-
const platform = osUtils.detect();
|
|
57
|
-
|
|
58
|
-
// On macOS, Homebrew must be installed first since all other tools use it
|
|
59
|
-
if (platform.type === 'macos') {
|
|
60
|
-
return [HOMEBREW_TOOL, ...CORE_TOOLS];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// On other platforms, just use the core tools
|
|
64
|
-
return CORE_TOOLS;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Create readline interface for prompts
|
|
69
|
-
* @returns {readline.Interface}
|
|
70
|
-
*/
|
|
71
|
-
function createPrompt() {
|
|
72
|
-
return readline.createInterface({
|
|
73
|
-
input: process.stdin,
|
|
74
|
-
output: process.stdout
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Prompt user for confirmation
|
|
80
|
-
* @param {readline.Interface} rl - Readline interface
|
|
81
|
-
* @param {string} question - Question to ask
|
|
82
|
-
* @returns {Promise<boolean>}
|
|
83
|
-
*/
|
|
84
|
-
function confirm(rl, question) {
|
|
85
|
-
return new Promise(resolve => {
|
|
86
|
-
rl.question(`${question} (y/n): `, answer => {
|
|
87
|
-
resolve(answer.toLowerCase().startsWith('y'));
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Check which essential tools are missing
|
|
94
|
-
* @returns {Array<object>} Array of missing tools
|
|
95
|
-
*/
|
|
96
|
-
function checkMissingTools() {
|
|
97
|
-
const tools = getEssentialTools();
|
|
98
|
-
const missing = [];
|
|
99
|
-
for (const tool of tools) {
|
|
100
|
-
if (!shell.commandExists(tool.command)) {
|
|
101
|
-
missing.push(tool);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return missing;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Get all tool statuses
|
|
109
|
-
* @returns {Array<{ tool: object, installed: boolean }>}
|
|
110
|
-
*/
|
|
111
|
-
function getToolStatuses() {
|
|
112
|
-
const tools = getEssentialTools();
|
|
113
|
-
return tools.map(tool => ({
|
|
114
|
-
tool,
|
|
115
|
-
installed: shell.commandExists(tool.command)
|
|
116
|
-
}));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Install a tool using the appropriate installer
|
|
121
|
-
* @param {object} tool - Tool definition
|
|
122
|
-
* @returns {Promise<boolean>} True if installation succeeded
|
|
123
|
-
*/
|
|
124
|
-
async function installTool(tool) {
|
|
125
|
-
try {
|
|
126
|
-
const installer = require(`../installs/${tool.install}`);
|
|
127
|
-
if (typeof installer.install !== 'function') {
|
|
128
|
-
console.error(` No install function found for ${tool.name}`);
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Run the installer
|
|
133
|
-
await installer.install();
|
|
134
|
-
|
|
135
|
-
// Verify installation by checking if the command now exists
|
|
136
|
-
// This is more reliable than trusting return values from installers
|
|
137
|
-
const isNowInstalled = shell.commandExists(tool.command);
|
|
138
|
-
return isNowInstalled;
|
|
139
|
-
} catch (err) {
|
|
140
|
-
console.error(` Failed to install ${tool.name}: ${err.message}`);
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Display tool status table
|
|
147
|
-
* @param {Array<{ tool: object, installed: boolean }>} statuses
|
|
148
|
-
*/
|
|
149
|
-
function displayToolStatus(statuses) {
|
|
150
|
-
console.log('\nEssential Tools:');
|
|
151
|
-
console.log('─'.repeat(50));
|
|
152
|
-
|
|
153
|
-
for (const { tool, installed } of statuses) {
|
|
154
|
-
const status = installed ? '✓ Installed' : '✗ Missing';
|
|
155
|
-
const statusColor = installed ? status : status;
|
|
156
|
-
console.log(` ${tool.name.padEnd(15)} ${statusColor.padEnd(15)} ${tool.description}`);
|
|
157
|
-
}
|
|
158
|
-
console.log('');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Run the setup command
|
|
163
|
-
* @param {object} options - Command options
|
|
164
|
-
*/
|
|
165
|
-
async function runSetup(options) {
|
|
166
|
-
const platform = osUtils.detect();
|
|
167
|
-
|
|
168
|
-
console.log('\n=== DevUtils CLI Setup ===\n');
|
|
169
|
-
console.log(`Platform: ${platform.type}`);
|
|
170
|
-
console.log(`Package Manager: ${platform.packageManager || 'unknown'}`);
|
|
171
|
-
|
|
172
|
-
// Check tool statuses
|
|
173
|
-
const statuses = getToolStatuses();
|
|
174
|
-
displayToolStatus(statuses);
|
|
175
|
-
|
|
176
|
-
// Find missing tools
|
|
177
|
-
const missing = statuses.filter(s => !s.installed).map(s => s.tool);
|
|
178
|
-
|
|
179
|
-
if (missing.length === 0) {
|
|
180
|
-
console.log('All essential tools are already installed.\n');
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
console.log(`Missing ${missing.length} tool(s): ${missing.map(t => t.name).join(', ')}\n`);
|
|
185
|
-
|
|
186
|
-
// Confirm installation unless --force
|
|
187
|
-
let shouldInstall = options.force;
|
|
188
|
-
if (!shouldInstall) {
|
|
189
|
-
const rl = createPrompt();
|
|
190
|
-
shouldInstall = await confirm(rl, 'Install missing tools?');
|
|
191
|
-
rl.close();
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (!shouldInstall) {
|
|
195
|
-
console.log('Setup cancelled.\n');
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Install each missing tool
|
|
200
|
-
console.log('\nInstalling missing tools...\n');
|
|
201
|
-
|
|
202
|
-
let installed = 0;
|
|
203
|
-
let failed = 0;
|
|
204
|
-
|
|
205
|
-
for (const tool of missing) {
|
|
206
|
-
console.log(`Installing ${tool.name}...`);
|
|
207
|
-
const success = await installTool(tool);
|
|
208
|
-
if (success) {
|
|
209
|
-
installed++;
|
|
210
|
-
console.log(` ${tool.name} installed successfully.\n`);
|
|
211
|
-
} else {
|
|
212
|
-
failed++;
|
|
213
|
-
console.log(` ${tool.name} installation failed.\n`);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Show final status
|
|
218
|
-
console.log('─'.repeat(50));
|
|
219
|
-
console.log(`\nSetup complete: ${installed} installed, ${failed} failed.\n`);
|
|
220
|
-
|
|
221
|
-
// Show updated status
|
|
222
|
-
if (installed > 0) {
|
|
223
|
-
const updatedStatuses = getToolStatuses();
|
|
224
|
-
displayToolStatus(updatedStatuses);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Create and configure the command
|
|
229
|
-
const setup = new Command('setup')
|
|
230
|
-
.description('Install essential tools required for DevUtils CLI')
|
|
231
|
-
.option('--force', 'Install without prompting')
|
|
232
|
-
.option('--check', 'Check tool status without installing')
|
|
233
|
-
.action(async (options) => {
|
|
234
|
-
if (options.check) {
|
|
235
|
-
const statuses = getToolStatuses();
|
|
236
|
-
displayToolStatus(statuses);
|
|
237
|
-
const missing = statuses.filter(s => !s.installed);
|
|
238
|
-
if (missing.length > 0) {
|
|
239
|
-
console.log(`Run 'dev setup' to install missing tools.\n`);
|
|
240
|
-
}
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
await runSetup(options);
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
module.exports = setup;
|
package/src/commands/status.js
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview Status command - Display current configuration and environment health.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const { Command } = require('commander');
|
|
8
|
-
const fs = require('fs');
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const { execSync } = require('child_process');
|
|
11
|
-
|
|
12
|
-
const CONFIG_FILE = path.join(process.env.HOME || process.env.USERPROFILE, '.devutils');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Load existing configuration
|
|
16
|
-
* @returns {object|null}
|
|
17
|
-
*/
|
|
18
|
-
function loadConfig() {
|
|
19
|
-
try {
|
|
20
|
-
if (fs.existsSync(CONFIG_FILE)) {
|
|
21
|
-
const content = fs.readFileSync(CONFIG_FILE, 'utf8');
|
|
22
|
-
return JSON.parse(content);
|
|
23
|
-
}
|
|
24
|
-
} catch {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Check if current directory is inside a git repository
|
|
32
|
-
* @returns {string|null} Path to git root or null
|
|
33
|
-
*/
|
|
34
|
-
function getGitRoot() {
|
|
35
|
-
try {
|
|
36
|
-
const result = execSync('git rev-parse --show-toplevel', {
|
|
37
|
-
encoding: 'utf8',
|
|
38
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
39
|
-
});
|
|
40
|
-
return result.trim();
|
|
41
|
-
} catch {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Get current git branch
|
|
48
|
-
* @returns {string|null}
|
|
49
|
-
*/
|
|
50
|
-
function getGitBranch() {
|
|
51
|
-
try {
|
|
52
|
-
const result = execSync('git branch --show-current', {
|
|
53
|
-
encoding: 'utf8',
|
|
54
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
55
|
-
});
|
|
56
|
-
return result.trim();
|
|
57
|
-
} catch {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Get Node.js version
|
|
64
|
-
* @returns {string|null}
|
|
65
|
-
*/
|
|
66
|
-
function getNodeVersion() {
|
|
67
|
-
try {
|
|
68
|
-
return process.version;
|
|
69
|
-
} catch {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Get npm version
|
|
76
|
-
* @returns {string|null}
|
|
77
|
-
*/
|
|
78
|
-
function getNpmVersion() {
|
|
79
|
-
try {
|
|
80
|
-
return execSync('npm --version', {
|
|
81
|
-
encoding: 'utf8',
|
|
82
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
83
|
-
}).trim();
|
|
84
|
-
} catch {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Detect operating system
|
|
91
|
-
* @returns {string}
|
|
92
|
-
*/
|
|
93
|
-
function getOS() {
|
|
94
|
-
switch (process.platform) {
|
|
95
|
-
case 'darwin':
|
|
96
|
-
return 'macOS';
|
|
97
|
-
case 'win32':
|
|
98
|
-
return 'Windows';
|
|
99
|
-
case 'linux':
|
|
100
|
-
return 'Linux';
|
|
101
|
-
default:
|
|
102
|
-
return process.platform;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Check if a command exists
|
|
108
|
-
* @param {string} cmd - Command to check
|
|
109
|
-
* @returns {boolean}
|
|
110
|
-
*/
|
|
111
|
-
function commandExists(cmd) {
|
|
112
|
-
try {
|
|
113
|
-
const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
|
|
114
|
-
execSync(checkCmd, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
115
|
-
return true;
|
|
116
|
-
} catch {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Display status information
|
|
123
|
-
* @param {object} options - Command options
|
|
124
|
-
*/
|
|
125
|
-
function runStatus(options) {
|
|
126
|
-
const config = loadConfig();
|
|
127
|
-
const warnings = [];
|
|
128
|
-
|
|
129
|
-
console.log('\n=== DevUtils CLI Status ===\n');
|
|
130
|
-
|
|
131
|
-
// Configuration Status
|
|
132
|
-
console.log('Configuration:');
|
|
133
|
-
console.log('─'.repeat(40));
|
|
134
|
-
|
|
135
|
-
if (config) {
|
|
136
|
-
console.log(` File: ${CONFIG_FILE}`);
|
|
137
|
-
console.log(' Status: Valid');
|
|
138
|
-
|
|
139
|
-
if (config.user) {
|
|
140
|
-
console.log(` User: ${config.user.name} <${config.user.email}>`);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (config.updated) {
|
|
144
|
-
console.log(` Updated: ${new Date(config.updated).toLocaleString()}`);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Check for issues
|
|
148
|
-
if (!config.user?.name || !config.user?.email) {
|
|
149
|
-
warnings.push('User name or email not configured');
|
|
150
|
-
}
|
|
151
|
-
} else {
|
|
152
|
-
console.log(` File: ${CONFIG_FILE}`);
|
|
153
|
-
console.log(' Status: Not found');
|
|
154
|
-
warnings.push(`Configuration file not found. Run 'dev configure' to create it.`);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Environment
|
|
158
|
-
console.log('\nEnvironment:');
|
|
159
|
-
console.log('─'.repeat(40));
|
|
160
|
-
console.log(` OS: ${getOS()}`);
|
|
161
|
-
console.log(` Node: ${getNodeVersion() || 'Not found'}`);
|
|
162
|
-
console.log(` npm: ${getNpmVersion() || 'Not found'}`);
|
|
163
|
-
console.log(` CWD: ${process.cwd()}`);
|
|
164
|
-
|
|
165
|
-
// Git Repository
|
|
166
|
-
const gitRoot = getGitRoot();
|
|
167
|
-
console.log('\nGit Repository:');
|
|
168
|
-
console.log('─'.repeat(40));
|
|
169
|
-
|
|
170
|
-
if (gitRoot) {
|
|
171
|
-
console.log(` Root: ${gitRoot}`);
|
|
172
|
-
console.log(` Branch: ${getGitBranch() || 'Unknown'}`);
|
|
173
|
-
} else {
|
|
174
|
-
console.log(' Status: Not in a git repository');
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Available Tools
|
|
178
|
-
console.log('\nAvailable Tools:');
|
|
179
|
-
console.log('─'.repeat(40));
|
|
180
|
-
|
|
181
|
-
const tools = [
|
|
182
|
-
{ name: 'git', label: 'Git' },
|
|
183
|
-
{ name: 'docker', label: 'Docker' },
|
|
184
|
-
{ name: 'code', label: 'VS Code' },
|
|
185
|
-
{ name: 'brew', label: 'Homebrew' },
|
|
186
|
-
{ name: 'choco', label: 'Chocolatey' },
|
|
187
|
-
{ name: 'winget', label: 'winget' }
|
|
188
|
-
];
|
|
189
|
-
|
|
190
|
-
for (const tool of tools) {
|
|
191
|
-
const exists = commandExists(tool.name);
|
|
192
|
-
const status = exists ? 'Installed' : 'Not found';
|
|
193
|
-
console.log(` ${tool.label.padEnd(12)} ${status}`);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Identities
|
|
197
|
-
if (config?.identities && Object.keys(config.identities).length > 0) {
|
|
198
|
-
console.log('\nIdentities:');
|
|
199
|
-
console.log('─'.repeat(40));
|
|
200
|
-
for (const [name, identity] of Object.entries(config.identities)) {
|
|
201
|
-
console.log(` ${name}: ${identity.email || identity.name || '(incomplete)'}`);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Warnings
|
|
206
|
-
if (warnings.length > 0) {
|
|
207
|
-
console.log('\nWarnings:');
|
|
208
|
-
console.log('─'.repeat(40));
|
|
209
|
-
for (const warning of warnings) {
|
|
210
|
-
console.log(` ! ${warning}`);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
console.log('');
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Create and configure the command
|
|
218
|
-
const status = new Command('status')
|
|
219
|
-
.description('Display current configuration and environment health')
|
|
220
|
-
.option('--verbose', 'Show detailed information')
|
|
221
|
-
.action(runStatus);
|
|
222
|
-
|
|
223
|
-
module.exports = status;
|
package/src/commands/update.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview Update command - Update this package to the latest version.
|
|
5
|
-
* Queries the NPM registry and installs the latest version globally.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { Command } = require('commander');
|
|
9
|
-
const { execSync, spawn } = require('child_process');
|
|
10
|
-
const pkg = require('../../package.json');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* The name of this package on NPM
|
|
14
|
-
*/
|
|
15
|
-
const PACKAGE_NAME = pkg.name;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Get the latest version of this package from the NPM registry
|
|
19
|
-
* @returns {string|null} The latest version string, or null if unable to fetch
|
|
20
|
-
*/
|
|
21
|
-
function getLatestVersion() {
|
|
22
|
-
try {
|
|
23
|
-
const result = execSync(`npm view ${PACKAGE_NAME} version`, {
|
|
24
|
-
encoding: 'utf8',
|
|
25
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
26
|
-
});
|
|
27
|
-
return result.trim();
|
|
28
|
-
} catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Compare two semantic version strings
|
|
35
|
-
* @param {string} current - Current version (e.g., "1.2.3")
|
|
36
|
-
* @param {string} latest - Latest version (e.g., "1.2.4")
|
|
37
|
-
* @returns {boolean} True if latest is newer than current
|
|
38
|
-
*/
|
|
39
|
-
function isNewerVersion(current, latest) {
|
|
40
|
-
if (!current || !latest) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const currentParts = current.split('.').map(Number);
|
|
45
|
-
const latestParts = latest.split('.').map(Number);
|
|
46
|
-
|
|
47
|
-
for (let i = 0; i < 3; i++) {
|
|
48
|
-
const currentPart = currentParts[i] || 0;
|
|
49
|
-
const latestPart = latestParts[i] || 0;
|
|
50
|
-
|
|
51
|
-
if (latestPart > currentPart) {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
if (latestPart < currentPart) {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Install the latest version of this package globally
|
|
64
|
-
* @returns {Promise<boolean>} True if installation succeeded
|
|
65
|
-
*/
|
|
66
|
-
function installLatestVersion() {
|
|
67
|
-
return new Promise((resolve) => {
|
|
68
|
-
console.log(`\nInstalling ${PACKAGE_NAME}@latest globally...`);
|
|
69
|
-
console.log('─'.repeat(40));
|
|
70
|
-
|
|
71
|
-
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
72
|
-
const child = spawn(npmCommand, ['install', '-g', `${PACKAGE_NAME}@latest`], {
|
|
73
|
-
stdio: 'inherit'
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
child.on('close', (code) => {
|
|
77
|
-
if (code === 0) {
|
|
78
|
-
resolve(true);
|
|
79
|
-
} else {
|
|
80
|
-
resolve(false);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
child.on('error', () => {
|
|
85
|
-
resolve(false);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Check for updates and install if available
|
|
92
|
-
* @param {object} options - Command options
|
|
93
|
-
*/
|
|
94
|
-
async function runUpdate(options) {
|
|
95
|
-
const currentVersion = pkg.version;
|
|
96
|
-
|
|
97
|
-
console.log(`\n${pkg.name}`);
|
|
98
|
-
console.log('─'.repeat(40));
|
|
99
|
-
console.log(`Current version: ${currentVersion}`);
|
|
100
|
-
|
|
101
|
-
// Check for updates
|
|
102
|
-
console.log('\nChecking for updates...');
|
|
103
|
-
const latestVersion = getLatestVersion();
|
|
104
|
-
|
|
105
|
-
if (!latestVersion) {
|
|
106
|
-
console.log('Unable to check for updates (NPM registry unreachable)');
|
|
107
|
-
console.log('');
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
console.log(`Latest version: ${latestVersion}`);
|
|
112
|
-
|
|
113
|
-
if (!isNewerVersion(currentVersion, latestVersion)) {
|
|
114
|
-
console.log('\nYou are already running the latest version.');
|
|
115
|
-
console.log('');
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
console.log(`\nUpdate available: ${currentVersion} -> ${latestVersion}`);
|
|
120
|
-
|
|
121
|
-
// Perform the update
|
|
122
|
-
const success = await installLatestVersion();
|
|
123
|
-
|
|
124
|
-
if (success) {
|
|
125
|
-
console.log('─'.repeat(40));
|
|
126
|
-
console.log(`\nSuccessfully updated to version ${latestVersion}`);
|
|
127
|
-
console.log('');
|
|
128
|
-
} else {
|
|
129
|
-
console.log('─'.repeat(40));
|
|
130
|
-
console.log('\nUpdate failed. Try running manually:');
|
|
131
|
-
console.log(` npm install -g ${PACKAGE_NAME}@latest`);
|
|
132
|
-
console.log('');
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Create and configure the command
|
|
138
|
-
const update = new Command('update')
|
|
139
|
-
.description('Update this package to the latest version')
|
|
140
|
-
.action(runUpdate);
|
|
141
|
-
|
|
142
|
-
module.exports = update;
|
package/src/commands/version.js
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview Version command - Display current version and check for updates.
|
|
5
|
-
* Queries the NPM registry to determine if a newer version is available.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { Command } = require('commander');
|
|
9
|
-
const { execSync } = require('child_process');
|
|
10
|
-
const pkg = require('../../package.json');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* The name of this package on NPM
|
|
14
|
-
*/
|
|
15
|
-
const PACKAGE_NAME = pkg.name;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Get the latest version of this package from the NPM registry
|
|
19
|
-
* @returns {string|null} The latest version string, or null if unable to fetch
|
|
20
|
-
*/
|
|
21
|
-
function getLatestVersion() {
|
|
22
|
-
try {
|
|
23
|
-
const result = execSync(`npm view ${PACKAGE_NAME} version`, {
|
|
24
|
-
encoding: 'utf8',
|
|
25
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
26
|
-
});
|
|
27
|
-
return result.trim();
|
|
28
|
-
} catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Compare two semantic version strings
|
|
35
|
-
* @param {string} current - Current version (e.g., "1.2.3")
|
|
36
|
-
* @param {string} latest - Latest version (e.g., "1.2.4")
|
|
37
|
-
* @returns {boolean} True if latest is newer than current
|
|
38
|
-
*/
|
|
39
|
-
function isNewerVersion(current, latest) {
|
|
40
|
-
if (!current || !latest) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const currentParts = current.split('.').map(Number);
|
|
45
|
-
const latestParts = latest.split('.').map(Number);
|
|
46
|
-
|
|
47
|
-
for (let i = 0; i < 3; i++) {
|
|
48
|
-
const currentPart = currentParts[i] || 0;
|
|
49
|
-
const latestPart = latestParts[i] || 0;
|
|
50
|
-
|
|
51
|
-
if (latestPart > currentPart) {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
if (latestPart < currentPart) {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Display version information and check for updates
|
|
64
|
-
* @param {object} options - Command options
|
|
65
|
-
*/
|
|
66
|
-
async function runVersion(options) {
|
|
67
|
-
const currentVersion = pkg.version;
|
|
68
|
-
|
|
69
|
-
console.log(`\n${pkg.name}`);
|
|
70
|
-
console.log('─'.repeat(40));
|
|
71
|
-
console.log(`Current version: ${currentVersion}`);
|
|
72
|
-
|
|
73
|
-
// Check for updates
|
|
74
|
-
console.log('\nChecking for updates...');
|
|
75
|
-
const latestVersion = getLatestVersion();
|
|
76
|
-
|
|
77
|
-
if (!latestVersion) {
|
|
78
|
-
console.log('Unable to check for updates (NPM registry unreachable)');
|
|
79
|
-
console.log('');
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (isNewerVersion(currentVersion, latestVersion)) {
|
|
84
|
-
console.log(`\nUpdate available: ${currentVersion} -> ${latestVersion}`);
|
|
85
|
-
console.log('\nTo update, run:');
|
|
86
|
-
console.log(' dev update');
|
|
87
|
-
console.log('');
|
|
88
|
-
} else {
|
|
89
|
-
console.log(`Latest version: ${latestVersion}`);
|
|
90
|
-
console.log('\nYou are running the latest version.');
|
|
91
|
-
console.log('');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Create and configure the command
|
|
96
|
-
const version = new Command('version')
|
|
97
|
-
.description('Display current version and check for updates')
|
|
98
|
-
.action(runVersion);
|
|
99
|
-
|
|
100
|
-
module.exports = version;
|