Compare commits

...

179 Commits

Author SHA1 Message Date
dependabot[bot] 8686d1ca1a chore(deps): bump actions/checkout from 4 to 7
Check for typos / check-typos (push) Has been cancelled
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-29 19:53:03 +00:00
titus 9be14fe058 fix security alert for rand
Deploy Hugo site to Pages / build (push) Has been cancelled
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
Deploy Hugo site to Pages / deploy (push) Has been cancelled
2026-06-23 20:27:14 -05:00
Pinak Dhabu 50e6e33c91 Add nouveau option for old NVIDIA GPUs in Arch Server install (#1293)
Co-authored-by: Pinak Dhabu <thepinak503@users.noreply.github.com>
2026-06-23 20:24:50 -05:00
Daniel 28ab9a8ca5 Use temporary directory for AUR helper installation (#1305)
* Use temporary directory for AUR helper installation

Switch from using /opt to a temporary directory for building yay to
improve
security, auto clean-up and prevent permission issues.

* apply the fix in the yay-setup and paru-setup scripts

* fix(arch): clean temporary AUR build directories

---------

Co-authored-by: titus <contact@christitus.com>
2026-06-23 20:23:01 -05:00
emylfy 29ac0ef394 Add SSD TRIM (fstrim.timer) setup script (#1318)
* Add SSD TRIM (fstrim.timer) setup script

* fix(system): mark fstrim as non-queueable

---------

Co-authored-by: titus <contact@christitus.com>
2026-06-23 20:21:43 -05:00
Pinak Dhabu dbadadff86 feat: add Brave Origin browser install script (#1311)
* feat: add Brave Origin browser install script

* fix: address PR #1311 review - fix rpm-ostree detection and add uninstaller

---------

Co-authored-by: Pinak Dhabu <thepinak503@users.noreply.github.com>
2026-06-23 20:09:34 -05:00
github-actions[bot] da55a2e47a chore(nix): update flake inputs (#1298)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-23 20:09:02 -05:00
dependabot[bot] d6d0f11beb chore(deps): bump which from 8.0.2 to 8.0.3 (#1317)
Bumps [which](https://github.com/harryfei/which-rs) from 8.0.2 to 8.0.3.
- [Release notes](https://github.com/harryfei/which-rs/releases)
- [Changelog](https://github.com/harryfei/which-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/harryfei/which-rs/compare/8.0.2...8.0.3)

---
updated-dependencies:
- dependency-name: which
  dependency-version: 8.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 20:03:32 -05:00
dependabot[bot] 3038c24820 chore(deps): bump time from 0.3.47 to 0.3.51 (#1316)
Bumps [time](https://github.com/time-rs/time) from 0.3.47 to 0.3.51.
- [Release notes](https://github.com/time-rs/time/releases)
- [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md)
- [Commits](https://github.com/time-rs/time/compare/v0.3.47...v0.3.51)

---
updated-dependencies:
- dependency-name: time
  dependency-version: 0.3.49
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 20:02:45 -05:00
titus 1316e9a953 bump ratatui-image to 11.0.5 to fix render 2026-06-23 20:02:22 -05:00
dependabot[bot] e6b4d0b724 chore(deps): bump ratatui from 0.30.0 to 0.30.2 (#1315)
Bumps [ratatui](https://github.com/ratatui/ratatui) from 0.30.0 to 0.30.2.
- [Release notes](https://github.com/ratatui/ratatui/releases)
- [Changelog](https://github.com/ratatui/ratatui/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ratatui/ratatui/compare/ratatui-v0.30.0...ratatui-v0.30.2)

---
updated-dependencies:
- dependency-name: ratatui
  dependency-version: 0.30.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:57:43 -05:00
dependabot[bot] 4eeb01a308 chore(deps): bump actions/cache from 4 to 5 (#1304)
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:57:15 -05:00
dependabot[bot] 7fadb7b3e3 chore(deps): bump actions/github-script from 7 to 9 (#1303)
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:57:05 -05:00
dependabot[bot] e07b62d2ad chore(deps): bump ratatui-image from 11.0.2 to 11.0.3 (#1302)
Bumps [ratatui-image](https://github.com/ratatui/ratatui-image) from 11.0.2 to 11.0.3.
- [Release notes](https://github.com/ratatui/ratatui-image/releases)
- [Changelog](https://github.com/ratatui/ratatui-image/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ratatui/ratatui-image/compare/v11.0.2...v11.0.3)

---
updated-dependencies:
- dependency-name: ratatui-image
  dependency-version: 11.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:56:29 -05:00
dependabot[bot] 2682c35cd1 chore(deps): bump actions/upload-pages-artifact from 4 to 5 (#1301)
Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](https://github.com/actions/upload-pages-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-pages-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:56:04 -05:00
dependabot[bot] 3da4fb76e4 chore(deps): bump actions/deploy-pages from 4 to 5 (#1300)
Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5.
- [Release notes](https://github.com/actions/deploy-pages/releases)
- [Commits](https://github.com/actions/deploy-pages/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/deploy-pages
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:55:54 -05:00
dependabot[bot] 6fef076083 chore(deps): bump softprops/action-gh-release from 2 to 3 (#1299)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 19:55:07 -05:00
dependabot[bot] dabddd5692 chore(deps): bump tree-sitter-highlight from 0.26.8 to 0.26.9 (#1295)
* chore(deps): bump tree-sitter-highlight from 0.26.8 to 0.26.9

Bumps [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) from 0.26.8 to 0.26.9.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](https://github.com/tree-sitter/tree-sitter/compare/v0.26.8...v0.26.9)

---
updated-dependencies:
- dependency-name: tree-sitter-highlight
  dependency-version: 0.26.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* docs: refresh generated walkthrough

* ci: allow Ratatui product name

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: titus <contact@christitus.com>
2026-06-23 19:54:15 -05:00
titus f3946bf4a4 add agent and spec sheets 2026-06-23 19:22:15 -05:00
Abs c770e88764 add Game Launchers and Proton tool entries (#1290)
Deploy Hugo site to Pages / build (push) Has been cancelled
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
Deploy Hugo site to Pages / deploy (push) Has been cancelled
* add Game Launchers

* Add Proton tools to gaming tab

* cleanup gaming-setup

* install proton tools using native pkg manager

* fix(gaming): show live progress for long dependency installs

* fix(gaming): avoid pacman prompt when enabling multilib

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-06-10 14:37:24 -05:00
Chris Titus 8502628b87 Delete .github/workflows/xtask.yml (#1297)
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-05-31 10:32:19 -05:00
Chris Titus 7ab6f204f3 Merge branch 'main' of https://github.com/ChrisTitusTech/linutil
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
2026-05-21 16:35:55 -05:00
Chris Titus 8ff6898b8b fix sorting 2026-05-21 16:35:44 -05:00
Chris Titus f80bc288fb revamp to use nested install from dwm-titus repo (#1291)
* revamp to use nested install from dwm-titus repo

* fix(dwmtitus-setup): improve error handling during repository update
2026-05-21 16:33:47 -05:00
Chomba 6618e78060 fix(fedora-upgrade): add WSL support via distro-sync fallback (#1289)
WSL cannot run the offline boot phase that dnf system-upgrade reboot
depends on. Detect WSL via /proc/version and use distro-sync as a live
equivalent instead, leaving the standard path untouched.
2026-05-21 15:42:15 -05:00
Nick A 4d6018df77 Chrome remove local ai (#1288)
* Mirrored gaming changes

* Added uninstall to chrome, and added option to remove local AI if downloaded

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
2026-05-21 15:31:15 -05:00
Nick A 466e49dce9 1124 ramalama (#1286)
* Mirrored gaming changes

* added ramalama installer

* Updated ramalama install to prompt for docker or podman

* Updated toml

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
2026-05-21 15:30:22 -05:00
Abs c7e54991db Improve gaming setup partial failure summary (#1284) 2026-05-21 15:21:48 -05:00
titus 559fc9da35 Fix overwrite on multiple runs in starfield
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
Co-authored-by: Copilot <copilot@github.com>
2026-05-20 22:46:16 -05:00
titus 969f7ad85e starfield addition
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-05-19 21:54:05 -05:00
titus 9f13a8f3ac Fix .gitignore formatting by removing unnecessary newline
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-05-16 13:00:08 -05:00
Chris Titus 3548a65952 Security workflow fix (#1285)
* Remove obsolete agent guidelines and configuration files

* Refactor issue slash command handling and improve user authorization checks

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
2026-05-16 12:58:01 -05:00
Sean (ANGRYxScotsman) 9dfbe571d6 update theme ver (#1280)
Deploy Hugo site to Pages / build (push) Has been cancelled
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
Deploy Hugo site to Pages / deploy (push) Has been cancelled
2026-05-14 14:10:28 -05:00
Nick A d9e279ffa5 Refactor cleanup application installs (#1276)
* Mirrored gaming changes

* removed duplicate escalationtoolcheck, added flatpaks where avaialble, added flatpak checks where they were missing

* fixed change for okular

* fix typo

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-05-14 14:09:06 -05:00
Nick A 1f97bdbe60 Move dwm titus (#1275)
* Mirrored gaming changes

* Moved dwmtitus-setup to system-setup/arch to avoid issues of installs on none arch systems

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
2026-05-14 13:40:33 -05:00
Nick A ef57ca2590 Bug reports fix (#1274)
* Mirrored gaming changes

* Fixed the bug reports not showing update in github by removing none option

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
2026-05-14 13:39:34 -05:00
Ivan Lepekha 41eb13f8b1 Fix path slashes for debian-based distros (#1271)
* Fix Discord installation command for package manager

* Chris, just tell me that was AI-coded
2026-05-14 13:29:44 -05:00
Chris Titus 04de00bf07 fix logo render 2026-05-14 13:26:44 -05:00
dependabot[bot] 42a0dbd0df chore(deps): bump ratatui-image from 10.0.6 to 11.0.2 (#1278)
Bumps [ratatui-image](https://github.com/ratatui/ratatui-image) from 10.0.6 to 11.0.2.
- [Release notes](https://github.com/ratatui/ratatui-image/releases)
- [Changelog](https://github.com/ratatui/ratatui-image/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ratatui/ratatui-image/compare/v10.0.6...v11.0.2)

---
updated-dependencies:
- dependency-name: ratatui-image
  dependency-version: 11.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-14 12:45:03 -05:00
dependabot[bot] 777fb0f73a chore(deps): bump nix from 0.31.2 to 0.31.3 (#1277)
Bumps [nix](https://github.com/nix-rust/nix) from 0.31.2 to 0.31.3.
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.31.2...v0.31.3)

---
updated-dependencies:
- dependency-name: nix
  dependency-version: 0.31.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-14 12:44:32 -05:00
Abs ddc543c459 Fix NVIDIA installer on non-GRUB systems (#1272)
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-05-13 13:28:08 -05:00
Chris Titus b114e376d8 Update utility_functions.sh (#1270)
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-05-07 16:20:01 -05:00
dependabot[bot] 792e5df6ba chore(deps): bump tree-sitter-highlight from 0.26.6 to 0.26.8 (#1266)
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
Bumps [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) from 0.26.6 to 0.26.8.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](https://github.com/tree-sitter/tree-sitter/compare/v0.26.6...v0.26.8)

---
updated-dependencies:
- dependency-name: tree-sitter-highlight
  dependency-version: 0.26.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:45:20 -05:00
dependabot[bot] b4df724a6b chore(deps): bump toml from 0.9.11+spec-1.1.0 to 1.1.2+spec-1.1.0 (#1265)
Bumps [toml](https://github.com/toml-rs/toml) from 0.9.11+spec-1.1.0 to 1.1.2+spec-1.1.0.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.9.11...toml-v1.1.2)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 1.1.2+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:44:29 -05:00
dependabot[bot] 8db0ddbad4 chore(deps): bump tui-term from 0.3.1 to 0.3.4 (#1264)
Bumps [tui-term](https://github.com/a-kenji/tui-term) from 0.3.1 to 0.3.4.
- [Release notes](https://github.com/a-kenji/tui-term/releases)
- [Changelog](https://github.com/a-kenji/tui-term/blob/development/CHANGELOG.md)
- [Commits](https://github.com/a-kenji/tui-term/compare/v0.3.1...v0.3.4)

---
updated-dependencies:
- dependency-name: tui-term
  dependency-version: 0.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:32:29 -05:00
dependabot[bot] 885947c169 chore(deps): bump clap from 4.6.0 to 4.6.1 (#1263)
Bumps [clap](https://github.com/clap-rs/clap) from 4.6.0 to 4.6.1.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.0...clap_complete-v4.6.1)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:31:20 -05:00
dependabot[bot] 26113dda40 chore(deps): bump image from 0.25.9 to 0.25.10 (#1262)
Bumps [image](https://github.com/image-rs/image) from 0.25.9 to 0.25.10.
- [Changelog](https://github.com/image-rs/image/blob/v0.25.10/CHANGES.md)
- [Commits](https://github.com/image-rs/image/compare/v0.25.9...v0.25.10)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 0.25.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:27:17 -05:00
Chris Titus 92777e4b33 fix typo 2026-05-05 13:46:30 -05:00
Abs 9eabc12212 Fix Arch gaming dependency install on PipeWire JACK systems (#1260)
* Fix Arch gaming dependencies JACK provider conflict

* Fix existing cargo clippy failures
2026-05-05 13:43:29 -05:00
Nick A f4ef6a0430 Fix cachyos (#1254)
* Mirrored gaming changes

* Fixed CachyOS install, revert to using CachyOS Automated to avoid constant updates

* Removed unused code

* added check to not install multiple times

* Added non lts cachyos kernels as option

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
2026-05-05 13:17:03 -05:00
Harsh Vyapari 845c158bcf feat(topgrade): add topgrade option (#1253)
for now, I've kept it as separate script, I don't know should I merge it
with original script or not
2026-05-05 13:15:49 -05:00
Harsh Vyapari 94d6d9470c fix(system-update): use extra package for rate-mirrors instead of aur (#1251)
Since it already contains in extra repo, no need to use aur package
2026-05-05 13:14:33 -05:00
hyliancode 22a5c08e57 pr: Made $TIMEZONE offline fallback "tzselect" which is an included script with "tzdata" https://archlinux.org/packages/core/x86_64/tzdata/ (#1250)
* pr: Made $TIMEZONE offline fallback "tzselect" which is an included script with "tzdata" https://archlinux.org/packages/core/x86_64/tzdata/

* Added 'else' for error message

Added error message for incorrect timezone input.

* Made code more DRY and concise

* Fixed some grammar

---------

Co-authored-by: hyliancoder <hyliancoder@github.com>
2026-05-05 13:13:09 -05:00
George Fam 39d2922162 fix: Add missing import to ollama installer (#1223) 2026-05-05 13:09:52 -05:00
github-actions[bot] 7aac634f4c chore(nix): update flake inputs (#1258)
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-05-01 15:38:02 +02:00
Chris Titus a8156e1d32 Fix documentation links in README.md
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
Updated links to the official documentation and roadmap.
2026-04-30 15:50:46 -05:00
Chris Titus 7d2ac8e4a4 Add entry for Linutil docs website creation 2026-04-30 15:40:32 -05:00
Chris Titus 5db155017a Add TUI Refresh with Logo entry to README 2026-04-30 15:35:00 -05:00
Chris Titus 7b748c38ab fix build error from rand 0.10 2026-04-30 15:29:08 -05:00
dependabot[bot] 48865a9c5c chore(deps): bump rand from 0.9.2 to 0.10.1 (#1248)
Bumps [rand](https://github.com/rust-random/rand) from 0.9.2 to 0.10.1.
- [Release notes](https://github.com/rust-random/rand/releases)
- [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/rand/compare/rand_core-0.9.2...0.10.1)

---
updated-dependencies:
- dependency-name: rand
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-30 12:05:32 -05:00
dependabot[bot] 6b77344be8 chore(deps): bump oneshot from 0.1.13 to 0.2.1 (#1247)
Bumps [oneshot](https://github.com/faern/oneshot) from 0.1.13 to 0.2.1.
- [Release notes](https://github.com/faern/oneshot/releases)
- [Changelog](https://github.com/faern/oneshot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/faern/oneshot/compare/v0.1.13...v0.2.1)

---
updated-dependencies:
- dependency-name: oneshot
  dependency-version: 0.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-30 12:05:14 -05:00
dependabot[bot] 76b5d73e39 Bump ratatui-image from 10.0.5 to 10.0.6 (#1246)
Bumps [ratatui-image](https://github.com/benjajaja/ratatui-image) from 10.0.5 to 10.0.6.
- [Release notes](https://github.com/benjajaja/ratatui-image/releases)
- [Changelog](https://github.com/ratatui/ratatui-image/blob/master/CHANGELOG.md)
- [Commits](https://github.com/benjajaja/ratatui-image/compare/v10.0.5...v10.0.6)

---
updated-dependencies:
- dependency-name: ratatui-image
  dependency-version: 10.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-30 12:04:16 -05:00
dependabot[bot] 433b47bbb8 Bump nix from 0.31.1 to 0.31.2 (#1245)
Bumps [nix](https://github.com/nix-rust/nix) from 0.31.1 to 0.31.2.
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.31.1...v0.31.2)

---
updated-dependencies:
- dependency-name: nix
  dependency-version: 0.31.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-30 12:03:47 -05:00
dependabot[bot] 81b5f77a92 Bump clap from 4.5.60 to 4.6.0 (#1244)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.60 to 4.6.0.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.60...clap_complete-v4.6.0)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-30 12:03:17 -05:00
Chris Titus Tech 768deda1f0 refactor(global-theme): enhance dark theme configuration for GTK and Qt applications
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-04-11 22:16:30 -05:00
Chris Titus 097d62792c cleanup server
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
2026-04-09 15:50:58 -05:00
Chris Titus 415d22d317 refactor(server-setup): update rate-mirrors command options and pre-seed machine-id for improved setup process
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
2026-04-09 14:44:32 -05:00
Chris Titus 7e18e9bee3 refactor(mirror-setup): enhance rate-mirrors command options for improved performance and reliability 2026-04-09 14:27:26 -05:00
Chris Titus 1e5bb067ba feat(server-setup): add locale detection and user confirmation for keymap settings 2026-04-09 13:45:57 -05:00
Chris Titus a9f1f0c70e refactor(server-setup): enhance timezone detection and validation, update keymap handling 2026-04-09 13:42:37 -05:00
Chris Titus cd92c1174c refactor(server-setup): replace reflector with rate-mirrors for improved mirror selection 2026-04-09 13:34:59 -05:00
Chris Titus 46d9513598 autodetect disk type 2026-04-09 13:29:02 -05:00
Chris Titus e5c0eb7728 refactor(server-setup): simplify timezone detection and improve BTRFS handling 2026-04-09 13:24:27 -05:00
github-actions[bot] a301c34fcf chore(nix): update flake inputs (#1240)
nix / checks (push) Has been cancelled
nix / update (push) Has been cancelled
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-02 05:16:18 +02:00
Abs 1228defd59 refactor(tabs): move duplicate tools to Gaming, add nested emulator groups, fix shellcheck/clippy issues (#1233) 2026-04-01 16:12:25 -05:00
Nick A ebfcc15bc5 Linux cachyos (#1231)
* Mirrored gaming changes

* Added CachyOS Repos and Kernel install and uninstall

* Fixed Typo

* renamed cachyos-repos.sh to be all lowercase. updated toml file

* fixed some shell checks

* fixed some shell checks

* fixed some shell checks

* fix some obvious glaring issues :).  Thank you to the community for pointing them out.  Added Escalation Tool, added reset for kernel, run repo sync, remove cachy repos if sync fails, fixed setdefaultkernel to run checkRepo.  fixed numbering

* removed singl quotes in cachyos add repo

* added back accidental delete of gpu driver

---------

Co-authored-by: namato1 <60294463+namato1@users.noreply.github.com>
2026-04-01 16:10:37 -05:00
dependabot[bot] 1e1c2d946c Bump which from 8.0.0 to 8.0.2 (#1229)
Bumps [which](https://github.com/harryfei/which-rs) from 8.0.0 to 8.0.2.
- [Release notes](https://github.com/harryfei/which-rs/releases)
- [Changelog](https://github.com/harryfei/which-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/harryfei/which-rs/compare/8.0.0...8.0.2)

---
updated-dependencies:
- dependency-name: which
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-01 16:07:39 -05:00
dependabot[bot] 29a46dc90c Bump tree-sitter-highlight from 0.26.5 to 0.26.6 (#1228)
Bumps [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) from 0.26.5 to 0.26.6.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](https://github.com/tree-sitter/tree-sitter/compare/v0.26.5...v0.26.6)

---
updated-dependencies:
- dependency-name: tree-sitter-highlight
  dependency-version: 0.26.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-01 16:01:15 -05:00
dependabot[bot] f33343ffb4 Bump rand from 0.8.5 to 0.9.2 (#1227)
* Bump rand from 0.8.5 to 0.9.2

Bumps [rand](https://github.com/rust-random/rand) from 0.8.5 to 0.9.2.
- [Release notes](https://github.com/rust-random/rand/releases)
- [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/rand/compare/0.8.5...rand_core-0.9.2)

---
updated-dependencies:
- dependency-name: rand
  dependency-version: 0.9.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix random tip selection method in get_random_tip function

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Chris Titus Tech <contact@christitus.com>
2026-04-01 16:00:14 -05:00
dependabot[bot] 54efd51204 Bump ego-tree from 0.9.0 to 0.11.0 (#1226)
Bumps [ego-tree](https://github.com/rust-scraper/ego-tree) from 0.9.0 to 0.11.0.
- [Release notes](https://github.com/rust-scraper/ego-tree/releases)
- [Commits](https://github.com/rust-scraper/ego-tree/compare/v0.9.0...v0.11.0)

---
updated-dependencies:
- dependency-name: ego-tree
  dependency-version: 0.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-01 15:56:44 -05:00
dependabot[bot] c2fff1034d Bump temp-dir from 0.1.16 to 0.2.0 (#1225)
Bumps [temp-dir](https://gitlab.com/leonhard-llc/ops) from 0.1.16 to 0.2.0.
- [Commits](https://gitlab.com/leonhard-llc/ops/compare/temp-dir-v0.1.16...temp-dir-v0.2.0)

---
updated-dependencies:
- dependency-name: temp-dir
  dependency-version: 0.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-01 15:54:09 -05:00
Donald Williams 0621fc51e0 Upd: URL for KooLit dotfiles for arch (#1238)
Jak isn't maintaining KooLit installers and dotfiles

It's been forked to https://github.com/LinuxBeginnings/Arch-Hyprland

It's community maintained and actively being developed still
Installers for debian, unbuntu, arch, opensuse and Fedora available

 On branch KooLit-url-update
 Your branch is up to date with 'origin/KooLit-url-update'.

 Changes to be committed:
	modified:   core/tabs/system-setup/arch/hyprland-kool.sh
2026-04-01 15:53:39 -05:00
Harsh Vyapari 91b13987fe chore(onlyoffice.sh): use onlyoffice-bin aur package instead of source build (#1235) 2026-04-01 10:27:46 -05:00
titus 6f97c3441b dwmtitus update 2026-03-21 22:58:59 -05:00
Sean (ANGRYxScotsman) 63bb4f4cc0 Linutil website edits (#1221)
* update theme

* Update docs.yaml

* put getting started into a dir
2026-03-05 22:13:21 -06:00
titus e2c63d0a9b add nojekyll
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
2026-03-05 22:09:03 -06:00
titus 783e951dfc update xtask 2026-03-05 22:05:36 -06:00
titus 24d78a679c publish sort 2026-03-05 22:04:22 -06:00
titus f31ea70e37 release 2026-03-05 22:00:40 -06:00
Chris Titus aea9be5ba2 Game fixup (#1219)
* Fix games scripts

* standardize game functions

* fix gaming menu and diablo 2 instructions

* cleanup shellcheck issues

* fix: use repo-root-relative shellcheck source path in gaming mod scripts

* fix: disable SC2034/SC2154 in common-steam-script.sh (vars set/used by sourcing scripts)
2026-03-05 16:35:27 -06:00
Abs a9b302298b add GPU driver install + fix WiFi Manager (#1213)
* add GPU driver install

* fix typo

* Delete docs/userguide.md

---------

Co-authored-by: Abs <abs@aabs.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-03-05 16:23:13 -06:00
Kingproone 7d35f78ace remove the hotfix line (#1211)
like in the winutil repo, it's redundant here as well with the bug fix line
2026-03-05 16:18:03 -06:00
dependabot[bot] 7e2722a2a4 Bump clap from 4.5.56 to 4.5.57 (#1210)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.56 to 4.5.57.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.56...clap_complete-v4.5.57)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.57
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 16:15:59 -06:00
dependabot[bot] 4a62df212e Bump which from 7.0.3 to 8.0.0 (#1209)
Bumps [which](https://github.com/harryfei/which-rs) from 7.0.3 to 8.0.0.
- [Release notes](https://github.com/harryfei/which-rs/releases)
- [Changelog](https://github.com/harryfei/which-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/harryfei/which-rs/compare/7.0.3...8.0.0)

---
updated-dependencies:
- dependency-name: which
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 16:14:27 -06:00
Sean (ANGRYxScotsman) 2fcd7cf878 New linutil website (#1215)
* Add Hugo build artifacts to .gitignore

Ignore docs/public/, docs/resources/, and docs/.hugo_build.lock so
generated Hugo output is never accidentally committed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add Hugo site infrastructure for Linutil docs

Adds the Hugo configuration, theme module (hextra), layout shortcodes,
i18n strings, static assets (favicons, nav logo), and archetype template
needed to build the documentation site.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add docs site homepage

Adds the root _index.md with badges, the quick-start curl command, and
an important-note callout about frequent updates.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add user guide content pages for Linutil

Rewrites all user guide sections from Winutil (Windows) content to
accurate Linutil (Linux) documentation:

- _index.md: overview, feature summary, quick links
- getting-started.md: how to run, install options, TUI navigation, keyboard shortcuts
- store/_index.md: application installation guide with category tables
- tweaks/_index.md: distro-specific system setup (Arch, Fedora, Debian, Ubuntu, Alpine)
- features/_index.md: security, gaming, emulators, and utilities reference
- updates/_index.md: how to keep Linutil up to date
- automation/_index.md: TOML config file usage and use-case examples

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add FAQ, known issues, and contributing guide pages

- faq.md: answers for general usage, running, scripts, contributing, and updates
- KnownIssues.md: documents terminal size, rendering, distro support, Nvidia, and Cargo update issues
- CONTRIBUTING.md: full contributing guide based on .github/CONTRIBUTING.md, formatted for the docs site

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add developer reference section and architecture docs

- dev/_index.md: landing page for the developer reference section
- dev/architecture.md: comprehensive architecture doc covering workspace
  layout, data model (Tab/ListNode/Command), tab_data.toml format, task
  list flags, preconditions system, script embedding via include_dir!,
  the script execution pipeline (PTY/vt100/tui-term), TUI layout and
  focus state machine, config file parsing, and key dependencies

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docgen: write walkthrough to docs/content/userguide/walkthrough.md

- Rename generated file from userguide.md to walkthrough.md to better
  reflect that it is an auto-generated script reference/walkthrough
- Update USER_GUIDE path to docs/content/userguide/walkthrough.md so
  cargo xtask docgen writes to the correct Hugo content location
- Update automation guide link to point to ../walkthrough/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: remove unused Winutil screenshot assets

All images in docs/assets/images/ were Winutil (Windows) screenshots
copied over from the Winutil docs. None are referenced by any content
file. Keeping only favicon.png and navlogo.png at the assets root,
which are used by hugo.toml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Update CNAME

* updated hugo configs

* docs: add preview.gif to homepage via Hugo mount

Mount .github/preview.gif directly into Hugo's static pipeline using
includeFiles so only the gif is exposed (no workflows or other .github
files). This means any update to .github/preview.gif is automatically
reflected on the site without any manual copying.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* added workflow

* Delete docs/assets/navlogo.png

can change this to something else

* Delete navlogo.png

* Update docs.yaml

* Update hugo.toml

* Update _index.md

* fix typo

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 16:13:39 -06:00
dependabot[bot] 25d596ff4b Bump tree-sitter-bash from 0.23.3 to 0.25.1 (#1208)
Bumps [tree-sitter-bash](https://github.com/tree-sitter/tree-sitter-bash) from 0.23.3 to 0.25.1.
- [Release notes](https://github.com/tree-sitter/tree-sitter-bash/releases)
- [Commits](https://github.com/tree-sitter/tree-sitter-bash/compare/v0.23.3...v0.25.1)

---
updated-dependencies:
- dependency-name: tree-sitter-bash
  dependency-version: 0.25.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 16:01:57 -06:00
dependabot[bot] 6e6bf3d714 Bump tree-sitter-highlight from 0.24.7 to 0.26.5 (#1207)
Bumps [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) from 0.24.7 to 0.26.5.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](https://github.com/tree-sitter/tree-sitter/compare/v0.24.7...v0.26.5)

---
updated-dependencies:
- dependency-name: tree-sitter-highlight
  dependency-version: 0.26.5
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 14:54:45 -06:00
dependabot[bot] 9b2482ed66 Bump nix from 0.29.0 to 0.31.1 (#1206)
Bumps [nix](https://github.com/nix-rust/nix) from 0.29.0 to 0.31.1.
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.29.0...v0.31.1)

---
updated-dependencies:
- dependency-name: nix
  dependency-version: 0.31.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 14:53:33 -06:00
Kingproone 96c7a68fdc feat: Add related tools and setups to the gaming tab (#1192)
* Add related tools and setups to gaming tab

* remove double '&' in the Nvidia Drivers entry
2026-03-05 14:52:42 -06:00
github-actions[bot] bc663f72ec chore(nix): update flake inputs (#1216)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-03 11:42:03 +01:00
Chris Titus 3bb64c3f7b update publish script (#1203) 2026-02-06 19:34:36 -06:00
dependabot[bot] c6ca91f6c1 Bump time from 0.3.46 to 0.3.47 (#1201)
Bumps [time](https://github.com/time-rs/time) from 0.3.46 to 0.3.47.
- [Release notes](https://github.com/time-rs/time/releases)
- [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md)
- [Commits](https://github.com/time-rs/time/compare/v0.3.46...v0.3.47)

---
updated-dependencies:
- dependency-name: time
  dependency-version: 0.3.47
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-06 19:28:47 -06:00
dependabot[bot] fc8c37fe69 Bump toml from 0.8.23 to 0.9.11+spec-1.1.0 (#1199)
* Bump toml from 0.8.23 to 0.9.11+spec-1.1.0

Bumps [toml](https://github.com/toml-rs/toml) from 0.8.23 to 0.9.11+spec-1.1.0.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.23...toml-v0.9.11)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 0.9.11+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update core/Cargo.toml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix build errors

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-06 19:27:38 -06:00
dependabot[bot] 8ebe6e2013 Bump portable-pty from 0.8.1 to 0.9.0 (#1198)
Bumps [portable-pty](https://github.com/wezterm/wezterm) from 0.8.1 to 0.9.0.
- [Release notes](https://github.com/wezterm/wezterm/releases)
- [Changelog](https://github.com/wezterm/wezterm/blob/main/docs/changelog.md)
- [Commits](https://github.com/wezterm/wezterm/compare/portable-pty-0.8.1...termwiz-0.9.0)

---
updated-dependencies:
- dependency-name: portable-pty
  dependency-version: 0.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-06 19:12:52 -06:00
dependabot[bot] 878cf275eb Bump tui-term from 0.2.0 to 0.3.1 (#1197)
* Bump tui-term from 0.2.0 to 0.3.1

Bumps [tui-term](https://github.com/a-kenji/tui-term) from 0.2.0 to 0.3.1.
- [Release notes](https://github.com/a-kenji/tui-term/releases)
- [Changelog](https://github.com/a-kenji/tui-term/blob/development/CHANGELOG.md)
- [Commits](https://github.com/a-kenji/tui-term/compare/v0.2.0...v0.3.1)

---
updated-dependencies:
- dependency-name: tui-term
  dependency-version: 0.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* update from vt100-ctt and bump versions

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: titus <contact@christitus.com>
2026-02-06 19:10:17 -06:00
dependabot[bot] 3ed4930bfb Bump clap from 4.5.55 to 4.5.56 (#1196)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.55 to 4.5.56.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.55...clap_complete-v4.5.56)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.56
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-06 18:19:14 -06:00
titus 46cc1086cd fix pr labels 2026-02-06 18:18:02 -06:00
github-actions[bot] 36c0c22f8d chore(nix): update flake inputs
Reviewed-on: https://github.com/ChrisTitusTech/linutil/pull/1194
Reviewed-by: koi <me@koi.rip>
2026-02-01 07:10:04 +01:00
Chris Titus 1e8be70005 Simplify pull request template (#1191)
Removed unnecessary sections and checklist items from the pull request template.
2026-01-28 21:47:32 -06:00
titus 1c34399b8c fix syntax errors from parsing 2026-01-28 13:48:09 -06:00
Chris Titus 469205c1a6 update minor version for oneshot (#1190)
* update minor version for oneshot

* update pr template
2026-01-28 13:23:06 -06:00
Abs 7df23d9a71 fix duplicate ver (#1188) 2026-01-28 10:24:30 -06:00
Kingproone 7404851a84 documentation: add a line to the readme, to credit vhs for the preview gif (#1185) 2026-01-28 10:23:11 -06:00
titus cb29388de7 update labels 2026-01-28 09:59:41 -06:00
titus eb56a4b0d3 update pr label 2026-01-28 09:55:17 -06:00
koi 3408e83b33 chore: update adamperkowski username to koibtw (#1172)
hi so this is still me on the same account, just a new username
2026-01-26 19:50:37 -06:00
titus db50c6e029 fallout 76 script revamp and standardization
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
2026-01-25 23:50:24 -06:00
Chris Titus bae996d676 bigger preview 2026-01-22 15:16:56 -06:00
Chris Titus 59753c1d20 done with all this preview madness 2026-01-22 15:11:15 -06:00
Chris Titus e26c0525bc fix preview.tape 2026-01-22 14:35:09 -06:00
Chris Titus 7457242995 fix: properly set up VHS environment with PATH and font cache 2026-01-22 14:22:14 -06:00
Chris Titus efab8bd933 revert: use manual VHS installation instead of action due to ffmpeg conflicts 2026-01-22 14:20:24 -06:00
Chris Titus dcffb58de8 fix: explicitly install ffmpeg before vhs-action 2026-01-22 14:17:15 -06:00
Chris Titus 56d8e368d7 chore: migrate preview workflow to use vhs-action 2026-01-22 14:15:06 -06:00
Chris Titus cb03bfe569 fix env and font for preview 2026-01-22 14:04:34 -06:00
Chris Titus fedcbfb967 update width 2026-01-22 13:49:58 -06:00
Chris Titus b20c3457b0 Merge branch 'main' of https://github.com/ChrisTitusTech/linutil 2026-01-22 13:43:38 -06:00
Chris Titus bf4790dc88 update preview 2026-01-22 13:43:36 -06:00
github-actions[bot] 247f09d396 Preview for 2026.01.22 (#1179)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-01-22 13:37:52 -06:00
Chris Titus f19b831ddc update version 2026-01-22 13:11:45 -06:00
Chris Titus cd620d0a65 update cargo sort workspace 2026-01-22 13:07:11 -06:00
Abs 62018c7844 Linutil New design (#1176)
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
* New theme & design

* Fix shellcheck assignment spacing

* Fixed system_info file

* Fixed Cargo fmt

* add ctt logo

* update version and fmt

* update docs with xtask

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-01-22 12:37:38 -06:00
Kingproone 3ae81b8084 update universal android debloater to 1.2.0 (#1174) 2026-01-22 12:18:40 -06:00
Kingproone 16c80d10b1 Remove duplicate entry for "desktop environment setup" (#1173)
When I ran the dev branch, the setup was listed twice, this should hopefully fix it.

The most probable cause of the duplication is when chris used the llm to alpha the toml entries.
2026-01-22 12:03:40 -06:00
Chris Titus bbb6cc517e fix sorting and cleanup toml sort bash script 2026-01-22 11:59:52 -06:00
Chris Titus ec7ab4f28e Fix sorting 2026-01-22 11:51:03 -06:00
namato1 0ef3102727 [Feature]: Game emulators (#1151)
* Mirrored gaming changes

* Added game emulators for Playstation 1 and 2, Nintendo Gameboy, DS, GameCube, Wii, Switch, and RetroArch

* Added docs

* removed ghostty from user guide

* added flatpak check before installing

* used only AURHelper for Arch

* Update retroarch.sh

fixed misspelling on melondsds-bin and xmv

* Added new emulators

* Updated TOML file

* fixed typo and script error

* modified game emulators to install GUI versions and changed a few that were having issues on Arch

* Updated pcsxr depends, removed yabause, updated docs

* removed accidental character

* Added .cache cleanup for removal

* fixed shell check double qoute errors

* Added gopher64 and organized emulates based on company

* Removed pcsxr (Fails to install), Play! set to flatpak for Arch due to failing install, removed mesen 2 as it is not ready for production

* Changed retroarch melonds core to proper core

* fixed accidental comment on line in play-emu.sh

* Added --clearafter arguement to remove cache.  This will save space for those who have smaller drives

* fixed cleanafter which was spelled wrong

---------

Co-authored-by: Nick A <namato@deloitte.com>
2026-01-22 11:41:45 -06:00
Chris Titus 66296bd6e2 docs update
Check for typos / check-typos (push) Has been cancelled
XTask Checks / DocGen (push) Has been cancelled
2025-12-18 15:14:53 -06:00
Chris Titus ac962f49e9 arc-raiders update 2025-12-18 14:41:21 -06:00
Chris Titus a79812a346 Arc Raiders mod setup 2025-12-18 14:38:25 -06:00
Chris Titus 80930c0820 update 2025-12-12 09:51:07 -06:00
Chris Titus db2019e31f add more gaming packages needed for blizzard games 2025-12-12 09:45:57 -06:00
Chris Titus f0f7c7642b update to include publish version checks (#1169)
* update to include publish version checks

* update docs

* Fix sorting and error checks
2025-12-10 16:00:52 -06:00
Adian Kozlica 2f0e9ff652 fix: podman-compose install for zypper (#1168)
* fix: podman-compose install for zypper

* fix: quote

* fix: syntax issue

* Simplify zypper installation process for podman-compose

Removed unnecessary OS release checks for zypper installation.

* Remove checkDistro function call

This is already done and /etc/os-release is sourced from checkEnv

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2025-12-10 15:10:39 -06:00
awarzu 0e26ba2501 fix: remove duplicate Compile Setup entry and orphaned config fields (#1164)
Co-authored-by: Chris Titus <contact@christitus.com>
2025-12-10 15:01:25 -06:00
awarzu 00d7c58611 fix: correct exit code checking in encryption/decryption tool (#1163)
* fix: correct exit code checking in encryption/decryption tool

* fix: remove duplicate Compile Setup entry and orphaned config fields

* Update tab_data.toml

* Update tab_data.toml
2025-12-10 15:00:19 -06:00
Chris Titus Tech a322cb9809 gaming update 2025-12-10 14:52:07 -06:00
Chris Titus 263cbfd52d Potential fix for code scanning alert no. 8: Workflow does not contain permissions (#1167)
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-12-04 10:40:38 -06:00
Chris Titus 14137b8002 fix sorting once and for all 2025-12-02 15:20:39 -06:00
Chris Titus 973e8e7d14 fix sorting in linutil (#1165)
* fix sorting in linutil

* pr label fix

* update to fix bashisms
2025-12-02 15:09:00 -06:00
namato1 575cdbd5e1 [Feature]: Adobe alternatives (#1149)
* Mirrored gaming changes

* Added GIMP, pinta, darktable, krita, mypaint, Inkscape, Scribus, OpenShot, Olive, Synfig Studio, Natron, Blender, Ardour, Audacity, Tenacity, Handbrake

* Fixed typo in Fallout76

* removed fallout changes

* Separated Installers

* removed empty file, added items to TOML file, renamed from adobe alternatives to design-tools

* Fived Olive install check

* Fixed installed checks for some tools

* updated check for AUR to include paru

* Fixed issue with heading being bash rather than sh

* Added Uninstallers

* updated docs

* Update gimp.sh

fixed AUR install which would install pinta by mistake

* Removed unsupported package manager comment when installing with FlatPak

* removed ghostty from user guide

* added flatpak check before installing

* Switched to using the checkAURHelper to check for yay/paru or install yay

* Removed redundency

* Added --clearafter arguement to remove cache.  This will save space for those who have smaller drives

* fixed cleanafter which was spelled wrong

---------

Co-authored-by: Nick A <namato@deloitte.com>
2025-12-02 14:06:35 -06:00
Jared Cervantes 66ffc397a5 [Fix]: Gaming depends for apt (#1146)
* fix lutris

* fix lutris again

* possible wine fix

* use github for lutris anyway

* lutris update
2025-12-02 14:00:57 -06:00
Jared Cervantes 636c6af268 [Fix]: Nala backup adjustment (#1145)
* adjust for new version of nala

* don't need
2025-12-02 13:59:45 -06:00
nev-al 5e55b79487 feat(podman-setup): docker.io container registry (#1134)
* feat: add a container registry for podman-setup

* Apply suggestion from @adamperkowski

Co-authored-by: Adam Perkowski <adas1per@protonmail.com>

* Apply suggestion from @adamperkowski

Co-authored-by: Adam Perkowski <adas1per@protonmail.com>

* Apply suggestion from @adamperkowski

Co-authored-by: Adam Perkowski <adas1per@protonmail.com>

---------

Co-authored-by: Adam Perkowski <adas1per@protonmail.com>
2025-12-02 13:55:46 -06:00
Phoenix Hale 1758e7edea Added script for installing/uninstalling Desktop Environments/Window Managers (#1070)
* Added Tor Browser to Web Browsers tab.

* Ran cargo xtask docgen

* removed unnecessary double quotes in tor-browser.sh

Co-authored-by: JEEVITHA KANNAN K S <ksjeevithakannan123@gmail.com>

* Add desktop environment and compile setup scripts to tab_data.toml

- Introduced scripts for installing and uninstalling various desktop environments and window managers.

* Update userguide.md to include new applications and scripts for desktop environment management

* refactor: use common-script.sh functions

* refactor: remove BASHISMs

* fix: quote pkg_manager in cleanup commands for safety

* Remove color codes

* added new WM options

* Fix shell check and a few errors in WM install

---------

Co-authored-by: Phoenix Mark Hale <m.werthammer@online.de>
Co-authored-by: Phoenix Mark Hale <69822350+phoenixhaleofficial@users.noreply.github.com>
Co-authored-by: JEEVITHA KANNAN K S <ksjeevithakannan123@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2025-12-02 13:45:52 -06:00
Kevin Knapp b411d78dbc [Feature] Add Cursor as a developer tool (#1152)
* Added cursor to tab_data

* Fixed data entry

* Added message to indicate the program was installed

* Removed install message, verified the URL's were correct (does not download through browser, needs curl or wget)

* Updated DOCS

* Fixed URLs to get latest version of files for apt and dnf

* Updated userguide using docgen

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Update docs/userguide.md

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/applications-setup/tab_data.toml

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Fixed shellcheck errors

* Possibly fixed posix compliant issue

* Updated userguide with docgen

* remove ghostty from userguide

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Added a way to just install cursor from the repos if it already exists.

* Fixed switch statement

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <me@adamperkowski.dev>

* Update core/tabs/applications-setup/developer-tools/cursor.sh

Co-authored-by: adam <me@adamperkowski.dev>

* apt-search was causing issues for installing, removed it entired. Same with dnf search

---------

Co-authored-by: adam <adas1per@protonmail.com>
Co-authored-by: adam <me@adamperkowski.dev>
2025-12-02 13:19:01 -06:00
adam cad7b63f28 feat(ci): create a workflow for nix (#1161)
this checks nix code on every push and pull request and updates flake
inputs through a PR every month
2025-12-02 13:12:37 -06:00
adam 1ae1b7e1f7 chore: set up CODEOWNERS (#1157)
this adds a CODEOWNERS file defining ownership for merge permissions
2025-10-23 14:13:52 -05:00
adam b6ca0dc45d feat(nix): create a flake (#1154)
turns out i use nixos now so this will make the development process
wayyyy easier for me

you can now build linutil for nix with `nix build`, enter the dev
environment with `nix develop`, and format nix code with `nix fmt`

and if some crazy person was to use linutil on nixos, now they can with
`nix run github:ChrisTitusTech/linutil` or by adding linutil to their
flake
2025-10-23 13:47:54 -05:00
adam a674cc1dbc docs: bring back docgen requirements & delete the roadmap (#1153) 2025-10-23 13:41:50 -05:00
adam 16528757ba docs: update the manpage (#1144)
its pretty outdated for some reason so i updated it :)
i also think its better for it to not reference a specific version
because its not being updated on every release
2025-10-23 13:38:00 -05:00
adam a9f00dd16c feat(ci): automatic PR labeling (#1143)
so i decided to make labeling prs a bit easier and this workflow
automatically syncs issue labels to a newly created pr
(if it has a closing keyword for that issue of course). this WILL NOT
always be accurate so we still need to review manually. it's not a
replacement, just makes stuff easier.

fully tested on my fork
2025-10-23 13:36:26 -05:00
JbstormburstADV fbfd12f6a6 Server-Setup: eMMC Support (#1049)
* Add Feature: eMMC Disk Option

Changes logic in driveSSD to choose from three options instead of yes/no.  Adds eMMC option to implement increased zstd compression factor in fstab.

* Add Feature: eMMC Error Handling

Adds logic to diskpart function to prevent selection of a non-viable eMMC partition as the target disk for installation (e.g.: /dev/mmcblkXbootY or /dev/mmcblkrpbm).

* Add Feature: eMMC Filesystems

Adds logic to allow handling of eMMC partitions (e.g.: /dev/mmcblkXpY) when creating filesystems; prior usage would cause errors when attempting to create or mount eMMC partitions due to partitions being read incorrectly (/dev/mmcblkXY).

* Update core/tabs/system-setup/arch/server-setup.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/system-setup/arch/server-setup.sh

Co-authored-by: adam <adas1per@protonmail.com>

* Update core/tabs/system-setup/arch/server-setup.sh

Co-authored-by: adam <adas1per@protonmail.com>

---------

Co-authored-by: adam <adas1per@protonmail.com>
2025-10-23 13:13:48 -05:00
Adam Perkowski 21addb8db0 docs: clean up issue templates and introduce new labels (#1142)
heyy so i decided to do a little autumn cleaning in our issue management
in linutil. i created a couple of new labels
([label list](https://github.com/ChrisTitusTech/linutil/labels)),
updated the issue templates to be more concise, and updated
`ALLOWED_USERS` in the `issue-slash-commands` workflow.

from now on, we'll be using the new priority labels for issues and PRs.
also, i'd like to say that we (the maintainers, so @ChrisTitusTech,
@afonsofrancof, and me) need to start labeling stuff accordingly again.
the releases still rely on PR labels.
for that, i created the `initial review required` label. it'll be added
to every issue upon creation, and then removed after a maintainer review
which would include adding priority and scope labels.

so chris, please start labeling RPs again :3
2025-10-07 13:10:24 -05:00
Adam Perkowski 2aa99ce653 test: implement unit tests for linutil_core (#1140)
🚨 THIS IS MY COMEBACK PR I CAME BACK HELLO 🚨

so basically i added unit tests for critical core functions and also
some cats :3 hope its not an issue (im taking a break again if it is)
also figured would be nice to have `cargo test` in `publish.sh`

resolves #1023
2025-10-07 13:03:43 -05:00
Adam Perkowski ae765bb663 chore(clippy): comply with new lints (#1141)
yup clippy got mad at u again for not maintaining rust code chris
should we add clippy to the release workflow? maybe that would help
2025-10-07 13:00:24 -05:00
Chris Titus 8333803917 git go path 2025-09-29 14:45:49 -05:00
Real-MullaC 7beb8732c0 Update dwmtitus-setup.sh (#1136) 2025-09-29 14:39:24 -05:00
Chris Titus 93bda82417 update vhs-action 2025-09-29 14:36:18 -05:00
Chris Titus bbc4d5b2c7 fix preview trigger 2025-09-29 14:29:13 -05:00
Chris Titus 22d95a769a move ffmpeg install after set env 2025-09-29 14:24:25 -05:00
Chris Titus 00d5e85626 fix linutil preview
Check for typos / check-typos (push) Has been cancelled
2025-09-29 14:15:01 -05:00
Chris Titus 566b4c83aa Fix shellcheck errors 2025-09-29 14:05:21 -05:00
Chris Titus 8a9da3de6c omarchy fix to stock dhh install script 2025-09-29 13:36:52 -05:00
titus 60204ce983 f76 build
Check for typos / check-typos (push) Has been cancelled
2025-09-12 21:17:24 -05:00
Chris Titus b6825603f8 speed up find 2025-09-12 14:24:06 -05:00
Chris Titus 5603c2473a error checking 2025-09-12 13:58:37 -05:00
titus 2553f43f7d f76 script update 2025-09-11 16:18:14 -05:00
titus 8be0758a6c add mod support f76 2025-09-11 16:14:02 -05:00
228 changed files with 12075 additions and 2021 deletions
+8
View File
@@ -0,0 +1,8 @@
# Chris rules EVERYTHING (including paths listed below)
* @ChrisTitusTech
# Nix stuff
# We want the whole `nix` directory here in case we add custom tests/script later
*.nix @koibtw
flake.lock @koibtw
/nix/ @koibtw
+24 -21
View File
@@ -1,7 +1,7 @@
name: Bug Report
description: Report a bug or issue to help us improve.
title: "[Bug]: "
labels: ["bug"]
title: "[Bug]: <title>"
labels: ["type: bug", "initial review required"]
assignees: []
body:
- type: markdown
@@ -26,7 +26,7 @@ body:
- type: input
id: specify-distribution
attributes:
label: Specify Distribution (if "Other" selected)
label: Distribution (if "Other" selected)
description: Enter the name of your Linux distribution.
placeholder: e.g., Manjaro, Pop!_OS
- type: dropdown
@@ -47,7 +47,7 @@ body:
- type: input
id: specify-de-wm
attributes:
label: Specify Desktop Environment/Window Manager (if "Other" selected)
label: Desktop Environment / Window Manager (if "Other" selected)
description: Enter the name of your desktop environment or window manager.
placeholder: e.g., LXQt, Openbox
- type: dropdown
@@ -65,7 +65,7 @@ body:
id: linutil-version
attributes:
label: Linutil Version
description: Linutil version (found above the list within linutil).
description: Version number (found above the list within Linutil).
validations:
required: true
- type: dropdown
@@ -75,31 +75,31 @@ body:
multiple: false
description: Specify the branch of the project you are using.
options:
- main
- prerelease
- stable
- main
- release
- pre-release
- other
validations:
required: true
- type: input
id: specify-branch
id: specify-commit
attributes:
label: Specify Branch (if "Other" selected)
description: Enter the branch name.
placeholder: e.g., feature/new-feature
label: Commit Hash (if "Other" selected)
description: Enter commit hash if not using a listed branch.
placeholder: e.g., 09ebb1c, 09ebb1c604ba8f15fd818de2ead0a9ef2690fc21
- type: textarea
id: describe-bug
attributes:
label: Describe the bug
label: Description
description: |
Provide a clear and concise description of what the bug is.
Provide a clear and concise description of what went wrong.
placeholder: Describe the issue in detail.
validations:
required: true
- type: textarea
id: reproduce-steps
attributes:
label: Steps to reproduce
label: Steps to Reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. Go to '...'
@@ -111,33 +111,36 @@ body:
- type: textarea
id: expected-behavior
attributes:
label: Expected behavior
label: Expected Behavior
description: |
A clear and concise description of what you expected to happen.
placeholder: Explain the expected outcome.
placeholder: Describe the correct behavior.
validations:
required: true
- type: textarea
id: additional-context
attributes:
label: Additional context
label: Additional Context
description: |
Add any other context or information about the problem here.
placeholder: Include any related logs, error messages, or configurations.
- type: textarea
id: screenshots
attributes:
label: Screenshots
label: Logs or Screenshots
description: |
If applicable, add screenshots to help explain your problem. Provide links or attach images in the comments after submitting the issue.
If applicable, add logs or screenshots to help explain your problem.
placeholder: Remeber to use code blocks (```) for logs.
- type: checkboxes
id: checklist
attributes:
label: Checklist
options:
- label: I checked for duplicate issues.
required: true
- label: I checked existing discussions.
required: true
- label: This issue is not included in the roadmap.
required: true
- label: This issue is present on both stable and development branches.
required: true
+15 -14
View File
@@ -1,49 +1,50 @@
name: Feature Request
description: Suggest a new feature or improvement to help us enhance this project.
title: "[Feature Request]: "
labels: ["enhancement"]
description: Suggest a new feature or improvement to help us enhance the project.
title: "[Feature Request]: <title>"
labels: ["type: enhancement", "initial review required"]
assignees: []
body:
- type: markdown
attributes:
value: |
Thank you for suggesting a feature or enhancement! Please provide as much detail as possible to help us understand your request. Note that submitting a feature request does not guarantee implementation.
Please provide as much detail as possible to help us understand your request. Note that submitting a feature request does not guarantee implementation.
- type: textarea
id: related-problem
attributes:
label: Is your feature request related to a problem? Please describe.
label: Problem Description
description: |
Provide a clear and concise description of the problem, if applicable.
Is your feature request related to a problem? If yes, please describe.
placeholder: I'm always frustrated when ...
- type: textarea
id: proposed-solution
attributes:
label: Describe the solution you'd like
label: Proposed solution
description: |
Provide a clear and concise description of what you want to happen.
placeholder: Explain your proposed feature or enhancement in detail.
Provide a clear and concise description of what you would like to be changed.
placeholder: Explain your proposal in detail.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
label: Alternatives
description: |
Provide a clear and concise description of any alternative solutions or features you've considered.
Are there other ways to solve this? List any alternatives or workarounds youve considered.
placeholder: Explain any other approaches or solutions you've thought about.
- type: textarea
id: additional-context
attributes:
label: Additional context
label: Additional Context
description: |
Add any other context or screenshots about the feature request here.
placeholder: Provide additional information, screenshots, or references to explain your request further.
Add any other context, screenshots or references related to your request here.
- type: checkboxes
id: checklist
attributes:
label: Checklist
options:
- label: I checked for duplicate issues.
required: true
- label: I checked already existing discussions.
required: true
- label: This feature is not included in the roadmap.
required: true
+1 -17
View File
@@ -8,29 +8,13 @@ https://github.com/ChrisTitusTech/linutil/blob/main/.github/CONTRIBUTING.md
- [ ] Bug fix
- [ ] Documentation update
- [ ] Refactoring
- [ ] Hotfix
- [ ] Security patch
- [ ] UI/UX improvement
## Description
<!--[Provide a detailed explanation of the changes you have made. Include the reasons behind these changes and any relevant context. Link any related issues.]-->
## Testing
<!--[Detail the testing you have performed to ensure that these changes function as intended. Include information about any added tests.]-->
## Impact
<!--[Discuss the impact of your changes on the project. This might include effects on performance, new dependencies, or changes in behaviour.]-->
## Issues / other PRs related
<!--[What issue/discussion is related to this PR (if any)]-->
- Resolves #
## Additional Information
<!--[Any additional information that reviewers should be aware of.]-->
## Checklist
- [ ] My code adheres to the coding and style guidelines of the project.
- [ ] I have performed a self-review of my own code.
- [ ] I have commented my code, particularly in hard-to-understand areas.
- [ ] I have made corresponding changes to the documentation.
- [ ] My changes generate no errors/warnings/merge conflicts.
## Screenshots (if applicable)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

+3 -3
View File
@@ -60,11 +60,11 @@ Output preview.gif
Require linutil
Require sh
Set Shell "bash"
Set FontFamily "JetBrainsMono Nerd Font"
Set FontSize 24
Set Shell bash
Set FontFamily "JetBrainsMono NFM"
Set Width 1920
Set Height 1080
Set Theme nord
Sleep 1s
+9 -9
View File
@@ -2,31 +2,31 @@ changelog:
categories:
- title: '🚀 Features'
labels:
- 'enhancement'
- 'type: enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'bug'
- 'type: bug'
- title: '⚙️ Refactoring'
labels:
- 'refactor'
- 'type: refactor'
- title: '🧩 UI/UX'
labels:
- 'UI/UX'
- 'scope: UI/UX'
- title: '📚 Documentation'
labels:
- 'documentation'
- 'scope: documentation'
- title: '🔒 Security'
labels:
- 'security'
- 'scope: security'
- title: '🧰 GitHub Actions'
labels:
- 'github_actions'
- 'scope: github_actions'
- title: '🦀 Rust'
labels:
- 'rust'
- 'scope: rust'
- title: '📃 Scripting'
labels:
- 'script'
- 'scope: script'
- title: 'Other Changes'
labels:
- "*"
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- run: git fetch origin ${{ github.base_ref }}
- name: Install devscripts
+87
View File
@@ -0,0 +1,87 @@
name: Deploy Hugo site to Pages
on:
push:
branches:
- main
paths:
- "docs/**"
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
defaults:
run:
shell: bash
jobs:
build:
if: github.repository == 'ChrisTitusTech/linutil'
runs-on: ubuntu-latest
env:
HUGO_VERSION: 0.156.0
HUGO_ENVIRONMENT: production
TZ: America/Chicago
steps:
- name: Install Hugo CLI
run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Checkout
uses: actions/checkout@v7
with:
submodules: recursive
fetch-depth: 0
persist-credentials: false
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
- name: Install Node.js dependencies
run: "cd docs && [[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
- name: Cache Restore
id: cache-restore
uses: actions/cache/restore@v5
with:
path: |
${{ runner.temp }}/hugo_cache
key: hugo-${{ github.run_id }}
restore-keys: hugo-
- name: Build with Hugo
run: |
hugo \
--gc \
--minify \
--cleanDestinationDir \
--source docs \
--cacheDir "${{ runner.temp }}/hugo_cache"
- name: Cache Save
id: cache-save
uses: actions/cache/save@v5
with:
path: |
${{ runner.temp }}/hugo_cache
key: ${{ steps.cache-restore.outputs.cache-primary-key }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v5
with:
path: ./docs/public
deploy:
if: github.repository == 'ChrisTitusTech/linutil'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
+54 -92
View File
@@ -15,101 +15,63 @@ jobs:
contents: read
steps:
- run: echo "command=false" >> $GITHUB_ENV
- name: Process slash command
uses: actions/github-script@v9
with:
script: |
const allowedUsers = ["ChrisTitusTech", "og-mrk", "Marterich", "MyDrift-user", "Real-MullaC", "CodingWonders", "GabiNun2", "FluffyPunk"];
const commenter = context.payload.comment.user.login;
- name: Check for /label command
id: check_label_command
run: |
if [[ "${{ contains(github.event.comment.body, '/label') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
LABEL_NAME=$(echo '${{ github.event.comment.body }}' | awk -F"/label" '/\/label/ { match($2, /'\''([^'\'']*)'\''/, arr); if (arr[1] != "") print arr[1] }')
echo "label_command=true" >> $GITHUB_ENV
echo "label_name=${LABEL_NAME}" >> $GITHUB_ENV
else
echo "label_command=false" >> $GITHUB_ENV
fi
- name: Check for /unlabel command
id: check_unlabel_command
run: |
if [[ "${{ contains(github.event.comment.body, '/unlabel') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
UNLABEL_NAME=$(echo '${{ github.event.comment.body }}' | awk -F"/unlabel" '/\/unlabel/ { match($2, /'\''([^'\'']*)'\''/, arr); if (arr[1] != "") print arr[1] }')
echo "unlabel_command=true" >> $GITHUB_ENV
echo "unlabel_name=${UNLABEL_NAME}" >> $GITHUB_ENV
else
echo "unlabel_command=false" >> $GITHUB_ENV
fi
// Authorization check first - before any parsing of comment content
if (!allowedUsers.includes(commenter)) {
console.log(`User ${commenter} is not in the allowlist. Skipping.`);
return;
}
- name: Check for /close command
id: check_close_command
run: |
if [[ "${{ contains(github.event.comment.body, '/close') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
echo "close_command=true" >> $GITHUB_ENV
echo "reopen_command=false" >> $GITHUB_ENV
else
echo "close_command=false" >> $GITHUB_ENV
fi
// Read comment body as data, never interpolated into shell
const body = context.payload.comment.body;
const issueNumber = context.issue.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
- name: Check for /open or /reopen command
id: check_reopen_command
run: |
if [[ "${{ contains(github.event.comment.body, '/open') }}" == "true" ]] || [[ "${{ contains(github.event.comment.body, '/reopen') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
echo "reopen_command=true" >> $GITHUB_ENV
echo "close_command=false" >> $GITHUB_ENV
else
echo "reopen_command=false" >> $GITHUB_ENV
fi
// /label 'name' or /label name
const labelMatch = body.match(/\/label\s+'([^']+)'|\/label\s+(\S+?)(?:\s|$)/);
if (labelMatch) {
const labelName = (labelMatch[1] || labelMatch[2]).trim();
console.log(`Adding label: ${labelName}`);
await github.rest.issues.addLabels({
owner, repo, issue_number: issueNumber,
labels: [labelName],
});
}
- name: Check if the user is allowed
id: check_user
if: env.command == 'true'
run: |
ALLOWED_USERS=("ChrisTitusTech" "afonsofrancof" "Marterich" "MyDrift-user" "Real-MullaC" "nnyyxxxx" "adamperkowski" "lj3954" "jeevithakannan2" "${{ github.event.issue.user.login }}")
if [[ " ${ALLOWED_USERS[@]} " =~ " ${{ github.event.comment.user.login }} " ]]; then
echo "user=true" >> $GITHUB_ENV
else
exit 0
fi
// /unlabel 'name' or /unlabel name
const unlabelMatch = body.match(/\/unlabel\s+'([^']+)'|\/unlabel\s+(\S+?)(?:\s|$)/);
if (unlabelMatch) {
const labelName = (unlabelMatch[1] || unlabelMatch[2]).trim();
console.log(`Removing label: ${labelName}`);
await github.rest.issues.removeLabel({
owner, repo, issue_number: issueNumber,
name: labelName,
});
}
- name: Close issue
if: env.close_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Closing the issue...
if [[ "${{ contains(github.event.comment.body, 'not planned') }}" == "true" ]]; then
gh issue close $ISSUE_NUMBER --repo ${{ github.repository }} --reason 'not planned'
else
gh issue close $ISSUE_NUMBER --repo ${{ github.repository }}
fi
- name: Reopen issue
if: env.reopen_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Reopening the issue...
gh issue reopen $ISSUE_NUMBER --repo ${{ github.repository }}
// /close (optionally with 'not planned')
if (body.includes('/close')) {
const stateReason = body.includes('not planned') ? 'not_planned' : 'completed';
console.log(`Closing issue (reason: ${stateReason})`);
await github.rest.issues.update({
owner, repo, issue_number: issueNumber,
state: 'closed',
state_reason: stateReason,
});
}
- name: Label issue
if: env.label_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Labeling the issue...
gh issue edit $ISSUE_NUMBER --repo ${{ github.repository }} --add-label "${{ env.label_name }}"
- name: Remove labels
if: env.unlabel_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Unlabeling the issue...
gh issue edit $ISSUE_NUMBER --repo ${{ github.repository }} --remove-label "${{ env.unlabel_name }}"
// /open or /reopen
if (body.includes('/open') || body.includes('/reopen')) {
console.log('Reopening issue');
await github.rest.issues.update({
owner, repo, issue_number: issueNumber,
state: 'open',
});
}
+4 -4
View File
@@ -15,20 +15,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Install musl-tools
run: sudo apt-get update && sudo apt-get install musl-tools
- name: Cache Cargo registry
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-registry-
- name: Cache Cargo index
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
@@ -59,7 +59,7 @@ jobs:
- name: Create and Upload Release
id: create_release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ env.version }}
name: Pre-Release ${{ env.version }}
+62
View File
@@ -0,0 +1,62 @@
name: nix
on:
push:
branches:
- main
pull_request:
branches:
- main
schedule:
- cron: '0 0 1 * *'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
checks:
runs-on: ubuntu-latest
if: github.event_name != 'schedule'
steps:
- uses: actions/checkout@v7
- name: set up nix
uses: cachix/install-nix-action@v31
- name: check formatting
run: |
nix fmt
if [ -n "$(git status --porcelain)" ]; then
git --no-pager diff
exit 1
fi
- name: check flake evaluation
run: nix flake check
update:
runs-on: ubuntu-latest
if: github.event_name == 'schedule'
steps:
- uses: actions/checkout@v7
- name: set up nix
uses: cachix/install-nix-action@v31
- name: update flake inputs
run: nix flake update
- name: open pull request
uses: peter-evans/create-pull-request@v7
with:
commit-message: 'chore(nix): update flake inputs'
committer: 'github-actions[bot] <github-actions[bot]@users.noreply.github.com>'
author: 'github-actions[bot] <github-actions[bot]@users.noreply.github.com>'
branch: 'chore/nix/flake-update'
title: 'chore(nix): update flake inputs'
reviewers: koibtw
assignees: koibtw
+95
View File
@@ -0,0 +1,95 @@
name: Label PRs by Type of Change
on:
pull_request_target:
types: [opened, edited, synchronize]
jobs:
label-pr:
runs-on: ubuntu-latest
permissions:
pull-requests: write
issues: write
contents: read
steps:
- name: Check PR body for Type of Change
uses: actions/github-script@v9
with:
script: |
const prBody = context.payload.pull_request.body || '';
const labelsToAdd = [];
// Check for Type of Change checkboxes
if (/\[x\]\s*New feature/i.test(prBody)) {
labelsToAdd.push('new feature');
}
if (/\[x\]\s*Bug fix/i.test(prBody)) {
labelsToAdd.push('bug');
}
if (/\[x\]\s*Documentation update/i.test(prBody)) {
labelsToAdd.push('documentation');
}
if (/\[x\]\s*Hotfix/i.test(prBody)) {
labelsToAdd.push('hotfix');
}
if (/\[x\]\s*UI\/UX improvement/i.test(prBody)) {
labelsToAdd.push('UI update');
}
// Check changed files for automatic labeling
const { data: files } = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number
});
const hasRustFiles = files.some(file => file.filename.endsWith('.rs'));
const hasShellFiles = files.some(file => file.filename.endsWith('.sh'));
const hasMarkdownFiles = files.some(file => file.filename.endsWith('.md'));
if (hasRustFiles) {
labelsToAdd.push('rust');
}
if (hasShellFiles) {
labelsToAdd.push('script');
}
if (hasMarkdownFiles) {
labelsToAdd.push('documentation');
}
// Extract referenced issues and get their labels
const issueRegex = /(?:Fixes|Resolves|Closes):?\s*#(\d+)/gi;
const issueMatches = [...prBody.matchAll(issueRegex)];
const issueNumbers = [...new Set(issueMatches.map(match => parseInt(match[1])))];
for (const issueNumber of issueNumbers) {
try {
const issue = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
});
// Add labels from referenced issues that contain a colon
const issueLabels = issue.data.labels
.map(label => typeof label === 'string' ? label : label.name)
.filter(name => name.includes(':'));
labelsToAdd.push(...issueLabels);
} catch (error) {
console.log(`Could not fetch issue #${issueNumber}: ${error.message}`);
}
}
// Remove duplicates and add labels
const uniqueLabels = [...new Set(labelsToAdd)];
if (uniqueLabels.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels: uniqueLabels
});
}
-78
View File
@@ -1,78 +0,0 @@
name: LinUtil Preview
on:
workflow_dispatch:
inputs:
tag_name:
description: 'Tag name'
required: true
workflow_run:
workflows: ["LinUtil Release"]
types:
- completed
jobs:
generate_preview:
runs-on: ubuntu-latest
environment: linutil_env
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Get tag name ( Workflow Run )
id: latest_tag
uses: actions/github-script@v7
if: github.event_name == 'workflow_run'
with:
script: |
const releases = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 1
});
return releases.data[0].tag_name;
- name: Set tag name ( Workflow Run )
if: github.event_name == 'workflow_run'
run: echo "tag_name=${{ steps.latest_tag.outputs.result }}" >> $GITHUB_ENV
- name: Set tag name ( Workflow Dispatch )
if: github.event_name == 'workflow_dispatch'
run: echo "tag_name=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV
- name: Download binary
run: |
curl -LO "https://github.com/${{ github.repository }}/releases/download/${{ env.tag_name }}/linutil"
- name: Set env
run: |
chmod +x linutil
mkdir -p build
mv linutil build/linutil
echo "${{ github.workspace }}/build" >> $GITHUB_PATH
echo "branch_name=${{ env.tag_name }}" | tr . - >> $GITHUB_ENV
- name: Generate preview
uses: charmbracelet/vhs-action@v2.1.0
with:
path: ".github/preview.tape"
- name: Move preview
run: mv preview.gif .github/preview.gif
- name: Create PR
uses: peter-evans/create-pull-request@v7.0.5
with:
commit-message: Preview for ${{ env.tag_name }}
branch: preview-${{ env.branch_name }}
title: "Update preview for ${{ env.tag_name }}"
labels: |
documentation
body: |
Automated PR to update preview gif for version ${{ env.tag_name }}
![preview](https://raw.githubusercontent.com/${{ github.repository }}/preview-${{ env.branch_name }}/.github/preview.gif)
if: success()
+6 -3
View File
@@ -21,25 +21,28 @@ jobs:
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Cargo registry
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-registry-
- name: Cache Cargo index
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-index-
- name: Run cargo test
run: cargo test --no-fail-fast --package linutil_core
- name: Run cargo clippy
run: cargo clippy -- -Dwarnings
+2 -2
View File
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Run ShellCheck
uses: reviewdog/action-shellcheck@v1
@@ -30,4 +30,4 @@ jobs:
needs: shellcheck
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: actions/checkout@v7
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- run: git fetch origin ${{ github.base_ref }}
- name: Run spellcheck
+32
View File
@@ -1,5 +1,37 @@
/target
/build
/result
rust/target
rust/build
/build/linutil
# Hugo Files
docs/public/
docs/.hugo_build.lock
docs/resources/
# OS system files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
desktop.ini
# IDE and editor files
.vscode/
.opencode/
.idea/
*.iml
*.iws
*.ipr
.fleet/
.zed/
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*~
-39
View File
@@ -1,39 +0,0 @@
# OpenCode Agent Guidelines for LinUtil
## Build/Test/Lint Commands
- **Build**: `cargo build --release`
- **Test**: `cargo test`
- **Lint**: `cargo clippy -- -Dwarnings`
- **Format**: `cargo fmt --all` (fix) or `cargo fmt --all --check` (check)
- **Cross-compile**: `cross build --target=aarch64-unknown-linux-musl --release`
- **Shell Scripts**: `find core/tabs -name '*.sh' -exec shellcheck {} +`
## Code Style Guidelines
### Rust
- **Edition**: 2021 (workspace-level)
- **Imports**: Use `imports_granularity = "Crate"` per rustfmt.toml
- **Module Structure**: Use `mod modulename;` declarations at file top
- **Import Order**: std → external crates → local modules
- **Error Handling**: Use `Result<T>` for fallible operations
- **Naming**: snake_case (functions/vars), PascalCase (types/structs)
- **Dependencies**: Check existing Cargo.toml before adding crates
- **Workspace**: Multi-crate (tui, core, xtask) - respect boundaries
### Shell Scripts
- **Shell**: bash (#!/bin/bash)
- **Linting**: Use shellcheck for all .sh files
- **Location**: Organize in `core/tabs/` by category
- **Style**: Follow existing script patterns in codebase
## Project Structure
- `tui/`: Terminal UI crate (main binary)
- `core/`: Core library and shell scripts
- `xtask/`: Build and development tools
- Shell utilities in `core/tabs/` categorized by function
## MCP Integration
OpenCode uses MCP servers defined in `.opencode/mcp-config.json` for:
- Rust language support via rust-analyzer
- Bash scripting support via bash-language-server
- Linting via cargo clippy and shellcheck
-137
View File
@@ -1,137 +0,0 @@
{
"mcpServers": {
"rust-analyzer": {
"command": "rust-analyzer",
"args": [],
"cwd": "/home/titus/github/linutil",
"env": {
"RUST_LOG": "info"
}
},
"bash-language-server": {
"command": "bash-language-server",
"args": ["start"],
"cwd": "/home/titus/github/linutil",
"env": {}
},
"cargo-tools": {
"command": "cargo",
"args": ["--version"],
"cwd": "/home/titus/github/linutil",
"capabilities": {
"build": {
"command": "cargo",
"args": ["build", "--release"]
},
"test": {
"command": "cargo",
"args": ["test"]
},
"lint": {
"command": "cargo",
"args": ["clippy", "--", "-Dwarnings"]
},
"format": {
"command": "cargo",
"args": ["fmt", "--all"]
},
"format-check": {
"command": "cargo",
"args": ["fmt", "--all", "--check"]
},
"cross-compile-aarch64": {
"command": "cross",
"args": ["build", "--target=aarch64-unknown-linux-musl", "--release"]
}
}
},
"shellcheck": {
"command": "shellcheck",
"args": ["--version"],
"cwd": "/home/titus/github/linutil",
"capabilities": {
"check-script": {
"command": "shellcheck",
"args": ["-f", "gcc"]
}
}
}
},
"workspace": {
"type": "rust-cargo",
"root": "/home/titus/github/linutil",
"members": ["tui", "core", "xtask"],
"defaultMembers": ["tui", "core"],
"edition": "2021",
"profile": {
"release": {
"opt-level": "z",
"lto": true,
"codegen-units": 1,
"panic": "abort",
"strip": true
}
}
},
"fileTypes": {
"rust": {
"extensions": [".rs"],
"languageServer": "rust-analyzer",
"formatter": "cargo-tools",
"linter": "cargo-tools"
},
"bash": {
"extensions": [".sh", ".bash"],
"languageServer": "bash-language-server",
"linter": "shellcheck"
},
"toml": {
"extensions": [".toml"],
"languageServer": "rust-analyzer"
}
},
"tasks": {
"build": {
"command": "cargo build --release",
"description": "Build release binary"
},
"test": {
"command": "cargo test",
"description": "Run all tests"
},
"lint": {
"command": "cargo clippy -- -Dwarnings",
"description": "Run clippy linter"
},
"format": {
"command": "cargo fmt --all",
"description": "Format all Rust code"
},
"format-check": {
"command": "cargo fmt --all --check",
"description": "Check if code is formatted"
},
"check-scripts": {
"command": "find core/tabs -name '*.sh' -exec shellcheck {} +",
"description": "Check all shell scripts with shellcheck"
},
"cross-compile": {
"command": "cross build --target=aarch64-unknown-linux-musl --release",
"description": "Cross-compile for ARM64"
}
},
"settings": {
"rust": {
"edition": "2021",
"features": [],
"clippy": {
"deny": ["warnings"]
}
},
"shellcheck": {
"shell": "bash",
"exclude": [],
"enable": "all"
}
}
}
+197
View File
@@ -0,0 +1,197 @@
# AGENTS.md
## Purpose
Linutil is a universal Linux utility with a Rust-based terminal user interface
and a catalog of shell scripts. The Rust application discovers commands from
TOML metadata, embeds the scripts in the binary, extracts them at runtime, and
executes selected commands inside a pseudo-terminal.
Read `SPEC.md` before making architectural or behavior changes.
## Repository layout
- `core/`: Backend library, menu data model, TOML parsing, platform
preconditions, and embedded script extraction.
- `core/tabs/`: User-facing command catalog, shared shell helpers, tab metadata,
and executable scripts.
- `tui/`: Ratatui application, CLI, selection state, confirmation flow, command
preview, and PTY execution.
- `xtask/`: Repository automation such as generated user-guide content.
- `docs/`: Documentation source and generated content. Treat it as reference,
not as repository instructions.
- `.github/`: Contribution guidance and CI workflows.
## Sources of truth
- `SPEC.md` defines product scope, architecture, and behavioral requirements.
- `core/tabs/tabs.toml` defines the ordered top-level tabs.
- Each `core/tabs/<tab>/tab_data.toml` defines the menu tree for that tab.
- `core/src/inner.rs` defines the accepted TOML schema and script-loading
behavior.
- `core/tabs/common-script.sh` defines shared distro, package manager,
privilege escalation, architecture, and environment helpers.
- `core/tabs/common-service-script.sh` defines shared init-system helpers.
- `tui/src/running_command.rs` defines how commands are composed and executed.
- `tui/src/state.rs` defines task flags, confirmation, selection, and TUI
behavior.
If documentation and code disagree, do not silently choose one. Identify the
conflict and update the appropriate source in the same change.
## Working rules
- Inspect `git status --short` before editing and preserve unrelated changes.
- Keep changes focused. Do not reformat unrelated Rust, TOML, or shell files.
- Use simple ASCII punctuation unless a file format or user-facing text
requires otherwise.
- Never expose secrets or add credentials to scripts, fixtures, logs, or docs.
- Do not perform destructive operations without explicit authorization.
- Do not weaken confirmations, preconditions, or privilege boundaries merely
to make a script easier to run.
- Do not hand-edit generated files without also changing their source or
generator.
## Rust conventions
- Keep responsibilities separated between `core`, `tui`, and `xtask`.
- Put menu parsing, script discovery, and configuration behavior in `core`.
- Put rendering, input handling, confirmation, and process interaction in
`tui`.
- Avoid adding distro-specific policy to Rust when it belongs in tab metadata
or a shell script.
- Return or propagate useful errors when practical. Avoid new `unwrap`,
`expect`, or `panic` calls on user-controlled input.
- Add or update tests for parser, filtering, configuration, and command-model
changes.
- Format Rust with `cargo fmt`.
- Treat Clippy warnings as errors.
## Shell script conventions
- Prefer POSIX shell with `#!/bin/sh -e`.
- Use Bash only when the script requires Bash features, and declare
`#!/bin/bash` explicitly.
- A script is executed from its own parent directory after the embedded
`core/tabs/` tree is extracted. Keep relative imports valid from that
directory.
- Source shared helpers with the correct relative path:
```sh
. ../common-script.sh
```
Adjust the number of `..` components for nested directories.
- Use `common-script.sh` helpers instead of duplicating package manager,
architecture, escalation, command detection, or distro detection logic.
- Source `common-service-script.sh` when managing services across init systems.
- Call `checkEnv` before relying on values such as `PACKAGER`,
`ESCALATION_TOOL`, `ARCH`, or `DTYPE`.
- Quote variable expansions unless intentional word splitting is required.
- Use `printf` rather than `echo` for portable formatted output.
- Use `command_exists` for executable checks.
- Use `"$ESCALATION_TOOL"` only for operations that require elevated
privileges. Do not run the whole script as root by default.
- Make installation and configuration steps reasonably idempotent. Detect an
existing installation or state before changing it.
- Fail with a clear message when a required distro, package manager,
architecture, display server, init system, or command is unsupported.
- Do not download and execute unverified remote code when a package,
checksummed artifact, or pinned source is available.
- Clean up temporary files created by the script.
- Preserve interactive behavior because scripts run in a PTY.
## Adding or changing a utility
1. Place the script under the most appropriate `core/tabs/<tab>/` directory.
2. Reuse shared helpers and support all practical package managers already
handled by `common-script.sh`.
3. Add or update the matching entry in that tab's `tab_data.toml`.
4. Provide a clear `name`, useful `description`, one of `script`, `command`, or
`entries`, and accurate `task_list` flags.
5. Add `preconditions` when the entry only works on specific distros,
environments, filesystems, commands, display servers, or architectures.
6. Set `multi_select = false` for interactive, destructive, rebooting,
long-running, or state-dependent operations that should not be queued.
7. Run `cargo xtask docgen` when menu entries or descriptions change.
8. Validate the script and the Rust catalog loader.
The supported task flags are:
- `D`: disk modification
- `FI`: Flatpak installation
- `FM`: file modification
- `I`: privileged installation
- `K`: kernel modification
- `MP`: package manager action
- `RP`: package removal
- `SI`: full system installation
- `SS`: systemd or service action
- Prefixing a flag with `P` indicates privileged work.
Do not invent new task flags without updating the TUI guide and associated
documentation.
## TOML catalog rules
- Script paths are relative to the tab directory containing `tab_data.toml`.
- Every leaf entry must define exactly one executable form: `script` or
`command`.
- Every directory entry uses `entries`.
- Prefer scripts over long inline `command` values.
- Keep names stable when possible because config-file `auto_execute` resolves
commands by display name.
- Use preconditions to hide unsupported entries rather than letting users
discover incompatibility after execution.
- Parent `multi_select = false` applies to all descendants.
- Keep tab data consistently ordered. Use `sort-tomlfiles.sh` when the change
requires catalog sorting.
## Validation
Run the smallest relevant checks, then broaden them for cross-cutting changes.
For Rust changes:
```bash
cargo fmt --all --check
cargo test --no-fail-fast --package linutil_core
cargo clippy -- -Dwarnings
```
For shell changes:
```bash
shellcheck path/to/changed-script.sh
checkbashisms path/to/changed-script.sh
```
Use `checkbashisms` only for scripts intended to run under `/bin/sh`. If local
tools are unavailable, state which checks were skipped.
For catalog or documentation changes:
```bash
cargo test --no-fail-fast --package linutil_core
cargo xtask docgen
git diff --check
```
For TUI behavior, also run:
```bash
cargo run --package linutil_tui
```
Interactive validation must not execute destructive utilities merely to test
navigation. Use preview, descriptions, harmless entries, or focused tests.
## Completion criteria
- The change matches `SPEC.md`.
- Relevant tests and static checks pass.
- New scripts are reachable through valid tab metadata.
- Unsupported environments are filtered or fail clearly.
- User-visible behavior and generated documentation are updated together.
- The final report lists changed files, checks run, skipped checks, and any
remaining platform-specific risk.
Generated
+1908 -339
View File
@@ -3,14 +3,38 @@
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.3"
name = "adler2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
[[package]]
name = "aligned"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685"
dependencies = [
"as-slice",
]
[[package]]
name = "aligned-vec"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b"
dependencies = [
"equator",
]
[[package]]
name = "allocator-api2"
version = "0.2.21"
@@ -19,9 +43,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "anstream"
version = "0.6.18"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -34,43 +58,70 @@ dependencies = [
[[package]]
name = "anstyle"
version = "1.0.10"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
[[package]]
name = "anstyle-parse"
version = "0.2.6"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.2"
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
dependencies = [
"windows-sys 0.59.0",
"windows-sys 0.61.2",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.6"
version = "3.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [
"anstyle",
"windows-sys 0.59.0",
"once_cell_polyfill",
"windows-sys 0.61.2",
]
[[package]]
name = "anyhow"
version = "1.0.95"
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "approx"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
dependencies = [
"num-traits",
]
[[package]]
name = "arbitrary"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
[[package]]
name = "arg_enum_proc_macro"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "arrayvec"
@@ -79,10 +130,78 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "autocfg"
version = "1.4.0"
name = "as-slice"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516"
dependencies = [
"stable_deref_trait",
]
[[package]]
name = "autocfg"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "av-scenechange"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394"
dependencies = [
"aligned",
"anyhow",
"arg_enum_proc_macro",
"arrayvec",
"log",
"num-rational",
"num-traits",
"pastey",
"rayon",
"thiserror 2.0.18",
"v_frame",
"y4m",
]
[[package]]
name = "av1-grain"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8"
dependencies = [
"anyhow",
"arrayvec",
"log",
"nom",
"num-rational",
"v_frame",
]
[[package]]
name = "avif-serialize"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f"
dependencies = [
"arrayvec",
]
[[package]]
name = "base64-simd"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
dependencies = [
"outref",
"vsimd",
]
[[package]]
name = "bit_field"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6"
[[package]]
name = "bitflags"
@@ -92,15 +211,74 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.7.0"
version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be"
checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
[[package]]
name = "byteorder"
version = "1.5.0"
name = "bitstream-io"
version = "4.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757"
dependencies = [
"core2",
]
[[package]]
name = "bitvec"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
dependencies = [
"funty",
"radium",
"tap",
"wyz",
]
[[package]]
name = "built"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64"
[[package]]
name = "bumpalo"
version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]]
name = "by_address"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06"
[[package]]
name = "bytemuck"
version = "1.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
version = "1.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "byteorder-lite"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]]
name = "cassowary"
@@ -110,27 +288,36 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
[[package]]
name = "castaway"
version = "0.2.3"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5"
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
dependencies = [
"rustversion",
]
[[package]]
name = "cc"
version = "1.2.7"
version = "1.2.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7"
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
dependencies = [
"find-msvc-tools",
"jobserver",
"libc",
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "cfg_aliases"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]]
name = "cfg_aliases"
@@ -139,10 +326,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "clap"
version = "4.5.26"
name = "chacha20"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783"
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
dependencies = [
"cfg-if",
"cpufeatures",
"rand_core 0.10.1",
]
[[package]]
name = "clap"
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
dependencies = [
"clap_builder",
"clap_derive",
@@ -150,9 +348,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.26"
version = "4.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121"
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
dependencies = [
"anstream",
"anstyle",
@@ -162,9 +360,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.24"
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c"
checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
dependencies = [
"heck",
"proc-macro2",
@@ -174,15 +372,21 @@ dependencies = [
[[package]]
name = "clap_lex"
version = "0.7.4"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831"
[[package]]
name = "color_quant"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "colorchoice"
version = "1.0.3"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "compact_str"
@@ -199,16 +403,93 @@ dependencies = [
]
[[package]]
name = "crossterm"
version = "0.28.1"
name = "compact_str"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a"
dependencies = [
"bitflags 2.7.0",
"castaway",
"cfg-if",
"itoa",
"rustversion",
"ryu",
"static_assertions",
]
[[package]]
name = "convert_case"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "core2"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505"
dependencies = [
"memchr",
]
[[package]]
name = "cpufeatures"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crossterm"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
dependencies = [
"bitflags 2.13.0",
"crossterm_winapi",
"derive_more",
"document-features",
"mio",
"parking_lot",
"rustix",
"rustix 1.1.3",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -224,10 +505,16 @@ dependencies = [
]
[[package]]
name = "darling"
version = "0.20.10"
name = "crunchy"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
[[package]]
name = "darling"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
dependencies = [
"darling_core",
"darling_macro",
@@ -235,11 +522,10 @@ dependencies = [
[[package]]
name = "darling_core"
version = "0.20.10"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
@@ -249,9 +535,9 @@ dependencies = [
[[package]]
name = "darling_macro"
version = "0.20.10"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core",
"quote",
@@ -260,11 +546,39 @@ dependencies = [
[[package]]
name = "deranged"
version = "0.3.11"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
[[package]]
name = "derive_more"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
dependencies = [
"powerfmt",
"derive_more-impl",
]
[[package]]
name = "derive_more-impl"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
dependencies = [
"convert_case",
"proc-macro2",
"quote",
"rustc_version",
"syn",
]
[[package]]
name = "document-features"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
dependencies = [
"litrs",
]
[[package]]
@@ -275,66 +589,152 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
name = "ego-tree"
version = "0.9.0"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c6ba7d4eec39eaa9ab24d44a0e73a7949a1095a8b3f3abb11eddf27dbb56a53"
checksum = "b04dc5a38e4f151a79d9f2451ae6037fb6eaf5cba34771f44781f80e508498e3"
[[package]]
name = "either"
version = "1.13.0"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "env_home"
version = "0.1.0"
name = "equator"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe"
checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc"
dependencies = [
"equator-macro",
]
[[package]]
name = "equator-macro"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "equivalent"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
version = "0.3.10"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys 0.59.0",
"windows-sys 0.61.2",
]
[[package]]
name = "exr"
version = "1.74.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be"
dependencies = [
"bit_field",
"half",
"lebe",
"miniz_oxide",
"rayon-core",
"smallvec",
"zune-inflate",
]
[[package]]
name = "fast-srgb8"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1"
[[package]]
name = "fax"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab"
dependencies = [
"fax_derive",
]
[[package]]
name = "fax_derive"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "fdeflate"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
dependencies = [
"simd-adler32",
]
[[package]]
name = "filedescriptor"
version = "0.8.2"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e"
checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d"
dependencies = [
"libc",
"thiserror",
"thiserror 1.0.69",
"winapi",
]
[[package]]
name = "fnv"
version = "1.0.7"
name = "find-msvc-tools"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
[[package]]
name = "flate2"
version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
name = "foldhash"
version = "0.1.4"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "foldhash"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
[[package]]
name = "funty"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "getrandom"
version = "0.2.15"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
"cfg-if",
"libc",
@@ -342,14 +742,83 @@ dependencies = [
]
[[package]]
name = "hashbrown"
version = "0.15.2"
name = "getrandom"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
"r-efi 5.3.0",
"wasip2",
]
[[package]]
name = "getrandom"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
dependencies = [
"cfg-if",
"libc",
"r-efi 6.0.0",
"rand_core 0.10.1",
"wasip2",
"wasip3",
]
[[package]]
name = "gif"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e"
dependencies = [
"color_quant",
"weezl",
]
[[package]]
name = "half"
version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
dependencies = [
"cfg-if",
"crunchy",
"zerocopy",
]
[[package]]
name = "hashbrown"
version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
dependencies = [
"allocator-api2",
"equivalent",
"foldhash",
"foldhash 0.1.5",
]
[[package]]
name = "hashbrown"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
dependencies = [
"allocator-api2",
"equivalent",
"foldhash 0.2.0",
]
[[package]]
name = "hashbrown"
version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
dependencies = [
"allocator-api2",
"equivalent",
"foldhash 0.2.0",
]
[[package]]
@@ -358,12 +827,68 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "icy_sixel"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85518b9086bf01117761b90e7691c0ef3236fa8adfb1fb44dd248fe5f87215d5"
dependencies = [
"quantette",
"thiserror 2.0.18",
]
[[package]]
name = "id-arena"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "image"
version = "0.25.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
dependencies = [
"bytemuck",
"byteorder-lite",
"color_quant",
"exr",
"gif",
"image-webp",
"moxcms",
"num-traits",
"png",
"qoi",
"ravif",
"rayon",
"rgb",
"tiff",
"zune-core",
"zune-jpeg",
]
[[package]]
name = "image-webp"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"
dependencies = [
"byteorder-lite",
"quick-error",
]
[[package]]
name = "imgref"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8"
[[package]]
name = "include_dir"
version = "0.7.4"
@@ -385,25 +910,30 @@ dependencies = [
[[package]]
name = "indexmap"
version = "2.7.0"
version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
"hashbrown",
"hashbrown 0.16.1",
"serde",
"serde_core",
]
[[package]]
name = "indoc"
version = "2.0.5"
version = "2.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
dependencies = [
"rustversion",
]
[[package]]
name = "instability"
version = "0.3.6"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "894813a444908c0c8c0e221b041771d107c4a21de1d317dc49bcc66e3c9e5b3f"
checksum = "357b7205c6cd18dd2c86ed312d1e70add149aea98e7ef72b9fdf0270e555c11d"
dependencies = [
"darling",
"indoc",
@@ -413,19 +943,21 @@ dependencies = [
]
[[package]]
name = "ioctl-rs"
version = "0.1.6"
name = "interpolate_name"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d"
checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [
"libc",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
name = "itertools"
@@ -437,10 +969,40 @@ dependencies = [
]
[[package]]
name = "itoa"
version = "1.0.14"
name = "itertools"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
[[package]]
name = "jobserver"
version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
"getrandom 0.3.4",
"libc",
]
[[package]]
name = "kasuari"
version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b"
dependencies = [
"hashbrown 0.16.1",
"portable-atomic",
"thiserror 2.0.18",
]
[[package]]
name = "lazy_static"
@@ -449,14 +1011,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.169"
name = "leb128fmt"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]]
name = "lebe"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8"
[[package]]
name = "libc"
version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "libfuzzer-sys"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404"
dependencies = [
"arbitrary",
"cc",
]
[[package]]
name = "libm"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "line-clipping"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a"
dependencies = [
"bitflags 2.13.0",
]
[[package]]
name = "linutil_core"
version = "25.9.9"
version = "26.5.21"
dependencies = [
"ego-tree",
"include_dir",
@@ -468,15 +1067,17 @@ dependencies = [
[[package]]
name = "linutil_tui"
version = "25.9.9"
version = "26.5.21"
dependencies = [
"clap",
"image",
"linutil_core",
"nix 0.29.0",
"nix 0.31.3",
"oneshot",
"portable-pty",
"rand",
"ratatui",
"rand 0.10.1",
"ratatui 0.30.2",
"ratatui-image",
"time",
"tree-sitter-bash",
"tree-sitter-highlight",
@@ -492,20 +1093,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "lock_api"
version = "0.4.12"
name = "linux-raw-sys"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "litrs"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
[[package]]
name = "lock_api"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.22"
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "loop9"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062"
dependencies = [
"imgref",
]
[[package]]
name = "lru"
@@ -513,67 +1134,167 @@ version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
dependencies = [
"hashbrown",
"hashbrown 0.15.5",
]
[[package]]
name = "lru"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
dependencies = [
"hashbrown 0.17.1",
]
[[package]]
name = "maybe-rayon"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519"
dependencies = [
"cfg-if",
"rayon",
]
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "memoffset"
version = "0.6.5"
name = "miniz_oxide"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"autocfg",
"adler2",
"simd-adler32",
]
[[package]]
name = "mio"
version = "1.0.3"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
dependencies = [
"libc",
"log",
"wasi",
"windows-sys 0.52.0",
"windows-sys 0.61.2",
]
[[package]]
name = "moxcms"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
dependencies = [
"num-traits",
"pxfm",
]
[[package]]
name = "new_debug_unreachable"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]]
name = "nix"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
dependencies = [
"bitflags 2.13.0",
"cfg-if",
"cfg_aliases 0.1.1",
"libc",
]
[[package]]
name = "nix"
version = "0.25.1"
version = "0.31.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4"
checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"
dependencies = [
"autocfg",
"bitflags 1.3.2",
"bitflags 2.13.0",
"cfg-if",
"cfg_aliases 0.2.1",
"libc",
"memoffset",
"pin-utils",
]
[[package]]
name = "nix"
version = "0.29.0"
name = "nom"
version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
dependencies = [
"bitflags 2.7.0",
"cfg-if",
"cfg_aliases",
"libc",
"memchr",
]
[[package]]
name = "noop_proc_macro"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
[[package]]
name = "num-bigint"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
"num-integer",
"num-traits",
]
[[package]]
name = "num-conv"
version = "0.1.0"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
[[package]]
name = "num-derive"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "num-integer"
version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
dependencies = [
"num-bigint",
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
"libm",
]
[[package]]
name = "num_threads"
@@ -585,16 +1306,68 @@ dependencies = [
]
[[package]]
name = "oneshot"
version = "0.1.8"
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "once_cell_polyfill"
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "oneshot"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfe21416a02c693fb9f980befcb230ecc70b0b3d1cc4abf88b9675c4c1457f0c"
[[package]]
name = "ordered-float"
version = "5.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d"
dependencies = [
"num-traits",
]
[[package]]
name = "outref"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
[[package]]
name = "palette"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6"
dependencies = [
"approx",
"bytemuck",
"fast-srgb8",
"libm",
"palette_derive",
]
[[package]]
name = "palette_derive"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30"
dependencies = [
"by_address",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -602,15 +1375,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-targets",
"windows-link",
]
[[package]]
@@ -620,16 +1393,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pin-utils"
version = "0.1.0"
name = "pastey"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec"
[[package]]
name = "png"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
dependencies = [
"bitflags 2.13.0",
"crc32fast",
"fdeflate",
"flate2",
"miniz_oxide",
]
[[package]]
name = "portable-atomic"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
[[package]]
name = "portable-pty"
version = "0.8.1"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "806ee80c2a03dbe1a9fb9534f8d19e4c0546b790cde8fd1fea9d6390644cb0be"
checksum = "b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e"
dependencies = [
"anyhow",
"bitflags 1.3.2",
@@ -638,8 +1430,8 @@ dependencies = [
"lazy_static",
"libc",
"log",
"nix 0.25.1",
"serial",
"nix 0.28.0",
"serial2",
"shared_library",
"shell-words",
"winapi",
@@ -654,40 +1446,152 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
version = "0.2.20"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
"zerocopy",
]
[[package]]
name = "proc-macro2"
version = "1.0.92"
name = "prettyplease"
version = "0.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
"syn",
]
[[package]]
name = "proc-macro2"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.38"
name = "profiling"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773"
dependencies = [
"profiling-procmacros",
]
[[package]]
name = "profiling-procmacros"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"
dependencies = [
"quote",
"syn",
]
[[package]]
name = "pxfm"
version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8"
dependencies = [
"num-traits",
]
[[package]]
name = "qoi"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
dependencies = [
"bytemuck",
]
[[package]]
name = "quantette"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c98fecda8b16396ff9adac67644a523dd1778c42b58606a29df5c31ca925d174"
dependencies = [
"bitvec",
"bytemuck",
"image",
"libm",
"num-traits",
"ordered-float",
"palette",
"rand 0.9.4",
"rand_xoshiro",
"rayon",
"ref-cast",
"wide",
]
[[package]]
name = "quick-error"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]]
name = "quote"
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.5"
name = "r-efi"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "r-efi"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "radium"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]]
name = "rand"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.5",
]
[[package]]
name = "rand"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
dependencies = [
"chacha20",
"getrandom 0.4.2",
"rand_core 0.10.1",
]
[[package]]
@@ -697,7 +1601,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
"rand_core 0.6.4",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.5",
]
[[package]]
@@ -706,7 +1620,31 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
"getrandom 0.2.17",
]
[[package]]
name = "rand_core"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
dependencies = [
"getrandom 0.3.4",
]
[[package]]
name = "rand_core"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
[[package]]
name = "rand_xoshiro"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41"
dependencies = [
"rand_core 0.9.5",
]
[[package]]
@@ -715,35 +1653,207 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
dependencies = [
"bitflags 2.7.0",
"bitflags 2.13.0",
"cassowary",
"compact_str",
"crossterm",
"compact_str 0.8.1",
"indoc",
"instability",
"itertools",
"lru",
"itertools 0.13.0",
"lru 0.12.5",
"paste",
"strum",
"strum 0.26.3",
"unicode-segmentation",
"unicode-truncate",
"unicode-truncate 1.1.0",
"unicode-width 0.2.0",
]
[[package]]
name = "redox_syscall"
version = "0.5.8"
name = "ratatui"
version = "0.30.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d"
dependencies = [
"bitflags 2.7.0",
"instability",
"ratatui-core",
"ratatui-crossterm",
"ratatui-widgets",
"serde",
]
[[package]]
name = "ratatui-core"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c"
dependencies = [
"bitflags 2.13.0",
"compact_str 0.9.0",
"hashbrown 0.17.1",
"itertools 0.14.0",
"kasuari",
"lru 0.18.0",
"palette",
"serde",
"strum 0.28.0",
"thiserror 2.0.18",
"unicode-segmentation",
"unicode-truncate 2.0.1",
"unicode-width 0.2.0",
]
[[package]]
name = "ratatui-crossterm"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0"
dependencies = [
"cfg-if",
"crossterm",
"instability",
"ratatui-core",
]
[[package]]
name = "ratatui-image"
version = "11.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d413732e0e2f49577b59f35fa4ba9d5c4c0649fffe9541d9b43da10094058591"
dependencies = [
"base64-simd",
"icy_sixel",
"image",
"rand 0.8.6",
"ratatui 0.30.2",
"rustix 0.38.44",
"self_cell",
"thiserror 1.0.69",
"windows",
]
[[package]]
name = "ratatui-widgets"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1"
dependencies = [
"bitflags 2.13.0",
"hashbrown 0.17.1",
"indoc",
"instability",
"itertools 0.14.0",
"line-clipping",
"ratatui-core",
"serde",
"strum 0.28.0",
"time",
"unicode-segmentation",
"unicode-width 0.2.0",
]
[[package]]
name = "rav1e"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b"
dependencies = [
"aligned-vec",
"arbitrary",
"arg_enum_proc_macro",
"arrayvec",
"av-scenechange",
"av1-grain",
"bitstream-io",
"built",
"cfg-if",
"interpolate_name",
"itertools 0.14.0",
"libc",
"libfuzzer-sys",
"log",
"maybe-rayon",
"new_debug_unreachable",
"noop_proc_macro",
"num-derive",
"num-traits",
"paste",
"profiling",
"rand 0.9.4",
"rand_chacha 0.9.0",
"simd_helpers",
"thiserror 2.0.18",
"v_frame",
"wasm-bindgen",
]
[[package]]
name = "ravif"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45"
dependencies = [
"avif-serialize",
"imgref",
"loop9",
"quick-error",
"rav1e",
"rayon",
"rgb",
]
[[package]]
name = "rayon"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]]
name = "redox_syscall"
version = "0.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
dependencies = [
"bitflags 2.13.0",
]
[[package]]
name = "ref-cast"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
dependencies = [
"ref-cast-impl",
]
[[package]]
name = "ref-cast-impl"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "regex"
version = "1.11.1"
version = "1.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
dependencies = [
"aho-corasick",
"memchr",
@@ -753,9 +1863,9 @@ dependencies = [
[[package]]
name = "regex-automata"
version = "0.4.9"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
dependencies = [
"aho-corasick",
"memchr",
@@ -764,34 +1874,71 @@ dependencies = [
[[package]]
name = "regex-syntax"
version = "0.8.5"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "rgb"
version = "0.8.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
[[package]]
name = "rustc_version"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
dependencies = [
"semver",
]
[[package]]
name = "rustix"
version = "0.38.43"
version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6"
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [
"bitflags 2.7.0",
"bitflags 2.13.0",
"errno",
"libc",
"linux-raw-sys",
"linux-raw-sys 0.4.15",
"windows-sys 0.59.0",
]
[[package]]
name = "rustversion"
version = "1.0.19"
name = "rustix"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
dependencies = [
"bitflags 2.13.0",
"errno",
"libc",
"linux-raw-sys 0.11.0",
"windows-sys 0.61.2",
]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
version = "1.0.18"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
[[package]]
name = "safe_arch"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "629516c85c29fe757770fa03f2074cf1eac43d44c02a3de9fc2ef7b0e207dfdd"
dependencies = [
"bytemuck",
]
[[package]]
name = "scopeguard"
@@ -800,19 +1947,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
version = "1.0.217"
name = "self_cell"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89"
[[package]]
name = "semver"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.217"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
@@ -820,54 +1989,37 @@ dependencies = [
]
[[package]]
name = "serde_spanned"
version = "0.6.8"
name = "serde_json"
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
"indexmap",
"itoa",
"memchr",
"serde",
"serde_core",
"zmij",
]
[[package]]
name = "serial"
version = "0.4.0"
name = "serde_spanned"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86"
checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
dependencies = [
"serial-core",
"serial-unix",
"serial-windows",
"serde_core",
]
[[package]]
name = "serial-core"
version = "0.4.0"
name = "serial2"
version = "0.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581"
checksum = "8cc76fa68e25e771492ca1e3c53d447ef0be3093e05cd3b47f4b712ba10c6f3c"
dependencies = [
"cfg-if",
"libc",
]
[[package]]
name = "serial-unix"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7"
dependencies = [
"ioctl-rs",
"libc",
"serial-core",
"termios",
]
[[package]]
name = "serial-windows"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162"
dependencies = [
"libc",
"serial-core",
"winapi",
]
[[package]]
@@ -882,9 +2034,9 @@ dependencies = [
[[package]]
name = "shell-words"
version = "1.1.0"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77"
[[package]]
name = "shlex"
@@ -894,9 +2046,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook"
version = "0.3.17"
version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
dependencies = [
"libc",
"signal-hook-registry",
@@ -904,9 +2056,9 @@ dependencies = [
[[package]]
name = "signal-hook-mio"
version = "0.2.4"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
dependencies = [
"libc",
"mio",
@@ -915,18 +2067,40 @@ dependencies = [
[[package]]
name = "signal-hook-registry"
version = "1.4.2"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
"errno",
"libc",
]
[[package]]
name = "smallvec"
version = "1.13.2"
name = "simd-adler32"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
[[package]]
name = "simd_helpers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6"
dependencies = [
"quote",
]
[[package]]
name = "smallvec"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "static_assertions"
@@ -952,7 +2126,16 @@ version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
dependencies = [
"strum_macros",
"strum_macros 0.26.4",
]
[[package]]
name = "strum"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd"
dependencies = [
"strum_macros 0.28.0",
]
[[package]]
@@ -969,10 +2152,22 @@ dependencies = [
]
[[package]]
name = "syn"
version = "2.0.96"
name = "strum_macros"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "syn"
version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
"proc-macro2",
"quote",
@@ -980,19 +2175,16 @@ dependencies = [
]
[[package]]
name = "temp-dir"
version = "0.1.14"
name = "tap"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc1ee6eef34f12f765cb94725905c6312b6610ab2b0940889cfe58dae7bc3c72"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "termios"
version = "0.2.2"
name = "temp-dir"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a"
dependencies = [
"libc",
]
checksum = "016ef9739649996fcc983b9c588fe3d557cf216d4d98503ce1b057ab5a66d689"
[[package]]
name = "thiserror"
@@ -1000,7 +2192,16 @@ version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
"thiserror-impl",
"thiserror-impl 1.0.69",
]
[[package]]
name = "thiserror"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
"thiserror-impl 2.0.18",
]
[[package]]
@@ -1015,33 +2216,57 @@ dependencies = [
]
[[package]]
name = "time"
version = "0.3.37"
name = "thiserror-impl"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tiff"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52"
dependencies = [
"fax",
"flate2",
"half",
"quick-error",
"weezl",
"zune-jpeg",
]
[[package]]
name = "time"
version = "0.3.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327"
dependencies = [
"deranged",
"itoa",
"libc",
"num-conv",
"num_threads",
"powerfmt",
"serde",
"serde_core",
"time-core",
"time-macros",
]
[[package]]
name = "time-core"
version = "0.1.2"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
[[package]]
name = "time-macros"
version = "0.2.19"
version = "0.2.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935"
dependencies = [
"num-conv",
"time-core",
@@ -1049,56 +2274,62 @@ dependencies = [
[[package]]
name = "toml"
version = "0.8.19"
version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit",
]
[[package]]
name = "toml_datetime"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.22.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee"
dependencies = [
"indexmap",
"serde",
"serde_core",
"serde_spanned",
"toml_datetime",
"toml_parser",
"toml_writer",
"winnow",
]
[[package]]
name = "tree-sitter"
version = "0.24.6"
name = "toml_datetime"
version = "1.1.1+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f2434c86ba59ed15af56039cc5bf1acf8ba76ce301e32ef08827388ef285ec5"
checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
dependencies = [
"serde_core",
]
[[package]]
name = "toml_parser"
version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
dependencies = [
"winnow",
]
[[package]]
name = "toml_writer"
version = "1.1.1+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
[[package]]
name = "tree-sitter"
version = "0.26.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dab76d0b724ba557954125188cf0633a1ca43199ced82d95c7b9c32cc3de1f3"
dependencies = [
"cc",
"regex",
"regex-syntax",
"serde_json",
"streaming-iterator",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-bash"
version = "0.23.3"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "329a4d48623ac337d42b1df84e81a1c9dbb2946907c102ca72db158c1964a52e"
checksum = "9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062"
dependencies = [
"cc",
"tree-sitter-language",
@@ -1106,37 +2337,37 @@ dependencies = [
[[package]]
name = "tree-sitter-highlight"
version = "0.24.6"
version = "0.26.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1df627d3607f08557788a3c85b85042d8ccd5155eb119afff5f0c7b67a40924"
checksum = "f4fbfa3f35520ff730da507e2c9a526a98156f417e0008c73de873741d7e4ecc"
dependencies = [
"lazy_static",
"regex",
"streaming-iterator",
"thiserror",
"thiserror 2.0.18",
"tree-sitter",
]
[[package]]
name = "tree-sitter-language"
version = "0.1.3"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c199356c799a8945965bb5f2c55b2ad9d9aa7c4b4f6e587fe9dea0bc715e5f9c"
checksum = "4ae62f7eae5eb549c71b76658648b72cc6111f2d87d24a1e31fa907f4943e3ce"
[[package]]
name = "tui-term"
version = "0.2.0"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72af159125ce32b02ceaced6cffae6394b0e6b6dfd4dc164a6c59a2db9b3c0b0"
checksum = "a338ded85dbe7f9ea2298321d126244f54e531e2b2006b97abdab8e47d6f3c88"
dependencies = [
"ratatui",
"ratatui-core",
"ratatui-widgets",
]
[[package]]
name = "unicode-ident"
version = "1.0.14"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unicode-segmentation"
@@ -1150,11 +2381,22 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf"
dependencies = [
"itertools",
"itertools 0.13.0",
"unicode-segmentation",
"unicode-width 0.1.14",
]
[[package]]
name = "unicode-truncate"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5"
dependencies = [
"itertools 0.14.0",
"unicode-segmentation",
"unicode-width 0.2.0",
]
[[package]]
name = "unicode-width"
version = "0.1.14"
@@ -1167,6 +2409,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
[[package]]
name = "unicode-xid"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -1174,14 +2422,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "vt100-ctt"
version = "0.16.0"
name = "v_frame"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "298aca8af9c2d1395da31a65eb711abef2dc948e475e819212c8ed5008d52c9f"
checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2"
dependencies = [
"aligned-vec",
"num-traits",
"wasm-bindgen",
]
[[package]]
name = "vsimd"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
[[package]]
name = "vt100-ctt"
version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e0333bcaa031b50f85eac76cb9d62a400be0915ac2d60c3cce28656c01e7e58"
dependencies = [
"itoa",
"log",
"ratatui",
"ratatui 0.29.0",
"ratatui-core",
"tui-term",
"unicode-width 0.2.0",
"vte",
@@ -1210,20 +2476,130 @@ dependencies = [
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasip2"
version = "1.0.2+wasi-0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
dependencies = [
"wit-bindgen",
]
[[package]]
name = "wasip3"
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
dependencies = [
"wit-bindgen",
]
[[package]]
name = "wasm-bindgen"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
dependencies = [
"unicode-ident",
]
[[package]]
name = "wasm-encoder"
version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
dependencies = [
"leb128fmt",
"wasmparser",
]
[[package]]
name = "wasm-metadata"
version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
dependencies = [
"anyhow",
"indexmap",
"wasm-encoder",
"wasmparser",
]
[[package]]
name = "wasmparser"
version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
dependencies = [
"bitflags 2.13.0",
"hashbrown 0.15.5",
"indexmap",
"semver",
]
[[package]]
name = "weezl"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
[[package]]
name = "which"
version = "7.0.1"
version = "8.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb4a9e33648339dc1642b0e36e21b3385e6148e289226f657c809dee59df5028"
checksum = "c789537cf2f7f55be8e6192f92e464174ee55f91af622777f7f1ceb0dbccd03e"
dependencies = [
"either",
"env_home",
"rustix",
"winsafe",
"libc",
]
[[package]]
name = "wide"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13ca908d26e4786149c48efcf6c0ea09ab0e06d1fe3c17dc1b4b0f1ca4a7e788"
dependencies = [
"bytemuck",
"safe_arch",
]
[[package]]
@@ -1249,11 +2625,72 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.52.0"
name = "windows"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
dependencies = [
"windows-core",
"windows-targets",
]
[[package]]
name = "windows-core"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
dependencies = [
"windows-implement",
"windows-interface",
"windows-result",
"windows-strings",
"windows-targets",
]
[[package]]
name = "windows-implement"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-interface"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-result"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-strings"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
dependencies = [
"windows-result",
"windows-targets",
]
@@ -1266,6 +2703,15 @@ dependencies = [
"windows-targets",
]
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-targets"
version = "0.52.6"
@@ -1332,12 +2778,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.6.22"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980"
dependencies = [
"memchr",
]
checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
[[package]]
name = "winreg"
@@ -1349,35 +2792,161 @@ dependencies = [
]
[[package]]
name = "winsafe"
version = "0.0.19"
name = "wit-bindgen"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
dependencies = [
"wit-bindgen-rust-macro",
]
[[package]]
name = "wit-bindgen-core"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
dependencies = [
"anyhow",
"heck",
"wit-parser",
]
[[package]]
name = "wit-bindgen-rust"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
dependencies = [
"anyhow",
"heck",
"indexmap",
"prettyplease",
"syn",
"wasm-metadata",
"wit-bindgen-core",
"wit-component",
]
[[package]]
name = "wit-bindgen-rust-macro"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
dependencies = [
"anyhow",
"prettyplease",
"proc-macro2",
"quote",
"syn",
"wit-bindgen-core",
"wit-bindgen-rust",
]
[[package]]
name = "wit-component"
version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
dependencies = [
"anyhow",
"bitflags 2.13.0",
"indexmap",
"log",
"serde",
"serde_derive",
"serde_json",
"wasm-encoder",
"wasm-metadata",
"wasmparser",
"wit-parser",
]
[[package]]
name = "wit-parser"
version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
dependencies = [
"anyhow",
"id-arena",
"indexmap",
"log",
"semver",
"serde",
"serde_derive",
"serde_json",
"unicode-xid",
"wasmparser",
]
[[package]]
name = "wyz"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
dependencies = [
"tap",
]
[[package]]
name = "xtask"
version = "25.9.9"
version = "26.5.21"
dependencies = [
"linutil_core",
]
[[package]]
name = "zerocopy"
version = "0.7.35"
name = "y4m"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448"
[[package]]
name = "zerocopy"
version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdea86ddd5568519879b8187e1cf04e24fce28f7fe046ceecbce472ff19a2572"
dependencies = [
"byteorder",
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.7.35"
version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
checksum = "0c15e1b46eff7c6c91195752e0eeed8ef040e391cdece7c25376957d5f15df22"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "zmij"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7"
[[package]]
name = "zune-core"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9"
[[package]]
name = "zune-inflate"
version = "0.2.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
dependencies = [
"simd-adler32",
]
[[package]]
name = "zune-jpeg"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2"
dependencies = [
"zune-core",
]
+5 -5
View File
@@ -1,12 +1,12 @@
[workspace.package]
license = "MIT"
version = "25.9.9"
edition = "2021"
[workspace]
members = ["tui", "core", "xtask"]
members = ["core", "tui", "xtask"]
default-members = ["tui", "core"]
resolver = "2"
[workspace.package]
license = "MIT"
version = "26.5.21"
edition = "2021"
[profile.release]
opt-level = "z"
+5 -4
View File
@@ -5,6 +5,7 @@
[![Crates.io Version](https://img.shields.io/crates/v/linutil_tui?style=for-the-badge&color=%23af3a03)](https://crates.io/crates/linutil_tui)
[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
![Preview](/.github/preview.gif)
<p align="center"><i>The above preview was generated with the help of <a href="https://github.com/charmbracelet/vhs">vhs</a>, give them a :star:!</i></p>
**Linutil** is a distro-agnostic toolbox designed to simplify everyday Linux tasks. It helps you set up applications and optimize your system for specific use cases. The utility is actively developed in Rust 🦀, providing performance and reliability.
@@ -125,14 +126,12 @@ If you find Linutil helpful, please consider giving it a ⭐️ to show your sup
## 🎓 Documentation
For comprehensive information on how to use Linutil, visit the [Linutil Official Documentation](https://chris-titus-docs.github.io/linutil-docs/).
For comprehensive information on how to use Linutil, visit the [Linutil Official Documentation](https://linutil.christitus.com/).
## 🛠 Contributing
We welcome contributions from the community! Before you start, please review our [Contributing Guidelines](.github/CONTRIBUTING.md) to understand how to make the most effective and efficient contributions.
[Official LinUtil Roadmap](https://chris-titus-docs.github.io/linutil-docs/roadmap/)
Docs are now [here](https://github.com/Chris-Titus-Docs/linutil-docs)
## 🏅 Thanks to All Contributors
@@ -145,7 +144,9 @@ Thank you to everyone who has contributed to the development of Linutil. Your ef
- 2024/07 - Original Linutil Rust TUI was developed by [@JustLinuxUser](https://github.com/JustLinuxUser).
- 2024/09 - TabList (Left Column) and various Rust Core/TUI Improvements developed by [@lj3954](https://github.com/lj3954)
- 2024/09 - Cargo Publish, AUR, Rust, and Bash additions done by [@adamperkowski](https://github.com/adamperkowski)
- 2024/09 - Cargo Publish, AUR, Rust, and Bash additions done by [@koibtw](https://github.com/koibtw)
- 2024/09 - Rust TUI Min/Max, MultiSelection, and Bash additions done by [@jeevithakannan2](https://github.com/jeevithakannan2)
- 2024/09 - Various bash updates and standardization done by [@nnyyxxxx](https://github.com/nnyyxxxx)
- 2024/09 - Multiple bash script additions done by [@guruswarupa](https://github.com/guruswarupa)
- 2026/01 - TUI Refresh with Logo by [@Abs313a](https://github.com/Abs313a)
- 2026/03 - Linutil docs website creation by [@seanh1995](https://github.com/seanh1995)
+384
View File
@@ -0,0 +1,384 @@
# Linutil Technical Specification
## 1. Product definition
Linutil is a terminal-based Linux utility that provides a searchable,
organized catalog of system setup, application installation, gaming, security,
and maintenance tasks.
The product consists of:
- A Rust TUI that presents commands, previews their contents, confirms
execution, and displays live terminal output.
- A Rust core library that loads command metadata, filters unsupported entries,
and embeds the complete script catalog in the application binary.
- Portable shell scripts that implement the operating-system changes.
- Shared shell libraries that centralize Linux distribution, package manager,
privilege escalation, architecture, and service-manager behavior.
"Universal" means the architecture supports multiple Linux distributions,
package managers, architectures, init systems, and desktop environments. It
does not mean every command must work on every Linux system. Unsupported
commands must be hidden by metadata or fail early with a useful explanation.
## 2. Goals
Linutil must:
1. Provide one discoverable TUI for common Linux administration and setup
tasks.
2. Ship as a self-contained binary with its command catalog and scripts
embedded at compile time.
3. Support distro-independent workflows where practical and explicit
distro-specific workflows where required.
4. Give users a preview and confirmation boundary before system-changing
commands run.
5. Preserve interactive terminal behavior for prompts, colors, progress, and
full-screen command-line tools.
6. Reuse shared shell behavior instead of duplicating package-manager and
privilege logic across scripts.
7. Make new utilities primarily data-and-script additions rather than Rust UI
changes.
8. Clearly communicate privileged, destructive, package-management, service,
kernel, disk, and file operations.
## 3. Non-goals
Linutil is not:
- A replacement for a distribution's package manager.
- A general-purpose shell or arbitrary command launcher.
- A daemon or background configuration-management system.
- A guarantee that every utility supports every Linux distribution.
- A mechanism for silently bypassing package signatures, privilege controls,
user confirmation, or platform compatibility checks.
- A substitute for backups before disk, bootloader, kernel, account, or
destructive filesystem operations.
## 4. System architecture
### 4.1 Workspace
The Cargo workspace contains:
| Component | Responsibility |
| --- | --- |
| `core` | Data model, TOML loading, precondition evaluation, embedded assets, temporary extraction, and user config |
| `tui` | CLI, rendering, navigation, search, preview, confirmation, selection, PTY execution, and output display |
| `xtask` | Repository maintenance and generated documentation |
| `core/tabs` | Tab definitions, utility metadata, shared shell libraries, and executable scripts |
### 4.2 Runtime flow
1. `linutil_core` embeds `core/tabs/` into the binary at compile time.
2. On startup, the embedded tree is extracted to a temporary directory.
3. `tabs.toml` determines the ordered list of tab directories.
4. Each tab's `tab_data.toml` is parsed into a tree of `ListNode` values.
5. Preconditions are evaluated against the current machine when validation is
enabled.
6. Unsupported leaves and empty parent categories are removed.
7. The TUI displays the resulting tabs and command tree.
8. The user may inspect descriptions and source previews before selection.
9. Selected commands pass through the confirmation flow.
10. The TUI composes the commands into a shell program and runs it in a PTY.
11. Output is rendered live until the process succeeds, fails, or is
interrupted.
12. The temporary script tree remains alive for the lifetime of the tab list
and is removed when it is dropped.
### 4.3 Data model
The core command model has three forms:
- `Command::Raw(String)`: A short inline shell command.
- `Command::LocalFile`: An extracted script, its shebang-derived executable,
and executable arguments.
- `Command::None`: A non-executable directory node.
A `Tab` owns a tree of `ListNode` values. Each node contains:
- Display name.
- User-facing description.
- Command form.
- Task flag string.
- Multi-select eligibility.
Display names should be unique among executable leaves because config-file
automation resolves entries by name.
## 5. Command catalog
### 5.1 Top-level tabs
`core/tabs/tabs.toml` contains an ordered `directories` array. Every listed
directory must contain a valid `tab_data.toml`.
Adding a top-level tab requires:
1. A new directory under `core/tabs/`.
2. A valid `tab_data.toml`.
3. An entry in `core/tabs/tabs.toml`.
4. At least one supported executable leaf at runtime.
### 5.2 Tab schema
Each tab data file contains:
```toml
name = "Tab Display Name"
[[data]]
name = "Category or Command"
```
An entry must define exactly one of:
- `entries`: Nested child entries.
- `script`: A script path relative to the tab directory.
- `command`: An inline shell command.
Optional entry fields are:
- `description`: User-facing explanation.
- `preconditions`: Conditions controlling visibility.
- `task_list`: Space-separated task flags shown in the TUI.
- `multi_select`: Whether the entry may participate in a queued command set.
The default is `true`.
Script paths may reference shared scripts elsewhere under `core/tabs/`, but
the resolved path must exist when the catalog is loaded.
### 5.3 Preconditions
All preconditions on an entry must pass for it to remain visible.
Supported data sources are:
| Type | Behavior |
| --- | --- |
| `environment` | Compare an environment variable with the provided values |
| `containing_file` | Check a file's contents for all provided strings |
| `command_exists` | Check all provided commands on `PATH` |
| `file_exists` | Check all provided paths as files |
`matches = true` requires a match. `matches = false` requires the inverse.
Preconditions should be used for objective platform capabilities such as a
package manager, distro marker, display-server session, required executable,
or required file. They are visibility filters, not a replacement for runtime
validation inside scripts.
### 5.4 Task flags
Task flags warn users about the important effects of a command:
| Flag | Meaning |
| --- | --- |
| `D` | Disk modification |
| `FI` | Flatpak installation |
| `FM` | File modification |
| `I` | Privileged installation |
| `K` | Kernel modification |
| `MP` | Package manager action |
| `RP` | Package removal |
| `SI` | Full system installation |
| `SS` | Service or systemd action |
| `P*` | The marked action requires privileges |
Flags are informational and do not grant privileges or replace confirmation.
## 6. Script contract
### 6.1 Interpreter
Scripts should use POSIX shell and `#!/bin/sh -e` by default. Scripts requiring
Bash syntax must declare Bash explicitly.
If no shebang is present, the core defaults to `/bin/sh -e`. When executable
validation is enabled, a script with an unavailable or non-executable shebang
interpreter is omitted.
### 6.2 Working directory and shared files
Before a local script runs, the TUI changes to the script's extracted parent
directory. Relative imports and sibling assets must be written for that
working directory.
General-purpose scripts should source `common-script.sh`. Scripts that manage
services should also source `common-service-script.sh`. More specialized
families may define an additional shared helper when it removes meaningful
duplication.
### 6.3 Environment initialization
Scripts using the general shared environment must call `checkEnv` before
depending on its results.
The shared environment is responsible for detecting or defining:
- CPU architecture.
- Supported privilege escalation tool.
- Required baseline commands.
- Supported package manager.
- Current Linux distribution identifier.
- Superuser group access.
- Current-directory writability.
- Arch User Repository helper where relevant.
Scripts must still validate feature-specific requirements and unsupported
states.
### 6.4 Distribution portability
For a generally available utility:
- Use the detected `PACKAGER`.
- Handle appropriate package names and flags per package manager.
- Prefer native distribution packages.
- Use Flatpak or another portable method as an intentional fallback, not an
accidental catch-all when the platform is unknown.
- Report unsupported distributions or architectures before making changes.
For a distro-specific utility:
- Place it in a clearly named distro category.
- Add metadata preconditions.
- Recheck critical assumptions in the script before changing the system.
### 6.5 Privilege and safety
Scripts must:
- Run unprivileged by default.
- Apply `ESCALATION_TOOL` only to commands that require elevated access.
- Explain destructive or irreversible choices before execution.
- Avoid overwriting user configuration without a backup, merge, or explicit
prompt.
- Check existing state so repeated execution is safe when practical.
- Stop on unsupported or ambiguous conditions.
- Avoid embedding credentials or collecting user secrets.
- Avoid logging sensitive input.
- Clean temporary files and partial downloads.
- Verify downloaded artifacts when upstream checksums or signatures exist.
Disk, bootloader, kernel, account-removal, and broad cleanup utilities should
set `multi_select = false`.
### 6.6 User interaction
Scripts run in a PTY and may prompt users. Prompts must:
- State the action and meaningful consequences.
- Accept predictable input.
- Provide a safe default for risky operations.
- Remain usable in the TUI's terminal viewport.
- Exit nonzero on failure or cancellation when no work was completed.
## 7. TUI requirements
The TUI must provide:
- Tab and hierarchical command navigation.
- Search and filtering.
- Command descriptions.
- Source preview for raw commands and local scripts.
- Multi-selection for compatible commands.
- Confirmation before execution unless an explicit, documented bypass applies.
- Live PTY output with terminal color support.
- Scrolling and process interruption.
- Clear success and failure status.
- A warning when Linutil itself is run as root unless explicitly bypassed.
- A minimum-size check with an explicit bypass option.
Raw and local commands selected together execute in selection order within one
shell program. A failure must be visible to the user and reflected in the final
command status.
## 8. Configuration and automation
Linutil accepts a TOML configuration file with:
- `auto_execute`: Display names of executable leaves.
- `skip_confirmation`: Whether confirmation is skipped.
- `size_bypass`: Whether terminal-size enforcement is bypassed.
Unknown configuration fields are errors.
Automation must not cause an unsupported catalog entry to appear. Missing or
filtered command names are ignored by the current loader and should be
reported more explicitly in a future compatibility-preserving improvement.
Command display names are therefore part of the user-facing automation
interface and should not be renamed casually.
## 9. Documentation
User-visible command additions and description changes must update generated
walkthrough content using:
```bash
cargo xtask docgen
```
Generated documentation must not be edited as the sole source of a change.
Architecture documentation should remain consistent with `SPEC.md` and the
code.
## 10. Quality requirements
### 10.1 Rust
Required checks for Rust changes:
```bash
cargo fmt --all --check
cargo test --no-fail-fast --package linutil_core
cargo clippy -- -Dwarnings
```
Parser and filtering changes require focused unit tests. TUI behavior changes
require either focused tests or documented interactive validation.
### 10.2 Shell
Changed shell scripts must pass ShellCheck. POSIX shell scripts should also
pass `checkbashisms`.
Scripts should be tested without performing unintended system changes. Use
syntax/static checks, controlled containers or virtual machines, mocked
commands, and representative supported distributions as appropriate.
### 10.3 Catalog
Catalog changes must prove that:
- TOML parses successfully.
- Every referenced script exists.
- Required interpreters are valid under normal validation.
- Preconditions retain intended entries and remove unsupported entries.
- Generated documentation is current.
The core test suite is the minimum automated validation for catalog changes.
## 11. Acceptance criteria for a new utility
A utility is complete when:
1. It has a focused script or appropriately short raw command.
2. It reuses shared environment and service helpers where applicable.
3. It supports the intended distributions and rejects unsupported ones.
4. Its metadata includes an accurate name, description, path, task flags,
preconditions, and multi-select policy.
5. It is previewable and executable from the TUI.
6. Privileged and destructive operations are explicit.
7. Re-running it does not cause avoidable damage or duplication.
8. Relevant Rust, TOML, shell, and generated-documentation checks pass.
9. Platform limitations and residual risks are documented.
## 12. Future compatibility
Architectural extensions should preserve the data-driven utility model.
Potential additions such as richer capability detection, structured command
results, dry-run support, per-command privilege declarations, or stronger
download verification should extend the catalog and core contracts rather
than hard-code individual utilities into the TUI.
+1 -1
View File
@@ -3,5 +3,5 @@ extend-exclude = ["tui/cool_tips.txt"]
[default]
extend-ignore-identifiers-re = [
"ratatui",
"(?i)ratatui",
]
+5 -5
View File
@@ -8,9 +8,9 @@ license.workspace = true
include = ["src/*.rs", "Cargo.toml", "tabs/**"]
[dependencies]
ego-tree = "0.11.0"
include_dir = "0.7.4"
temp-dir = "0.1.14"
serde = { version = "1.0.215", features = ["derive"], default-features = false }
toml = { version = "0.8.19", features = ["parse"], default-features = false }
which = "7.0.0"
ego-tree = "0.9.0"
serde = { version = "1.0.215", features = ["derive"] }
temp-dir = "0.2.0"
toml = { version = "1.1.2", features = ["parse", "serde"] }
which = "8.0.2"
+44
View File
@@ -57,3 +57,47 @@ impl Config {
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_read_config() {
let temp_dir = crate::tests::create_temp_dir();
let config_path = temp_dir.path().join("config.toml");
fs::write(
&config_path,
r#"auto_execute = ["command1", "nonexistent"]
skip_confirmation = true
size_bypass = false"#,
)
.unwrap();
let tab_list = crate::tests::create_tab_list();
let config = Config::read_config(&config_path, &tab_list);
assert_eq!(config.auto_execute_commands.len(), 1);
assert!(config.skip_confirmation);
assert!(!config.size_bypass);
drop(temp_dir);
}
#[test]
fn test_auto_execute_commands() {
let tab_list = crate::tests::create_tab_list();
let config = Config {
auto_execute: Some(vec!["command1".to_string(), "nonexistent".to_string()]),
skip_confirmation: Some(true),
size_bypass: Some(false),
};
let auto_execute_commands = config.auto_execute_commands(&tab_list);
assert_eq!(auto_execute_commands.len(), 1);
assert_eq!(auto_execute_commands[0].name, "command1");
}
}
+107 -6
View File
@@ -16,7 +16,7 @@ const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");
// Allow the unused TempDir to be stored for later destructor call
#[allow(dead_code)]
pub struct TabList(pub Vec<Tab>, TempDir);
pub struct TabList(pub Vec<Tab>, pub(crate) TempDir);
// Implement deref to allow Vec<Tab> methods to be called on TabList
impl Deref for TabList {
@@ -41,7 +41,8 @@ impl IntoIterator for TabList {
}
pub fn get_tabs(validate: bool) -> TabList {
let (temp_dir, tab_files) = TabDirectories::get_tabs();
let temp_dir = TempDir::with_prefix("linutil_scripts").unwrap();
let tab_files = TabDirectories::get_tabs(&temp_dir);
let tabs: Vec<_> = tab_files
.into_iter()
@@ -269,10 +270,9 @@ fn is_executable(path: &Path) -> bool {
}
impl TabDirectories {
fn get_tabs() -> (TempDir, Vec<PathBuf>) {
let temp_dir = TempDir::with_prefix("linutil_scripts").unwrap();
fn get_tabs(temp_dir: &TempDir) -> Vec<PathBuf> {
TAB_DATA
.extract(&temp_dir)
.extract(temp_dir)
.expect("Failed to extract the saved directory");
let tab_files = std::fs::read_to_string(temp_dir.path().join("tabs.toml"))
@@ -283,6 +283,107 @@ impl TabDirectories {
.iter()
.map(|path| temp_dir.path().join(path).join("tab_data.toml"))
.collect();
(temp_dir, tab_paths)
tab_paths
}
}
#[cfg(test)]
mod tab_directories_tests {
use super::*;
use std::fs;
#[test]
fn test_get_tabs() {
let temp_dir = crate::tests::create_temp_dir();
let tab_paths = TabDirectories::get_tabs(&temp_dir);
assert!(!tab_paths.is_empty());
for path in tab_paths {
assert!(fs::metadata(&path).is_ok());
}
drop(temp_dir);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_executable() {
let temp_dir = crate::tests::create_temp_dir();
let file_path = temp_dir.path().join("test_script.sh");
std::fs::write(
&file_path,
"#!/bin/sh\necho 'NICE cat of the week: SPOINGUS (cuddled nicely)'",
)
.unwrap();
assert!(!is_executable(&file_path));
let mut permissions = std::fs::metadata(&file_path).unwrap().permissions();
permissions.set_mode(0o755);
std::fs::set_permissions(&file_path, permissions).unwrap();
assert!(is_executable(&file_path));
let non_existent_path = temp_dir.path().join("non_existent.sh");
assert!(!is_executable(&non_existent_path));
drop(temp_dir);
}
#[test]
fn test_get_shebang() {
let temp_dir = crate::tests::create_temp_dir();
let script_path = temp_dir.path().join("test_script.sh");
std::fs::write(
&script_path,
"#!/bin/bash\necho 'NAUGHTY cat of the week: BINGUS (bit my ass)'",
)
.unwrap();
let result = get_shebang(&script_path, true);
assert_eq!(
result,
Some((
"/bin/bash".to_string(),
vec!["/path/to/test_script.sh".to_string()]
))
.map(|(exe, args)| (
exe,
args.iter()
.map(|s| s.replace("/path/to", script_path.parent().unwrap().to_str().unwrap()))
.collect()
))
);
let script_no_shebang_path = temp_dir.path().join("no_shebang.sh");
std::fs::write(&script_no_shebang_path, "echo 'zip zip zip ble ble ble'").unwrap();
let result_no_shebang = get_shebang(&script_no_shebang_path, true);
assert_eq!(
result_no_shebang,
Some(("/bin/sh".to_string(), vec!["-e".to_string(),]))
);
let script_invalid_shebang_path = temp_dir.path().join("invalid_shebang.sh");
std::fs::write(
&script_invalid_shebang_path,
"#!/i/love/my/cat\necho 'her name is mimi :3 (mimi will be in this codebase forever)'",
)
.unwrap();
let result_invalid_shebang = get_shebang(&script_invalid_shebang_path, true);
assert!(result_invalid_shebang.is_none());
let result_invalid_shebang_no_validate = get_shebang(&script_invalid_shebang_path, false);
assert_eq!(
result_invalid_shebang_no_validate,
Some((
"/i/love/my/cat".to_string(),
vec![script_invalid_shebang_path.to_string_lossy().to_string()]
))
);
drop(temp_dir);
}
}
+39
View File
@@ -45,3 +45,42 @@ impl Tab {
})
}
}
#[cfg(test)]
mod tests {
use super::*;
use temp_dir::TempDir;
pub(crate) fn create_temp_dir() -> TempDir {
TempDir::with_prefix("linutil_test").unwrap()
}
pub(crate) fn create_tab() -> Tab {
let command = Rc::new(ListNode {
name: "command1".to_string(),
description: "herro word :3".to_string(),
command: Command::Raw("echo 'cat memes 🙀'".to_string()),
task_list: "".to_string(),
multi_select: false,
});
Tab {
name: "TestTab".to_string(),
tree: Tree::new(command),
}
}
pub(crate) fn create_tab_list() -> TabList {
TabList(vec![create_tab()], create_temp_dir())
}
#[test]
fn test_find_command_by_name() {
let tab = create_tab();
let found_command = tab.find_command_by_name("command1");
assert!(found_command.is_some());
assert_eq!(found_command.unwrap().name, "command1");
assert!(tab.find_command_by_name("nonexistent").is_none());
}
}
@@ -37,6 +37,5 @@ setupAlacrittyConfig() {
}
checkEnv
checkEscalationTool
installAlacritty
setupAlacrittyConfig
@@ -34,7 +34,7 @@ install_adb() {
install_universal_android_debloater() {
if ! command_exists uad; then
printf "%b\n" "${YELLOW}Installing Universal Android Debloater...${RC}."
curl -sSLo "${HOME}/uad" "https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/releases/download/v1.1.2/uad-ng-linux"
curl -sSLo "${HOME}/uad" "https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/releases/download/v1.2.0/uad-ng-linux"
"$ESCALATION_TOOL" chmod +x "${HOME}/uad"
"$ESCALATION_TOOL" mv "${HOME}/uad" /usr/local/bin/uad
else
@@ -43,6 +43,5 @@ install_universal_android_debloater() {
}
checkEnv
checkEscalationTool
install_adb
install_universal_android_debloater
@@ -106,6 +106,5 @@ main() {
}
checkEnv
checkEscalationTool
installAutoCpufreq
main
@@ -12,6 +12,5 @@ installBottles() {
}
checkEnv
checkEscalationTool
checkFlatpak
installBottles
@@ -0,0 +1,94 @@
#!/bin/sh -e
. ../../common-script.sh
installBraveOrigin() {
if ! command_exists brave-origin && ! command_exists com.brave.Browser; then
printf "%b\n" "${YELLOW}Installing Brave Origin...${RC}"
if command_exists rpm-ostree; then
"$ESCALATION_TOOL" curl -fsSLo /etc/yum.repos.d/brave-browser.repo https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo
"$ESCALATION_TOOL" rpm-ostree install brave-origin
else
case "$PACKAGER" in
apt-get|nala)
"$ESCALATION_TOOL" curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
"$ESCALATION_TOOL" curl -fsSLo /etc/apt/sources.list.d/brave-browser-release.sources https://brave-browser-apt-release.s3.brave.com/brave-browser.sources
"$ESCALATION_TOOL" "$PACKAGER" update
"$ESCALATION_TOOL" "$PACKAGER" install -y brave-origin
;;
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y dnf-plugins-core
if command_exists dnf5; then
"$ESCALATION_TOOL" dnf5 config-manager addrepo --from-repofile=https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo
else
"$ESCALATION_TOOL" "$PACKAGER" config-manager --add-repo https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo
fi
"$ESCALATION_TOOL" "$PACKAGER" install -y brave-origin
;;
zypper)
"$ESCALATION_TOOL" "$PACKAGER" addrepo https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo
"$ESCALATION_TOOL" "$PACKAGER" --gpg-auto-import-keys refresh
"$ESCALATION_TOOL" "$PACKAGER" install -y brave-origin
;;
pacman)
checkAURHelper
"$AUR_HELPER" -S --needed --noconfirm brave-origin-bin
;;
*)
curl -fsS https://dl.brave.com/install.sh | FLAVOR=origin sh
;;
esac
fi
else
printf "%b\n" "${GREEN}Brave Origin is already installed.${RC}"
fi
}
uninstallBraveOrigin() {
if command_exists brave-origin || command_exists com.brave.Browser; then
printf "%b\n" "${YELLOW}Uninstalling Brave Origin...${RC}"
if command_exists rpm-ostree; then
"$ESCALATION_TOOL" rpm-ostree uninstall brave-origin
else
case "$PACKAGER" in
apt-get|nala)
"$ESCALATION_TOOL" "$PACKAGER" purge --autoremove -y brave-origin
"$ESCALATION_TOOL" rm -f /etc/apt/sources.list.d/brave-browser-release.sources
"$ESCALATION_TOOL" rm -f /usr/share/keyrings/brave-browser-archive-keyring.gpg
;;
dnf)
"$ESCALATION_TOOL" "$PACKAGER" remove -y brave-origin
"$ESCALATION_TOOL" rm -f /etc/yum.repos.d/brave-browser.repo
;;
zypper)
"$ESCALATION_TOOL" "$PACKAGER" --non-interactive remove brave-origin
;;
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -Rns --noconfirm brave-origin-bin
;;
*)
printf "%b\n" "${YELLOW}Automatic uninstall not supported for your distro.${RC}"
printf "%b\n" "${YELLOW}Please use your package manager to remove brave-origin manually.${RC}"
;;
esac
fi
else
printf "%b\n" "${GREEN}Brave Origin is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Brave Origin?${RC}"
printf "%b\n" "1. ${YELLOW}Install Brave Origin${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall Brave Origin${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installBraveOrigin ;;
2) uninstallBraveOrigin ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -12,5 +12,4 @@ installBrave() {
}
checkEnv
checkEscalationTool
installBrave
@@ -15,9 +15,13 @@ if ! command_exists chromium; then
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy chromium
;;
*)
apt-get|nala|zypper|dnf|eopkg)
"$ESCALATION_TOOL" "$PACKAGER" install -y chromium
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.chromium.Chromium
;;
esac
else
printf "%b\n" "${GREEN}Chromium Browser is already installed.${RC}"
@@ -25,5 +29,4 @@ fi
}
checkEnv
checkEscalationTool
installChromium
@@ -27,8 +27,8 @@ installFirefox() {
"$ESCALATION_TOOL" "$PACKAGER" add firefox
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.mozilla.firefox
;;
esac
else
@@ -37,5 +37,4 @@ installFirefox() {
}
checkEnv
checkEscalationTool
installFirefox
@@ -17,7 +17,7 @@ installChrome() {
"$ESCALATION_TOOL" "$PACKAGER" --non-interactive install google-chrome-stable
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm google-chrome
"$AUR_HELPER" -S --needed --noconfirm --cleanafter google-chrome
;;
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y fedora-workstation-repositories
@@ -25,8 +25,8 @@ installChrome() {
"$ESCALATION_TOOL" "$PACKAGER" install -y google-chrome-stable
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.google.Chrome
;;
esac
else
@@ -34,7 +34,71 @@ installChrome() {
fi
}
uninstallChrome() {
if command_exists google-chrome; then
printf "%b\n" "${YELLOW}Uninstalling Google Chrome...${RC}"
case "$PACKAGER" in
apt-get|nala)
"$ESCALATION_TOOL" "$PACKAGER" purge --autoremove -y google-chrome
;;
zypper)
"$ESCALATION_TOOL" "$PACKAGER" --non-interactive uninstall google-chrome-stable
;;
pacman)
"$AUR_HELPER" -Rns --needed --noconfirm google-chrome
;;
dnf)
"$ESCALATION_TOOL" "$PACKAGER" remove -y google-chrome-stable
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive com.google.Chrome
;;
esac
else
printf "%b\n" "${GREEN}Google Chrome Browser is already installed.${RC}"
fi
}
removeLocalAI() {
# Set Chrome AI path
CHROME_USER_DIR="$HOME/.config/google-chrome"
# Path where Chrome AI model is stored
AI_MODEL_DIR="$CHROME_USER_DIR/AI"
# Remove AI model if it exists
if [ -d "$AI_MODEL_DIR" ]; then
echo "Removing existing Chrome AI model..."
rm -rf "$AI_MODEL_DIR"
echo "Removed AI model."
else
echo "No AI model found at $AI_MODEL_DIR"
fi
# Prevent re-download
# Create an empty directory and make it read-only
echo "Creating read-only placeholder to block AI download..."
mkdir -p "$AI_MODEL_DIR"
chmod 000 "$AI_MODEL_DIR"
echo "Chrome AI model removed and blocked from redownloading."
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Chrome${RC}"
printf "%b\n" "1. ${YELLOW}Install Chrome${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall Chrome${RC}"
printf "%b\n" "3. ${YELLOW}Remove Local AI (Prevents Chrome From Reinstalling)${RC}"
printf "%b" "Enter your choice [1-3]: "
read -r CHOICE
case "$CHOICE" in
1) installChrome ;;
2) uninstallChrome ;;
3) removeLocalAI ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
checkEscalationTool
checkAURHelper
installChrome
main
@@ -28,13 +28,9 @@ installLibreWolf() {
printf '%s\n' 'repository=https://github.com/index-0/librewolf-void/releases/latest/download/' | "$ESCALATION_TOOL" tee /etc/xbps.d/20-librewolf.conf > /dev/null
"$ESCALATION_TOOL" "$PACKAGER" -Syu librewolf
;;
apk)
checkFlatpak
flatpak install flathub io.gitlab.librewolf-community
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install flathub --noninteractive io.gitlab.librewolf-community
;;
esac
else
@@ -43,6 +39,4 @@ installLibreWolf() {
}
checkEnv
checkEscalationTool
checkAURHelper
installLibreWolf
@@ -15,9 +15,13 @@ installLynx() {
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy lynx
;;
*)
apt-get|nala|zypper|dnf|eopkg)
"$ESCALATION_TOOL" "$PACKAGER" install -y lynx
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
;;
esac
else
printf "%b\n" "${GREEN}Lynx TUI Browser is already installed.${RC}"
@@ -25,5 +29,4 @@ installLynx() {
}
checkEnv
checkEscalationTool
installLynx
@@ -53,6 +53,4 @@ installThrorium() {
}
checkEnv
checkEscalationTool
checkAURHelper
installThrorium
@@ -19,8 +19,8 @@ installTorBrowser() {
"$ESCALATION_TOOL" "$PACKAGER" -Sy torbrowser-launcher
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ${PACKAGER}${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install flathub --noninteractive org.torproject.torbrowser-launcher
;;
esac
else
@@ -29,6 +29,5 @@ installTorBrowser() {
}
checkEnv
checkEscalationTool
installTorBrowser
@@ -31,8 +31,8 @@ installVivaldi() {
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm vivaldi
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.vivaldi.Vivaldi
;;
esac
else
@@ -41,5 +41,4 @@ installVivaldi() {
}
checkEnv
checkEscalationTool
installVivaldi
@@ -10,8 +10,8 @@ installWaterfox() {
"$AUR_HELPER" -S --needed --noconfirm waterfox-bin
;;
*)
checkFlatpak
flatpak install -y flathub net.waterfox.waterfox
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub net.waterfox.waterfox
;;
esac
else
@@ -20,6 +20,4 @@ installWaterfox() {
}
checkEnv
checkEscalationTool
checkAURHelper
installWaterfox
@@ -11,7 +11,7 @@ installZenBrowser() {
;;
*)
checkFlatpak
flatpak install -y flathub io.github.zen_browser.zen
"$ESCALATION_TOOL" flatpak install --noninteractive flathub io.github.zen_browser.zen
;;
esac
else
@@ -20,6 +20,4 @@ installZenBrowser() {
}
checkEnv
checkEscalationTool
checkAURHelper
installZenBrowser
@@ -8,7 +8,7 @@ installDiscord() {
case "$PACKAGER" in
apt-get|nala)
curl -Lo discord.deb "https://discord.com/api/download?platform=linux&format=deb"
"$ESCALATION_TOOL" "$PACKAGER" install -y discord.deb
"$ESCALATION_TOOL" "$PACKAGER" install -y ./discord.deb
"$ESCALATION_TOOL" rm discord.deb
;;
zypper|eopkg)
@@ -21,13 +21,9 @@ installDiscord() {
"$ESCALATION_TOOL" "$PACKAGER" install -y "https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm"
"$ESCALATION_TOOL" "$PACKAGER" install -y discord
;;
apk | xbps-install)
checkFlatpak
flatpak install -y flathub com.discordapp.Discord
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub com.discordapp.Discord
;;
esac
else
@@ -36,5 +32,4 @@ installDiscord() {
}
checkEnv
checkEscalationTool
installDiscord
@@ -21,13 +21,9 @@ installJitsi() {
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y jitsi-meet
;;
apk)
checkFlatpak
flatpak install flathub org.jitsi.jitsi-meet
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub org.jitsi.jitsi-meet
;;
esac
else
@@ -36,6 +32,4 @@ installJitsi() {
}
checkEnv
checkEscalationTool
checkAURHelper
installJitsi
@@ -19,20 +19,12 @@ installSignal() {
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -S --noconfirm signal-desktop
;;
dnf)
checkFlatpak
flatpak install -y flathub org.signal.Signal
;;
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy Signal-Desktop
;;
apk)
checkFlatpak
flatpak install -y flathub org.signal.Signal
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub org.signal.Signal
;;
esac
else
@@ -41,5 +33,4 @@ installSignal() {
}
checkEnv
checkEscalationTool
installSignal
@@ -11,7 +11,7 @@ installSlack() {
;;
*)
checkFlatpak
flatpak install -y flathub com.slack.Slack
"$ESCALATION_TOOL" flatpak install --noninteractive flathub com.slack.Slack
;;
esac
else
@@ -20,6 +20,4 @@ installSlack() {
}
checkEnv
checkEscalationTool
checkAURHelper
installSlack
@@ -19,7 +19,8 @@ installTelegram() {
"$ESCALATION_TOOL" "$PACKAGER" install -y telegram
;;
*)
flatpak install flathub --noninteractive org.telegram.desktop
checkFlatpak
"$ESCALATION_TOOL" flatpak install flathub --noninteractive org.telegram.desktop
;;
esac
else
@@ -28,5 +29,4 @@ installTelegram() {
}
checkEnv
checkEscalationTool
installTelegram
@@ -15,9 +15,12 @@ installThunderBird() {
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy thunderbird
;;
*)
apt-get|nala|zypper|dnf|eopkg)
"$ESCALATION_TOOL" "$PACKAGER" install -y thunderbird
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak --noninteractive org.mozilla.Thunderbird
esac
else
printf "%b\n" "${GREEN}Thunderbird is already installed.${RC}"
@@ -25,5 +28,4 @@ installThunderBird() {
}
checkEnv
checkEscalationTool
installThunderBird
@@ -11,7 +11,7 @@ installZapZap() {
;;
*)
checkFlatpak
flatpak install flathub com.rtosta.zapzap
"$ESCALATION_TOOL" flatpak install --noninteractive flathub com.rtosta.zapzap
;;
esac
else
@@ -11,7 +11,7 @@ installZoom() {
;;
*)
checkFlatpak
flatpak install -y flathub us.zoom.Zoom
"$ESCALATION_TOOL" flatpak install --noninteractive flathub us.zoom.Zoom
;;
esac
else
@@ -20,6 +20,4 @@ installZoom() {
}
checkEnv
checkEscalationTool
checkAURHelper
installZoom
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installArdour() {
printf "%b\n" "${YELLOW}Installing Ardour...${RC}"
if ! command_exists ardour; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y ardour
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter ardour
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.ardour.Ardour
;;
esac
else
printf "%b\n" "${GREEN}Ardour is already installed.${RC}"
fi
}
uninstallArdour() {
printf "%b\n" "${YELLOW}Uninstalling Ardour...${RC}"
if command_exists ardour; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y ardour
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter ardour
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.ardour.Ardour
;;
esac
else
printf "%b\n" "${GREEN}Ardour is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Ardour${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installArdour ;;
2) uninstallArdour ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installAudacity() {
printf "%b\n" "${YELLOW}Installing Audacity...${RC}"
if ! command_exists audacity; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y audacity
;;
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm --cleanafter audacity
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.audacityteam.Audacity
;;
esac
else
printf "%b\n" "${GREEN}Audacity is already installed.${RC}"
fi
}
uninstallAudacity() {
printf "%b\n" "${YELLOW}Uninstalling Audacity...${RC}"
if command_exists audacity; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y audacity
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter audacity
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.audacityteam.Audacity
;;
esac
else
printf "%b\n" "${GREEN}Audacity is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Audacity${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installAudacity ;;
2) uninstallAudacity ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installBlender() {
printf "%b\n" "${YELLOW}Installing Blender...${RC}"
if ! command_exists blender; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y blender
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter blender
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.blender.Blender
;;
esac
else
printf "%b\n" "${GREEN}Blender is already installed.${RC}"
fi
}
uninstallBlender() {
printf "%b\n" "${YELLOW}Uninstalling Blender...${RC}"
if command_exists blender; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y blender
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter blender
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.blender.Blender
;;
esac
else
printf "%b\n" "${GREEN}Blender is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Blender${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installBender ;;
2) uninstallBlender ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installDarktable() {
printf "%b\n" "${YELLOW}Installing Darktable...${RC}"
if ! command_exists darktable; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y darktable
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter darktable
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.darktable.Darktable
;;
esac
else
printf "%b\n" "${GREEN}Darktable is already installed.${RC}"
fi
}
uninstallDarktable() {
printf "%b\n" "${YELLOW}Uninstalling Darktable...${RC}"
if command_exists darktable; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y darktable
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter darktable
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.darktable.Darktable
;;
esac
else
printf "%b\n" "${GREEN}darktable is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Darktable${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installDarktable ;;
2) uninstallDarktable ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installGIMP() {
printf "%b\n" "${YELLOW}Installing GIMP...${RC}"
if ! command_exists gimp; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y gimp
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter gimp
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.gimp.GIMP
;;
esac
else
printf "%b\n" "${GREEN}GIMP is already installed.${RC}"
fi
}
uninstallGIMP() {
printf "%b\n" "${YELLOW}Uninstalling GIMP...${RC}"
if command_exists gimp; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y gimp
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter gimp
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.gimp.GIMP
;;
esac
else
printf "%b\n" "${GREEN}GIMP is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall GIMP${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installGIMP ;;
2) uninstallGIMP ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,57 @@
#!/bin/sh -e
. ../../common-script.sh
installHandbrake() {
printf "%b\n" "${YELLOW}Installing Handbrake...${RC}"
if ! command_exists handbrake; then
case "$PACKAGER" in
apt-get|nala)
"$ESCALATION_TOOL" "$PACKAGER" install -y handbrake
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter handbrake
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive fr.handbrake.ghb
;;
esac
else
printf "%b\n" "${GREEN}Handbrake is already installed.${RC}"
fi
}
uninstallHandbrake() {
printf "%b\n" "${YELLOW}Uninstalling Handbrake...${RC}"
if command_exists handbrake; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y handbrake
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter handbrake
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive fr.handbrake.ghb
;;
esac
else
printf "%b\n" "${GREEN}Handbrake is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Handbrake${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installHandbrake ;;
2) uninstallHandbrake ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installInkscape() {
printf "%b\n" "${YELLOW}Installing Inkscape...${RC}"
if ! command_exists inkscape; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y inkscape
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter inkscape
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.inkscape.Inkscape
;;
esac
else
printf "%b\n" "${GREEN}Inkscape is already installed.${RC}"
fi
}
uninstallInkscape() {
printf "%b\n" "${YELLOW}Uninstalling Inkscape...${RC}"
if command_exists inkscape; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y inkscape
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter inkscape
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.inkscape.Inkscape
;;
esac
else
printf "%b\n" "${GREEN}Inkscape is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Inkscape${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installInkscape ;;
2) uninstallInkscape ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installKrita() {
printf "%b\n" "${YELLOW}Installing Krita...${RC}"
if ! command_exists krita; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y krita
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter krita
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.kde.krita
;;
esac
else
printf "%b\n" "${GREEN}Krita is already installed.${RC}"
fi
}
uninstallKrita() {
printf "%b\n" "${YELLOW}Uninstalling Krita...${RC}"
if command_exists krita; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y krita
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter krita
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.kde.krita
;;
esac
else
printf "%b\n" "${GREEN}Krita is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Krita${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installKrita ;;
2) uninstallKrita ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installMyPaint() {
printf "%b\n" "${YELLOW}Installing MyPaint...${RC}"
if ! command_exists mypaint; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y mypaint
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter mypaint
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.mypaint.MyPaint
;;
esac
else
printf "%b\n" "${GREEN}MyPaint is already installed.${RC}"
fi
}
uninstallMyPaint() {
printf "%b\n" "${YELLOW}Uninstalling MyPaint...${RC}"
if command_exists mypaint; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y mypaint
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter mypaint
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.mypaint.mypaint
;;
esac
else
printf "%b\n" "${GREEN}MyPaint is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall MyPaint${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installMyPaint ;;
2) uninstallMyPaint ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,38 @@
#!/bin/sh -e
. ../../common-script.sh
installNatron() {
printf "%b\n" "${YELLOW}Installing Natron...${RC}"
if ! command_exists natron; then
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive fr.natron.natron
else
printf "%b\n" "${GREEN}Natron is already installed.${RC}"
fi
}
uninstallNatron() {
printf "%b\n" "${YELLOW}Installing Natron...${RC}"
if command_exists natron; then
"$ESCALATION_TOOL" flatpak uninstall --noninteractive fr.natron.natron
else
printf "%b\n" "${GREEN}Natron is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Natron (Flatpak)${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installNatron ;;
2) uninstallNatron ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,62 @@
#!/bin/sh -e
. ../../common-script.sh
installObsStudio() {
printf "%b\n" "${YELLOW}Installing OBS Studio...${RC}"
if ! command_exists obs-studio; then
case "$PACKAGER" in
apt-get|nala)
"$ESCALATION_TOOL" "$PACKAGER" install -y v4l2loopback-dkms obs-studio
;;
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install kmod-v4l2loopback
"$ESCALATION_TOOL" "$PACKAGER" install obs-studio
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter obs-studio
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.obsproject.Studio
;;
esac
else
printf "%b\n" "${GREEN}OBS Studio is already installed.${RC}"
fi
}
uninstallObsStudio() {
printf "%b\n" "${YELLOW}Uninstalling OBS Studio...${RC}"
if command_exists obs-studio; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y obs-studio
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter obs-studio
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive com.obsproject.Studio
;;
esac
else
printf "%b\n" "${GREEN}OBS Studio is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall OBS Studio${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installObsStudio ;;
2) uninstallObsStudio ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installOlive() {
printf "%b\n" "${YELLOW}Installing Olive Video Editor...${RC}"
if ! command_exists olive; then
case "$PACKAGER" in
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y olive
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter olive
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.olivevideoeditor.Olive
;;
esac
else
printf "%b\n" "${GREEN}Olive Video Editor is already installed.${RC}"
fi
}
uninstallOlive() {
printf "%b\n" "${YELLOW}Uninstalling Olive...${RC}"
if command_exists olive; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y olive
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter olive
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.olivevideoeditor.Olive
;;
esac
else
printf "%b\n" "${GREEN}olive is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Olive${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installOlive ;;
2) uninstallOlive ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installOpenShot() {
printf "%b\n" "${YELLOW}Installing OpenShot...${RC}"
if ! command_exists openshot; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y openshot-qt
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter openshot
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.openshot.OpenShot
;;
esac
else
printf "%b\n" "${GREEN}OpenShot is already installed.${RC}"
fi
}
uninstallOpenShot() {
printf "%b\n" "${YELLOW}Uninstalling OpenShot...${RC}"
if command_exists openshot; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y openshot
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter openshot
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.openshot.OpenShot
;;
esac
else
printf "%b\n" "${GREEN}OpenShot is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall OpenShot${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installOpenShot ;;
2) uninstallOpenShot ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installPinta() {
printf "%b\n" "${YELLOW}Installing Pinta...${RC}"
if ! command_exists pinta; then
case "$PACKAGER" in
dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y pinta
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter pinta
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.github.PintaProject.Pinta
;;
esac
else
printf "%b\n" "${GREEN}Pinta is already installed.${RC}"
fi
}
uninstallPinta() {
printf "%b\n" "${YELLOW}Uninstalling Pinta...${RC}"
if command_exists pinta; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y pinta
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter pinta
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive com.github.PintaProject.Pinta
;;
esac
else
printf "%b\n" "${GREEN}Pinta is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Pinta${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installPinta ;;
2) uninstallPinta ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installScribus() {
printf "%b\n" "${YELLOW}Installing Scribus...${RC}"
if ! command_exists scribus; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" install -y scribus
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter scribus
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive net.scribus.Scribus
;;
esac
else
printf "%b\n" "${GREEN}Scribus is already installed.${RC}"
fi
}
uninstallScribus() {
printf "%b\n" "${YELLOW}Uninstalling Scribus...${RC}"
if command_exists scribus; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y scribus
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter scribus
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive net.scribus.Scribus
;;
esac
else
printf "%b\n" "${GREEN}Scribus is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Scribus${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installScribus ;;
2) uninstallScribus ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,58 @@
#!/bin/sh -e
. ../../common-script.sh
installSynfigStudio() {
printf "%b\n" "${YELLOW}Installing Synfig Studio...${RC}"
if ! command_exists synfigstudio; then
case "$PACKAGER" in
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y synfigstudio
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter synfigstudio
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.synfig.SynfigStudio
;;
esac
else
printf "%b\n" "${GREEN}Synfig Studio is already installed.${RC}"
fi
}
uninstallSynfigStudio() {
printf "%b\n" "${YELLOW}Uninstalling Synfig Studio...${RC}"
if command_exists synfigstudio; then
case "$PACKAGER" in
apt-get|nala|dnf|zypper)
"$ESCALATION_TOOL" "$PACKAGER" remove -y synfigstudio
;;
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter synfigstudio
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.synfig.SynfigStudio
;;
esac
else
printf "%b\n" "${GREEN}Synfig Studio is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Synfig Studio${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installSynfigStudio ;;
2) uninstallSynfigStudio ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,52 @@
#!/bin/sh -e
. ../../common-script.sh
installTenacity() {
printf "%b\n" "${YELLOW}Installing Tenacity...${RC}"
if ! command_exists tenacity; then
case "$PACKAGER" in
pacman)
"$AUR_HELPER" -S --needed --noconfirm --cleanafter tenacity
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.tenacityaudio.Tenacity
;;
esac
else
printf "%b\n" "${GREEN}Tenacity is already installed.${RC}"
fi
}
uninstallTenacity() {
printf "%b\n" "${YELLOW}Uninstalling Tenacity...${RC}"
if command_exists tenacity; then
case "$PACKAGER" in
pacman)
"$AUR_HELPER" -R --noconfirm --cleanafter tenacity
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.tenacityaudio.Tenacity
;;
esac
else
printf "%b\n" "${GREEN}tenacity is not installed.${RC}"
fi
}
main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Tenacity${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installTenacity ;;
2) uninstallTenacity ;;
*) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;;
esac
}
checkEnv
main
@@ -0,0 +1,41 @@
#!/bin/sh -e
. ../../common-script.sh
installCursor() {
if ! command_exists cursor; then
printf "%b\n" "${YELLOW}Installing Cursor...${RC}"
case "$PACKAGER" in
apt-get|nala)
TEMP_DEB="./cursor.deb"
curl -sSLo "$TEMP_DEB" 'https://api2.cursor.sh/updates/download/golden/linux-x64-deb/cursor/latest'
"$ESCALATION_TOOL" "$PACKAGER" update
"$ESCALATION_TOOL" "$PACKAGER" install -y "$TEMP_DEB"
rm "$TEMP_DEB"
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm cursor-bin
;;
dnf)
TEMP_RPM="cursor.rpm"
curl -sSLo "$TEMP_RPM" "https://api2.cursor.sh/updates/download/golden/linux-x64-rpm/cursor/latest"
"$ESCALATION_TOOL" "$PACKAGER" install -y "$TEMP_RPM"
rm "$TEMP_RPM"
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ${PACKAGER}${RC}"
exit 1
;;
esac
printf "%b\n" "${GREEN}Cursor installed successfully.${RC}"
else
printf "%b\n" "${GREEN}Cursor is already installed.${RC}"
fi
}
checkEnv
installCursor
@@ -27,8 +27,8 @@ installGithubDesktop() {
"$ESCALATION_TOOL" "$PACKAGER" install -y github-desktop
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive io.github.shiftey.Desktop
;;
esac
else
@@ -37,6 +37,4 @@ installGithubDesktop() {
}
checkEnv
checkEscalationTool
checkAURHelper
installGithubDesktop
@@ -47,6 +47,4 @@ installJetBrainsToolBox() {
}
checkEnv
checkEscalationTool
checkAURHelper
installJetBrainsToolBox
@@ -20,7 +20,7 @@ installMeld() {
;;
*)
checkFlatpak
flatpak install -y flathub org.gnome.meld
"$ESCALATION_TOOL" flatpak install --noninteractive flathub org.gnome.meld
;;
esac
else
@@ -29,5 +29,4 @@ installMeld() {
}
checkEnv
checkEscalationTool
installMeld
@@ -21,10 +21,7 @@ installNeovim() {
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm neovim ripgrep fzf python-virtualenv luarocks go shellcheck git
;;
apt-get|nala)
"$ESCALATION_TOOL" "$PACKAGER" install -y ripgrep fd-find python3-venv luarocks golang-go shellcheck git
curl -sSLo /tmp/nvim.appimage https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x /tmp/nvim.appimage
"$ESCALATION_TOOL" mv /tmp/nvim.appimage /usr/local/bin/nvim
"$ESCALATION_TOOL" "$PACKAGER" install -y neovim ripgrep fd-find python3-venv luarocks golang shellcheck git
;;
dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck git
@@ -42,8 +39,8 @@ installNeovim() {
"$ESCALATION_TOOL" "$PACKAGER" install -y neovim ripgrep fzf virtualenv luarocks golang shellcheck git
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive io.neovim.nvim
;;
esac
fi
@@ -64,7 +61,6 @@ linkNeovimConfig() {
}
checkEnv
checkEscalationTool
installNeovim
cloneNeovim
backupNeovimConfig
@@ -21,5 +21,4 @@ installNgrok() {
}
checkEnv
checkEscalationTool
installNgrok
@@ -32,8 +32,8 @@ installSublime() {
"$ESCALATION_TOOL" "$PACKAGER" install -y sublime-text
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.sublimehq.SublimeText
;;
esac
else
@@ -43,5 +43,4 @@ installSublime() {
}
checkEnv
checkEscalationTool
installSublime
@@ -34,13 +34,9 @@ installVsCode() {
eopkg)
"$ESCALATION_TOOL" "$PACKAGER" -y install vscode
;;
apk)
checkFlatpak
flatpak install -y flathub com.visualstudio.code
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub com.visualstudio.code
;;
esac
else
@@ -49,6 +45,4 @@ installVsCode() {
}
checkEnv
checkEscalationTool
checkAURHelper
installVsCode
@@ -26,13 +26,9 @@ installVsCodium() {
printf "%b\n" "[gitlab.com_paulcarroty_vscodium_repo]\nname=download.vscodium.com\nbaseurl=https://download.vscodium.com/rpms/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/-/raw/master/pub.gpg\nmetadata_expire=1h" | "$ESCALATION_TOOL" tee -a /etc/yum.repos.d/vscodium.repo
"$ESCALATION_TOOL" "$PACKAGER" install -y codium
;;
apk|xbps-install|eopkg)
checkFlatpak
flatpak install -y flathub com.vscodium.codium
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub com.vscodium.codium
;;
esac
else
@@ -42,6 +38,4 @@ installVsCodium() {
}
checkEnv
checkEscalationTool
checkAURHelper
installVsCodium
@@ -27,9 +27,9 @@ installZed() {
printf "%b" "Choose an option: "
read -r choice
case "$choice" in
1)
checkFlatpak
flatpak install -y flathub dev.zed.Zed
1)
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive flathub dev.zed.Zed
;;
2)
curl -f https://zed.dev/install.sh | sh
@@ -51,5 +51,4 @@ installZed() {
}
checkEnv
clear
installZed
@@ -122,6 +122,5 @@ docker_permission() {
}
checkEnv
checkEscalationTool
install_components
docker_permission
@@ -1,171 +0,0 @@
#!/bin/sh
. ../common-script.sh
. ../common-service-script.sh
setupDWM() {
printf "%b\n" "${YELLOW}Installing DWM-Titus...${RC}"
case "$PACKAGER" in # Install pre-Requisites
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm base-devel libx11 libxinerama libxft imlib2 git unzip flameshot nwg-look feh mate-polkit alsa-utils ghostty rofi xclip xarchiver thunar tumbler tldr gvfs thunar-archive-plugin dunst feh nwg-look dex xscreensaver xorg-xprop polybar picom xdg-user-dirs xdg-desktop-portal-gtk pipewire pavucontrol gnome-keyring flatpak
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
;;
esac
}
makeDWM() {
[ ! -d "$HOME/.local/share" ] && mkdir -p "$HOME/.local/share/"
if [ ! -d "$HOME/.local/share/dwm-titus" ]; then
printf "%b\n" "${YELLOW}DWM-Titus not found, cloning repository...${RC}"
cd "$HOME/.local/share/" && git clone https://github.com/ChrisTitusTech/dwm-titus.git # CD to Home directory to install dwm-titus This path can be changed (e.g. to linux-toolbox directory)
cd dwm-titus/ # Hardcoded path, maybe not the best.
else
printf "%b\n" "${GREEN}DWM-Titus directory already exists, replacing..${RC}"
cd "$HOME/.local/share/dwm-titus" && git pull
fi
"$ESCALATION_TOOL" make clean install # Run make clean install
}
install_nerd_font() {
# Check to see if the MesloLGS Nerd Font is installed (Change this to whatever font you would like)
FONT_NAME="MesloLGS Nerd Font Mono"
FONT_DIR="$HOME/.local/share/fonts"
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
FONT_INSTALLED=$(fc-list | grep -i "Meslo")
if [ -n "$FONT_INSTALLED" ]; then
printf "%b\n" "${GREEN}Meslo Nerd-fonts are already installed.${RC}"
return 0
fi
printf "%b\n" "${YELLOW}Installing Meslo Nerd-fonts${RC}"
# Create the fonts directory if it doesn't exist
if [ ! -d "$FONT_DIR" ]; then
mkdir -p "$FONT_DIR" || {
printf "%b\n" "${RED}Failed to create directory: $FONT_DIR${RC}"
return 1
}
fi
printf "%b\n" "${YELLOW}Installing font '$FONT_NAME'${RC}"
# Change this URL to correspond with the correct font
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
FONT_DIR="$HOME/.local/share/fonts"
TEMP_DIR=$(mktemp -d)
curl -sSLo "$TEMP_DIR"/"${FONT_NAME}".zip "$FONT_URL"
unzip "$TEMP_DIR"/"${FONT_NAME}".zip -d "$TEMP_DIR"
mkdir -p "$FONT_DIR"/"$FONT_NAME"
mv "${TEMP_DIR}"/*.ttf "$FONT_DIR"/"$FONT_NAME"
fc-cache -fv
rm -rf "${TEMP_DIR}"
printf "%b\n" "${GREEN}'$FONT_NAME' installed successfully.${RC}"
}
clone_config_folders() {
# Ensure the target directory exists
[ ! -d ~/.config ] && mkdir -p ~/.config
[ ! -d ~/.local/bin ] && mkdir -p ~/.local/bin
# Copy scripts to local bin
cp -rf "$HOME/.local/share/dwm-titus/scripts/." "$HOME/.local/bin/"
# Iterate over all directories in config/*
for dir in config/*/; do
# Extract the directory name
dir_name=$(basename "$dir")
# Clone the directory to ~/.config/
if [ -d "$dir" ]; then
cp -r "$dir" ~/.config/
printf "%b\n" "${GREEN}Cloned $dir_name to ~/.config/${RC}"
else
printf "%b\n" "${RED}Directory $dir_name does not exist, skipping${RC}"
fi
done
}
configure_backgrounds() {
# Set the variable PIC_DIR which stores the path for images
PIC_DIR="$HOME/Pictures"
# Set the variable BG_DIR to the path where backgrounds will be stored
BG_DIR="$PIC_DIR/backgrounds"
# Check if the ~/Pictures directory exists
if [ ! -d "$PIC_DIR" ]; then
# If it doesn't exist, print an error message and return with a status of 1 (indicating failure)
printf "%b\n" "${RED}Pictures directory does not exist${RC}"
mkdir ~/Pictures
printf "%b\n" "${GREEN}Directory was created in Home folder${RC}"
fi
# Check if the backgrounds directory (BG_DIR) exists
if [ ! -d "$BG_DIR" ]; then
# If the backgrounds directory doesn't exist, attempt to clone a repository containing backgrounds
if ! git clone https://github.com/ChrisTitusTech/nord-background.git "$PIC_DIR/backgrounds"; then
# If the git clone command fails, print an error message and return with a status of 1
printf "%b\n" "${RED}Failed to clone the repository${RC}"
return 1
fi
# Print a success message indicating that the backgrounds have been downloaded
printf "%b\n" "${GREEN}Downloaded desktop backgrounds to $BG_DIR${RC}"
else
# If the backgrounds directory already exists, print a message indicating that the download is being skipped
printf "%b\n" "${GREEN}Path $BG_DIR exists for desktop backgrounds, skipping download of backgrounds${RC}"
fi
}
setupDisplayManager() {
printf "%b\n" "${YELLOW}Setting up Xorg${RC}"
case "$PACKAGER" in
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm xorg-xinit xorg-server
;;
*)
printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}"
exit 1
;;
esac
printf "%b\n" "${GREEN}Xorg installed successfully${RC}"
printf "%b\n" "${YELLOW}Setting up Display Manager${RC}"
currentdm="none"
for dm in gdm sddm lightdm; do
if command -v "$dm" >/dev/null 2>&1 || isServiceActive "$dm"; then
currentdm="$dm"
break
fi
done
printf "%b\n" "${GREEN}Display Manager Setup: $currentdm${RC}"
if [ "$currentdm" = "none" ]; then
printf "%b\n" "${YELLOW}--------------------------${RC}"
DM="sddm"
case "$PACKAGER" in
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm "$DM"
if [ "$DM" = "lightdm" ]; then
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm lightdm-gtk-greeter
elif [ "$DM" = "sddm" ]; then
sh -c "$(curl -fsSL https://raw.githubusercontent.com/keyitdev/sddm-astronaut-theme/master/setup.sh)"
fi
;;
*)
printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}"
exit 1
;;
esac
printf "%b\n" "${GREEN}$DM installed successfully${RC}"
enableService "$DM"
fi
}
checkEnv
checkEscalationTool
setupDisplayManager
setupDWM
makeDWM
install_nerd_font
clone_config_folders
configure_backgrounds
@@ -91,7 +91,6 @@ setupFastfetchShell() {
}
checkEnv
checkEscalationTool
installFastfetch
setupFastfetchConfig
setupFastfetchShell
@@ -35,6 +35,5 @@ setupGhosttyConfig() {
}
checkEnv
checkEscalationTool
installGhostty
setupGhosttyConfig
@@ -14,5 +14,4 @@ themeinstall(){
}
checkEnv
checkEscalationTool
themeinstall
@@ -35,6 +35,5 @@ setupKittyConfig() {
}
checkEnv
checkEscalationTool
installKitty
setupKittyConfig
@@ -2,6 +2,16 @@
. ../common-script.sh
install_extra() {
printf "%b\n" "${YELLOW}Installing the manpage...${RC}"
"$ESCALATION_TOOL" mkdir -p /usr/share/man/man1
curl 'https://raw.githubusercontent.com/ChrisTitusTech/linutil/refs/heads/main/man/linutil.1' | "$ESCALATION_TOOL" tee '/usr/share/man/man1/linutil.1' > /dev/null
printf "%b\n" "${YELLOW}Creating a Desktop Entry...${RC}"
"$ESCALATION_TOOL" mkdir -p /usr/share/applications
curl 'https://raw.githubusercontent.com/ChrisTitusTech/linutil/refs/heads/main/linutil.desktop' | "$ESCALATION_TOOL" tee /usr/share/applications/linutil.desktop > /dev/null
printf "%b\n" "${GREEN}Done.${RC}"
}
installLinutil() {
printf "%b\n" "${YELLOW}Installing Linutil...${RC}"
case "$PACKAGER" in
@@ -35,7 +45,7 @@ installLinutil() {
read -r choice
case $choice in
y | Y)
if ! command_exists cargo; then
if ! command -v cargo > /dev/null 2>&1; then
printf "%b\n" "${YELLOW}Installing rustup...${RC}"
case "$PACKAGER" in
dnf)
@@ -52,11 +62,15 @@ installLinutil() {
esac
fi
rustup default stable
# shellcheck disable=SC1091
. "$HOME/.cargo/env"
if [ -f "$HOME/.cargo/env" ]; then
# shellcheck disable=SC1091
. "$HOME/.cargo/env"
else
export PATH="$HOME/.cargo/bin:$PATH"
fi
cargo install --force linutil_tui
printf "%b\n" "${GREEN}Installed successfully.${RC}"
installExtra
install_extra
;;
*) printf "%b\n" "${RED}Linutil not installed.${RC}" ;;
esac
@@ -64,17 +78,5 @@ installLinutil() {
esac
}
installExtra() {
printf "%b\n" "${YELLOW}Installing the manpage...${RC}"
"$ESCALATION_TOOL" mkdir -p /usr/share/man/man1
curl 'https://raw.githubusercontent.com/ChrisTitusTech/linutil/refs/heads/main/man/linutil.1' | "$ESCALATION_TOOL" tee '/usr/share/man/man1/linutil.1' > /dev/null
printf "%b\n" "${YELLOW}Creating a Desktop Entry...${RC}"
"$ESCALATION_TOOL" mkdir -p /usr/share/applications
curl 'https://raw.githubusercontent.com/ChrisTitusTech/linutil/refs/heads/main/linutil.desktop' | "$ESCALATION_TOOL" tee /usr/share/applications/linutil.desktop > /dev/null
printf "%b\n" "${GREEN}Done.${RC}"
}
checkEnv
checkEscalationTool
checkAURHelper
installLinutil
@@ -49,6 +49,4 @@ updateLinutil() {
}
checkEnv
checkEscalationTool
checkAURHelper
updateLinutil
@@ -117,7 +117,6 @@ linkConfig() {
}
checkEnv
checkEscalationTool
installDepend
cloneMyBash
installFont
@@ -34,6 +34,4 @@ installFreeOffice() {
}
checkEnv
checkEscalationTool
checkAURHelper
installFreeOffice
@@ -9,10 +9,6 @@ installLibreOffice() {
apt-get|nala)
"$ESCALATION_TOOL" "$PACKAGER" install -y libreoffice-core
;;
zypper|dnf)
checkFlatpak
flatpak install -y flathub org.libreoffice.LibreOffice
;;
pacman)
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm libreoffice-fresh
;;
@@ -26,8 +22,8 @@ installLibreOffice() {
"$ESCALATION_TOOL" "$PACKAGER" -y install libreoffice
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak --noninteractive org.libreoffice.LibreOffice
;;
esac
else
@@ -36,5 +32,4 @@ installLibreOffice() {
}
checkEnv
checkEscalationTool
installLibreOffice
@@ -3,32 +3,26 @@
. ../../common-script.sh
installOnlyOffice() {
if ! command_exists org.onlyoffice.desktopeditors && ! command_exists onlyoffice-desktopeditors; then
printf "%b\n" "${YELLOW}Installing Only Office..${RC}."
case "$PACKAGER" in
apt-get|nala)
curl -O https://download.onlyoffice.com/install/desktop/editors/linux/onlyoffice-desktopeditors_amd64.deb
"$ESCALATION_TOOL" "$PACKAGER" install -y ./onlyoffice-desktopeditors_amd64.deb
"$ESCALATION_TOOL" rm ./onlyoffice-desktopeditors_amd64.deb
;;
zypper|dnf|xbps-install|eopkg|apk)
checkFlatpak
"$ESCALATION_TOOL" flatpak install -y flathub org.onlyoffice.desktopeditors
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm onlyoffice
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
;;
esac
else
printf "%b\n" "${GREEN}Only Office is already installed.${RC}"
fi
if ! command_exists org.onlyoffice.desktopeditors && ! command_exists onlyoffice-desktopeditors; then
printf "%b\n" "${YELLOW}Installing Only Office..${RC}."
case "$PACKAGER" in
apt-get | nala)
curl -O https://download.onlyoffice.com/install/desktop/editors/linux/onlyoffice-desktopeditors_amd64.deb
"$ESCALATION_TOOL" "$PACKAGER" install -y ./onlyoffice-desktopeditors_amd64.deb
"$ESCALATION_TOOL" rm ./onlyoffice-desktopeditors_amd64.deb
;;
pacman)
"$AUR_HELPER" -S --needed --noconfirm onlyoffice-bin
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak --noninteractive org.onlyoffice.desktopeditors
;;
esac
else
printf "%b\n" "${GREEN}Only Office is already installed.${RC}"
fi
}
checkEnv
checkEscalationTool
checkAURHelper
installOnlyOffice
installOnlyOffice
@@ -11,7 +11,7 @@ installWpsOffice() {
;;
*)
checkFlatpak
flatpak install flathub com.wps.Office
"$ESCALATION_TOOL" flatpak install --noninteractive flathub com.wps.Office
;;
esac
else
@@ -20,6 +20,4 @@ installWpsOffice() {
}
checkEnv
checkEscalationTool
checkAURHelper
installWpsOffice
@@ -15,9 +15,13 @@ installEvince() {
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy evince
;;
*)
apt-get|nala|zypper|dnf|eopkg)
"$ESCALATION_TOOL" "$PACKAGER" install -y evince
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak --noninteractive org.gnome.Evince
;;
esac
else
printf "%b\n" "${GREEN}Evince is already installed.${RC}"
@@ -25,5 +29,4 @@ installEvince() {
}
checkEnv
checkEscalationTool
installEvince
@@ -15,9 +15,13 @@ installOkular() {
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy okular
;;
*)
apt-get|nala|zypper|dnf|eopkg)
"$ESCALATION_TOOL" "$PACKAGER" install -y okular
;;
*)
checkFlatpak
"$ESCALATION_TOOL" flatpak --noninteractive org.kde.okular
::
esac
else
printf "%b\n" "${GREEN}Okular is already installed.${RC}"
@@ -25,5 +29,4 @@ installOkular() {
}
checkEnv
checkEscalationTool
installOkular
installOkular
@@ -19,5 +19,4 @@ installPdfstudio() {
}
checkEnv
checkEscalationTool
installPdfstudio
@@ -19,5 +19,4 @@ installPdfstudioviewer() {
}
checkEnv
checkEscalationTool
installPdfstudioviewer
@@ -6,7 +6,7 @@ installPodmanCompose() {
if ! command_exists podman-compose; then
printf "%b\n" "${YELLOW}Installing Podman Compose...${RC}"
case "$PACKAGER" in
apt-get|nala|zypper|dnf)
apt-get|nala|dnf)
"$ESCALATION_TOOL" "$PACKAGER" install -y podman-compose
;;
pacman)
@@ -18,6 +18,18 @@ installPodmanCompose() {
xbps-install)
"$ESCALATION_TOOL" "$PACKAGER" -Sy podman-compose
;;
zypper)
if [ "$ID" = "opensuse-leap" ]; then
"$ESCALATION_TOOL" "$PACKAGER" addrepo "https://download.opensuse.org/repositories/devel:languages:python/$VERSION_ID/devel:languages:python.repo"
"$ESCALATION_TOOL" "$PACKAGER" --gpg-auto-import-keys refresh
"$ESCALATION_TOOL" "$PACKAGER" --gpg-auto-import-keys install -y podman-compose
elif [ "$ID" = "opensuse-tumbleweed" ]; then
"$ESCALATION_TOOL" "$PACKAGER" install -y podman-compose
else
printf "%b\n" "${RED}Unsupported openSUSE distro: ${ID}${RC}"
exit 1
fi
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ${PACKAGER}${RC}"
exit 1
@@ -29,5 +41,4 @@ installPodmanCompose() {
}
checkEnv
checkEscalationTool
installPodmanCompose
+28 -1
View File
@@ -24,6 +24,33 @@ installPodman() {
fi
}
addRegistry() {
printf "\n%b\n" "${YELLOW}Do you want to add docker.io to the list of unqualified search registries?${RC}"
printf "%b\n" "This allows using short names like 'postgres' instead of 'docker.io/library/postgres'. (y/n)${RC}"
read -r answer
if echo "$answer" | grep -qE '^[Yy]$'; then
printf "%b\n" "${YELLOW}Adding docker.io to registries...${RC}"
CONF_DIR="/etc/containers/registries.conf.d"
CONF_FILE="$CONF_DIR/10-unqualified-search-registries.conf"
REGISTRY_LINE='unqualified-search-registries = ["docker.io"]'
if [ ! -d "$CONF_DIR" ]; then
"$ESCALATION_TOOL" mkdir -p "$CONF_DIR"
fi
if ! grep -Fxq "$REGISTRY_LINE" "$CONF_FILE" 2>/dev/null; then
printf "%s\n" "$REGISTRY_LINE" | "$ESCALATION_TOOL" tee -a "$CONF_FILE" > /dev/null
printf "%b\n" "${GREEN}Successfully added docker.io to registries.${RC}"
else
printf "%b\n" "${YELLOW}docker.io already present in registries.${RC}"
fi
printf "%b\n" "${GREEN}Successfully added docker.io to registries.${RC}"
else
printf "%b\n" "${GREEN}Skipping registry addition.${RC}"
fi
}
checkEnv
checkEscalationTool
installPodman
addRegistry

Some files were not shown because too many files have changed in this diff Show More