add agent and spec sheets
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user