Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| be688ba129 | |||
| 9be14fe058 | |||
| 50e6e33c91 | |||
| 28ab9a8ca5 | |||
| 29ac0ef394 | |||
| dbadadff86 | |||
| da55a2e47a | |||
| d6d0f11beb | |||
| 3038c24820 | |||
| 1316e9a953 | |||
| e6b4d0b724 | |||
| 4eeb01a308 | |||
| 7fadb7b3e3 | |||
| e07b62d2ad | |||
| 2682c35cd1 | |||
| 3da4fb76e4 | |||
| 6fef076083 | |||
| dabddd5692 | |||
| f3946bf4a4 | |||
| c770e88764 | |||
| 8502628b87 | |||
| 7ab6f204f3 | |||
| 8ff6898b8b | |||
| f80bc288fb | |||
| 6618e78060 | |||
| 4d6018df77 | |||
| 466e49dce9 | |||
| c7e54991db | |||
| 559fc9da35 | |||
| 969f7ad85e | |||
| 9f13a8f3ac | |||
| 3548a65952 | |||
| 9dfbe571d6 | |||
| d9e279ffa5 | |||
| 1f97bdbe60 | |||
| ef57ca2590 | |||
| 41eb13f8b1 | |||
| 04de00bf07 | |||
| 42a0dbd0df | |||
| 777fb0f73a | |||
| ddc543c459 | |||
| b114e376d8 | |||
| 792e5df6ba | |||
| b4df724a6b | |||
| 8db0ddbad4 | |||
| 885947c169 | |||
| 26113dda40 | |||
| 92777e4b33 | |||
| 9eabc12212 | |||
| f4ef6a0430 | |||
| 845c158bcf | |||
| 94d6d9470c | |||
| 22a5c08e57 | |||
| 39d2922162 | |||
| 7aac634f4c | |||
| a8156e1d32 | |||
| 7d2ac8e4a4 | |||
| 5db155017a | |||
| 7b748c38ab | |||
| 48865a9c5c | |||
| 6b77344be8 | |||
| 76b5d73e39 | |||
| 433b47bbb8 | |||
| 81b5f77a92 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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 || '';
|
||||
|
||||
@@ -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') }}
|
||||
|
||||
@@ -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
@@ -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?
|
||||
*~
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"chat.tools.terminal.autoApprove": {
|
||||
"cargo build": true
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -3,5 +3,5 @@ extend-exclude = ["tui/cool_tips.txt"]
|
||||
|
||||
[default]
|
||||
extend-ignore-identifiers-re = [
|
||||
"ratatui",
|
||||
"(?i)ratatui",
|
||||
]
|
||||
|
||||
+1
-1
@@ -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
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user