Compare commits

...

64 Commits

Author SHA1 Message Date
dependabot[bot] be688ba129 chore(deps): bump tree-sitter-highlight from 0.26.9 to 0.26.10
Check for typos / check-typos (push) Has been cancelled
Bumps [tree-sitter-highlight](https://github.com/tree-sitter/tree-sitter) from 0.26.9 to 0.26.10.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](https://github.com/tree-sitter/tree-sitter/compare/v0.26.9...v0.26.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-29 19:53:19 +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
154 changed files with 2896 additions and 1315 deletions
-2
View File
@@ -42,7 +42,6 @@ body:
- Hyprland
- i3
- Other
- None
validations:
required: true
- type: input
@@ -60,7 +59,6 @@ body:
options:
- X11
- Wayland
- None
validations:
required: true
- type: input
+2 -2
View File
@@ -70,7 +70,7 @@ jobs:
${{ runner.temp }}/hugo_cache
key: ${{ steps.cache-restore.outputs.cache-primary-key }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v4
uses: actions/upload-pages-artifact@v5
with:
path: ./docs/public
@@ -84,4 +84,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
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/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2}')
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/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2}')
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" "koibtw" "lj3954" "jeevithakannan2")
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',
});
}
+3 -3
View File
@@ -21,14 +21,14 @@ jobs:
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 }}
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
steps:
- name: Check PR body for Type of Change
uses: actions/github-script@v7
uses: actions/github-script@v9
with:
script: |
const prBody = context.payload.pull_request.body || '';
+2 -2
View File
@@ -27,14 +27,14 @@ jobs:
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') }}
-61
View File
@@ -1,61 +0,0 @@
name: XTask Checks
permissions:
contents: read
on:
pull_request:
paths:
- "xtask"
- "Cargo.toml"
- "Cargo.lock"
- ".cargo"
- "core/tabs"
- "docs"
push:
paths:
- "xtask"
- "Cargo.toml"
- "Cargo.lock"
- ".cargo"
- "core/tabs"
- "docs"
env:
CARGO_TERM_COLOR: always
jobs:
docgen:
name: DocGen
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v5
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Cargo registry
uses: actions/cache@v4
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
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-index-
- name: Run cargo xtask docgen
run: cargo xtask docgen
- name: Check uncommitted documentation changes
run: |
if [[ -n $(git status --porcelain docs) ]]; then
echo "Please run 'cargo xtask docgen' and commit the changes.";
git --no-pager diff docs/generated;
exit 1;
fi
+25
View File
@@ -10,3 +10,28 @@ 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"
}
}
}
-5
View File
@@ -1,5 +0,0 @@
{
"chat.tools.terminal.autoApprove": {
"cargo build": true
}
}
+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
+358 -134
View File
@@ -43,9 +43,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "anstream"
version = "0.6.21"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -64,9 +64,9 @@ checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
[[package]]
name = "anstyle-parse"
version = "0.2.7"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
dependencies = [
"utf8parse",
]
@@ -97,6 +97,15 @@ version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
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"
@@ -202,9 +211,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.10.0"
version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
[[package]]
name = "bitstream-io"
@@ -317,10 +326,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "clap"
version = "4.5.60"
name = "chacha20"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a"
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",
@@ -328,9 +348,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.60"
version = "4.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876"
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
dependencies = [
"anstream",
"anstyle",
@@ -340,9 +360,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.55"
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
dependencies = [
"heck",
"proc-macro2",
@@ -414,6 +434,15 @@ 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"
@@ -454,7 +483,7 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"crossterm_winapi",
"derive_more",
"document-features",
@@ -517,12 +546,9 @@ dependencies = [
[[package]]
name = "deranged"
version = "0.5.5"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
dependencies = [
"powerfmt",
]
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
[[package]]
name = "derive_more"
@@ -723,10 +749,24 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
"r-efi",
"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"
@@ -770,6 +810,17 @@ dependencies = [
"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]]
name = "heck"
version = "0.5.0"
@@ -786,6 +837,12 @@ dependencies = [
"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"
@@ -794,9 +851,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "image"
version = "0.25.9"
version = "0.25.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a"
checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
dependencies = [
"bytemuck",
"byteorder-lite",
@@ -812,8 +869,8 @@ dependencies = [
"rayon",
"rgb",
"tiff",
"zune-core 0.5.1",
"zune-jpeg 0.5.11",
"zune-core",
"zune-jpeg",
]
[[package]]
@@ -859,6 +916,8 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
"hashbrown 0.16.1",
"serde",
"serde_core",
]
[[package]]
@@ -951,6 +1010,12 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "leb128fmt"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]]
name = "lebe"
version = "0.5.3"
@@ -959,9 +1024,9 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8"
[[package]]
name = "libc"
version = "0.2.180"
version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "libfuzzer-sys"
@@ -985,12 +1050,12 @@ version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
]
[[package]]
name = "linutil_core"
version = "26.3.5"
version = "26.5.21"
dependencies = [
"ego-tree",
"include_dir",
@@ -1002,16 +1067,16 @@ dependencies = [
[[package]]
name = "linutil_tui"
version = "26.3.5"
version = "26.5.21"
dependencies = [
"clap",
"image",
"linutil_core",
"nix 0.31.1",
"nix 0.31.3",
"oneshot",
"portable-pty",
"rand 0.9.2",
"ratatui 0.30.0",
"rand 0.10.1",
"ratatui 0.30.2",
"ratatui-image",
"time",
"tree-sitter-bash",
@@ -1074,11 +1139,11 @@ dependencies = [
[[package]]
name = "lru"
version = "0.16.3"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593"
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
dependencies = [
"hashbrown 0.16.1",
"hashbrown 0.17.1",
]
[[package]]
@@ -1121,9 +1186,9 @@ dependencies = [
[[package]]
name = "moxcms"
version = "0.7.11"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97"
checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
dependencies = [
"num-traits",
"pxfm",
@@ -1141,7 +1206,7 @@ version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"cfg-if",
"cfg_aliases 0.1.1",
"libc",
@@ -1149,11 +1214,11 @@ dependencies = [
[[package]]
name = "nix"
version = "0.31.1"
version = "0.31.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225e7cfe711e0ba79a68baeddb2982723e4235247aefce1482f2f16c27865b66"
checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"cfg-if",
"cfg_aliases 0.2.1",
"libc",
@@ -1186,9 +1251,9 @@ dependencies = [
[[package]]
name = "num-conv"
version = "0.2.0"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
[[package]]
name = "num-derive"
@@ -1254,9 +1319,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "oneshot"
version = "0.1.13"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107"
checksum = "cfe21416a02c693fb9f980befcb230ecc70b0b3d1cc4abf88b9675c4c1457f0c"
[[package]]
name = "ordered-float"
@@ -1279,6 +1344,7 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6"
dependencies = [
"approx",
"bytemuck",
"fast-srgb8",
"libm",
@@ -1338,7 +1404,7 @@ version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"crc32fast",
"fdeflate",
"flate2",
@@ -1387,6 +1453,16 @@ dependencies = [
"zerocopy",
]
[[package]]
name = "prettyplease"
version = "0.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
"syn",
]
[[package]]
name = "proc-macro2"
version = "1.0.106"
@@ -1446,7 +1522,7 @@ dependencies = [
"num-traits",
"ordered-float",
"palette",
"rand 0.9.2",
"rand 0.9.4",
"rand_xoshiro",
"rayon",
"ref-cast",
@@ -1461,9 +1537,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]]
name = "quote"
version = "1.0.44"
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
"proc-macro2",
]
@@ -1474,6 +1550,12 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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"
@@ -1482,9 +1564,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]]
name = "rand"
version = "0.8.5"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
dependencies = [
"libc",
"rand_chacha 0.3.1",
@@ -1493,14 +1575,25 @@ dependencies = [
[[package]]
name = "rand"
version = "0.9.2"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
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]]
name = "rand_chacha"
version = "0.3.1"
@@ -1539,6 +1632,12 @@ 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"
@@ -1554,7 +1653,7 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"cassowary",
"compact_str 0.8.1",
"indoc",
@@ -1570,30 +1669,32 @@ dependencies = [
[[package]]
name = "ratatui"
version = "0.30.0"
version = "0.30.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc"
checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d"
dependencies = [
"instability",
"ratatui-core",
"ratatui-crossterm",
"ratatui-widgets",
"serde",
]
[[package]]
name = "ratatui-core"
version = "0.1.0"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293"
checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"compact_str 0.9.0",
"hashbrown 0.16.1",
"indoc",
"hashbrown 0.17.1",
"itertools 0.14.0",
"kasuari",
"lru 0.16.3",
"strum 0.27.2",
"lru 0.18.0",
"palette",
"serde",
"strum 0.28.0",
"thiserror 2.0.18",
"unicode-segmentation",
"unicode-truncate 2.0.1",
@@ -1602,9 +1703,9 @@ dependencies = [
[[package]]
name = "ratatui-crossterm"
version = "0.1.0"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3"
checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0"
dependencies = [
"cfg-if",
"crossterm",
@@ -1614,34 +1715,36 @@ dependencies = [
[[package]]
name = "ratatui-image"
version = "10.0.5"
version = "11.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aab488b43d51a76c8ae4c184867aa0b5fbd5465e8c6a3d554d1acc8852ddf260"
checksum = "d413732e0e2f49577b59f35fa4ba9d5c4c0649fffe9541d9b43da10094058591"
dependencies = [
"base64-simd",
"icy_sixel",
"image",
"rand 0.8.5",
"ratatui 0.30.0",
"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.0"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db"
checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1"
dependencies = [
"bitflags 2.10.0",
"hashbrown 0.16.1",
"bitflags 2.13.0",
"hashbrown 0.17.1",
"indoc",
"instability",
"itertools 0.14.0",
"line-clipping",
"ratatui-core",
"strum 0.27.2",
"serde",
"strum 0.28.0",
"time",
"unicode-segmentation",
"unicode-width 0.2.0",
@@ -1674,7 +1777,7 @@ dependencies = [
"num-traits",
"paste",
"profiling",
"rand 0.9.2",
"rand 0.9.4",
"rand_chacha 0.9.0",
"simd_helpers",
"thiserror 2.0.18",
@@ -1684,9 +1787,9 @@ dependencies = [
[[package]]
name = "ravif"
version = "0.12.0"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285"
checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45"
dependencies = [
"avif-serialize",
"imgref",
@@ -1723,7 +1826,7 @@ version = "0.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
]
[[package]]
@@ -1796,7 +1899,7 @@ version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"errno",
"libc",
"linux-raw-sys 0.4.15",
@@ -1809,7 +1912,7 @@ version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
dependencies = [
"bitflags 2.10.0",
"bitflags 2.13.0",
"errno",
"libc",
"linux-raw-sys 0.11.0",
@@ -1843,6 +1946,12 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "self_cell"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89"
[[package]]
name = "semver"
version = "1.0.27"
@@ -1895,9 +2004,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
version = "1.0.4"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776"
checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
dependencies = [
"serde_core",
]
@@ -2022,11 +2131,11 @@ dependencies = [
[[package]]
name = "strum"
version = "0.27.2"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd"
dependencies = [
"strum_macros 0.27.2",
"strum_macros 0.28.0",
]
[[package]]
@@ -2044,9 +2153,9 @@ dependencies = [
[[package]]
name = "strum_macros"
version = "0.27.2"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664"
dependencies = [
"heck",
"proc-macro2",
@@ -2056,9 +2165,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.114"
version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
"proc-macro2",
"quote",
@@ -2119,26 +2228,25 @@ dependencies = [
[[package]]
name = "tiff"
version = "0.10.3"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f"
checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52"
dependencies = [
"fax",
"flate2",
"half",
"quick-error",
"weezl",
"zune-jpeg 0.4.21",
"zune-jpeg",
]
[[package]]
name = "time"
version = "0.3.47"
version = "0.3.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327"
dependencies = [
"deranged",
"itoa",
"libc",
"num-conv",
"num_threads",
@@ -2150,15 +2258,15 @@ dependencies = [
[[package]]
name = "time-core"
version = "0.1.8"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
[[package]]
name = "time-macros"
version = "0.2.27"
version = "0.2.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935"
dependencies = [
"num-conv",
"time-core",
@@ -2166,9 +2274,9 @@ dependencies = [
[[package]]
name = "toml"
version = "0.9.11+spec-1.1.0"
version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46"
checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee"
dependencies = [
"indexmap",
"serde_core",
@@ -2181,33 +2289,33 @@ dependencies = [
[[package]]
name = "toml_datetime"
version = "0.7.5+spec-1.1.0"
version = "1.1.1+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
dependencies = [
"serde_core",
]
[[package]]
name = "toml_parser"
version = "1.0.6+spec-1.1.0"
version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
dependencies = [
"winnow",
]
[[package]]
name = "toml_writer"
version = "1.0.6+spec-1.1.0"
version = "1.1.1+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
[[package]]
name = "tree-sitter"
version = "0.26.6"
version = "0.26.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13f456d2108c3fef07342ba4689a8503ec1fb5beed245e2b9be93096ef394848"
checksum = "3c343ed63e3f5c64d1acdecb5d2c13d4e169cb5fde0052106ebaa6c6f27f9e55"
dependencies = [
"cc",
"regex",
@@ -2229,9 +2337,9 @@ dependencies = [
[[package]]
name = "tree-sitter-highlight"
version = "0.26.6"
version = "0.26.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "185918b7780c968608f2bd079233349df795846ac79562b3fd38477e287fca5c"
checksum = "51d5c68e5dba9c2818166330961143812b22a286e51a107a0733766b50dfc87d"
dependencies = [
"regex",
"streaming-iterator",
@@ -2247,9 +2355,9 @@ checksum = "4ae62f7eae5eb549c71b76658648b72cc6111f2d87d24a1e31fa907f4943e3ce"
[[package]]
name = "tui-term"
version = "0.3.1"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16f4d2473af6ae50523181a971dd8c8557416ece8ba4fcd2d63331be6f73759c"
checksum = "a338ded85dbe7f9ea2298321d126244f54e531e2b2006b97abdab8e47d6f3c88"
dependencies = [
"ratatui-core",
"ratatui-widgets",
@@ -2301,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"
@@ -2375,6 +2489,15 @@ 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"
@@ -2420,6 +2543,40 @@ 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"
@@ -2428,9 +2585,9 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
[[package]]
name = "which"
version = "8.0.2"
version = "8.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459"
checksum = "c789537cf2f7f55be8e6192f92e464174ee55f91af622777f7f1ceb0dbccd03e"
dependencies = [
"libc",
]
@@ -2621,9 +2778,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.7.14"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
[[package]]
name = "winreg"
@@ -2639,6 +2796,88 @@ name = "wit-bindgen"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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"
@@ -2651,7 +2890,7 @@ dependencies = [
[[package]]
name = "xtask"
version = "26.3.5"
version = "26.5.21"
dependencies = [
"linutil_core",
]
@@ -2688,12 +2927,6 @@ version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7"
[[package]]
name = "zune-core"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
[[package]]
name = "zune-core"
version = "0.5.1"
@@ -2709,20 +2942,11 @@ dependencies = [
"simd-adler32",
]
[[package]]
name = "zune-jpeg"
version = "0.4.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"
dependencies = [
"zune-core 0.4.12",
]
[[package]]
name = "zune-jpeg"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2"
dependencies = [
"zune-core 0.5.1",
"zune-core",
]
+1 -1
View File
@@ -5,7 +5,7 @@ default-members = ["tui", "core"]
resolver = "2"
[workspace.package]
license = "MIT"
version = "26.3.5"
version = "26.5.21"
edition = "2021"
[profile.release]
+3 -3
View File
@@ -126,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
@@ -150,3 +148,5 @@ Thank you to everyone who has contributed to the development of Linutil. Your ef
- 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",
]
+1 -1
View File
@@ -12,5 +12,5 @@ ego-tree = "0.11.0"
include_dir = "0.7.4"
serde = { version = "1.0.215", features = ["derive"] }
temp-dir = "0.2.0"
toml = { version = "0.9.11", features = ["parse", "serde"] }
toml = { version = "1.1.2", features = ["parse", "serde"] }
which = "8.0.2"
+2 -2
View File
@@ -79,8 +79,8 @@ mod tests {
let config = Config::read_config(&config_path, &tab_list);
assert_eq!(config.auto_execute_commands.len(), 1);
assert_eq!(config.skip_confirmation, true);
assert_eq!(config.size_bypass, false);
assert!(config.skip_confirmation);
assert!(!config.size_bypass);
drop(temp_dir);
}
@@ -37,6 +37,5 @@ setupAlacrittyConfig() {
}
checkEnv
checkEscalationTool
installAlacritty
setupAlacrittyConfig
@@ -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
@@ -13,10 +13,8 @@ installArdour() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter ardour
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.ardour.Ardour
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.ardour.Ardour
;;
esac
else
@@ -36,7 +34,6 @@ uninstallArdour() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.ardour.Ardour
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installAudacity() {
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm --cleanafter audacity
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.audacityteam.Audacity
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.audacityteam.Audacity
;;
esac
else
@@ -36,7 +34,6 @@ uninstallAudacity() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.audacityteam.Audacity
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installBlender() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter blender
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.blender.Blender
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.blender.Blender
;;
esac
else
@@ -36,7 +34,6 @@ uninstallBlender() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.blender.Blender
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installDarktable() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter darktable
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.darktable.Darktable
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.darktable.Darktable
;;
esac
else
@@ -36,7 +34,6 @@ uninstallDarktable() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.darktable.Darktable
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installGIMP() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter gimp
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.gimp.GIMP
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.gimp.GIMP
;;
esac
else
@@ -36,7 +34,6 @@ uninstallGIMP() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.gimp.GIMP
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installHandbrake() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter handbrake
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive fr.handbrake.ghb
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive fr.handbrake.ghb
;;
esac
else
@@ -36,7 +34,6 @@ uninstallHandbrake() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive fr.handbrake.ghb
exit 1
;;
esac
else
@@ -57,5 +54,4 @@ main() {
esac
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installInkscape() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter inkscape
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.inkscape.Inkscape
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.inkscape.Inkscape
;;
esac
else
@@ -36,7 +34,6 @@ uninstallInkscape() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.inkscape.Inkscape
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installKrita() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter krita
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.kde.krita
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.kde.krita
;;
esac
else
@@ -36,7 +34,6 @@ uninstallKrita() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.kde.krita
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installMyPaint() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter mypaint
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.mypaint.MyPaint
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.mypaint.MyPaint
;;
esac
else
@@ -36,7 +34,6 @@ uninstallMyPaint() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.mypaint.mypaint
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -4,7 +4,8 @@
installNatron() {
printf "%b\n" "${YELLOW}Installing Natron...${RC}"
if ! command_exists natron && command_exists flatpak; then
if ! command_exists natron; then
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive fr.natron.natron
else
printf "%b\n" "${GREEN}Natron is already installed.${RC}"
@@ -34,5 +35,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -17,10 +17,8 @@ installObsStudio() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter obs-studio
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive com.obsproject.Studio
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.obsproject.Studio
;;
esac
else
@@ -40,7 +38,6 @@ uninstallObsStudio() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive com.obsproject.Studio
exit 1
;;
esac
else
@@ -62,5 +59,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installOlive() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter olive
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.olivevideoeditor.Olive
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.olivevideoeditor.Olive
;;
esac
else
@@ -36,7 +34,6 @@ uninstallOlive() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.olivevideoeditor.Olive
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installOpenShot() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter openshot
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.openshot.OpenShot
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.openshot.OpenShot
;;
esac
else
@@ -36,7 +34,6 @@ uninstallOpenShot() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.openshot.OpenShot
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installPinta() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter pinta
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive com.github.PintaProject.Pinta
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive com.github.PintaProject.Pinta
;;
esac
else
@@ -36,7 +34,6 @@ uninstallPinta() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive com.github.PintaProject.Pinta
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installScribus() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter scribus
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive net.scribus.Scribus
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive net.scribus.Scribus
;;
esac
else
@@ -36,7 +34,6 @@ uninstallScribus() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive net.scribus.Scribus
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installSynfigStudio() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter synfigstudio
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.synfig.SynfigStudio
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.synfig.SynfigStudio
;;
esac
else
@@ -36,7 +34,6 @@ uninstallSynfigStudio() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.synfig.SynfigStudio
exit 1
;;
esac
else
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -10,10 +10,8 @@ installTenacity() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter tenacity
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.tenacityaudio.Tenacity
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.tenacityaudio.Tenacity
;;
esac
else
@@ -30,7 +28,6 @@ uninstallTenacity() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.tenacityaudio.Tenacity
exit 1
;;
esac
else
@@ -52,5 +49,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -7,7 +7,7 @@ installCursor() {
printf "%b\n" "${YELLOW}Installing Cursor...${RC}"
case "$PACKAGER" in
apt-get|nala)
TEMP_DEB="cursor.deb"
TEMP_DEB="./cursor.deb"
curl -sSLo "$TEMP_DEB" 'https://api2.cursor.sh/updates/download/golden/linux-x64-deb/cursor/latest'
@@ -38,6 +38,4 @@ installCursor() {
}
checkEnv
checkEscalationTool
checkAURHelper
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,180 +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 libxcb git unzip flameshot nwg-look feh mate-polkit alsa-utils ghostty rofi xclip xarchiver thunar tumbler tldr gvfs thunar-archive-plugin dunst dex xscreensaver xorg-xprop xorg-xrandr xorg-xsetroot xorg-xset polybar picom xdg-user-dirs xdg-desktop-portal-gtk pipewire pavucontrol gnome-keyring flatpak networkmanager network-manager-applet noto-fonts-emoji
;;
*)
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/"
# Install Polybar icon fonts (MaterialIcons, Feather)
FONT_DIR="$HOME/.local/share/fonts"
mkdir -p "$FONT_DIR"
if [ -d "$HOME/.local/share/dwm-titus/polybar/fonts" ]; then
cp -r "$HOME/.local/share/dwm-titus/polybar/fonts/"* "$FONT_DIR/"
fc-cache -fv
printf "%b\n" "${GREEN}Polybar icon fonts installed${RC}"
fi
# 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
@@ -79,6 +79,4 @@ installLinutil() {
}
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
@@ -11,16 +11,12 @@ installOnlyOffice() {
"$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-bin
;;
*)
printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}"
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak --noninteractive org.onlyoffice.desktopeditors
;;
esac
else
@@ -29,6 +25,4 @@ installOnlyOffice() {
}
checkEnv
checkEscalationTool
checkAURHelper
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
@@ -41,5 +41,4 @@ installPodmanCompose() {
}
checkEnv
checkEscalationTool
installPodmanCompose
@@ -52,6 +52,5 @@ addRegistry() {
}
checkEnv
checkEscalationTool
installPodman
addRegistry
@@ -40,6 +40,5 @@ setupRofiConfig() {
}
checkEnv
checkEscalationTool
installRofi
setupRofiConfig
@@ -38,6 +38,5 @@ installExtra() {
}
checkEnv
checkEscalationTool
checkFlatpak
installExtra
+6 -6
View File
@@ -273,6 +273,12 @@ description = "Brave is a free and open-source web browser developed by Brave So
script = "browsers/brave.sh"
task_list = "I"
[[data.entries]]
name = "Brave Origin"
description = "Brave Origin is a minimalist version of Brave that strips out optional features like VPN, crypto wallet, Rewards, and Leo AI, keeping only core privacy protections and ad blocking."
script = "browsers/brave-origin.sh"
task_list = "I"
[[data.entries]]
name = "Chromium"
description = "Chromium is an open-source web browser project started by Google, to provide the source code for the proprietary Google Chrome browser."
@@ -357,12 +363,6 @@ description = "Docker is an open platform that uses OS-level virtualization to d
script = "docker-setup.sh"
task_list = "I SS"
[[data]]
name = "DWM-Titus"
description = "DWM is a dynamic window manager for X.\nIt manages windows in tiled, monocle and floating layouts.\nAll of the layouts can be applied dynamically, optimising the environment for the application in use and the task performed.\nThis command installs and configures DWM and a desktop manager.\nThe list of patches applied can be found in CTT's DWM repository\nhttps://github.com/ChrisTitusTech/dwm-titus"
script = "dwmtitus-setup.sh"
task_list = "I PFM SS"
[[data]]
name = "Fastfetch"
description = "Fastfetch is a neofetch-like tool for fetching system information and displaying it prettily. It is written mainly in C, with performance and customizability in mind. This command installs fastfetch and configures from CTT's mybash repository. https://github.com/ChrisTitusTech/mybash"
@@ -79,8 +79,6 @@ setupWaydroid() {
}
checkEnv
checkEscalationTool
checkAURHelper
checkGpu
installWaydroid
setupWaydroid
@@ -55,6 +55,5 @@ EOL
}
checkEnv
checkEscalationTool
installZsh
setupZshConfig
+9 -2
View File
@@ -72,8 +72,15 @@ checkAURHelper() {
printf "%b\n" "${YELLOW}Installing yay as AUR helper...${RC}"
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm base-devel git
cd /opt && "$ESCALATION_TOOL" git clone https://aur.archlinux.org/yay-bin.git && "$ESCALATION_TOOL" chown -R "$USER":"$USER" ./yay-bin
cd yay-bin && makepkg --noconfirm -si
TMP_BUILD_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_BUILD_DIR"' 0
git clone https://aur.archlinux.org/yay-bin.git "$TMP_BUILD_DIR/yay-bin"
(
cd "$TMP_BUILD_DIR/yay-bin"
makepkg --noconfirm -si
)
rm -rf "$TMP_BUILD_DIR"
trap - 0
if command_exists yay; then
AUR_HELPER="yay"
+2 -6
View File
@@ -10,10 +10,8 @@ installbsnes() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter bsnes-hd
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive dev.bsnes.bsnes
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive dev.bsnes.bsnes
;;
esac
else
@@ -30,7 +28,6 @@ uninstallbsnes() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive dev.bsnes.bsnes
exit 1
;;
esac
else
@@ -52,5 +49,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -13,10 +13,8 @@ installDolphin() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter dolphin-emu
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive org.DolphinEmu.dolphin-emu
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive org.DolphinEmu.dolphin-emu
;;
esac
else
@@ -36,7 +34,6 @@ uninstallDolphin() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive org.DolphinEmu.dolphin-emu
exit 1
;;
esac
else
@@ -48,7 +45,7 @@ main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Dolphin${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-3]: "
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installDolphin ;;
@@ -58,5 +55,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -16,10 +16,8 @@ installgopher64() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter gopher64
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive io.github.gopher64.gopher64
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive io.github.gopher64.gopher64
;;
esac
else
@@ -41,10 +39,7 @@ uninstallgopher64() {
"$AUR_HELPER" -R --noconfirm --cleanafter gopher64
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak uninstall --noninteractive io.github.gopher64.gopher64
fi
exit 1
"$ESCALATION_TOOL" flatpak uninstall --noninteractive io.github.gopher64.gopher64
;;
esac
else
@@ -56,7 +51,7 @@ main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall gopher64${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-3]: "
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installgopher64 ;;
@@ -66,6 +61,5 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -10,10 +10,8 @@ installMelonDS() {
"$AUR_HELPER" -S --needed --noconfirm --cleanafter melonds-bin
;;
*)
if command_exists flatpak; then
"$ESCALATION_TOOL" flatpak install --noninteractive net.kuribo64.melonDS
fi
exit 1
checkFlatpak
"$ESCALATION_TOOL" flatpak install --noninteractive net.kuribo64.melonDS
;;
esac
else
@@ -30,7 +28,6 @@ uninstallMelonDS() {
;;
*)
"$ESCALATION_TOOL" flatpak uninstall --noninteractive net.kuribo64.melonDS
exit 1
;;
esac
else
@@ -42,7 +39,7 @@ main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall MelonDS${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-3]: "
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installMelonDS ;;
@@ -52,5 +49,4 @@ main() {
}
checkEnv
checkEscalationTool
main
@@ -40,7 +40,7 @@ main() {
printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Mesen2${RC}"
printf "%b\n" "1. ${YELLOW}Install${RC}"
printf "%b\n" "2. ${YELLOW}Uninstall${RC}"
printf "%b" "Enter your choice [1-3]: "
printf "%b" "Enter your choice [1-2]: "
read -r CHOICE
case "$CHOICE" in
1) installMesen2 ;;
@@ -50,5 +50,4 @@ main() {
}
checkEnv
checkEscalationTool
main

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