@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/README.md
CHANGED
|
@@ -1,178 +1,251 @@
|
|
|
1
1
|
# DevUtils CLI
|
|
2
2
|
|
|
3
|
-
> **
|
|
4
|
-
> - Use it as-is and provide feedback
|
|
5
|
-
> - Participate in development
|
|
6
|
-
> - Watch for future releases (v0.1.0 for beta, v1.0.0 for stable)
|
|
7
|
-
> - [Reach out](#contact) with questions or suggestions
|
|
3
|
+
> **Work in Progress** -- This project is under active development and has not been fully tested in real-world environments. Commands may change, break, or behave unexpectedly. Use at your own risk. The stable, production-ready release will ship as **v1.0**. Until then, versions in the `0.x` range should be considered pre-release.
|
|
8
4
|
|
|
9
|
-
|
|
5
|
+
A config-driven CLI toolkit for bootstrapping and managing development environments across any machine.
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Every developer knows the pain:
|
|
14
|
-
- New laptop? Spend a day installing tools and configuring dotfiles
|
|
15
|
-
- Switch between work and personal projects? Juggle SSH keys and git configs
|
|
16
|
-
- Help a teammate set up their environment? Walk them through 50 different steps
|
|
17
|
-
- Work on macOS at home, Linux in prod? Remember two sets of commands
|
|
18
|
-
|
|
19
|
-
## The Solution
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
npm install -g @fredlackey/devutils
|
|
23
|
-
dev setup
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
That's it. DevUtils CLI detects your operating system and installs everything you need. Your configuration travels with you.
|
|
7
|
+
DevUtils replaces scattered dotfiles, setup scripts, and manual configuration with a single `dev` command. You tell it what you need, and it handles the rest -- whether you're setting up a new laptop, syncing git identities across machines, or managing tool installations.
|
|
27
8
|
|
|
28
9
|
## Installation
|
|
29
10
|
|
|
30
|
-
### If You Have Node.js Installed
|
|
31
|
-
|
|
32
|
-
If you already have Node.js 18+ on your machine, install DevUtils CLI as a global npm package:
|
|
33
|
-
|
|
34
11
|
```bash
|
|
35
12
|
npm install -g @fredlackey/devutils
|
|
36
13
|
```
|
|
37
14
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
For a fresh machine without Node.js, run the bootstrap script. It installs everything you need: build tools, nvm, Node.js LTS, and DevUtils CLI.
|
|
41
|
-
|
|
42
|
-
**macOS:**
|
|
43
|
-
```bash
|
|
44
|
-
bash -c "$(curl -LsS https://raw.github.com/fredlackey/devutils-cli/main/setup.sh)"
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Ubuntu / Debian / Raspberry Pi OS:**
|
|
48
|
-
```bash
|
|
49
|
-
bash -c "$(wget -qO - https://raw.github.com/fredlackey/devutils-cli/main/setup.sh)"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**Amazon Linux / RHEL / Fedora:**
|
|
53
|
-
```bash
|
|
54
|
-
bash -c "$(curl -LsS https://raw.github.com/fredlackey/devutils-cli/main/setup.sh)"
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
The script is interactive by default. For automated/CI environments, add `--no-prompt`:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
bash -c "$(curl -LsS https://raw.github.com/fredlackey/devutils-cli/main/setup.sh)" -- --no-prompt
|
|
61
|
-
```
|
|
15
|
+
Requires Node.js 18 or later.
|
|
62
16
|
|
|
63
17
|
## Quick Start
|
|
64
18
|
|
|
65
|
-
|
|
66
|
-
# Install essential tools (git, ssh, gpg, etc.)
|
|
67
|
-
dev setup
|
|
68
|
-
|
|
69
|
-
# Set up your developer profile
|
|
70
|
-
dev configure
|
|
71
|
-
|
|
72
|
-
# Install your favorite tools
|
|
73
|
-
dev install vscode
|
|
74
|
-
dev install docker
|
|
75
|
-
dev install node
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Key Features
|
|
79
|
-
|
|
80
|
-
### Cross-Platform Package Installation
|
|
81
|
-
|
|
82
|
-
Forget whether it's `brew install`, `apt-get install`, or `choco install`. Just run:
|
|
19
|
+
Once installed, the `dev` command is available globally:
|
|
83
20
|
|
|
84
21
|
```bash
|
|
85
|
-
dev
|
|
86
|
-
dev
|
|
87
|
-
dev
|
|
22
|
+
dev help # Show all available services and commands
|
|
23
|
+
dev version # Print the current version
|
|
24
|
+
dev config init # Walk through first-time setup
|
|
25
|
+
dev status # Check the health of your environment
|
|
26
|
+
dev ignore node # Add Node.js patterns to .gitignore
|
|
27
|
+
dev tools list # See what tools are installed
|
|
28
|
+
dev identity list # List your configured git identities
|
|
29
|
+
dev util list # Browse available utility functions
|
|
88
30
|
```
|
|
89
31
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
### Git Identity Management
|
|
32
|
+
## Command Reference
|
|
93
33
|
|
|
94
|
-
|
|
34
|
+
DevUtils organizes commands by service. The general pattern is:
|
|
95
35
|
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
dev identity add work --email you@company.com
|
|
99
|
-
dev identity add personal --email you@gmail.com
|
|
100
|
-
|
|
101
|
-
# Link identities to folders - commits automatically use the right credentials
|
|
102
|
-
dev identity link work ~/work
|
|
103
|
-
dev identity link personal ~/personal https://github.com/yourusername
|
|
36
|
+
```
|
|
37
|
+
dev <service> <method> [arguments] [flags]
|
|
104
38
|
```
|
|
105
39
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
40
|
+
### Services
|
|
41
|
+
|
|
42
|
+
#### config -- User configuration and onboarding
|
|
43
|
+
|
|
44
|
+
| Method | Description |
|
|
45
|
+
|----------|----------------------------------------------|
|
|
46
|
+
| `init` | Run first-time setup and create config files |
|
|
47
|
+
| `show` | Display the current configuration |
|
|
48
|
+
| `get` | Read a specific config value |
|
|
49
|
+
| `set` | Update a specific config value |
|
|
50
|
+
| `reset` | Reset configuration to defaults |
|
|
51
|
+
| `export` | Export config to a file |
|
|
52
|
+
| `import` | Import config from a file |
|
|
53
|
+
|
|
54
|
+
#### machine -- Machine profiles and detection
|
|
55
|
+
|
|
56
|
+
| Method | Description |
|
|
57
|
+
|----------|-------------------------------------|
|
|
58
|
+
| `detect` | Auto-detect the current machine |
|
|
59
|
+
| `show` | Show the active machine profile |
|
|
60
|
+
| `set` | Set a machine profile value |
|
|
61
|
+
| `list` | List all known machine profiles |
|
|
62
|
+
|
|
63
|
+
#### identity -- Git identities, SSH keys, GPG signing
|
|
64
|
+
|
|
65
|
+
| Method | Description |
|
|
66
|
+
|----------|---------------------------------------------|
|
|
67
|
+
| `add` | Register a new git identity |
|
|
68
|
+
| `remove` | Remove a registered identity |
|
|
69
|
+
| `list` | List all identities |
|
|
70
|
+
| `show` | Show details for a specific identity |
|
|
71
|
+
| `link` | Link an identity to a folder or repo |
|
|
72
|
+
| `unlink` | Remove a folder/repo identity link |
|
|
73
|
+
| `sync` | Sync identity configs to git and SSH |
|
|
74
|
+
|
|
75
|
+
#### tools -- Tool installation and management
|
|
76
|
+
|
|
77
|
+
| Method | Description |
|
|
78
|
+
|-----------|------------------------------------------|
|
|
79
|
+
| `install` | Install a tool using the platform's package manager |
|
|
80
|
+
| `check` | Check if a tool is installed |
|
|
81
|
+
| `list` | List available or installed tools |
|
|
82
|
+
| `search` | Search for tools by name |
|
|
83
|
+
|
|
84
|
+
#### ignore -- .gitignore pattern management
|
|
85
|
+
|
|
86
|
+
| Method | Description |
|
|
87
|
+
|----------|----------------------------------------------|
|
|
88
|
+
| `add` | Add technology patterns to .gitignore |
|
|
89
|
+
| `remove` | Remove a technology's patterns |
|
|
90
|
+
| `list` | List available technologies |
|
|
91
|
+
| `show` | Show patterns for a specific technology |
|
|
92
|
+
|
|
93
|
+
#### util -- Utility functions
|
|
94
|
+
|
|
95
|
+
| Method | Description |
|
|
96
|
+
|----------|---------------------------------------|
|
|
97
|
+
| `add` | Register a custom utility |
|
|
98
|
+
| `remove` | Unregister a utility |
|
|
99
|
+
| `list` | List all available utilities |
|
|
100
|
+
| `show` | Show details for a specific utility |
|
|
101
|
+
| `run` | Execute a utility |
|
|
102
|
+
|
|
103
|
+
#### alias -- Shorthand bin entries
|
|
104
|
+
|
|
105
|
+
| Method | Description |
|
|
106
|
+
|----------|------------------------------------------|
|
|
107
|
+
| `add` | Create a new alias |
|
|
108
|
+
| `remove` | Delete an alias |
|
|
109
|
+
| `list` | List all registered aliases |
|
|
110
|
+
| `sync` | Regenerate alias wrapper scripts |
|
|
111
|
+
|
|
112
|
+
#### auth -- OAuth and credential management
|
|
113
|
+
|
|
114
|
+
| Method | Description |
|
|
115
|
+
|-----------|--------------------------------------|
|
|
116
|
+
| `login` | Authenticate with a service |
|
|
117
|
+
| `logout` | Revoke credentials for a service |
|
|
118
|
+
| `list` | List authenticated services |
|
|
119
|
+
| `status` | Show current auth status |
|
|
120
|
+
| `refresh` | Refresh an expired token |
|
|
121
|
+
|
|
122
|
+
#### api -- API plugin system
|
|
123
|
+
|
|
124
|
+
| Method | Description |
|
|
125
|
+
|-----------|-------------------------------------|
|
|
126
|
+
| `list` | List installed API plugins |
|
|
127
|
+
| `enable` | Enable a plugin |
|
|
128
|
+
| `disable` | Disable a plugin |
|
|
129
|
+
| `update` | Update a plugin to latest version |
|
|
130
|
+
|
|
131
|
+
#### ai -- AI coding assistant launcher
|
|
132
|
+
|
|
133
|
+
| Method | Description |
|
|
134
|
+
|------------|-----------------------------------------|
|
|
135
|
+
| `launch` | Start an AI coding session |
|
|
136
|
+
| `resume` | Resume a previous session |
|
|
137
|
+
| `list` | List configured AI tools |
|
|
138
|
+
| `sessions` | List past sessions |
|
|
139
|
+
| `show` | Show details for a session or AI tool |
|
|
140
|
+
| `set` | Update AI tool settings |
|
|
141
|
+
|
|
142
|
+
#### search -- Markdown search
|
|
143
|
+
|
|
144
|
+
| Method | Description |
|
|
145
|
+
|---------------|------------------------------------------|
|
|
146
|
+
| `query` | Run a general search |
|
|
147
|
+
| `keyword` | Search by keyword |
|
|
148
|
+
| `semantic` | Search by meaning (requires AI plugin) |
|
|
149
|
+
| `get` | Retrieve a specific search result |
|
|
150
|
+
| `collections` | List indexed collections |
|
|
151
|
+
| `index` | Build or rebuild the search index |
|
|
152
|
+
| `status` | Show indexing status |
|
|
153
|
+
|
|
154
|
+
### Top-Level Commands
|
|
155
|
+
|
|
156
|
+
These commands don't belong to a service and are called directly:
|
|
157
|
+
|
|
158
|
+
| Command | Description |
|
|
159
|
+
|-----------|------------------------------------|
|
|
160
|
+
| `status` | Overall health check |
|
|
161
|
+
| `version` | Show current version |
|
|
162
|
+
| `help` | Show the help message |
|
|
163
|
+
| `schema` | Introspect available commands |
|
|
164
|
+
| `update` | Update DevUtils to latest version |
|
|
165
|
+
|
|
166
|
+
### Global Flags
|
|
167
|
+
|
|
168
|
+
These flags work with any command:
|
|
169
|
+
|
|
170
|
+
| Flag | Description |
|
|
171
|
+
|-----------------------------------|------------------------------------|
|
|
172
|
+
| `--format <json\|table\|yaml\|csv>` | Set the output format |
|
|
173
|
+
| `--dry-run` | Show what would happen without doing it |
|
|
174
|
+
| `--verbose` | Increase output detail |
|
|
175
|
+
| `--quiet` | Suppress non-essential output |
|
|
176
|
+
| `--json <data>` | Pass structured input as JSON |
|
|
177
|
+
| `--help`, `-h` | Show help |
|
|
178
|
+
| `--version`, `-v` | Show version |
|
|
179
|
+
|
|
180
|
+
## API Plugin System
|
|
181
|
+
|
|
182
|
+
DevUtils doesn't bundle API integrations directly. Instead, API wrappers are installed as separate plugin packages and managed through the `dev api` service.
|
|
183
|
+
|
|
184
|
+
Plugins live in `~/.devutils/plugins/` and are registered in `~/.devutils/plugins.json`. Each plugin is a standard npm package that exports a defined interface. This keeps the core CLI small and lets you add only the integrations you actually use.
|
|
109
185
|
|
|
110
186
|
```bash
|
|
111
|
-
dev
|
|
112
|
-
dev
|
|
113
|
-
dev
|
|
187
|
+
dev api list # See what's installed
|
|
188
|
+
dev api enable <plugin> # Enable a plugin
|
|
189
|
+
dev api disable <plugin> # Disable a plugin
|
|
190
|
+
dev api update <plugin> # Update to latest version
|
|
114
191
|
```
|
|
115
192
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
### Portable Configuration
|
|
119
|
-
|
|
120
|
-
Your `~/.devutils` file stores your preferences:
|
|
193
|
+
## Configuration
|
|
121
194
|
|
|
122
|
-
|
|
123
|
-
{
|
|
124
|
-
"user": {
|
|
125
|
-
"name": "Jane Developer",
|
|
126
|
-
"email": "jane@example.com"
|
|
127
|
-
},
|
|
128
|
-
"identities": {
|
|
129
|
-
"work": { "email": "jane@company.com", "sshKey": "~/.ssh/id_ed25519_work" },
|
|
130
|
-
"personal": { "email": "jane@gmail.com", "sshKey": "~/.ssh/id_ed25519_personal" }
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
```
|
|
195
|
+
All user data lives in `~/.devutils/`, created during `dev config init`:
|
|
134
196
|
|
|
135
|
-
|
|
197
|
+
- `config.json` -- User preferences, profile name, backup location
|
|
198
|
+
- `aliases.json` -- Registered alias mappings
|
|
199
|
+
- `ai.json` -- AI tool configurations
|
|
200
|
+
- `plugins.json` -- Installed API plugin registry
|
|
201
|
+
- `machines/` -- Machine profiles
|
|
202
|
+
- `auth/` -- OAuth tokens and API credentials
|
|
203
|
+
- `plugins/` -- Installed API plugin packages
|
|
204
|
+
- `utils/` -- User-added custom utilities
|
|
205
|
+
- `bin/` -- Generated alias wrapper scripts (added to PATH)
|
|
206
|
+
- `cache/` -- Temporary data
|
|
136
207
|
|
|
137
208
|
## Supported Platforms
|
|
138
209
|
|
|
139
|
-
| Platform
|
|
140
|
-
|
|
141
|
-
| macOS
|
|
142
|
-
| Ubuntu
|
|
143
|
-
| Raspberry Pi OS
|
|
144
|
-
| Amazon Linux
|
|
145
|
-
| Windows
|
|
146
|
-
| Git Bash
|
|
147
|
-
|
|
148
|
-
##
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
-
|
|
166
|
-
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
210
|
+
| Platform | Package Manager |
|
|
211
|
+
|-------------------|---------------------|
|
|
212
|
+
| macOS | Homebrew |
|
|
213
|
+
| Ubuntu | APT, Snap |
|
|
214
|
+
| Raspberry Pi OS | APT, Snap |
|
|
215
|
+
| Amazon Linux | DNF, YUM |
|
|
216
|
+
| Windows | Chocolatey, winget |
|
|
217
|
+
| Git Bash | Manual / Portable |
|
|
218
|
+
|
|
219
|
+
## Current Status
|
|
220
|
+
|
|
221
|
+
DevUtils is in **pre-release** (`0.1.x`). The core framework, command routing, and service structure are in place. Basic smoke tests pass on Ubuntu 24.04 in Docker, but deeper integration testing -- real Git operations, SSH key workflows, GitHub auth, tool installation, and interactive prompts -- has not been completed yet.
|
|
222
|
+
|
|
223
|
+
What's working:
|
|
224
|
+
- Command routing and service discovery across all 11 services
|
|
225
|
+
- Config init, show, get, set, reset, file-based export/import
|
|
226
|
+
- Machine detection and profile management
|
|
227
|
+
- Gitignore pattern management (add, remove, list, show)
|
|
228
|
+
- Tool check, list, search, and dry-run install
|
|
229
|
+
- Identity CRUD (add, list, show, remove)
|
|
230
|
+
- Alias management and wrapper generation
|
|
231
|
+
- AI tool configuration
|
|
232
|
+
- Schema introspection
|
|
233
|
+
- Platform detection (macOS, Ubuntu, Raspberry Pi OS, Amazon Linux, Windows, Git Bash)
|
|
234
|
+
|
|
235
|
+
What still needs real-world testing:
|
|
236
|
+
- SSH key generation and GitHub integration
|
|
237
|
+
- Git identity sync to actual repositories
|
|
238
|
+
- Config backup/restore via remote Git repo
|
|
239
|
+
- OAuth login flows
|
|
240
|
+
- Tool installation on each supported platform
|
|
241
|
+
- API plugin installation and lifecycle
|
|
242
|
+
- AI session launch and resume
|
|
243
|
+
- QMD search indexing and queries
|
|
244
|
+
|
|
245
|
+
Patch versions (`0.1.1`, `0.1.2`, etc.) will ship as issues are found and fixed during hands-on use. Minor version bumps (`0.2.0`) are reserved for breaking changes. The first stable release will be **v1.0.0**.
|
|
171
246
|
|
|
172
247
|
## Contact
|
|
173
248
|
|
|
174
|
-
Questions, suggestions, or just want to chat about the project?
|
|
175
|
-
|
|
176
249
|
**Fred Lackey**
|
|
177
250
|
- Email: [fred.lackey@gmail.com](mailto:fred.lackey@gmail.com)
|
|
178
251
|
- Website: [fredlackey.com](https://fredlackey.com)
|
package/package.json
CHANGED
|
@@ -1,101 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fredlackey/devutils",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A config-driven CLI toolkit for bootstrapping and managing development environments across any machine.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
7
|
-
"dev": "./
|
|
8
|
-
"afk": "./src/scripts/afk.js",
|
|
9
|
-
"backup-all": "./src/scripts/backup-all.js",
|
|
10
|
-
"backup-source": "./src/scripts/backup-source.js",
|
|
11
|
-
"brewd": "./src/scripts/brewd.js",
|
|
12
|
-
"brewi": "./src/scripts/brewi.js",
|
|
13
|
-
"brewr": "./src/scripts/brewr.js",
|
|
14
|
-
"brews": "./src/scripts/brews.js",
|
|
15
|
-
"brewu": "./src/scripts/brewu.js",
|
|
16
|
-
"c": "./src/scripts/c.js",
|
|
17
|
-
"ccurl": "./src/scripts/ccurl.js",
|
|
18
|
-
"certbot-crontab-init": "./src/scripts/certbot-crontab-init.js",
|
|
19
|
-
"certbot-init": "./src/scripts/certbot-init.js",
|
|
20
|
-
"ch": "./src/scripts/ch.js",
|
|
21
|
-
"claude-danger": "./src/scripts/claude-danger.js",
|
|
22
|
-
"clean-dev": "./src/scripts/clean-dev.js",
|
|
23
|
-
"clear-dns-cache": "./src/scripts/clear-dns-cache.js",
|
|
24
|
-
"clone": "./src/scripts/clone.js",
|
|
25
|
-
"code-all": "./src/scripts/code-all.js",
|
|
26
|
-
"count": "./src/scripts/count.js",
|
|
27
|
-
"count-files": "./src/scripts/count-files.js",
|
|
28
|
-
"count-folders": "./src/scripts/count-folders.js",
|
|
29
|
-
"d": "./src/scripts/d.js",
|
|
30
|
-
"datauri": "./src/scripts/datauri.js",
|
|
31
|
-
"delete-files": "./src/scripts/delete-files.js",
|
|
32
|
-
"docker-clean": "./src/scripts/docker-clean.js",
|
|
33
|
-
"dp": "./src/scripts/dp.js",
|
|
34
|
-
"e": "./src/scripts/e.js",
|
|
35
|
-
"empty-trash": "./src/scripts/empty-trash.js",
|
|
36
|
-
"evm": "./src/scripts/evm.js",
|
|
37
|
-
"fetch-github-repos": "./src/scripts/fetch-github-repos.js",
|
|
38
|
-
"get-channel": "./src/scripts/get-channel.js",
|
|
39
|
-
"get-course": "./src/scripts/get-course.js",
|
|
40
|
-
"get-dependencies": "./src/scripts/get-dependencies.js",
|
|
41
|
-
"get-folder": "./src/scripts/get-folder.js",
|
|
42
|
-
"get-tunes": "./src/scripts/get-tunes.js",
|
|
43
|
-
"get-video": "./src/scripts/get-video.js",
|
|
44
|
-
"git-backup": "./src/scripts/git-backup.js",
|
|
45
|
-
"git-clone": "./src/scripts/git-clone.js",
|
|
46
|
-
"git-pup": "./src/scripts/git-pup.js",
|
|
47
|
-
"git-push": "./src/scripts/git-push.js",
|
|
48
|
-
"h": "./src/scripts/h.js",
|
|
49
|
-
"hide-desktop-icons": "./src/scripts/hide-desktop-icons.js",
|
|
50
|
-
"hide-hidden-files": "./src/scripts/hide-hidden-files.js",
|
|
51
|
-
"install-dependencies-from": "./src/scripts/install-dependencies-from.js",
|
|
52
|
-
"ips": "./src/scripts/ips.js",
|
|
53
|
-
"iso": "./src/scripts/iso.js",
|
|
54
|
-
"killni": "./src/scripts/killni.js",
|
|
55
|
-
"ll": "./src/scripts/ll.js",
|
|
56
|
-
"local-ip": "./src/scripts/local-ip.js",
|
|
57
|
-
"m": "./src/scripts/m.js",
|
|
58
|
-
"map": "./src/scripts/map.js",
|
|
59
|
-
"mkd": "./src/scripts/mkd.js",
|
|
60
|
-
"ncu-update-all": "./src/scripts/ncu-update-all.js",
|
|
61
|
-
"nginx-init": "./src/scripts/nginx-init.js",
|
|
62
|
-
"npmi": "./src/scripts/npmi.js",
|
|
63
|
-
"o": "./src/scripts/o.js",
|
|
64
|
-
"org-by-date": "./src/scripts/org-by-date.js",
|
|
65
|
-
"p": "./src/scripts/p.js",
|
|
66
|
-
"packages": "./src/scripts/packages.js",
|
|
67
|
-
"path": "./src/scripts/path.js",
|
|
68
|
-
"ports": "./src/scripts/ports.js",
|
|
69
|
-
"q": "./src/scripts/q.js",
|
|
70
|
-
"refresh-files": "./src/scripts/refresh-files.js",
|
|
71
|
-
"remove-smaller-files": "./src/scripts/remove-smaller-files.js",
|
|
72
|
-
"rename-files-with-date": "./src/scripts/rename-files-with-date.js",
|
|
73
|
-
"resize-image": "./src/scripts/resize-image.js",
|
|
74
|
-
"rm-safe": "./src/scripts/rm-safe.js",
|
|
75
|
-
"s": "./src/scripts/s.js",
|
|
76
|
-
"set-git-public": "./src/scripts/set-git-public.js",
|
|
77
|
-
"show-desktop-icons": "./src/scripts/show-desktop-icons.js",
|
|
78
|
-
"show-hidden-files": "./src/scripts/show-hidden-files.js",
|
|
79
|
-
"tpa": "./src/scripts/tpa.js",
|
|
80
|
-
"tpo": "./src/scripts/tpo.js",
|
|
81
|
-
"u": "./src/scripts/u.js",
|
|
82
|
-
"vpush": "./src/scripts/vpush.js",
|
|
83
|
-
"y": "./src/scripts/y.js"
|
|
7
|
+
"dev": "./src/cli.js"
|
|
84
8
|
},
|
|
85
9
|
"files": [
|
|
86
|
-
"bin/",
|
|
87
10
|
"src/",
|
|
88
|
-
"
|
|
11
|
+
"package.json",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
89
14
|
],
|
|
90
15
|
"scripts": {
|
|
91
|
-
"test": "
|
|
16
|
+
"test": "node test/index.js"
|
|
92
17
|
},
|
|
93
18
|
"dependencies": {
|
|
94
19
|
"commander": "^12.0.0"
|
|
95
20
|
},
|
|
96
21
|
"repository": {
|
|
97
22
|
"type": "git",
|
|
98
|
-
"url": "git+
|
|
23
|
+
"url": "git+ssh://git@github.com/FredLackey/devutils-cli.git"
|
|
99
24
|
},
|
|
100
25
|
"keywords": [],
|
|
101
26
|
"author": {
|