@fredlackey/devutils 0.0.18 → 0.1.0
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 +214 -141
- package/package.json +8 -83
- package/src/api/loader.js +229 -0
- package/src/api/registry.json +62 -0
- package/src/cli.js +293 -60
- package/src/commands/ai/index.js +16 -0
- package/src/commands/ai/launch.js +112 -0
- package/src/commands/ai/list.js +54 -0
- package/src/commands/ai/resume.js +70 -0
- package/src/commands/ai/sessions.js +121 -0
- package/src/commands/ai/set.js +131 -0
- package/src/commands/ai/show.js +74 -0
- package/src/commands/ai/tools.js +46 -0
- package/src/commands/alias/add.js +93 -0
- package/src/commands/alias/helpers.js +107 -0
- package/src/commands/alias/index.js +14 -0
- package/src/commands/alias/list.js +55 -0
- package/src/commands/alias/remove.js +62 -0
- package/src/commands/alias/sync.js +109 -0
- package/src/commands/api/disable.js +73 -0
- package/src/commands/api/enable.js +148 -0
- package/src/commands/api/index.js +15 -0
- package/src/commands/api/list.js +66 -0
- package/src/commands/api/update.js +87 -0
- package/src/commands/auth/index.js +15 -0
- package/src/commands/auth/list.js +49 -0
- package/src/commands/auth/login.js +384 -0
- package/src/commands/auth/logout.js +111 -0
- package/src/commands/auth/refresh.js +184 -0
- package/src/commands/auth/services.js +169 -0
- package/src/commands/auth/status.js +104 -0
- package/src/commands/config/export.js +224 -0
- package/src/commands/config/get.js +52 -0
- package/src/commands/config/import.js +308 -0
- package/src/commands/config/index.js +17 -0
- package/src/commands/config/init.js +143 -0
- package/src/commands/config/reset.js +57 -0
- package/src/commands/config/set.js +93 -0
- package/src/commands/config/show.js +35 -0
- package/src/commands/help.js +338 -0
- package/src/commands/identity/add.js +133 -0
- package/src/commands/identity/index.js +17 -0
- package/src/commands/identity/link.js +76 -0
- package/src/commands/identity/list.js +48 -0
- package/src/commands/identity/remove.js +72 -0
- package/src/commands/identity/show.js +65 -0
- package/src/commands/identity/sync.js +172 -0
- package/src/commands/identity/unlink.js +57 -0
- package/src/commands/ignore/add.js +165 -0
- package/src/commands/ignore/index.js +14 -0
- package/src/commands/ignore/list.js +89 -0
- package/src/commands/ignore/markers.js +43 -0
- package/src/commands/ignore/remove.js +164 -0
- package/src/commands/ignore/show.js +169 -0
- package/src/commands/machine/detect.js +122 -0
- package/src/commands/machine/index.js +14 -0
- package/src/commands/machine/list.js +74 -0
- package/src/commands/machine/set.js +106 -0
- package/src/commands/machine/show.js +35 -0
- package/src/commands/schema.js +152 -0
- package/src/commands/search/collections.js +134 -0
- package/src/commands/search/get.js +71 -0
- package/src/commands/search/index-cmd.js +54 -0
- package/src/commands/search/index.js +21 -0
- package/src/commands/search/keyword.js +60 -0
- package/src/commands/search/qmd.js +70 -0
- package/src/commands/search/query.js +64 -0
- package/src/commands/search/semantic.js +62 -0
- package/src/commands/search/status.js +46 -0
- package/src/commands/status.js +224 -171
- package/src/commands/tools/check.js +79 -0
- package/src/commands/tools/index.js +14 -0
- package/src/commands/tools/install.js +110 -0
- package/src/commands/tools/list.js +91 -0
- package/src/commands/tools/search.js +60 -0
- package/src/commands/update.js +83 -112
- package/src/commands/util/add.js +151 -0
- package/src/commands/util/index.js +15 -0
- package/src/commands/util/list.js +97 -0
- package/src/commands/util/remove.js +76 -0
- package/src/commands/util/run.js +79 -0
- package/src/commands/util/show.js +67 -0
- package/src/commands/version.js +21 -88
- package/src/installers/_template.js +104 -0
- package/src/installers/git.js +150 -0
- package/src/installers/homebrew.js +190 -0
- package/src/installers/node.js +223 -0
- package/src/installers/registry.json +29 -0
- package/src/lib/config.js +125 -0
- package/src/lib/detect.js +74 -0
- package/src/lib/errors.js +114 -0
- package/src/lib/github.js +315 -0
- package/src/lib/installer.js +225 -0
- package/src/lib/output.js +239 -0
- package/src/lib/platform.js +112 -0
- package/src/lib/platforms/amazon-linux.js +41 -0
- package/src/lib/platforms/gitbash.js +46 -0
- package/src/lib/platforms/macos.js +45 -0
- package/src/lib/platforms/raspbian.js +41 -0
- package/src/lib/platforms/ubuntu.js +39 -0
- package/src/lib/platforms/windows.js +45 -0
- package/src/lib/prompt.js +161 -0
- package/src/lib/schema.js +211 -0
- package/src/lib/shell.js +75 -0
- package/src/patterns/gitignore/claude-code.txt +25 -0
- package/src/patterns/gitignore/docker.txt +15 -0
- package/src/patterns/gitignore/go.txt +24 -0
- package/src/patterns/gitignore/java.txt +38 -0
- package/src/patterns/gitignore/jetbrains.txt +26 -0
- package/src/patterns/gitignore/linux.txt +18 -0
- package/src/patterns/gitignore/macos.txt +27 -0
- package/src/patterns/gitignore/node.txt +51 -0
- package/src/patterns/gitignore/python.txt +55 -0
- package/src/patterns/gitignore/rust.txt +14 -0
- package/src/patterns/gitignore/terraform.txt +30 -0
- package/src/patterns/gitignore/vscode.txt +15 -0
- package/src/patterns/gitignore/windows.txt +25 -0
- package/src/utils/clone/index.js +165 -0
- package/src/utils/git-push/index.js +230 -0
- package/src/utils/git-status/index.js +116 -0
- package/src/utils/git-status/unix.sh +75 -0
- package/src/utils/registry.json +41 -0
- 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/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/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 -1028
- 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 -261
- 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/status.js
CHANGED
|
@@ -1,223 +1,276 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* status command.
|
|
5
|
+
* An overall health check that shows the current state of the DevUtils
|
|
6
|
+
* installation in a single-screen dashboard. Checks config, machine
|
|
7
|
+
* profile, auth services, aliases, API plugins, and sync status.
|
|
8
|
+
*
|
|
9
|
+
* This command is read-only and never modifies any files. It handles
|
|
10
|
+
* missing files gracefully, showing helpful placeholder messages
|
|
11
|
+
* instead of crashing.
|
|
5
12
|
*/
|
|
6
13
|
|
|
7
|
-
const { Command } = require('commander');
|
|
8
14
|
const fs = require('fs');
|
|
9
15
|
const path = require('path');
|
|
10
|
-
const
|
|
16
|
+
const os = require('os');
|
|
11
17
|
|
|
12
|
-
const
|
|
18
|
+
const meta = {
|
|
19
|
+
description: 'Overall health check',
|
|
20
|
+
arguments: [],
|
|
21
|
+
flags: []
|
|
22
|
+
};
|
|
13
23
|
|
|
14
24
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
25
|
+
* Checks the config.json status. Reports whether the file exists
|
|
26
|
+
* and whether it contains valid JSON.
|
|
27
|
+
*
|
|
28
|
+
* @param {object} config - The context.config module.
|
|
29
|
+
* @returns {{ exists: boolean, valid: boolean }}
|
|
17
30
|
*/
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const content = fs.readFileSync(CONFIG_FILE, 'utf8');
|
|
22
|
-
return JSON.parse(content);
|
|
23
|
-
}
|
|
24
|
-
} catch {
|
|
25
|
-
return null;
|
|
31
|
+
function checkConfig(config) {
|
|
32
|
+
if (!config.exists('config.json')) {
|
|
33
|
+
return { exists: false, valid: false };
|
|
26
34
|
}
|
|
27
|
-
|
|
35
|
+
const data = config.read('config.json');
|
|
36
|
+
if (data === null) {
|
|
37
|
+
return { exists: true, valid: false };
|
|
38
|
+
}
|
|
39
|
+
return { exists: true, valid: true };
|
|
28
40
|
}
|
|
29
41
|
|
|
30
42
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
43
|
+
* Checks the machine profile. Reads machines/current.json and pulls
|
|
44
|
+
* out key fields like type, arch, hostname, and packageManager.
|
|
45
|
+
*
|
|
46
|
+
* @param {object} config - The context.config module.
|
|
47
|
+
* @returns {{ detected: boolean, type?: string, arch?: string, hostname?: string, packageManager?: string }}
|
|
33
48
|
*/
|
|
34
|
-
function
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
39
|
-
});
|
|
40
|
-
return result.trim();
|
|
41
|
-
} catch {
|
|
42
|
-
return null;
|
|
49
|
+
function checkMachine(config) {
|
|
50
|
+
const profile = config.read('machines/current.json');
|
|
51
|
+
if (!profile) {
|
|
52
|
+
return { detected: false };
|
|
43
53
|
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
detected: true,
|
|
57
|
+
type: profile.os ? profile.os.type : (profile.type || 'unknown'),
|
|
58
|
+
arch: profile.arch || 'unknown',
|
|
59
|
+
hostname: profile.hostname || 'unknown',
|
|
60
|
+
packageManager: profile.packageManagers
|
|
61
|
+
? profile.packageManagers[0] || null
|
|
62
|
+
: (profile.packageManager || null),
|
|
63
|
+
};
|
|
44
64
|
}
|
|
45
65
|
|
|
46
66
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
67
|
+
* Checks the auth directory for connected services.
|
|
68
|
+
* Each JSON file (excluding subdirectories) represents a connected service.
|
|
69
|
+
*
|
|
70
|
+
* @param {object} config - The context.config module.
|
|
71
|
+
* @returns {{ services: string[], count: number }}
|
|
49
72
|
*/
|
|
50
|
-
function
|
|
73
|
+
function checkAuth(config) {
|
|
74
|
+
const authDir = config.getPath('auth');
|
|
75
|
+
if (!fs.existsSync(authDir)) {
|
|
76
|
+
return { services: [], count: 0 };
|
|
77
|
+
}
|
|
78
|
+
|
|
51
79
|
try {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
80
|
+
const entries = fs.readdirSync(authDir);
|
|
81
|
+
const services = entries
|
|
82
|
+
.filter(entry => {
|
|
83
|
+
const fullPath = path.join(authDir, entry);
|
|
84
|
+
return fs.statSync(fullPath).isFile() && entry.endsWith('.json');
|
|
85
|
+
})
|
|
86
|
+
.map(file => path.basename(file, '.json'));
|
|
87
|
+
|
|
88
|
+
return { services, count: services.length };
|
|
57
89
|
} catch {
|
|
58
|
-
return
|
|
90
|
+
return { services: [], count: 0 };
|
|
59
91
|
}
|
|
60
92
|
}
|
|
61
93
|
|
|
62
94
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
95
|
+
* Checks the aliases.json file for registered aliases.
|
|
96
|
+
*
|
|
97
|
+
* @param {object} config - The context.config module.
|
|
98
|
+
* @returns {{ count: number }}
|
|
65
99
|
*/
|
|
66
|
-
function
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return null;
|
|
100
|
+
function checkAliases(config) {
|
|
101
|
+
const data = config.read('aliases.json');
|
|
102
|
+
if (!data) {
|
|
103
|
+
return { count: 0 };
|
|
71
104
|
}
|
|
105
|
+
|
|
106
|
+
// Handle both array and object formats
|
|
107
|
+
if (Array.isArray(data)) {
|
|
108
|
+
return { count: data.length };
|
|
109
|
+
}
|
|
110
|
+
return { count: Object.keys(data).length };
|
|
72
111
|
}
|
|
73
112
|
|
|
74
113
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
114
|
+
* Checks the plugins.json file for installed API plugins.
|
|
115
|
+
*
|
|
116
|
+
* @param {object} config - The context.config module.
|
|
117
|
+
* @returns {{ count: number, plugins: string[] }}
|
|
77
118
|
*/
|
|
78
|
-
function
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
119
|
+
function checkPlugins(config) {
|
|
120
|
+
const data = config.read('plugins.json');
|
|
121
|
+
if (!data) {
|
|
122
|
+
return { count: 0, plugins: [] };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Handle both array and object formats
|
|
126
|
+
if (Array.isArray(data)) {
|
|
127
|
+
return { count: data.length, plugins: data };
|
|
128
|
+
}
|
|
129
|
+
const plugins = Object.keys(data);
|
|
130
|
+
return { count: plugins.length, plugins };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Checks the sync.json file for the last backup timestamp.
|
|
135
|
+
*
|
|
136
|
+
* @param {object} config - The context.config module.
|
|
137
|
+
* @returns {{ lastBackup: string|null }}
|
|
138
|
+
*/
|
|
139
|
+
function checkSync(config) {
|
|
140
|
+
const data = config.read('sync.json');
|
|
141
|
+
if (!data || !data.lastBackup) {
|
|
142
|
+
return { lastBackup: null };
|
|
143
|
+
}
|
|
144
|
+
return { lastBackup: data.lastBackup };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Formats a human-readable summary line for the config section.
|
|
149
|
+
*
|
|
150
|
+
* @param {{ exists: boolean, valid: boolean }} configStatus - The config check result.
|
|
151
|
+
* @returns {string}
|
|
152
|
+
*/
|
|
153
|
+
function formatConfig(configStatus) {
|
|
154
|
+
if (!configStatus.exists) {
|
|
155
|
+
return 'Not found. Run \'dev config init\' to get started.';
|
|
156
|
+
}
|
|
157
|
+
if (!configStatus.valid) {
|
|
158
|
+
return 'Invalid JSON. Check ~/.devutils/config.json for syntax errors.';
|
|
159
|
+
}
|
|
160
|
+
return 'OK';
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Formats a human-readable summary line for the machine section.
|
|
165
|
+
*
|
|
166
|
+
* @param {{ detected: boolean, type?: string, arch?: string, packageManager?: string }} machineStatus - The machine check result.
|
|
167
|
+
* @returns {string}
|
|
168
|
+
*/
|
|
169
|
+
function formatMachine(machineStatus) {
|
|
170
|
+
if (!machineStatus.detected) {
|
|
171
|
+
return 'Not detected. Run \'dev machine detect\' to set up.';
|
|
86
172
|
}
|
|
173
|
+
const pm = machineStatus.packageManager ? ` (${machineStatus.packageManager})` : '';
|
|
174
|
+
return `${machineStatus.type} ${machineStatus.arch}${pm}`;
|
|
87
175
|
}
|
|
88
176
|
|
|
89
177
|
/**
|
|
90
|
-
*
|
|
178
|
+
* Formats a human-readable summary line for the auth section.
|
|
179
|
+
*
|
|
180
|
+
* @param {{ services: string[], count: number }} authStatus - The auth check result.
|
|
91
181
|
* @returns {string}
|
|
92
182
|
*/
|
|
93
|
-
function
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return 'macOS';
|
|
97
|
-
case 'win32':
|
|
98
|
-
return 'Windows';
|
|
99
|
-
case 'linux':
|
|
100
|
-
return 'Linux';
|
|
101
|
-
default:
|
|
102
|
-
return process.platform;
|
|
183
|
+
function formatAuth(authStatus) {
|
|
184
|
+
if (authStatus.count === 0) {
|
|
185
|
+
return 'No services connected.';
|
|
103
186
|
}
|
|
187
|
+
return `${authStatus.count} services (${authStatus.services.join(', ')})`;
|
|
104
188
|
}
|
|
105
189
|
|
|
106
190
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* @
|
|
191
|
+
* Formats a human-readable summary line for the aliases section.
|
|
192
|
+
*
|
|
193
|
+
* @param {{ count: number }} aliasStatus - The alias check result.
|
|
194
|
+
* @returns {string}
|
|
110
195
|
*/
|
|
111
|
-
function
|
|
196
|
+
function formatAliases(aliasStatus) {
|
|
197
|
+
if (aliasStatus.count === 0) {
|
|
198
|
+
return 'None registered.';
|
|
199
|
+
}
|
|
200
|
+
return `${aliasStatus.count} registered`;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Formats a human-readable summary line for the plugins section.
|
|
205
|
+
*
|
|
206
|
+
* @param {{ count: number, plugins: string[] }} pluginStatus - The plugin check result.
|
|
207
|
+
* @returns {string}
|
|
208
|
+
*/
|
|
209
|
+
function formatPlugins(pluginStatus) {
|
|
210
|
+
if (pluginStatus.count === 0) {
|
|
211
|
+
return 'None installed.';
|
|
212
|
+
}
|
|
213
|
+
return `${pluginStatus.count} installed (${pluginStatus.plugins.join(', ')})`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Formats a human-readable summary line for the sync section.
|
|
218
|
+
*
|
|
219
|
+
* @param {{ lastBackup: string|null }} syncStatus - The sync check result.
|
|
220
|
+
* @returns {string}
|
|
221
|
+
*/
|
|
222
|
+
function formatSync(syncStatus) {
|
|
223
|
+
if (!syncStatus.lastBackup) {
|
|
224
|
+
return 'Never.';
|
|
225
|
+
}
|
|
226
|
+
// Format the ISO timestamp into something more readable
|
|
112
227
|
try {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
return true;
|
|
228
|
+
const date = new Date(syncStatus.lastBackup);
|
|
229
|
+
return date.toLocaleString();
|
|
116
230
|
} catch {
|
|
117
|
-
return
|
|
231
|
+
return syncStatus.lastBackup;
|
|
118
232
|
}
|
|
119
233
|
}
|
|
120
234
|
|
|
121
235
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
236
|
+
* Runs the status health check. Gathers information from config files,
|
|
237
|
+
* machine profile, auth directory, aliases, plugins, and sync state.
|
|
238
|
+
* Outputs a compact summary for humans or a structured object for JSON.
|
|
239
|
+
*
|
|
240
|
+
* @param {object} args - Parsed command arguments (none expected).
|
|
241
|
+
* @param {object} context - The CLI context object with config, platform, shell, output, flags.
|
|
124
242
|
*/
|
|
125
|
-
function
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
}
|
|
243
|
+
async function run(args, context) {
|
|
244
|
+
const configStatus = checkConfig(context.config);
|
|
245
|
+
const machineStatus = checkMachine(context.config);
|
|
246
|
+
const authStatus = checkAuth(context.config);
|
|
247
|
+
const aliasStatus = checkAliases(context.config);
|
|
248
|
+
const pluginStatus = checkPlugins(context.config);
|
|
249
|
+
const syncStatus = checkSync(context.config);
|
|
250
|
+
|
|
251
|
+
const result = {
|
|
252
|
+
config: configStatus,
|
|
253
|
+
machine: machineStatus,
|
|
254
|
+
auth: authStatus,
|
|
255
|
+
aliases: aliasStatus,
|
|
256
|
+
plugins: pluginStatus,
|
|
257
|
+
sync: syncStatus,
|
|
258
|
+
};
|
|
216
259
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
260
|
+
if (context.flags.format === 'json') {
|
|
261
|
+
context.output.out(result);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Human-friendly output
|
|
266
|
+
context.output.info('DevUtils Status');
|
|
267
|
+
context.output.info('---------------');
|
|
268
|
+
context.output.info(`Config: ${formatConfig(configStatus)}`);
|
|
269
|
+
context.output.info(`Machine: ${formatMachine(machineStatus)}`);
|
|
270
|
+
context.output.info(`Auth: ${formatAuth(authStatus)}`);
|
|
271
|
+
context.output.info(`Aliases: ${formatAliases(aliasStatus)}`);
|
|
272
|
+
context.output.info(`API Plugins: ${formatPlugins(pluginStatus)}`);
|
|
273
|
+
context.output.info(`Last Sync: ${formatSync(syncStatus)}`);
|
|
274
|
+
}
|
|
222
275
|
|
|
223
|
-
module.exports =
|
|
276
|
+
module.exports = { meta, run };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Command: dev tools check <tool-name>
|
|
5
|
+
*
|
|
6
|
+
* Checks if a tool is installed and shows its version.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @type {{ description: string, arguments: Array, flags: Array }}
|
|
11
|
+
*/
|
|
12
|
+
const meta = {
|
|
13
|
+
description: 'Check if a tool is installed and show its version',
|
|
14
|
+
arguments: [
|
|
15
|
+
{ name: 'tool', description: 'Name of the tool to check', required: true }
|
|
16
|
+
],
|
|
17
|
+
flags: []
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Runs the check command.
|
|
22
|
+
* @param {{ positional: string[], flags: object }} args - Parsed command arguments.
|
|
23
|
+
* @param {object} context - The CLI context object.
|
|
24
|
+
*/
|
|
25
|
+
async function run(args, context) {
|
|
26
|
+
const toolName = args.positional[0];
|
|
27
|
+
|
|
28
|
+
if (!toolName) {
|
|
29
|
+
context.errors.throwError(400, 'Missing required argument: tool. Usage: dev tools check <tool-name>', 'tools');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const installer = require('../../lib/installer');
|
|
34
|
+
|
|
35
|
+
// Look up the tool in the registry
|
|
36
|
+
const tool = installer.findTool(toolName);
|
|
37
|
+
if (!tool) {
|
|
38
|
+
context.output.error(`Tool '${toolName}' not found in registry. Run "dev tools search ${toolName}" to search.`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
// Load the installer and check if the tool is installed
|
|
44
|
+
const mod = installer.loadInstaller(tool);
|
|
45
|
+
const installed = await mod.isInstalled(context);
|
|
46
|
+
|
|
47
|
+
if (installed) {
|
|
48
|
+
// Try to get the version
|
|
49
|
+
let version = 'version unknown';
|
|
50
|
+
if (typeof mod.getVersion === 'function') {
|
|
51
|
+
const ver = await mod.getVersion(context);
|
|
52
|
+
if (ver) {
|
|
53
|
+
version = `version ${ver}`;
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
// Fall back to --version
|
|
57
|
+
try {
|
|
58
|
+
const result = await context.shell.exec(`${tool.name} --version`);
|
|
59
|
+
if (result.exitCode === 0 && result.stdout) {
|
|
60
|
+
const match = result.stdout.trim().match(/(\d+\.\d+[\.\d]*)/);
|
|
61
|
+
if (match) {
|
|
62
|
+
version = `version ${match[1]}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
// version remains "version unknown"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
context.output.out({ name: tool.name, installed: true, version });
|
|
71
|
+
} else {
|
|
72
|
+
context.output.out({ name: tool.name, installed: false, version: null });
|
|
73
|
+
}
|
|
74
|
+
} catch (err) {
|
|
75
|
+
context.output.error(err.message);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
module.exports = { meta, run };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools service registration.
|
|
3
|
+
* Tool installation and management.
|
|
4
|
+
*/
|
|
5
|
+
module.exports = {
|
|
6
|
+
name: 'tools',
|
|
7
|
+
description: 'Tool installation and management',
|
|
8
|
+
commands: {
|
|
9
|
+
install: () => require('./install'),
|
|
10
|
+
check: () => require('./check'),
|
|
11
|
+
list: () => require('./list'),
|
|
12
|
+
search: () => require('./search'),
|
|
13
|
+
}
|
|
14
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Command: dev tools install <tool-name>
|
|
5
|
+
*
|
|
6
|
+
* Installs a development tool using the platform-appropriate method.
|
|
7
|
+
* Resolves and installs dependencies automatically.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @type {{ description: string, arguments: Array, flags: Array }}
|
|
12
|
+
*/
|
|
13
|
+
const meta = {
|
|
14
|
+
description: 'Install a development tool',
|
|
15
|
+
arguments: [
|
|
16
|
+
{ name: 'tool', description: 'Name of the tool to install', required: true }
|
|
17
|
+
],
|
|
18
|
+
flags: [
|
|
19
|
+
{ name: '--dry-run', description: 'Show what would be installed without doing it' },
|
|
20
|
+
{ name: '--skip-deps', description: 'Skip dependency installation' }
|
|
21
|
+
]
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Runs the install command.
|
|
26
|
+
* @param {{ positional: string[], flags: object }} args - Parsed command arguments.
|
|
27
|
+
* @param {object} context - The CLI context object.
|
|
28
|
+
*/
|
|
29
|
+
async function run(args, context) {
|
|
30
|
+
const toolName = args.positional[0];
|
|
31
|
+
|
|
32
|
+
if (!toolName) {
|
|
33
|
+
context.errors.throwError(400, 'Missing required argument: tool. Usage: dev tools install <tool-name>', 'tools');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const installer = require('../../lib/installer');
|
|
38
|
+
|
|
39
|
+
// Look up the tool in the registry
|
|
40
|
+
const tool = installer.findTool(toolName);
|
|
41
|
+
if (!tool) {
|
|
42
|
+
context.output.error(`Tool '${toolName}' not found in registry. Run "dev tools search ${toolName}" to search.`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check platform support
|
|
47
|
+
const platformType = context.platform.detect().type;
|
|
48
|
+
if (!tool.platforms.includes(platformType)) {
|
|
49
|
+
context.output.error(
|
|
50
|
+
`Tool '${tool.name}' is not supported on ${platformType}. ` +
|
|
51
|
+
`Supported platforms: ${tool.platforms.join(', ')}`
|
|
52
|
+
);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Dry run: show what would be installed without doing it
|
|
57
|
+
if (context.flags.dryRun || args.flags['dry-run']) {
|
|
58
|
+
try {
|
|
59
|
+
const chain = installer.resolveDependencies(tool.name);
|
|
60
|
+
|
|
61
|
+
// Check which tools are already installed
|
|
62
|
+
const statuses = [];
|
|
63
|
+
for (const name of chain) {
|
|
64
|
+
const isAlready = await installer.checkInstalled(name, context);
|
|
65
|
+
statuses.push({ name, installed: isAlready });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const needsInstall = statuses.filter(s => !s.installed);
|
|
69
|
+
const alreadyInstalled = statuses.filter(s => s.installed);
|
|
70
|
+
|
|
71
|
+
if (needsInstall.length === 0) {
|
|
72
|
+
context.output.info(`${tool.name} is already installed (and all dependencies).`);
|
|
73
|
+
} else {
|
|
74
|
+
context.output.info('Would install (in order):');
|
|
75
|
+
for (const s of needsInstall) {
|
|
76
|
+
context.output.info(` - ${s.name}`);
|
|
77
|
+
}
|
|
78
|
+
if (alreadyInstalled.length > 0) {
|
|
79
|
+
context.output.info('Already installed:');
|
|
80
|
+
for (const s of alreadyInstalled) {
|
|
81
|
+
context.output.info(` - ${s.name}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch (err) {
|
|
86
|
+
context.output.error(err.message);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Actually install
|
|
92
|
+
try {
|
|
93
|
+
const result = await installer.installTool(tool.name, context);
|
|
94
|
+
|
|
95
|
+
if (result.alreadyInstalled) {
|
|
96
|
+
context.output.info(`${tool.name} is already installed.`);
|
|
97
|
+
} else {
|
|
98
|
+
if (result.dependenciesInstalled.length > 0) {
|
|
99
|
+
context.output.info(`Dependencies installed: ${result.dependenciesInstalled.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
if (result.installed) {
|
|
102
|
+
context.output.info(`${tool.name} installed successfully.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
context.output.error(err.message);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = { meta, run };
|