@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
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const readline = require('readline');
|
|
4
|
+
const { detectOutputMode } = require('./detect');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Checks if the current environment is interactive (human at a terminal).
|
|
8
|
+
* Only 'tty' callers are interactive. AI tools, CI systems, and piped output
|
|
9
|
+
* are all non-interactive.
|
|
10
|
+
*
|
|
11
|
+
* @returns {boolean}
|
|
12
|
+
*/
|
|
13
|
+
function isInteractive() {
|
|
14
|
+
const { caller } = detectOutputMode();
|
|
15
|
+
return caller === 'tty';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Opens a readline interface, asks one question, and closes it.
|
|
20
|
+
* Writes prompt text to stderr (not stdout) so piped output stays clean.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} question - The question text to display.
|
|
23
|
+
* @returns {Promise<string>} The user's answer.
|
|
24
|
+
*/
|
|
25
|
+
function askReadline(question) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const rl = readline.createInterface({
|
|
28
|
+
input: process.stdin,
|
|
29
|
+
output: process.stderr,
|
|
30
|
+
});
|
|
31
|
+
rl.question(question, (answer) => {
|
|
32
|
+
rl.close();
|
|
33
|
+
resolve(answer);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Asks a free-text question. Returns the user's answer, or the default value
|
|
40
|
+
* in non-interactive mode or when the user presses Enter without typing.
|
|
41
|
+
*
|
|
42
|
+
* @param {string} question - The question to ask.
|
|
43
|
+
* @param {string} [defaultValue=''] - The default value if no input is given.
|
|
44
|
+
* @returns {Promise<string>}
|
|
45
|
+
*/
|
|
46
|
+
async function ask(question, defaultValue = '') {
|
|
47
|
+
if (!isInteractive()) {
|
|
48
|
+
return defaultValue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const suffix = defaultValue ? ` (${defaultValue})` : '';
|
|
52
|
+
const answer = await askReadline(`${question}${suffix}: `);
|
|
53
|
+
return answer.trim() || defaultValue;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Asks a yes/no question. Returns true or false.
|
|
58
|
+
* The hint shows which option is default: (Y/n) means yes, (y/N) means no.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} question - The question to ask.
|
|
61
|
+
* @param {boolean} [defaultValue=false] - The default value.
|
|
62
|
+
* @returns {Promise<boolean>}
|
|
63
|
+
*/
|
|
64
|
+
async function confirm(question, defaultValue = false) {
|
|
65
|
+
if (!isInteractive()) {
|
|
66
|
+
return defaultValue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const hint = defaultValue ? '(Y/n)' : '(y/N)';
|
|
70
|
+
const answer = await askReadline(`${question} ${hint}: `);
|
|
71
|
+
const trimmed = answer.trim().toLowerCase();
|
|
72
|
+
|
|
73
|
+
if (trimmed === '') return defaultValue;
|
|
74
|
+
return trimmed === 'y' || trimmed === 'yes';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Presents a numbered list of choices and asks the user to pick one.
|
|
79
|
+
* Returns the selected choice string.
|
|
80
|
+
* Invalid input falls back to the default with a message.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} question - The question to display above the choices.
|
|
83
|
+
* @param {string[]} choices - The list of choices.
|
|
84
|
+
* @param {number} [defaultIndex=0] - The index of the default choice.
|
|
85
|
+
* @returns {Promise<string>}
|
|
86
|
+
*/
|
|
87
|
+
async function choose(question, choices, defaultIndex = 0) {
|
|
88
|
+
if (!isInteractive()) {
|
|
89
|
+
return choices[defaultIndex] || choices[0];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Display the choices on stderr
|
|
93
|
+
process.stderr.write(`${question}\n`);
|
|
94
|
+
for (let i = 0; i < choices.length; i++) {
|
|
95
|
+
const marker = i === defaultIndex ? '>' : ' ';
|
|
96
|
+
process.stderr.write(` ${marker} ${i + 1}. ${choices[i]}\n`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const answer = await askReadline(`Choice (1-${choices.length}) [${defaultIndex + 1}]: `);
|
|
100
|
+
const trimmed = answer.trim();
|
|
101
|
+
|
|
102
|
+
if (trimmed === '') return choices[defaultIndex];
|
|
103
|
+
|
|
104
|
+
const index = parseInt(trimmed, 10) - 1;
|
|
105
|
+
if (isNaN(index) || index < 0 || index >= choices.length) {
|
|
106
|
+
process.stderr.write(`Invalid choice. Using default: ${choices[defaultIndex]}\n`);
|
|
107
|
+
return choices[defaultIndex];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return choices[index];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Asks for sensitive input (passwords, API keys). The input is not echoed.
|
|
115
|
+
* Returns an empty string in non-interactive mode.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} question - The prompt text.
|
|
118
|
+
* @returns {Promise<string>}
|
|
119
|
+
*/
|
|
120
|
+
async function password(question) {
|
|
121
|
+
if (!isInteractive()) {
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return new Promise((resolve) => {
|
|
126
|
+
const rl = readline.createInterface({
|
|
127
|
+
input: process.stdin,
|
|
128
|
+
output: process.stderr,
|
|
129
|
+
terminal: true,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const origWrite = rl.output.write.bind(rl.output);
|
|
133
|
+
let muted = false;
|
|
134
|
+
|
|
135
|
+
rl.output.write = function(chunk) {
|
|
136
|
+
if (muted) return;
|
|
137
|
+
return origWrite(chunk);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
rl.question(`${question}: `, (answer) => {
|
|
141
|
+
muted = false;
|
|
142
|
+
rl.output.write('\n');
|
|
143
|
+
rl.close();
|
|
144
|
+
resolve(answer);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
muted = true;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Alias for ask(). Command stories may use context.prompt.input().
|
|
153
|
+
*/
|
|
154
|
+
const input = ask;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Alias for choose(). Command stories may use context.prompt.select().
|
|
158
|
+
*/
|
|
159
|
+
const select = choose;
|
|
160
|
+
|
|
161
|
+
module.exports = { ask, input, confirm, choose, select, password, isInteractive };
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
|
|
7
|
+
const SERVICE_NAMES = [
|
|
8
|
+
'config', 'machine', 'identity', 'tools',
|
|
9
|
+
'ignore', 'util', 'alias', 'auth', 'api', 'ai', 'search',
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
const TOP_LEVEL_COMMANDS = ['status', 'update', 'version', 'schema', 'help'];
|
|
13
|
+
|
|
14
|
+
let _registry = null;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Build the full schema registry by walking all service index.js files,
|
|
18
|
+
* top-level commands, and installed API plugins.
|
|
19
|
+
*
|
|
20
|
+
* @returns {object} The nested registry object.
|
|
21
|
+
*/
|
|
22
|
+
function buildRegistry() {
|
|
23
|
+
const registry = {};
|
|
24
|
+
|
|
25
|
+
// Load services
|
|
26
|
+
for (const name of SERVICE_NAMES) {
|
|
27
|
+
try {
|
|
28
|
+
const service = require(`../commands/${name}/index`);
|
|
29
|
+
const entry = {
|
|
30
|
+
type: 'service',
|
|
31
|
+
name: service.name || name,
|
|
32
|
+
description: service.description || '',
|
|
33
|
+
commands: {},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
for (const [cmdName, loader] of Object.entries(service.commands || {})) {
|
|
37
|
+
try {
|
|
38
|
+
const cmd = typeof loader === 'function' ? loader() : loader;
|
|
39
|
+
entry.commands[cmdName] = {
|
|
40
|
+
type: 'command',
|
|
41
|
+
name: cmdName,
|
|
42
|
+
description: (cmd.meta && cmd.meta.description) || '',
|
|
43
|
+
arguments: (cmd.meta && cmd.meta.arguments) || [],
|
|
44
|
+
flags: (cmd.meta && cmd.meta.flags) || [],
|
|
45
|
+
};
|
|
46
|
+
} catch {
|
|
47
|
+
// Skip commands that fail to load
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
registry[name] = entry;
|
|
52
|
+
} catch {
|
|
53
|
+
// Skip services that fail to load
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Load top-level commands
|
|
58
|
+
for (const name of TOP_LEVEL_COMMANDS) {
|
|
59
|
+
try {
|
|
60
|
+
const cmd = require(`../commands/${name}`);
|
|
61
|
+
registry[name] = {
|
|
62
|
+
type: 'command',
|
|
63
|
+
name,
|
|
64
|
+
description: (cmd.meta && cmd.meta.description) || '',
|
|
65
|
+
arguments: (cmd.meta && cmd.meta.arguments) || [],
|
|
66
|
+
flags: (cmd.meta && cmd.meta.flags) || [],
|
|
67
|
+
};
|
|
68
|
+
} catch {
|
|
69
|
+
// Skip commands that fail to load
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Load API plugins
|
|
74
|
+
loadPlugins(registry);
|
|
75
|
+
|
|
76
|
+
return registry;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Load installed API plugins into the registry under api.plugins.
|
|
81
|
+
* @param {object} registry - The registry to extend.
|
|
82
|
+
*/
|
|
83
|
+
function loadPlugins(registry) {
|
|
84
|
+
const pluginsFile = path.join(os.homedir(), '.devutils', 'plugins.json');
|
|
85
|
+
|
|
86
|
+
if (!fs.existsSync(pluginsFile)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let plugins;
|
|
91
|
+
try {
|
|
92
|
+
plugins = JSON.parse(fs.readFileSync(pluginsFile, 'utf8'));
|
|
93
|
+
} catch {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const pluginsDir = path.join(os.homedir(), '.devutils', 'plugins');
|
|
98
|
+
|
|
99
|
+
if (!registry.api) {
|
|
100
|
+
registry.api = { type: 'service', name: 'api', description: 'API plugin system', commands: {} };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const [serviceName, info] of Object.entries(plugins)) {
|
|
104
|
+
try {
|
|
105
|
+
const pluginPath = path.join(pluginsDir, 'node_modules', info.package);
|
|
106
|
+
const plugin = require(pluginPath);
|
|
107
|
+
|
|
108
|
+
const serviceEntry = {
|
|
109
|
+
type: 'plugin',
|
|
110
|
+
name: plugin.name || serviceName,
|
|
111
|
+
description: plugin.description || '',
|
|
112
|
+
version: plugin.version || '',
|
|
113
|
+
auth: plugin.auth || null,
|
|
114
|
+
resources: {},
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
for (const [resName, resource] of Object.entries(plugin.resources || {})) {
|
|
118
|
+
const resEntry = {
|
|
119
|
+
type: 'resource',
|
|
120
|
+
name: resName,
|
|
121
|
+
description: (resource.description) || '',
|
|
122
|
+
commands: {},
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
for (const [cmdName, loader] of Object.entries(resource.commands || {})) {
|
|
126
|
+
try {
|
|
127
|
+
const cmd = typeof loader === 'function' ? loader() : loader;
|
|
128
|
+
resEntry.commands[cmdName] = {
|
|
129
|
+
type: 'command',
|
|
130
|
+
name: cmdName,
|
|
131
|
+
description: (cmd.meta && cmd.meta.description) || '',
|
|
132
|
+
arguments: (cmd.meta && cmd.meta.arguments) || [],
|
|
133
|
+
flags: (cmd.meta && cmd.meta.flags) || [],
|
|
134
|
+
};
|
|
135
|
+
} catch {
|
|
136
|
+
// Skip commands that fail to load
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
serviceEntry.resources[resName] = resEntry;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!registry.api.plugins) {
|
|
144
|
+
registry.api.plugins = {};
|
|
145
|
+
}
|
|
146
|
+
registry.api.plugins[serviceName] = serviceEntry;
|
|
147
|
+
} catch {
|
|
148
|
+
// Plugin failed to load, skip it
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Get the schema registry. Built lazily on first access and cached.
|
|
155
|
+
* @returns {object} The registry.
|
|
156
|
+
*/
|
|
157
|
+
function getRegistry() {
|
|
158
|
+
if (!_registry) {
|
|
159
|
+
_registry = buildRegistry();
|
|
160
|
+
}
|
|
161
|
+
return _registry;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Resolve a dot-notation path to a registry entry.
|
|
166
|
+
* Handles up to 4 levels: api.plugin.resource.command.
|
|
167
|
+
*
|
|
168
|
+
* @param {string} dotPath - Dot-notation path (e.g., "config.set", "api.gmail.messages.list").
|
|
169
|
+
* @returns {object|null} The matching entry, or null if not found.
|
|
170
|
+
*/
|
|
171
|
+
function resolve(dotPath) {
|
|
172
|
+
const registry = getRegistry();
|
|
173
|
+
const parts = dotPath.split('.');
|
|
174
|
+
|
|
175
|
+
// Single segment: top-level service or command
|
|
176
|
+
if (parts.length === 1) {
|
|
177
|
+
return registry[parts[0]] || null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Two segments: service.command
|
|
181
|
+
if (parts.length === 2) {
|
|
182
|
+
const service = registry[parts[0]];
|
|
183
|
+
if (!service) return null;
|
|
184
|
+
if (service.type === 'service' && service.commands && service.commands[parts[1]]) {
|
|
185
|
+
return service.commands[parts[1]];
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Three segments: api.plugin.resource
|
|
191
|
+
if (parts.length === 3 && parts[0] === 'api') {
|
|
192
|
+
const plugins = (registry.api && registry.api.plugins) || {};
|
|
193
|
+
const plugin = plugins[parts[1]];
|
|
194
|
+
if (!plugin) return null;
|
|
195
|
+
return (plugin.resources && plugin.resources[parts[2]]) || null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Four segments: api.plugin.resource.command
|
|
199
|
+
if (parts.length === 4 && parts[0] === 'api') {
|
|
200
|
+
const plugins = (registry.api && registry.api.plugins) || {};
|
|
201
|
+
const plugin = plugins[parts[1]];
|
|
202
|
+
if (!plugin) return null;
|
|
203
|
+
const resource = plugin.resources && plugin.resources[parts[2]];
|
|
204
|
+
if (!resource) return null;
|
|
205
|
+
return (resource.commands && resource.commands[parts[3]]) || null;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
module.exports = { getRegistry, resolve };
|
package/src/lib/shell.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { exec: cpExec, execSync: cpExecSync } = require('child_process');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Runs a shell command asynchronously.
|
|
7
|
+
* Always resolves (never rejects). The caller checks exitCode to determine success.
|
|
8
|
+
*
|
|
9
|
+
* @param {string} cmd - The command to run.
|
|
10
|
+
* @param {object} [opts] - Options passed through to child_process.exec (cwd, env, timeout, etc.).
|
|
11
|
+
* @returns {Promise<{ stdout: string, stderr: string, exitCode: number }>}
|
|
12
|
+
*/
|
|
13
|
+
async function exec(cmd, opts = {}) {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
cpExec(cmd, opts, (error, stdout, stderr) => {
|
|
16
|
+
resolve({
|
|
17
|
+
stdout: stdout ? stdout.toString().trim() : '',
|
|
18
|
+
stderr: stderr ? stderr.toString().trim() : '',
|
|
19
|
+
exitCode: error ? error.code || 1 : 0,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Runs a shell command synchronously.
|
|
27
|
+
* Returns the trimmed stdout string on success, or null on failure.
|
|
28
|
+
*
|
|
29
|
+
* An empty string means "command ran but produced no output."
|
|
30
|
+
* Null means "command failed."
|
|
31
|
+
*
|
|
32
|
+
* @param {string} cmd - The command to run.
|
|
33
|
+
* @param {object} [opts] - Options passed through to child_process.execSync.
|
|
34
|
+
* @returns {string|null}
|
|
35
|
+
*/
|
|
36
|
+
function execSync(cmd, opts = {}) {
|
|
37
|
+
try {
|
|
38
|
+
const result = cpExecSync(cmd, { ...opts, encoding: 'utf8' });
|
|
39
|
+
return result ? result.trim() : '';
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Finds the full path to a binary on the system PATH.
|
|
47
|
+
* Uses "which" on unix-like systems and "where" on native Windows.
|
|
48
|
+
* Git Bash provides its own "which", so it uses the unix path.
|
|
49
|
+
*
|
|
50
|
+
* @param {string} binary - The name of the binary to find (e.g. 'node', 'git').
|
|
51
|
+
* @returns {string|null} The full path to the binary, or null if not found.
|
|
52
|
+
*/
|
|
53
|
+
function which(binary) {
|
|
54
|
+
const platform = require('./platform').detect();
|
|
55
|
+
const cmd = platform.type === 'windows' ? `where ${binary}` : `which ${binary}`;
|
|
56
|
+
const result = execSync(cmd);
|
|
57
|
+
if (result === null) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// 'where' on Windows can return multiple lines; take the first one
|
|
61
|
+
return result.split('\n')[0].trim();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Checks if a binary exists on the system PATH.
|
|
66
|
+
* A boolean wrapper around which().
|
|
67
|
+
*
|
|
68
|
+
* @param {string} binary - The name of the binary to check.
|
|
69
|
+
* @returns {boolean} True if the binary exists, false otherwise.
|
|
70
|
+
*/
|
|
71
|
+
function commandExists(binary) {
|
|
72
|
+
return which(binary) !== null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = { exec, execSync, which, commandExists };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Claude Code
|
|
2
|
+
# Patterns for Claude Code, Sidecar, and other AI coding tool artifacts.
|
|
3
|
+
|
|
4
|
+
# Claude Code local state
|
|
5
|
+
.claude/
|
|
6
|
+
|
|
7
|
+
# Sidecar local state (TUI task runner)
|
|
8
|
+
.sidecar/
|
|
9
|
+
|
|
10
|
+
# Sidecar todo tracking
|
|
11
|
+
.todos/
|
|
12
|
+
|
|
13
|
+
# AI session artifacts
|
|
14
|
+
.ai-sessions/
|
|
15
|
+
|
|
16
|
+
# Cursor AI
|
|
17
|
+
.cursorignore
|
|
18
|
+
.cursorindexingignore
|
|
19
|
+
.cursor/
|
|
20
|
+
|
|
21
|
+
# Aider
|
|
22
|
+
.aider*
|
|
23
|
+
|
|
24
|
+
# Codeium
|
|
25
|
+
.codeium/
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Docker
|
|
2
|
+
# Patterns for Docker projects. These are files that should not be
|
|
3
|
+
# included in a Docker build context or committed to version control.
|
|
4
|
+
|
|
5
|
+
# Docker Compose override (local dev customization)
|
|
6
|
+
docker-compose.override.yml
|
|
7
|
+
docker-compose.override.yaml
|
|
8
|
+
|
|
9
|
+
# Docker environment files
|
|
10
|
+
.docker/
|
|
11
|
+
.dockerenv
|
|
12
|
+
|
|
13
|
+
# Local data volumes (often mounted for development)
|
|
14
|
+
data/
|
|
15
|
+
volumes/
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Go
|
|
2
|
+
# Patterns for Go projects.
|
|
3
|
+
|
|
4
|
+
# Compiled binaries
|
|
5
|
+
*.exe
|
|
6
|
+
*.exe~
|
|
7
|
+
*.dll
|
|
8
|
+
*.so
|
|
9
|
+
*.dylib
|
|
10
|
+
|
|
11
|
+
# Test binary (created by go test -c)
|
|
12
|
+
*.test
|
|
13
|
+
|
|
14
|
+
# Output of go coverage tool
|
|
15
|
+
*.out
|
|
16
|
+
|
|
17
|
+
# Go workspace file
|
|
18
|
+
go.work
|
|
19
|
+
|
|
20
|
+
# Vendor directory (if not committing dependencies)
|
|
21
|
+
# vendor/
|
|
22
|
+
|
|
23
|
+
# Build output directory
|
|
24
|
+
bin/
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Java
|
|
2
|
+
# Patterns for Java and JVM-based projects.
|
|
3
|
+
|
|
4
|
+
# Compiled class files
|
|
5
|
+
*.class
|
|
6
|
+
|
|
7
|
+
# Package files
|
|
8
|
+
*.jar
|
|
9
|
+
*.war
|
|
10
|
+
*.nar
|
|
11
|
+
*.ear
|
|
12
|
+
*.zip
|
|
13
|
+
*.tar.gz
|
|
14
|
+
*.rar
|
|
15
|
+
|
|
16
|
+
# Build output
|
|
17
|
+
target/
|
|
18
|
+
build/
|
|
19
|
+
out/
|
|
20
|
+
|
|
21
|
+
# Gradle
|
|
22
|
+
.gradle/
|
|
23
|
+
gradle-app.setting
|
|
24
|
+
!gradle-wrapper.jar
|
|
25
|
+
|
|
26
|
+
# Maven
|
|
27
|
+
pom.xml.tag
|
|
28
|
+
pom.xml.releaseBackup
|
|
29
|
+
pom.xml.versionsBackup
|
|
30
|
+
pom.xml.next
|
|
31
|
+
release.properties
|
|
32
|
+
|
|
33
|
+
# Log files
|
|
34
|
+
*.log
|
|
35
|
+
|
|
36
|
+
# Virtual machine crash logs
|
|
37
|
+
hs_err_pid*
|
|
38
|
+
replay_pid*
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# JetBrains
|
|
2
|
+
# Patterns for JetBrains IDEs (IntelliJ, WebStorm, PyCharm, etc.).
|
|
3
|
+
|
|
4
|
+
# IDE project settings
|
|
5
|
+
.idea/
|
|
6
|
+
|
|
7
|
+
# File-based project format
|
|
8
|
+
*.iws
|
|
9
|
+
*.iml
|
|
10
|
+
*.ipr
|
|
11
|
+
|
|
12
|
+
# CMake build output
|
|
13
|
+
cmake-build-*/
|
|
14
|
+
|
|
15
|
+
# Crashlytics plugin (for Android projects)
|
|
16
|
+
com_crashlytics_export_strings.xml
|
|
17
|
+
crashlytics.properties
|
|
18
|
+
crashlytics-build.properties
|
|
19
|
+
fabric.properties
|
|
20
|
+
|
|
21
|
+
# Editor-based HTTP client requests
|
|
22
|
+
httpRequests/
|
|
23
|
+
|
|
24
|
+
# DataSources local storage
|
|
25
|
+
dataSources/
|
|
26
|
+
dataSources.local.xml
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# macOS
|
|
2
|
+
# Patterns for macOS system and Finder metadata files.
|
|
3
|
+
|
|
4
|
+
# Finder metadata
|
|
5
|
+
.DS_Store
|
|
6
|
+
.AppleDouble
|
|
7
|
+
.LSOverride
|
|
8
|
+
|
|
9
|
+
# Thumbnail cache
|
|
10
|
+
._*
|
|
11
|
+
|
|
12
|
+
# Spotlight indexing
|
|
13
|
+
.Spotlight-V100
|
|
14
|
+
|
|
15
|
+
# Trash folder state
|
|
16
|
+
.Trashes
|
|
17
|
+
|
|
18
|
+
# Volume metadata
|
|
19
|
+
.VolumeIcon.icns
|
|
20
|
+
.com.apple.timemachine.donotpresent
|
|
21
|
+
|
|
22
|
+
# Finder directory metadata
|
|
23
|
+
.fseventsd
|
|
24
|
+
.apdisk
|
|
25
|
+
|
|
26
|
+
# macOS resource forks
|
|
27
|
+
Icon?
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Node.js
|
|
2
|
+
# Patterns for Node.js and JavaScript/TypeScript projects.
|
|
3
|
+
|
|
4
|
+
# Dependencies
|
|
5
|
+
node_modules/
|
|
6
|
+
|
|
7
|
+
# Build output
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
out/
|
|
11
|
+
.next/
|
|
12
|
+
.nuxt/
|
|
13
|
+
|
|
14
|
+
# Environment and secrets
|
|
15
|
+
.env
|
|
16
|
+
.env.*
|
|
17
|
+
!.env.example
|
|
18
|
+
|
|
19
|
+
# Package manager files
|
|
20
|
+
package-lock.json
|
|
21
|
+
yarn.lock
|
|
22
|
+
pnpm-lock.yaml
|
|
23
|
+
.yarn/
|
|
24
|
+
.pnp.*
|
|
25
|
+
|
|
26
|
+
# Debug and logs
|
|
27
|
+
npm-debug.log*
|
|
28
|
+
yarn-debug.log*
|
|
29
|
+
yarn-error.log*
|
|
30
|
+
pnpm-debug.log*
|
|
31
|
+
lerna-debug.log*
|
|
32
|
+
*.log
|
|
33
|
+
|
|
34
|
+
# Coverage and test output
|
|
35
|
+
coverage/
|
|
36
|
+
.nyc_output/
|
|
37
|
+
*.lcov
|
|
38
|
+
|
|
39
|
+
# TypeScript cache
|
|
40
|
+
*.tsbuildinfo
|
|
41
|
+
|
|
42
|
+
# Cache directories
|
|
43
|
+
.cache/
|
|
44
|
+
.parcel-cache/
|
|
45
|
+
.eslintcache
|
|
46
|
+
|
|
47
|
+
# Runtime data
|
|
48
|
+
pids/
|
|
49
|
+
*.pid
|
|
50
|
+
*.seed
|
|
51
|
+
*.pid.lock
|