diff --git a/.copilotignore b/.copilotignore
index 51bf53c3..b8c26092 100644
--- a/.copilotignore
+++ b/.copilotignore
@@ -104,7 +104,7 @@ __pycache__/
python_pkg/cinema_planner/pasted_content.txt
# Large data files (exceed indexing limits)
-linux_configuration/scripts/digital_wellbeing/pacman/words.txt
+linux_configuration/digital_wellbeing/pacman/words.txt
# C build artifacts
**/*.out
diff --git a/.github/skills/efficient-polling-scripts/SKILL.md b/.github/skills/efficient-polling-scripts/SKILL.md
index 1ceb4b95..c8026d35 100644
--- a/.github/skills/efficient-polling-scripts/SKILL.md
+++ b/.github/skills/efficient-polling-scripts/SKILL.md
@@ -211,6 +211,6 @@ cached snapshot tools, some builds don't refresh them between calls.
- `linux_configuration/i3-configuration/i3blocks/battery_status.sh` — zero-fork via `/sys/class/power_supply`.
- `linux_configuration/i3-configuration/i3blocks/cpu_monitor.sh` — zero-fork via `/proc/loadavg` + `/sys/class/hwmon`.
- `linux_configuration/i3-configuration/i3blocks/motherboard_temp.sh` — zero-fork via `/sys/class/hwmon`.
-- `linux_configuration/scripts/system-maintenance/systemd/monitors.slice` — resource-cap slice.
+- `linux_configuration/system-maintenance/systemd/monitors.slice` — resource-cap slice.
- `phone_focus_mode/dns_enforcer.sh::chain_intact()`/`expected_rule_count()` — R9's hash/count-gate pattern, fixed 2026-07-03 after it was found pegging Android's `netd` at ~50% CPU.
- `phone_focus_mode/hosts_enforcer.sh::sync_magisk_module` — the original hash-before-write pattern R9 mirrors.
diff --git a/.github/skills/self-hosted-service-exposure/SKILL.md b/.github/skills/self-hosted-service-exposure/SKILL.md
index da349a91..d574a6c1 100644
--- a/.github/skills/self-hosted-service-exposure/SKILL.md
+++ b/.github/skills/self-hosted-service-exposure/SKILL.md
@@ -13,7 +13,7 @@ description: Use BEFORE deploying any Docker-based self-hosted service on this m
`setup_wireguard_ssh.sh`'s own `setup_duckdns()` also has a
`duckdns_already_updated()` guard for this reason. **Do not add a second one.**
- **The firewall is owned entirely by**
- `linux_configuration/scripts/single_use/features/setup_wireguard_ssh.sh`. It
+ `linux_configuration/features/setup_wireguard_ssh.sh`. It
regenerates `/etc/nftables.conf` from scratch on every `setup` run (`flush
ruleset` + fixed heredoc). **Never hand-edit `/etc/nftables.conf` directly or
from a second script** — the next `setup` re-run (e.g. adding a WireGuard peer)
@@ -139,7 +139,7 @@ own startup, independent of `docker compose` ever being re-invoked.
## Reference implementation
-`linux_configuration/scripts/single_use/features/setup_gitea.sh` and
+`linux_configuration/features/setup_gitea.sh` and
`migrate_github_to_gitea.sh` are working, idempotent examples of this whole
pattern end to end (firewall, Caddy, headless bootstrap, host networking
workaround, least-privilege external credential). Copy the shape, not
diff --git a/.gitignore b/.gitignore
index 62f4893d..9b4fbb00 100644
--- a/.gitignore
+++ b/.gitignore
@@ -373,15 +373,15 @@ out.txt
# Locally built Arch packages. The PKGBUILD and installer script are the source
# and stay tracked; the built artifact is a ~600 MB binary that must never be
# committed (see memories/binary-files.md).
-linux_configuration/scripts/single_use/*/*.pkg.tar.zst
-linux_configuration/scripts/single_use/*/*.pkg.tar.xz
+linux_configuration/*/*.pkg.tar.zst
+linux_configuration/*/*.pkg.tar.xz
# Wine/Bottles prefixes — local runtime state, not source.
bottles/
# archwiki_rag local vector index: regenerated by `reindex`, machine-specific,
# and full of binary sqlite/parquet blobs.
-linux_configuration/scripts/periodic_background/digital_wellbeing/data/
+linux_configuration/periodic_background/digital_wellbeing/data/
# ===========================================================================
# billsplit (Flutter) — launcher icons & platform assets MUST live in-repo
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f2963a81..b6d9ab05 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -37,9 +37,9 @@ repos:
# chattr +i (self-commitment lock on the shutdown-enforcement
# script) makes this file unwritable on purpose; the fixer hooks
# can't open it for writing even as the owning user.
- exclude: ^linux_configuration/scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown\.sh$
+ exclude: ^linux_configuration/periodic_background/digital_wellbeing/setup_midnight_shutdown\.sh$
- id: end-of-file-fixer
- exclude: ^linux_configuration/scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown\.sh$
+ exclude: ^linux_configuration/periodic_background/digital_wellbeing/setup_midnight_shutdown\.sh$
- id: check-yaml
args: [--unsafe]
- id: check-json
@@ -218,7 +218,7 @@ repos:
(?x)^(
Bash/.*|
\.venv/.*|
- linux_configuration/scripts/single_use/misc/testsAndMisc-bash/tools/.*
+ linux_configuration/misc/testsAndMisc-bash/tools/.*
)$
additional_dependencies:
- types-requests
diff --git a/AGENTS.md b/AGENTS.md
index 1dc396d5..b1fbfd01 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -9,7 +9,6 @@ Mixed-language monorepo: Python packages, Bash automation, and several apps.
| `python_pkg/` | Python packages — every `.py` in the repo belongs here or in an allowlisted dir |
| `meta/` | Repo-wide tooling: `pyproject.toml`, `requirements.txt`, `run.sh`, `lint_python.sh`, `.fvmrc`, `scripts/` |
| `linux_configuration/` | Arch setup, i3 config, system maintenance, and the tracked git hooks |
-| `billsplit/` | Receipt bill-splitting Flutter app (Dart) |
| `bottles/` | Small standalone project |
| `docs/` | Reference docs; `docs/superpowers/` holds AI workflow artifacts |
| `third_party/` | Vendored upstream skills/agents |
@@ -18,6 +17,14 @@ Root `pyproject.toml`, `requirements.txt`, `run.sh`, `lint_python.sh` and
`.fvmrc` are **symlinks into `meta/`** — edit the files in `meta/`, not the
symlinks.
+`linux_configuration/` has no `scripts/` or `single_use/` level: those two were
+pure taxonomy carrying no information, and the directory-depth cap does not
+leave room for them. Categories sit directly under it — `features/`, `fixes/`,
+`utils/`, `misc/`, `fresh-install/`, `installers/`, `diagnostics/`, `gaming/`,
+`boot_recovery/`, `periodic_background/`, `lib/`, `meta/`, `tests/`. A script's
+own `lib/` and `tests/` subdirectories are exempt from the cap, so those stay
+where they are.
+
Extracted to their own repos: [`steam-backlog-enforcer`](https://github.com/kuhyx/steam-backlog-enforcer),
[`screen-locker`](https://github.com/kuhyx/screen-locker),
[`diet-guard`](https://github.com/kuhyx/diet-guard),
@@ -38,18 +45,19 @@ Archived work: [`testsAndMisc-archive`](https://github.com/kuhyx/testsAndMisc-ar
## Adding a Flutter app
-`billsplit/` is currently the only one, and the only place binaries are
-committed. To add another, repeat **both** halves or the icons fail silently:
+There is currently no Flutter app here — `billsplit/` was archived, and with it
+the only committed binaries. Adding one means repeating **both** halves or the
+icons fail silently:
1. Add the icon globs to `.binary-allowlist`.
2. Add matching `!` overrides at the end of `.gitignore` — an ignored file
fails silently on `git add` rather than erroring.
-Icons come from the shared generator in `python_pkg/app_icons/`. Dart style is
-gated by CI only (`.github/workflows/billsplit-ci.yml`), not by a local hook.
-Keep app dirs free of Python: the `check-python-location` hook requires every
-`.py` to sit under `python_pkg/` (or `linux_configuration/`, `meta/scripts/`). `billsplit/`'s coverage gate therefore lives at
-`python_pkg/billsplit_coverage/`.
+Icons come from the shared generator in `python_pkg/app_icons/`. Dart style
+needs its own CI workflow; there is no local hook for it. Keep app dirs free of
+Python: the `check-python-location` hook requires every `.py` to sit under
+`python_pkg/` (or `linux_configuration/`, `meta/scripts/`), so an app's coverage
+gate lives in `python_pkg/`.
## Git Workflow
diff --git a/NEXT_SESSION_PROMPT.md b/NEXT_SESSION_PROMPT.md
index 468f90cf..b6bdfc65 100644
--- a/NEXT_SESSION_PROMPT.md
+++ b/NEXT_SESSION_PROMPT.md
@@ -32,7 +32,7 @@ branches, measured in a clean worktree. **File-length cap needs nothing:** 0
violations, hook-enforced.
**What is left, if anyone wants it:** 8 directories still have no suite at all
-(`.githooks/lib`, `scripts/meta/lib`, `mtk_root/lib`, `digital_wellbeing/{pacman,
+(`.githooks/lib`, `meta/lib`, `mtk_root/lib`, `digital_wellbeing/{pacman,
virtualbox}/lib`, `system-maintenance/bin/lib`, `single_use/{fresh-install,}/lib`)
— 20 libs, ~1,980 lines. All are allowlisted, so nothing is blocked. This is
optional work now, not a campaign.
@@ -100,7 +100,7 @@ SP=$(mktemp -d); git worktree add --detach --quiet "$SP/co" HEAD
time (cd "$SP/co" && SKIP=pytest-coverage pre-commit run --all-files)
time (cd "$SP/co" && python meta/scripts/pytest_changed_packages.py)
-time bash linux_configuration/scripts/single_use/fixes/lib/tests/run_all.sh
+time bash linux_configuration/fixes/lib/tests/run_all.sh
git worktree remove --force "$SP/co"
```
@@ -242,7 +242,7 @@ the shape before you spend it.
## The suite and its harnesses
-`linux_configuration/scripts/single_use/fixes/lib/tests/` is the reference
+`linux_configuration/fixes/lib/tests/` is the reference
suite: **30 test files, 645 assertions, all green, zero suppressions, 37s.**
Copy its shape. Layers:
diff --git a/NEXT_SESSION_RESTRUCTURE.md b/NEXT_SESSION_RESTRUCTURE.md
index 3779380d..aa068f85 100644
--- a/NEXT_SESSION_RESTRUCTURE.md
+++ b/NEXT_SESSION_RESTRUCTURE.md
@@ -15,7 +15,7 @@ patterns at all).
**Extracted** to public repos, full history, each with CI it did not have here:
`reverse-survivors`, `kcd2-dice-solver` (cloned to `~/kcd2-dice-solver`),
`focus-owner`, `mtk-root` (took the four `mtk_*` libs and three suites that
-lived in `scripts/lib/`).
+lived in `lib/`).
**Gates written, deliberately NOT wired**: `meta/scripts/check_directory_depth.sh`
(cap 2; exempts `third_party/`, `docs/superpowers/`, `.github/skills/` by prefix
@@ -29,7 +29,7 @@ Depth, tests and pre-commit verified green at every commit; nothing used
- **Depth cap is 2**, with `lib/` and `tests/` exempt — so the ~118 single_use
lib files stay put and step D only flattens entry scripts.
- **`meta/` is in scope** for the cap.
-- **`scripts/lib/common.sh` STAYS.** Measured: 55 consumers, 51 of which remain
+- **`lib/common.sh` STAYS.** Measured: 55 consumers, 51 of which remain
here. The `.githooks` use a _separate_ `common.sh`, so the ">2 units" rule
selects nothing worth moving. Deviation from the original instruction,
agreed after measurement.
diff --git a/docs/explanations/2026-07-13-explanation-setup-syncyomi.html b/docs/explanations/2026-07-13-explanation-setup-syncyomi.html
index 8bd95cec..5c895ea0 100644
--- a/docs/explanations/2026-07-13-explanation-setup-syncyomi.html
+++ b/docs/explanations/2026-07-13-explanation-setup-syncyomi.html
@@ -263,7 +263,7 @@ docker exec "${CADDY_CONTAINER}" caddy reload --config "${CADDYFILE_IN_CONTAINER
diff --git a/docs/explanations/2026-07-17-explanation-night-lockdown.html b/docs/explanations/2026-07-17-explanation-night-lockdown.html
index 25b17ac4..9c809467 100644
--- a/docs/explanations/2026-07-17-explanation-night-lockdown.html
+++ b/docs/explanations/2026-07-17-explanation-night-lockdown.html
@@ -116,7 +116,7 @@
Night lockdown: keeping the servers up through the curfew
-How a self-discipline shutdown stopped killing seven services every night — and the four bugs that surfaced on the way there. 3ebb56c · 2026-07-17 · linux_configuration/scripts/periodic_background/digital_wellbeing/
+How a self-discipline shutdown stopped killing seven services every night — and the four bugs that surfaced on the way there. 3ebb56c · 2026-07-17 · linux_configuration/periodic_background/digital_wellbeing/
Contents
diff --git a/docs/explanations/2026-07-19-explanation-network-diagnostics-and-stale-tests.html b/docs/explanations/2026-07-19-explanation-network-diagnostics-and-stale-tests.html
index 1852f9be..c1a7efca 100644
--- a/docs/explanations/2026-07-19-explanation-network-diagnostics-and-stale-tests.html
+++ b/docs/explanations/2026-07-19-explanation-network-diagnostics-and-stale-tests.html
@@ -318,7 +318,7 @@ elif [[ -f "/usr/local/lib/common.sh" ]]; then # ← the trap
a. Making bash unit-testable
- The two new diagnostics live in linux_configuration/scripts/diagnostics/. Their
+ The two new diagnostics live in linux_configuration/diagnostics/. Their
arithmetic — rate conversion, duty percentage, the mean of a sample window — is pulled out into
pure functions, with the measurement loop kept separate:
diff --git a/docs/restructure-live-state.md b/docs/restructure-live-state.md
index 92eebd8a..027f3a61 100644
--- a/docs/restructure-live-state.md
+++ b/docs/restructure-live-state.md
@@ -17,9 +17,9 @@ its timer next fires.
```
## systemd units
/etc/systemd/system/dns-blocklist-refresh.service
- 7:ExecStart=/home/kuhy/testsAndMisc/linux_configuration/scripts/single_use/features/setup_dns_blocker.sh refresh
+ 7:ExecStart=/home/kuhy/testsAndMisc/linux_configuration/features/setup_dns_blocker.sh refresh
/etc/systemd/system/media-organizer.service
- 10:ExecStart=/home/kuhy/testsAndMisc/linux_configuration/scripts/single_use/utils/organize_downloads.sh
+ 10:ExecStart=/home/kuhy/testsAndMisc/linux_configuration/utils/organize_downloads.sh
/home/kuhy/.config/systemd/user/endurain-import.service
3:Documentation=file:///home/kuhy/testsAndMisc/endurain/README.md
11:WorkingDirectory=/home/kuhy/testsAndMisc
@@ -33,37 +33,37 @@ its timer next fires.
## /etc references
/etc/guard-lib/targets/nsswitch.conf
- 4:PLUGIN="/home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/hosts/guard/plugins/nsswitch-plugin.sh"
+ 4:PLUGIN="/home/kuhy/testsAndMisc/linux_configuration/periodic_background/hosts/guard/plugins/nsswitch-plugin.sh"
/etc/guard-lib/targets/resolved.conf
- 4:PLUGIN="/home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/hosts/guard/plugins/resolved-plugin.sh"
+ 4:PLUGIN="/home/kuhy/testsAndMisc/linux_configuration/periodic_background/hosts/guard/plugins/resolved-plugin.sh"
## installed scripts referencing the repo
/usr/local/bin/hosts-file-monitor.sh
- 10:HOSTS_INSTALL_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/hosts/install.sh"
+ 10:HOSTS_INSTALL_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/periodic_background/hosts/install.sh"
/usr/local/bin/periodic-system-maintenance.sh
- 26:PACMAN_WRAPPER_INSTALL="/home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
- 27:MAKEPKG_WRAPPER_INSTALL="/home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/digital_wellbeing/pacman/install_makepkg_wrapper.sh"
- 28:HOSTS_INSTALL_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/hosts/install.sh"
+ 26:PACMAN_WRAPPER_INSTALL="/home/kuhy/testsAndMisc/linux_configuration/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
+ 27:MAKEPKG_WRAPPER_INSTALL="/home/kuhy/testsAndMisc/linux_configuration/periodic_background/digital_wellbeing/pacman/install_makepkg_wrapper.sh"
+ 28:HOSTS_INSTALL_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/periodic_background/hosts/install.sh"
/usr/local/bin/wsg-grabber
4:export PYTHONPATH="/home/kuhy/testsAndMisc${PYTHONPATH:+:$PYTHONPATH}"
## symlinks into the repo
- /home/kuhy/.config/i3blocks/claude_usage.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/claude_usage.sh
- /home/kuhy/.config/i3blocks/config -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/config
- /home/kuhy/.config/i3blocks/cpu_monitor.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/cpu_monitor.sh
- /home/kuhy/.config/i3blocks/disk.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/disk.sh
- /home/kuhy/.config/i3blocks/ethernet.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/ethernet.sh
- /home/kuhy/.config/i3blocks/gpu_monitor.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/gpu_monitor.sh
- /home/kuhy/.config/i3blocks/memory.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/memory.sh
- /home/kuhy/.config/i3blocks/motherboard_temp.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/motherboard_temp.sh
- /home/kuhy/.config/i3blocks/pc_startup_status.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/pc_startup_status.sh
- /home/kuhy/.config/i3blocks/persist_common.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/persist_common.sh
- /home/kuhy/.config/i3blocks/shutdown_countdown.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/shutdown_countdown.sh
- /home/kuhy/.config/i3blocks/time.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/time.sh
- /home/kuhy/.config/i3blocks/volume.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/periodic_background/i3-configuration/i3blocks/volume.sh
- /home/kuhy/.local/bin/keepass-open -> /home/kuhy/testsAndMisc/linux_configuration/scripts/single_use/features/keepass-open.sh
- /home/kuhy/.local/bin/line-speed-probe.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/diagnostics/line-speed-probe.sh
- /home/kuhy/.local/bin/steam-download-duty.sh -> /home/kuhy/testsAndMisc/linux_configuration/scripts/diagnostics/steam-download-duty.sh
+ /home/kuhy/.config/i3blocks/claude_usage.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/claude_usage.sh
+ /home/kuhy/.config/i3blocks/config -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/config
+ /home/kuhy/.config/i3blocks/cpu_monitor.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/cpu_monitor.sh
+ /home/kuhy/.config/i3blocks/disk.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/disk.sh
+ /home/kuhy/.config/i3blocks/ethernet.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/ethernet.sh
+ /home/kuhy/.config/i3blocks/gpu_monitor.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/gpu_monitor.sh
+ /home/kuhy/.config/i3blocks/memory.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/memory.sh
+ /home/kuhy/.config/i3blocks/motherboard_temp.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/motherboard_temp.sh
+ /home/kuhy/.config/i3blocks/pc_startup_status.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/pc_startup_status.sh
+ /home/kuhy/.config/i3blocks/persist_common.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/persist_common.sh
+ /home/kuhy/.config/i3blocks/shutdown_countdown.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/shutdown_countdown.sh
+ /home/kuhy/.config/i3blocks/time.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/time.sh
+ /home/kuhy/.config/i3blocks/volume.sh -> /home/kuhy/testsAndMisc/linux_configuration/periodic_background/i3-configuration/i3blocks/volume.sh
+ /home/kuhy/.local/bin/keepass-open -> /home/kuhy/testsAndMisc/linux_configuration/features/keepass-open.sh
+ /home/kuhy/.local/bin/line-speed-probe.sh -> /home/kuhy/testsAndMisc/linux_configuration/diagnostics/line-speed-probe.sh
+ /home/kuhy/.local/bin/steam-download-duty.sh -> /home/kuhy/testsAndMisc/linux_configuration/diagnostics/steam-download-duty.sh
/home/kuhy/.oh-my-zsh/custom/calc-live.zsh -> /home/kuhy/testsAndMisc/linux_configuration/zsh/calc-live.zsh
/home/kuhy/.oh-my-zsh/custom/claude-tty-fix.zsh -> /home/kuhy/testsAndMisc/linux_configuration/zsh/claude-tty-fix.zsh
/home/kuhy/.oh-my-zsh/custom/token-savers.zsh -> /home/kuhy/testsAndMisc/linux_configuration/zsh/token-savers.zsh
diff --git a/docs/shell-split-recipes.md b/docs/shell-split-recipes.md
index 8bf38370..1c338e0a 100644
--- a/docs/shell-split-recipes.md
+++ b/docs/shell-split-recipes.md
@@ -43,7 +43,7 @@ SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
### Shape of a new lib (two hooks disagree unless you get this right)
-Follow `scripts/lib/common.sh`: **shebang present, file executable.** The two
+Follow `lib/common.sh`: **shebang present, file executable.** The two
obvious-looking alternatives each fail a hook:
- No shebang → `shellcheck` SC2148 ("target shell unknown").
@@ -56,9 +56,9 @@ boilerplate that feeds jscpd. Say so in the lib's header comment.
- **Two live units point at repo paths** and break if a file moves or is
renamed. `systemctl cat` them after touching either:
- `/etc/systemd/system/dns-blocklist-refresh.service` →
- `scripts/single_use/features/setup_dns_blocker.sh refresh`
+ `./features/setup_dns_blocker.sh refresh`
- `/etc/systemd/system/media-organizer.service` →
- `scripts/single_use/utils/organize_downloads.sh`
+ `./utils/organize_downloads.sh`
Every other in-repo unit references an installed copy under `/usr/local/`,
so those are only at risk if the _installer_ is what you split.
@@ -69,12 +69,12 @@ A split is only safe if the file still resolves its libs from wherever it
actually runs. Two ways a script leaves the repo, both silent when broken:
- **Copied out** — only three, all under
- `scripts/periodic_background/hosts/guard/pacman-hooks/`, installed to
+ `periodic_background/hosts/guard/pacman-hooks/`, installed to
`/usr/local/share/hosts-guard/` by `hosts/guard/install_pacman_hooks.sh`.
Splitting any of those three means the installer must copy the new libs too,
**in the same commit** — the same trap as `phone_focus_mode/deploy.sh`.
- **Symlinked in** — exactly one: `/usr/local/bin/start-player2` →
- `scripts/gaming/start-player2.sh`. `${BASH_SOURCE[0]%/*}` resolves to
+ `gaming/start-player2.sh`. `${BASH_SOURCE[0]%/*}` resolves to
`/usr/local/bin` there, so a lib path must go through
`readlink -f "${BASH_SOURCE[0]}"` first.
diff --git a/docs/superpowers/contracts/flatten-linux-configuration-2026-08-23.json b/docs/superpowers/contracts/flatten-linux-configuration-2026-08-23.json
new file mode 100644
index 00000000..20a25f5b
--- /dev/null
+++ b/docs/superpowers/contracts/flatten-linux-configuration-2026-08-23.json
@@ -0,0 +1,21 @@
+{
+ "title": "Dissolve linux_configuration/scripts/ and single_use/ to satisfy the depth-2 cap",
+ "objective": "Flatten the largest source of directory-depth violations. scripts/ and single_use/ were three levels of pure taxonomy carrying no information, and a 2-directory cap leaves no room for them. Categories move up to sit directly under linux_configuration/, which is what makes the cap satisfiable at all.",
+ "acceptance_criteria": [
+ "linux_configuration/scripts/ no longer exists; its children sit one level under linux_configuration/.",
+ "Every relative `source` of a shared library resolves from its file's NEW location, checked by resolving each path on disk rather than by reading the diff.",
+ "Every REPO_ROOT derivation that walks up a fixed number of levels is recomputed for the new depth.",
+ "All lib/tests suites that passed before still pass, and any that fail are proven to fail identically in the pre-move baseline worktree.",
+ "The repo-wide pytest gate still reports 100% coverage.",
+ "Every symlink in $HOME pointing into the moved tree is repointed, and the i3blocks scripts are RUN to prove the status bar still works.",
+ "No config, workflow, allowlist or ignore rule names a path that no longer exists.",
+ "The .gitignore rules protecting untracked secrets still match after their paths change.",
+ "pre-commit passes without --no-verify."
+ ],
+ "out_of_scope": [
+ "periodic_background/digital_wellbeing and hosts, deferred while the guard-lib repoint is pending; they keep their depth violations for now.",
+ "Deduplicating the two Nextcloud implementations, which is a separate change.",
+ "Wiring the depth gate, which lands only once the tree conforms."
+ ],
+ "verifier": "check_directory_depth.sh --all falls 248 -> 139; every '$SCRIPT_DIR/../lib/...' source resolves on disk; 8 of 9 lib/tests run_all.sh pass with the ninth proven to need the jail at baseline too; pytest_changed_packages.py reports 1798 passed at 100%; find ~ -xtype l finds no broken link; the i3blocks scripts emit real output."
+}
diff --git a/docs/superpowers/evidence/flatten-linux-configuration-2026-08-23.json b/docs/superpowers/evidence/flatten-linux-configuration-2026-08-23.json
new file mode 100644
index 00000000..83f97e41
--- /dev/null
+++ b/docs/superpowers/evidence/flatten-linux-configuration-2026-08-23.json
@@ -0,0 +1,61 @@
+{
+ "intent": "Flatten linux_configuration by dissolving the scripts/ and single_use/ levels, cutting directory-depth violations nearly in half and making the depth-2 cap reachable.",
+ "scope": [
+ "linux_configuration/scripts/{features,fixes,utils,misc,fresh-install,feedback-appimage,lib,boot_recovery,diagnostics,gaming,meta,periodic_background} -> linux_configuration/",
+ "single_use's loose installer scripts -> linux_configuration/installers/",
+ "single_use/lib/joplin_server.sh -> installers/, freeing lib/ for the shared library",
+ "~90 files rewritten for the new paths; 16 $HOME symlinks repointed",
+ "Non-goal: periodic_background/digital_wellbeing and hosts, deferred pending the guard-lib repoint"
+ ],
+ "changes": [
+ "git mv'd every category out of scripts/single_use/ and scripts/ up to linux_configuration/, then removed the two empty parents. scripts/tests/ held only an untracked __pycache__ and was deleted.",
+ "Rewrote absolute references (linux_configuration/scripts/... -> linux_configuration/...) across 38 files, and relative ../scripts/X forms across the docs and harnesses that used them.",
+ "Recomputed every relative `source` of lib/common.sh and lib/android.sh per file depth: 40 files were ../../ and 12 were ../../../, and the correct prefix differs by where the file now sits.",
+ "Fixed REPO_ROOT in 7 fixes/lib/tests harnesses plus setup_syncyomi_guard.sh, which walked up four levels from a directory that is now two levels shallower.",
+ "Repointed 16 symlinks in $HOME: the whole i3blocks bar, keepass-open, and two diagnostics tools.",
+ "Fixed linux_configuration/.gitignore's two secret paths and meta/shell-coverage-allowlist.txt's joplin_server entry.",
+ "Fixed linux_configuration/tests/conftest.py, whose sys.path entries for fast_count and the transcribe tools still named the old tree.",
+ "Documented the new layout in AGENTS.md and removed the last stale billsplit references."
+ ],
+ "verification": [
+ {
+ "command": "check_directory_depth.sh --all",
+ "result": "pass (improvement)",
+ "evidence": "248 -> 139 violations. Roughly 40 of the remainder are inside digital_wellbeing and hosts, which are deliberately deferred."
+ },
+ {
+ "command": "resolve every '$SCRIPT_DIR/../lib/...' source against the filesystem",
+ "result": "fail then pass",
+ "evidence": "First sweep left 5 files in misc/testsAndMisc-bash pointing at ../../../lib/common.sh (they had a different prefix than the 40 already fixed). After the second pass every source resolves. Checked by testing the path on disk, not by reading the diff."
+ },
+ {
+ "command": "run every lib/tests/run_all.sh",
+ "result": "pass",
+ "evidence": "8 of 9 pass. features/lib/tests fails 'REFUSING: must run under shell_coverage_jail.sh' -- confirmed identical in the pre-move baseline worktree, so it is the suite's jail requirement, not a regression. fixes/lib/tests DID regress (log_warn: command not found) and was fixed by correcting REPO_ROOT; it passes again."
+ },
+ {
+ "command": "pytest_changed_packages.py",
+ "result": "fail then pass",
+ "evidence": "First run: 14 collection errors from conftest.py's stale sys.path. After the fix: 1798 passed, TOTAL coverage 100.00%."
+ },
+ {
+ "command": "find ~ -maxdepth 4 -xtype l -lname '*testsAndMisc*'; then run the i3blocks scripts",
+ "result": "fail then pass",
+ "evidence": "16 broken symlinks immediately after the move, including the entire i3blocks bar. After repointing, zero broken, and cpu_monitor/memory/disk/time/volume all emit real output (e.g. '54°C, 1.18', '17.9GiB/30.4GiB')."
+ },
+ {
+ "command": "git check-ignore on the two secret configs; check_shell_coverage.sh --all",
+ "result": "pass",
+ "evidence": "features/.wireguard_ssh.conf and .dufs_cloud.conf are still ignored after their gitignore paths changed. Coverage gate exits 0 and every allowlist entry names a file that exists."
+ }
+ ],
+ "risks": [
+ "This renames ~400 tracked files. Anything outside this repo and outside $HOME that hardcodes linux_configuration/scripts/... would break; report_live_state.sh covers systemd, /etc, /usr/local and $HOME symlinks, and all of those were checked.",
+ "docs/superpowers/ artifacts still quote old paths. They are dated records of past work and were deliberately not rewritten.",
+ "features/lib/tests remains jail-only. That predates this change but means one suite is not exercised by a bare run."
+ ],
+ "rollback": [
+ "git revert restores the tree; the symlinks then need repointing back, which the same one-liner does with the substitution reversed.",
+ "Re-run pytest_changed_packages.py and the lib/tests suites to confirm the restored state."
+ ]
+}
diff --git a/docs/syncyomi-restore-runbook.md b/docs/syncyomi-restore-runbook.md
index 6e71ca08..c8f227b8 100644
--- a/docs/syncyomi-restore-runbook.md
+++ b/docs/syncyomi-restore-runbook.md
@@ -88,8 +88,8 @@ loudly on a collapse, and keeps 14 restorable `.tachibk` snapshots.
python3 -m python_pkg.syncyomi_guard # exit 0 healthy, 1 collapsed
# install / remove the timer
-./linux_configuration/scripts/single_use/features/setup_syncyomi_guard.sh
-./linux_configuration/scripts/single_use/features/setup_syncyomi_guard.sh --uninstall
+./linux_configuration/features/setup_syncyomi_guard.sh
+./linux_configuration/features/setup_syncyomi_guard.sh --uninstall
systemctl --user list-timers syncyomi-guard.timer
journalctl --user -u syncyomi-guard.service -n 20
diff --git a/linux_configuration/.github/BRANCH_PROTECTION.md b/linux_configuration/.github/BRANCH_PROTECTION.md
index 1861a229..0b9c0e2e 100644
--- a/linux_configuration/.github/BRANCH_PROTECTION.md
+++ b/linux_configuration/.github/BRANCH_PROTECTION.md
@@ -36,7 +36,7 @@ To make the shell linting check **required** before merging PRs, follow these st
Before pushing changes, run the linting script locally to catch issues early:
```bash
-bash scripts/meta/shell_check.sh
+bash meta/shell_check.sh
```
This will:
@@ -68,7 +68,7 @@ The workflow validates shell scripts with these extensions or shebangs:
If the check fails on your PR:
1. Review the workflow logs to see which files failed
-2. Run `bash scripts/meta/shell_check.sh` locally to reproduce
+2. Run `bash meta/shell_check.sh` locally to reproduce
3. Fix the issues (usually formatting with `shfmt -w -i 2 -ci -sr -s`)
4. Commit and push the fixes
diff --git a/linux_configuration/.github/copilot-instructions.md b/linux_configuration/.github/copilot-instructions.md
index cc27707f..d30521e9 100644
--- a/linux_configuration/.github/copilot-instructions.md
+++ b/linux_configuration/.github/copilot-instructions.md
@@ -7,29 +7,29 @@ This repo automates Linux desktop bootstrap, hardening, and i3 setup. It’s pri
- fresh-install/: end-to-end bootstrap for Arch/Ubuntu workstations. Reads package lists, configures pacman/makepkg, sets up GPU drivers, i3, hosts guard, pacman wrapper, and useful services. Example: `fresh-install/main.sh` orchestrates most steps and sources `detect_gpu*.sh`.
- hosts/: manages a highly-opinionated `/etc/hosts` via StevenBlack upstream with custom edits, plus “guard” friction:
- `hosts/install.sh` builds and locks `/etc/hosts` (immutable/append-only; selective unblocks; custom blocks).
- - `hosts/guard/` enforcement is provided by guard-lib (`guardctl`, installed outside this repo): a `file-guard` instance per target (`hosts`, `nsswitch`, `resolved`) with a path-watcher, optional RO bind mount, generic pacman hooks, and per-target plugins under `hosts/guard/plugins/`. The pre-guard-lib scripts (`setup_hosts_guard.sh`, `enforce-*.sh`, per-target systemd units, `psychological/unlock-hosts.sh`) are archived at github.com/kuhyx/testsAndMisc-archive — see `scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh` for how the migration works.
-- scripts/periodic_background/digital_wellbeing/pacman/: a policy-aware pacman wrapper with friction mechanics.
+ - `hosts/guard/` enforcement is provided by guard-lib (`guardctl`, installed outside this repo): a `file-guard` instance per target (`hosts`, `nsswitch`, `resolved`) with a path-watcher, optional RO bind mount, generic pacman hooks, and per-target plugins under `hosts/guard/plugins/`. The pre-guard-lib scripts (`setup_hosts_guard.sh`, `enforce-*.sh`, per-target systemd units, `psychological/unlock-hosts.sh`) are archived at github.com/kuhyx/testsAndMisc-archive — see `./fixes/migrate_hosts_guard_to_guard_lib.sh` for how the migration works.
+- periodic_background/digital_wellbeing/pacman/: a policy-aware pacman wrapper with friction mechanics.
- `pacman_wrapper.sh` intercepts transactions, runs hosts-guard pre/post hooks, handles stale db lock, auto-wires maintenance services, and enforces package policy (blocked/whitelisted lists); adds weekend-only “Steam” challenge and a VirtualBox challenge powered by `words.txt`.
- `install_pacman_wrapper.sh` backs up `/usr/bin/pacman` to `pacman.orig` and symlinks to the wrapper.
-- scripts/periodic_background/system-maintenance/: templates and installer for periodic jobs and monitoring.
+- periodic_background/system-maintenance/: templates and installer for periodic jobs and monitoring.
- `setup_periodic_system.sh` installs: `/usr/local/bin/periodic-system-maintenance.sh`, a timer (`periodic-system-maintenance.timer`), a startup oneshot, and `hosts-file-monitor.service` that restores `/etc/hosts` if tampered. Also installs a browser pre-exec wrapper that re-runs the hosts installer before launching common browsers.
- i3-configuration/: installs i3 and i3blocks configs with small font sizing logic (`i3-configuration/install.sh`).
## Conventions you should follow
-- Bash style: use `set -e` or `set -euo pipefail`, re-exec with sudo if not root, be idempotent, and log to `/var/log/*` with timestamps. Examples: `setup_periodic_system.sh`, `scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh`.
-- Install via templates: scripts under `scripts/periodic_background/system-maintenance/bin` and `.../systemd` are templates. The setup script substitutes placeholders like `__HOSTS_INSTALL_SCRIPT__` and `__PACMAN_WRAPPER_INSTALL__` before installing to `/usr/local/bin` and `/etc/systemd/system`. Don’t edit installed copies directly; modify templates and the setup script.
+- Bash style: use `set -e` or `set -euo pipefail`, re-exec with sudo if not root, be idempotent, and log to `/var/log/*` with timestamps. Examples: `setup_periodic_system.sh`, `./fixes/migrate_hosts_guard_to_guard_lib.sh`.
+- Install via templates: scripts under `periodic_background/system-maintenance/bin` and `.../systemd` are templates. The setup script substitutes placeholders like `__HOSTS_INSTALL_SCRIPT__` and `__PACMAN_WRAPPER_INSTALL__` before installing to `/usr/local/bin` and `/etc/systemd/system`. Don’t edit installed copies directly; modify templates and the setup script.
- Package lists: `fresh-install/pacman_packages.txt` and `aur_packages.txt` treat any line not starting with lowercase alnum as a comment.
## Core workflows (what to run)
- Fresh machine: run from repo root
- `fresh-install/main.sh` (bootstraps configs, GPU, hosts, i3, pacman wrapper, services). It assumes the repo is at `~/linux-configuration` in some steps.
-- Periodic services: `sudo scripts/periodic_background/setup_periodic_system.sh` (installs timer, startup service, hosts monitor, and browser pre-exec wrapper; then performs an initial run).
-- Pacman wrapper only: `sudo scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` (backs up pacman and wires the wrapper). The wrapper auto-runs hosts-guard pre/post hooks and can self-setup periodic services when missing.
+- Periodic services: `sudo periodic_background/setup_periodic_system.sh` (installs timer, startup service, hosts monitor, and browser pre-exec wrapper; then performs an initial run).
+- Pacman wrapper only: `sudo periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` (backs up pacman and wires the wrapper). The wrapper auto-runs hosts-guard pre/post hooks and can self-setup periodic services when missing.
- Hosts guard:
- `sudo hosts/install.sh` to (re)build `/etc/hosts` from cache/upstream then lock it.
- - Guard layers (hosts/nsswitch/resolved) are managed by `guardctl file-guard `; see `scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh` to (re)install them.
+ - Guard layers (hosts/nsswitch/resolved) are managed by `guardctl file-guard `; see `./fixes/migrate_hosts_guard_to_guard_lib.sh` to (re)install them.
- To edit a guarded file: `sudo guardctl file-guard unlock `, edit, then let the path-watcher re-lock it (or `guardctl file-guard enforce `).
- i3 config: `i3-configuration/install.sh` (copies `i3` and `i3blocks`, adjusts font size; installs required tools conditionally for Arch/Ubuntu).
@@ -37,24 +37,24 @@ This repo automates Linux desktop bootstrap, hardening, and i3 setup. It’s pri
- Pacman interception: `pacman_wrapper.sh` sets `PACMAN_BIN=/usr/bin/pacman.orig` and symlinks `/usr/bin/pacman` -> wrapper. Keep this invariant when changing the wrapper.
- Hosts hooks: pacman transactions are unlocked/relocked by guard-lib's generic hooks (`/etc/pacman.d/hooks/10-guard-lib-unlock-all.hook`, `90-guard-lib-relock-all.hook`), which iterate every registered `file-guard` instance rather than being hosts-specific.
-- Logs: check `/var/log/periodic-system-maintenance.log` and `/var/log/hosts-file-monitor.log` for service behavior; timer and services live under `scripts/periodic_background/system-maintenance/systemd/` (templates).
+- Logs: check `/var/log/periodic-system-maintenance.log` and `/var/log/hosts-file-monitor.log` for service behavior; timer and services live under `periodic_background/system-maintenance/systemd/` (templates).
- Browser pre-exec: setup creates `/usr/local/bin/browser-preexec-wrapper` and symlinks common browser names to it; it silently re-runs the hosts installer before launching the real binary in `/usr/bin`.
## Patterns to reuse when adding features
-- Follow the sudo re-exec + idempotent install pattern from `setup_periodic_system.sh` and `scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh`.
-- Add new periodic behaviors as templates under `scripts/periodic_background/system-maintenance/bin` and `.../systemd`, then extend `setup_periodic_system.sh` to install/enable them.
-- Extend package policy by updating `scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt` or by adding `check_for_` + `prompt_for__challenge` blocks in the wrapper.
-- Run `scripts/meta/shell_check.sh` to detect things to fix before committing.
+- Follow the sudo re-exec + idempotent install pattern from `setup_periodic_system.sh` and `./fixes/migrate_hosts_guard_to_guard_lib.sh`.
+- Add new periodic behaviors as templates under `periodic_background/system-maintenance/bin` and `.../systemd`, then extend `setup_periodic_system.sh` to install/enable them.
+- Extend package policy by updating `periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt` or by adding `check_for_` + `prompt_for__challenge` blocks in the wrapper.
+- Run `meta/shell_check.sh` to detect things to fix before committing.
## Detailed LLM Documentation
For in-depth understanding of specific components, see these dedicated guides:
-- **Hosts Guard**: [scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh](../scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh) header comment - guard-lib migration, protection layers, canonical copies, path watchers. The pre-guard-lib README is archived at github.com/kuhyx/testsAndMisc-archive.
-- **Pacman Wrapper**: [scripts/periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md](../scripts/periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md) - Policy files, integrity checks, challenges
-- **Midnight Shutdown**: [scripts/periodic_background/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md](../scripts/periodic_background/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md) - Schedule protection, timer system
-- **Compulsive Block**: [scripts/periodic_background/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md](../scripts/periodic_background/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md) - App launch limiting
+- **Hosts Guard**: [./fixes/migrate_hosts_guard_to_guard_lib.sh](../fixes/migrate_hosts_guard_to_guard_lib.sh) header comment - guard-lib migration, protection layers, canonical copies, path watchers. The pre-guard-lib README is archived at github.com/kuhyx/testsAndMisc-archive.
+- **Pacman Wrapper**: [periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md](../periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md) - Policy files, integrity checks, challenges
+- **Midnight Shutdown**: [periodic_background/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md](../periodic_background/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md) - Schedule protection, timer system
+- **Compulsive Block**: [periodic_background/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md](../periodic_background/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md) - App launch limiting
- **Security Analysis**: [docs/SECURITY_HARDENING_ANALYSIS.md](../docs/SECURITY_HARDENING_ANALYSIS.md) - Vulnerabilities and implementation roadmap
## Digital Wellbeing Components Summary
@@ -62,8 +62,8 @@ For in-depth understanding of specific components, see these dedicated guides:
| Component | Purpose | Key Files |
| ----------------- | ----------------------------- | --------------------------------------------------------------------------- |
| Hosts Guard | Block websites via /etc/hosts | `hosts/install.sh`, `guardctl` (guard-lib), `hosts/guard/plugins/*` |
-| Pacman Wrapper | Block package installation | `scripts/periodic_background/digital_wellbeing/pacman/*` |
-| Midnight Shutdown | Auto-shutdown at night | `scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh` |
-| Compulsive Block | Limit app launches | `scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh` |
-| Music Wrapper | Block music during focus | `scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh` |
+| Pacman Wrapper | Block package installation | `periodic_background/digital_wellbeing/pacman/*` |
+| Midnight Shutdown | Auto-shutdown at night | `periodic_background/digital_wellbeing/setup_midnight_shutdown.sh` |
+| Compulsive Block | Limit app launches | `periodic_background/digital_wellbeing/block_compulsive_opening.sh` |
+| Music Wrapper | Block music during focus | `periodic_background/digital_wellbeing/youtube-music-wrapper.sh` |
| Screen Locker | Require workout to unlock | External: `~/testsAndMisc/python_pkg/screen_locker/` |
diff --git a/linux_configuration/.github/workflows/shell-check.yml b/linux_configuration/.github/workflows/shell-check.yml
index f3345f78..d0ac84fb 100644
--- a/linux_configuration/.github/workflows/shell-check.yml
+++ b/linux_configuration/.github/workflows/shell-check.yml
@@ -8,7 +8,7 @@ on:
- "**.bash"
- "**.zsh"
- ".github/workflows/shell-check.yml"
- - "scripts/meta/shell_check.sh"
+ - "meta/shell_check.sh"
pull_request:
branches: [main, master]
paths:
@@ -16,7 +16,7 @@ on:
- "**.bash"
- "**.zsh"
- ".github/workflows/shell-check.yml"
- - "scripts/meta/shell_check.sh"
+ - "meta/shell_check.sh"
jobs:
shellcheck:
@@ -43,7 +43,7 @@ jobs:
- name: Run shell_check.sh
run: |
- bash scripts/meta/shell_check.sh --skip-install
+ bash meta/shell_check.sh --skip-install
- name: Report status
if: success()
@@ -54,4 +54,4 @@ jobs:
run: |
echo "❌ Shell script linting failed!"
echo "This check is required to merge PRs into main/master."
- echo "Please run 'bash scripts/meta/shell_check.sh' locally and fix any issues."
+ echo "Please run 'bash meta/shell_check.sh' locally and fix any issues."
diff --git a/linux_configuration/.gitignore b/linux_configuration/.gitignore
index d14d68ee..3f9fe578 100644
--- a/linux_configuration/.gitignore
+++ b/linux_configuration/.gitignore
@@ -5,11 +5,11 @@ scripts/features/.raspberry_pi.conf
.raspberry_pi.conf
# WireGuard/SSH remote-access setup config (contains the DuckDNS token)
-scripts/single_use/features/.wireguard_ssh.conf
+features/.wireguard_ssh.conf
.wireguard_ssh.conf
# dufs cloud setup config (contains the plaintext web password) — never commit.
-scripts/single_use/features/.dufs_cloud.conf
+features/.dufs_cloud.conf
.dufs_cloud.conf
**/.dufs_cloud.conf
diff --git a/linux_configuration/scripts/boot_recovery/README.md b/linux_configuration/boot_recovery/README.md
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/README.md
rename to linux_configuration/boot_recovery/README.md
diff --git a/linux_configuration/scripts/boot_recovery/boot-repair b/linux_configuration/boot_recovery/boot-repair
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/boot-repair
rename to linux_configuration/boot_recovery/boot-repair
diff --git a/linux_configuration/scripts/boot_recovery/hooks/05-boot-mounted-guard.hook b/linux_configuration/boot_recovery/hooks/05-boot-mounted-guard.hook
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/hooks/05-boot-mounted-guard.hook
rename to linux_configuration/boot_recovery/hooks/05-boot-mounted-guard.hook
diff --git a/linux_configuration/scripts/boot_recovery/hooks/99-boot-autorepair.hook b/linux_configuration/boot_recovery/hooks/99-boot-autorepair.hook
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/hooks/99-boot-autorepair.hook
rename to linux_configuration/boot_recovery/hooks/99-boot-autorepair.hook
diff --git a/linux_configuration/scripts/boot_recovery/install.sh b/linux_configuration/boot_recovery/install.sh
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/install.sh
rename to linux_configuration/boot_recovery/install.sh
diff --git a/linux_configuration/scripts/boot_recovery/tests/lib/boot_repair_bios_cases.sh b/linux_configuration/boot_recovery/tests/lib/boot_repair_bios_cases.sh
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/tests/lib/boot_repair_bios_cases.sh
rename to linux_configuration/boot_recovery/tests/lib/boot_repair_bios_cases.sh
diff --git a/linux_configuration/scripts/boot_recovery/tests/lib/boot_repair_cases.sh b/linux_configuration/boot_recovery/tests/lib/boot_repair_cases.sh
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/tests/lib/boot_repair_cases.sh
rename to linux_configuration/boot_recovery/tests/lib/boot_repair_cases.sh
diff --git a/linux_configuration/scripts/boot_recovery/tests/live_test.sh b/linux_configuration/boot_recovery/tests/live_test.sh
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/tests/live_test.sh
rename to linux_configuration/boot_recovery/tests/live_test.sh
diff --git a/linux_configuration/scripts/boot_recovery/tests/test_boot_repair.sh b/linux_configuration/boot_recovery/tests/test_boot_repair.sh
similarity index 100%
rename from linux_configuration/scripts/boot_recovery/tests/test_boot_repair.sh
rename to linux_configuration/boot_recovery/tests/test_boot_repair.sh
diff --git a/linux_configuration/scripts/diagnostics/install.sh b/linux_configuration/diagnostics/install.sh
similarity index 100%
rename from linux_configuration/scripts/diagnostics/install.sh
rename to linux_configuration/diagnostics/install.sh
diff --git a/linux_configuration/scripts/diagnostics/line-speed-probe.sh b/linux_configuration/diagnostics/line-speed-probe.sh
similarity index 100%
rename from linux_configuration/scripts/diagnostics/line-speed-probe.sh
rename to linux_configuration/diagnostics/line-speed-probe.sh
diff --git a/linux_configuration/scripts/diagnostics/steam-download-duty.sh b/linux_configuration/diagnostics/steam-download-duty.sh
similarity index 100%
rename from linux_configuration/scripts/diagnostics/steam-download-duty.sh
rename to linux_configuration/diagnostics/steam-download-duty.sh
diff --git a/linux_configuration/docs/PACMAN_WRAPPER_SECURITY.md b/linux_configuration/docs/PACMAN_WRAPPER_SECURITY.md
index 8b6ea75e..53443ef7 100644
--- a/linux_configuration/docs/PACMAN_WRAPPER_SECURITY.md
+++ b/linux_configuration/docs/PACMAN_WRAPPER_SECURITY.md
@@ -16,7 +16,7 @@ The original pacman wrapper had the following vulnerabilities:
### 1. Policy File Integrity Checks
-**File**: `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh`
+**File**: `periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh`
The installer now:
@@ -25,7 +25,7 @@ The installer now:
- Makes the integrity file immutable using `chattr +i`
- Makes policy files (`pacman_blocked_keywords.txt`, `pacman_greylist.txt`) immutable
-**File**: `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh`
+**File**: `periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh`
The wrapper now:
@@ -42,7 +42,7 @@ The wrapper now:
### 2. Hardcoded VirtualBox Restrictions
-**File**: `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh`
+**File**: `periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh`
Added hardcoded VirtualBox detection that **cannot be bypassed** by editing policy files:
@@ -75,7 +75,7 @@ This function:
### 3. VirtualBox Hosts Enforcement
-**File**: `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
+**File**: `periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
A new enforcement script that:
@@ -116,7 +116,7 @@ The pacman wrapper automatically:
### 4. Installation Integration
-**File**: `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh`
+**File**: `periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh`
The installer now:
diff --git a/linux_configuration/docs/SUMMARY.md b/linux_configuration/docs/SUMMARY.md
index 74e66f1f..714b731e 100644
--- a/linux_configuration/docs/SUMMARY.md
+++ b/linux_configuration/docs/SUMMARY.md
@@ -37,7 +37,7 @@ Implemented a **defense-in-depth** security architecture with multiple layers:
### Layer 4: VirtualBox Enforcement
-- New script: `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
+- New script: `periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
- Automatically configures all VMs to:
- Use host's DNS resolution (`--natdnshostresolver1 on`)
- Enable NAT DNS proxy (`--natdnsproxy1 on`)
@@ -55,15 +55,15 @@ Implemented a **defense-in-depth** security architecture with multiple layers:
### New Files (4)
-1. `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - VirtualBox enforcement script
+1. `periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - VirtualBox enforcement script
2. `tests/test_pacman_wrapper_security.sh` - Comprehensive test suite (12 tests)
3. `docs/PACMAN_WRAPPER_SECURITY.md` - Detailed security documentation
4. `docs/SUMMARY.md` - This summary
### Modified Files (2)
-1. `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` - Added integrity checks and immutable attributes
-2. `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh` - Added integrity verification and VirtualBox enforcement
+1. `periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` - Added integrity checks and immutable attributes
+2. `periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh` - Added integrity verification and VirtualBox enforcement
## Security Guarantees
@@ -103,7 +103,7 @@ Tests verify:
## Installation
```bash
-cd scripts/periodic_background/digital_wellbeing/pacman
+cd periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh
```
@@ -137,7 +137,7 @@ If legitimate policy updates are needed:
```bash
sudo chattr -i /usr/local/bin/pacman_greylist.txt
sudo nano /usr/local/bin/pacman_greylist.txt
-cd scripts/periodic_background/digital_wellbeing/pacman
+cd periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh # Regenerates checksums
```
diff --git a/linux_configuration/docs/pacman-wrapper/testing-and-usage.md b/linux_configuration/docs/pacman-wrapper/testing-and-usage.md
index b83de6c8..dd57b97a 100644
--- a/linux_configuration/docs/pacman-wrapper/testing-and-usage.md
+++ b/linux_configuration/docs/pacman-wrapper/testing-and-usage.md
@@ -22,7 +22,7 @@ Tests verify:
### Installation
```bash
-cd scripts/periodic_background/digital_wellbeing/pacman
+cd periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh
```
@@ -46,7 +46,7 @@ sudo chattr -i /usr/local/bin/pacman_greylist.txt
sudo nano /usr/local/bin/pacman_greylist.txt
# Reinstall wrapper to update checksums
-cd scripts/periodic_background/digital_wellbeing/pacman
+cd periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh
# This will regenerate checksums and reapply immutable attributes
diff --git a/linux_configuration/docs/security-hardening/01-current-state.md b/linux_configuration/docs/security-hardening/01-current-state.md
index 4ee6a05a..f6d0599e 100644
--- a/linux_configuration/docs/security-hardening/01-current-state.md
+++ b/linux_configuration/docs/security-hardening/01-current-state.md
@@ -36,7 +36,7 @@
**Files involved:**
-- [scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh](../scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh) (1359 lines)
+- [periodic_background/digital_wellbeing/setup_midnight_shutdown.sh](../periodic_background/digital_wellbeing/setup_midnight_shutdown.sh) (1359 lines)
**Current Protection Layers:**
@@ -79,9 +79,9 @@
**Files involved:**
-- [scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh](../scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh) (823 lines)
-- [scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt](../scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt)
-- [scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh](../scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh)
+- [periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh](../periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh) (823 lines)
+- [periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt](../periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt)
+- [periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh](../periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh)
**Current Protection:**
@@ -101,7 +101,7 @@
### 5. Block Compulsive Opening
-**File:** [scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh](../scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh) (507 lines)
+**File:** [periodic_background/digital_wellbeing/block_compulsive_opening.sh](../periodic_background/digital_wellbeing/block_compulsive_opening.sh) (507 lines)
**Current Behavior:**
@@ -121,7 +121,7 @@
### 6. YouTube Music Wrapper
-**File:** [scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh](../scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh)
+**File:** [periodic_background/digital_wellbeing/youtube-music-wrapper.sh](../periodic_background/digital_wellbeing/youtube-music-wrapper.sh)
**Current Behavior:**
diff --git a/linux_configuration/docs/security-hardening/03-implementation.md b/linux_configuration/docs/security-hardening/03-implementation.md
index 7b18e1df..b69cc944 100644
--- a/linux_configuration/docs/security-hardening/03-implementation.md
+++ b/linux_configuration/docs/security-hardening/03-implementation.md
@@ -27,7 +27,7 @@ hosts line completely bypasses /etc/hosts without touching it.
## 2. MIDNIGHT SHUTDOWN - Silent Denial
-Location: scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh
+Location: periodic_background/digital_wellbeing/setup_midnight_shutdown.sh
Changes needed:
- Remove ALL helpful messages about how to bypass (unlock-shutdown-schedule path)
@@ -59,7 +59,7 @@ Changes needed:
## 4. PACMAN WRAPPER - Chrome Block + LeechBlock Auto-Install
-Location: scripts/periodic_background/digital_wellbeing/pacman/
+Location: periodic_background/digital_wellbeing/pacman/
Changes needed to pacman_blocked_keywords.txt:
- Add: google-chrome
@@ -78,7 +78,7 @@ New behavior in pacman_wrapper.sh:
## 5. BLOCK COMPULSIVE OPENING - Auto-Close Timer
-Location: scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh
+Location: periodic_background/digital_wellbeing/block_compulsive_opening.sh
New behavior:
- After app is allowed to open, start a background timer
@@ -126,7 +126,7 @@ launch_with_timer() {
This requires a more sophisticated approach. Create a new Python daemon.
-Location: scripts/periodic_background/digital_wellbeing/focus_mode_daemon.py (new file)
+Location: periodic_background/digital_wellbeing/focus_mode_daemon.py (new file)
Behavior:
@@ -158,18 +158,18 @@ New files:
- hosts/guard/nsswitch-guard.path
- hosts/guard/nsswitch-guard.service
- hosts/guard/enforce-nsswitch.sh
-- scripts/periodic_background/digital_wellbeing/focus_mode_daemon.py
-- scripts/periodic_background/digital_wellbeing/install_focus_mode_daemon.sh
+- periodic_background/digital_wellbeing/focus_mode_daemon.py
+- periodic_background/digital_wellbeing/install_focus_mode_daemon.sh
- tests/test_security_hardening.sh
Modified files:
- hosts/guard/setup_hosts_guard.sh (add nsswitch protection)
-- scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh (remove helpful messages)
-- scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt (add chrome)
-- scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh (leechblock auto-install)
-- scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh (auto-close timer)
-- scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh (daemon integration)
+- periodic_background/digital_wellbeing/setup_midnight_shutdown.sh (remove helpful messages)
+- periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt (add chrome)
+- periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh (leechblock auto-install)
+- periodic_background/digital_wellbeing/block_compulsive_opening.sh (auto-close timer)
+- periodic_background/digital_wellbeing/youtube-music-wrapper.sh (daemon integration)
External repo (separate changes):
diff --git a/linux_configuration/docs/security-hardening/04-agent-personas.md b/linux_configuration/docs/security-hardening/04-agent-personas.md
index 0a3218dd..5d69745f 100644
--- a/linux_configuration/docs/security-hardening/04-agent-personas.md
+++ b/linux_configuration/docs/security-hardening/04-agent-personas.md
@@ -45,7 +45,7 @@ You are an expert on the midnight shutdown system. You understand:
FILES YOU KNOW:
-- scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh - Main installer (1300+ lines)
+- periodic_background/digital_wellbeing/setup_midnight_shutdown.sh - Main installer (1300+ lines)
- /etc/shutdown-schedule.conf - Runtime config (MON_WED_HOUR, THU_SUN_HOUR, MORNING_END_HOUR)
- /usr/local/share/locked-shutdown-schedule.conf - Canonical protected copy
- /usr/local/bin/day-specific-shutdown-check.sh - Checks if in shutdown window
@@ -83,12 +83,12 @@ You are an expert on the pacman wrapper security system. You understand:
FILES YOU KNOW:
-- scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh - Main wrapper (823 lines)
-- scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh - Backs up real pacman
-- scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt - Always blocked
-- scripts/periodic_background/digital_wellbeing/pacman/pacman_whitelist.txt - Exceptions to keywords
-- scripts/periodic_background/digital_wellbeing/pacman/pacman_greylist.txt - Challenge required
-- scripts/periodic_background/digital_wellbeing/pacman/words.txt - Word scramble challenge words
+- periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh - Main wrapper (823 lines)
+- periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh - Backs up real pacman
+- periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt - Always blocked
+- periodic_background/digital_wellbeing/pacman/pacman_whitelist.txt - Exceptions to keywords
+- periodic_background/digital_wellbeing/pacman/pacman_greylist.txt - Challenge required
+- periodic_background/digital_wellbeing/pacman/words.txt - Word scramble challenge words
- /var/lib/pacman-wrapper/policy.sha256 - Integrity checksums
KEY CONCEPTS:
@@ -127,7 +127,7 @@ You are an expert on the block_compulsive_opening.sh script. You understand:
FILES YOU KNOW:
-- scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh - Main script (507 lines)
+- periodic_background/digital_wellbeing/block_compulsive_opening.sh - Main script (507 lines)
- /usr/local/bin/block-compulsive-opening.sh - Installed location
- ~/.local/state/compulsive-block/\*.lastopen - Per-app state files
- ~/.local/state/compulsive-block/compulsive-block.log - Activity log
diff --git a/linux_configuration/docs/security-hardening/05-llm-readmes.md b/linux_configuration/docs/security-hardening/05-llm-readmes.md
index 7921ddcf..13f995d0 100644
--- a/linux_configuration/docs/security-hardening/05-llm-readmes.md
+++ b/linux_configuration/docs/security-hardening/05-llm-readmes.md
@@ -51,7 +51,7 @@ sudo ~/linux-configuration/hosts/guard/setup_hosts_guard.sh
````
-### [scripts/periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md](to be created)
+### [periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md](to be created)
```markdown
# Pacman Wrapper - LLM Reference
diff --git a/linux_configuration/dwm/README.md b/linux_configuration/dwm/README.md
index 66d8bd74..addb0ee1 100644
--- a/linux_configuration/dwm/README.md
+++ b/linux_configuration/dwm/README.md
@@ -2,7 +2,7 @@
Versioned customisation for [suckless dwm](https://dwm.suckless.org/). This
directory is the **source of truth**; the installer
-[`../scripts/single_use/features/setup_dwm.sh`](../scripts/single_use/features/setup_dwm.sh)
+[`../features/setup_dwm.sh`](../features/setup_dwm.sh)
clones upstream `dwm` master, copies these files on top, applies the two
`dwm.c` patches, and builds. Nothing here is a full fork of dwm — only the
files we actually change live in the repo, so upstream stays bleeding-edge.
diff --git a/linux_configuration/dwm/bin/dwm-session b/linux_configuration/dwm/bin/dwm-session
index 8f54e520..7434e963 100755
--- a/linux_configuration/dwm/bin/dwm-session
+++ b/linux_configuration/dwm/bin/dwm-session
@@ -20,7 +20,7 @@ command -v simplenote >/dev/null 2>&1 && simplenote &
[ -x "$HOME/.fehbg" ] && "$HOME/.fehbg" &
# repo helpers (real current paths under single_use/utils); guarded in case moved
-idle="$HOME/testsAndMisc/linux_configuration/scripts/single_use/utils/turn_off_auto_idle_screen_shutdown.sh"
+idle="$HOME/testsAndMisc/linux_configuration/utils/turn_off_auto_idle_screen_shutdown.sh"
[ -x "$idle" ] && bash "$idle" --watch-controller &
# lightweight status bar (root window name)
diff --git a/linux_configuration/dwm/config.h b/linux_configuration/dwm/config.h
index 50a53ad5..d7727ead 100644
--- a/linux_configuration/dwm/config.h
+++ b/linux_configuration/dwm/config.h
@@ -201,13 +201,13 @@ static const Key keys[] = {
* backend as the media keys, with a notification and NO pacman side-effects.
* (toggle_mic.sh is deliberately avoided here: it runs `sudo pacman -S dunst`
* if dunst is missing, which deadlocks pacman when spawned without a tty.) */
- { MODKEY, XK_m, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/scripts/single_use/utils/volume_control.sh micmute") },
+ { MODKEY, XK_m, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/utils/volume_control.sh micmute") },
/* media keys — routed through volume_control.sh, same as the (now-fixed) i3 config */
- { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/scripts/single_use/utils/volume_control.sh up") },
- { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/scripts/single_use/utils/volume_control.sh down") },
- { 0, XF86XK_AudioMute, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/scripts/single_use/utils/volume_control.sh mute") },
- { 0, XF86XK_AudioMicMute, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/scripts/single_use/utils/volume_control.sh micmute") },
+ { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/utils/volume_control.sh up") },
+ { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/utils/volume_control.sh down") },
+ { 0, XF86XK_AudioMute, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/utils/volume_control.sh mute") },
+ { 0, XF86XK_AudioMicMute, spawn, SHCMD("$HOME/testsAndMisc/linux_configuration/utils/volume_control.sh micmute") },
/* tags 1-10 (i3 workspaces 1-10) */
TAGKEYS( XK_1, 0)
diff --git a/linux_configuration/scripts/single_use/features/control_from_mobile.sh b/linux_configuration/features/control_from_mobile.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/control_from_mobile.sh
rename to linux_configuration/features/control_from_mobile.sh
diff --git a/linux_configuration/scripts/single_use/features/install_unreal_mcp.sh b/linux_configuration/features/install_unreal_mcp.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/install_unreal_mcp.sh
rename to linux_configuration/features/install_unreal_mcp.sh
index 92fc5e2b..7f48ceee 100755
--- a/linux_configuration/scripts/single_use/features/install_unreal_mcp.sh
+++ b/linux_configuration/features/install_unreal_mcp.sh
@@ -12,8 +12,8 @@ SCRIPT_NAME="$(basename "$0")"
# Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# ---------- User/paths ----------
set_actual_user_vars
diff --git a/linux_configuration/scripts/single_use/features/install_unreal_mcp_kvick.sh b/linux_configuration/features/install_unreal_mcp_kvick.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/install_unreal_mcp_kvick.sh
rename to linux_configuration/features/install_unreal_mcp_kvick.sh
diff --git a/linux_configuration/scripts/single_use/features/keepass-open.sh b/linux_configuration/features/keepass-open.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/keepass-open.sh
rename to linux_configuration/features/keepass-open.sh
diff --git a/linux_configuration/scripts/single_use/features/keepass_consolidate.sh b/linux_configuration/features/keepass_consolidate.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/keepass_consolidate.sh
rename to linux_configuration/features/keepass_consolidate.sh
diff --git a/linux_configuration/scripts/single_use/features/keepass_sync.sh b/linux_configuration/features/keepass_sync.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/keepass_sync.sh
rename to linux_configuration/features/keepass_sync.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/aw_autostart.sh b/linux_configuration/features/lib/aw_autostart.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/aw_autostart.sh
rename to linux_configuration/features/lib/aw_autostart.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/aw_install.sh b/linux_configuration/features/lib/aw_install.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/aw_install.sh
rename to linux_configuration/features/lib/aw_install.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/aw_service.sh b/linux_configuration/features/lib/aw_service.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/aw_service.sh
rename to linux_configuration/features/lib/aw_service.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/dns_dhcp.sh b/linux_configuration/features/lib/dns_dhcp.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/dns_dhcp.sh
rename to linux_configuration/features/lib/dns_dhcp.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/dns_firewall.sh b/linux_configuration/features/lib/dns_firewall.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/dns_firewall.sh
rename to linux_configuration/features/lib/dns_firewall.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/dns_units.sh b/linux_configuration/features/lib/dns_units.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/dns_units.sh
rename to linux_configuration/features/lib/dns_units.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/dot_resolver_install.sh b/linux_configuration/features/lib/dot_resolver_install.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/dot_resolver_install.sh
rename to linux_configuration/features/lib/dot_resolver_install.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/dwm_config.sh b/linux_configuration/features/lib/dwm_config.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/dwm_config.sh
rename to linux_configuration/features/lib/dwm_config.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/gitea_network.sh b/linux_configuration/features/lib/gitea_network.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/gitea_network.sh
rename to linux_configuration/features/lib/gitea_network.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/kcd2_autorebuild.sh b/linux_configuration/features/lib/kcd2_autorebuild.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/kcd2_autorebuild.sh
rename to linux_configuration/features/lib/kcd2_autorebuild.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/kcd2_expose.sh b/linux_configuration/features/lib/kcd2_expose.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/kcd2_expose.sh
rename to linux_configuration/features/lib/kcd2_expose.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/kcd2_serve.sh b/linux_configuration/features/lib/kcd2_serve.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/kcd2_serve.sh
rename to linux_configuration/features/lib/kcd2_serve.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/local_llm_model.sh b/linux_configuration/features/lib/local_llm_model.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/local_llm_model.sh
rename to linux_configuration/features/lib/local_llm_model.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/mobile_service.sh b/linux_configuration/features/lib/mobile_service.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/mobile_service.sh
rename to linux_configuration/features/lib/mobile_service.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_discover.sh b/linux_configuration/features/lib/nc_discover.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_discover.sh
rename to linux_configuration/features/lib/nc_discover.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_flash.sh b/linux_configuration/features/lib/nc_flash.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_flash.sh
rename to linux_configuration/features/lib/nc_flash.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_image.sh b/linux_configuration/features/lib/nc_image.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_image.sh
rename to linux_configuration/features/lib/nc_image.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_packages.sh b/linux_configuration/features/lib/nc_packages.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_packages.sh
rename to linux_configuration/features/lib/nc_packages.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_php.sh b/linux_configuration/features/lib/nc_php.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_php.sh
rename to linux_configuration/features/lib/nc_php.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_remote.sh b/linux_configuration/features/lib/nc_remote.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_remote.sh
rename to linux_configuration/features/lib/nc_remote.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_remote_flash.sh b/linux_configuration/features/lib/nc_remote_flash.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_remote_flash.sh
rename to linux_configuration/features/lib/nc_remote_flash.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/nc_services.sh b/linux_configuration/features/lib/nc_services.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/nc_services.sh
rename to linux_configuration/features/lib/nc_services.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/pi_flash_exec.sh b/linux_configuration/features/lib/pi_flash_exec.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/pi_flash_exec.sh
rename to linux_configuration/features/lib/pi_flash_exec.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/pi_flash_image.sh b/linux_configuration/features/lib/pi_flash_image.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/pi_flash_image.sh
rename to linux_configuration/features/lib/pi_flash_image.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/pi_flash_remote.sh b/linux_configuration/features/lib/pi_flash_remote.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/pi_flash_remote.sh
rename to linux_configuration/features/lib/pi_flash_remote.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_ca.sh b/linux_configuration/features/lib/rpi_nc_ca.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_ca.sh
rename to linux_configuration/features/lib/rpi_nc_ca.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_deps.sh b/linux_configuration/features/lib/rpi_nc_deps.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_deps.sh
rename to linux_configuration/features/lib/rpi_nc_deps.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_fixes.sh b/linux_configuration/features/lib/rpi_nc_fixes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_fixes.sh
rename to linux_configuration/features/lib/rpi_nc_fixes.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_install.sh b/linux_configuration/features/lib/rpi_nc_install.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_install.sh
rename to linux_configuration/features/lib/rpi_nc_install.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_ssl.sh b/linux_configuration/features/lib/rpi_nc_ssl.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_ssl.sh
rename to linux_configuration/features/lib/rpi_nc_ssl.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_ssl_remote.sh b/linux_configuration/features/lib/rpi_nc_ssl_remote.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_ssl_remote.sh
rename to linux_configuration/features/lib/rpi_nc_ssl_remote.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/rpi_nc_system.sh b/linux_configuration/features/lib/rpi_nc_system.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/rpi_nc_system.sh
rename to linux_configuration/features/lib/rpi_nc_system.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/searxng_expose.sh b/linux_configuration/features/lib/searxng_expose.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/searxng_expose.sh
rename to linux_configuration/features/lib/searxng_expose.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/searxng_limiter.sh b/linux_configuration/features/lib/searxng_limiter.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/searxng_limiter.sh
rename to linux_configuration/features/lib/searxng_limiter.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/searxng_settings.sh b/linux_configuration/features/lib/searxng_settings.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/searxng_settings.sh
rename to linux_configuration/features/lib/searxng_settings.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/searxng_stack.sh b/linux_configuration/features/lib/searxng_stack.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/searxng_stack.sh
rename to linux_configuration/features/lib/searxng_stack.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/searxng_start.sh b/linux_configuration/features/lib/searxng_start.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/searxng_start.sh
rename to linux_configuration/features/lib/searxng_start.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/searxng_status.sh b/linux_configuration/features/lib/searxng_status.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/searxng_status.sh
rename to linux_configuration/features/lib/searxng_status.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/syncyomi_expose.sh b/linux_configuration/features/lib/syncyomi_expose.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/syncyomi_expose.sh
rename to linux_configuration/features/lib/syncyomi_expose.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/syncyomi_stack.sh b/linux_configuration/features/lib/syncyomi_stack.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/syncyomi_stack.sh
rename to linux_configuration/features/lib/syncyomi_stack.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/features_harness.sh b/linux_configuration/features/lib/tests/features_harness.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/features_harness.sh
rename to linux_configuration/features/lib/tests/features_harness.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/jail_args b/linux_configuration/features/lib/tests/jail_args
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/jail_args
rename to linux_configuration/features/lib/tests/jail_args
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/run_all.sh b/linux_configuration/features/lib/tests/run_all.sh
similarity index 93%
rename from linux_configuration/scripts/single_use/features/lib/tests/run_all.sh
rename to linux_configuration/features/lib/tests/run_all.sh
index 05eaed4f..4faa7c30 100755
--- a/linux_configuration/scripts/single_use/features/lib/tests/run_all.sh
+++ b/linux_configuration/features/lib/tests/run_all.sh
@@ -12,7 +12,7 @@
# need on an Arch host:
#
# meta/scripts/shell_coverage_jail.sh \
-# --subject linux_configuration/scripts/single_use/features/lib/tests/run_all.sh \
+# --subject linux_configuration/features/lib/tests/run_all.sh \
# --bind /etc --bind /usr/local/bin --bind /var/lib \
# --seed-dir /etc/php/8.2/apache2 \
# --seed-dir /etc/php/8.2/mods-available \
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/test_aw_autostart.sh b/linux_configuration/features/lib/tests/test_aw_autostart.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/test_aw_autostart.sh
rename to linux_configuration/features/lib/tests/test_aw_autostart.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/test_dot_resolver_install.sh b/linux_configuration/features/lib/tests/test_dot_resolver_install.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/test_dot_resolver_install.sh
rename to linux_configuration/features/lib/tests/test_dot_resolver_install.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/test_dwm_config.sh b/linux_configuration/features/lib/tests/test_dwm_config.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/test_dwm_config.sh
rename to linux_configuration/features/lib/tests/test_dwm_config.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/test_nc_php.sh b/linux_configuration/features/lib/tests/test_nc_php.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/test_nc_php.sh
rename to linux_configuration/features/lib/tests/test_nc_php.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/test_rpi_nc_ca.sh b/linux_configuration/features/lib/tests/test_rpi_nc_ca.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/test_rpi_nc_ca.sh
rename to linux_configuration/features/lib/tests/test_rpi_nc_ca.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/tests/test_rpi_nc_install.sh b/linux_configuration/features/lib/tests/test_rpi_nc_install.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/tests/test_rpi_nc_install.sh
rename to linux_configuration/features/lib/tests/test_rpi_nc_install.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/unreal_mcp_repo.sh b/linux_configuration/features/lib/unreal_mcp_repo.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/unreal_mcp_repo.sh
rename to linux_configuration/features/lib/unreal_mcp_repo.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/website_build.sh b/linux_configuration/features/lib/website_build.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/website_build.sh
rename to linux_configuration/features/lib/website_build.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/wg_firewall.sh b/linux_configuration/features/lib/wg_firewall.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/wg_firewall.sh
rename to linux_configuration/features/lib/wg_firewall.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/wg_keys.sh b/linux_configuration/features/lib/wg_keys.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/wg_keys.sh
rename to linux_configuration/features/lib/wg_keys.sh
diff --git a/linux_configuration/scripts/single_use/features/lib/wg_sshd.sh b/linux_configuration/features/lib/wg_sshd.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/lib/wg_sshd.sh
rename to linux_configuration/features/lib/wg_sshd.sh
diff --git a/linux_configuration/scripts/single_use/features/migrate_github_to_gitea.sh b/linux_configuration/features/migrate_github_to_gitea.sh
similarity index 97%
rename from linux_configuration/scripts/single_use/features/migrate_github_to_gitea.sh
rename to linux_configuration/features/migrate_github_to_gitea.sh
index 5b45dd1b..0138d48d 100755
--- a/linux_configuration/scripts/single_use/features/migrate_github_to_gitea.sh
+++ b/linux_configuration/features/migrate_github_to_gitea.sh
@@ -21,8 +21,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
readonly GITEA_DOMAIN="kuhy.duckdns.org"
readonly GITEA_OWNER="kuhyx"
diff --git a/linux_configuration/scripts/single_use/features/raspberry_pi_flash_sd.sh b/linux_configuration/features/raspberry_pi_flash_sd.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/raspberry_pi_flash_sd.sh
rename to linux_configuration/features/raspberry_pi_flash_sd.sh
diff --git a/linux_configuration/scripts/single_use/features/raspberry_pi_nextcloud.sh b/linux_configuration/features/raspberry_pi_nextcloud.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/raspberry_pi_nextcloud.sh
rename to linux_configuration/features/raspberry_pi_nextcloud.sh
diff --git a/linux_configuration/scripts/single_use/features/setup_activitywatch.sh b/linux_configuration/features/setup_activitywatch.sh
similarity index 96%
rename from linux_configuration/scripts/single_use/features/setup_activitywatch.sh
rename to linux_configuration/features/setup_activitywatch.sh
index fe45b202..a4f63431 100755
--- a/linux_configuration/scripts/single_use/features/setup_activitywatch.sh
+++ b/linux_configuration/features/setup_activitywatch.sh
@@ -7,8 +7,8 @@ set -e # Exit on any error
# Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# Function to check and request sudo privileges for package installation
check_sudo() {
diff --git a/linux_configuration/scripts/single_use/features/setup_dns_blocker.sh b/linux_configuration/features/setup_dns_blocker.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_dns_blocker.sh
rename to linux_configuration/features/setup_dns_blocker.sh
index d9fce123..c193755c 100755
--- a/linux_configuration/scripts/single_use/features/setup_dns_blocker.sh
+++ b/linux_configuration/features/setup_dns_blocker.sh
@@ -25,8 +25,8 @@
set -euo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# ---- Configuration ---------------------------------------------------------
readonly FEED_DIR="/var/lib/dns-blocker"
diff --git a/linux_configuration/scripts/single_use/features/setup_dot_resolver.sh b/linux_configuration/features/setup_dot_resolver.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/setup_dot_resolver.sh
rename to linux_configuration/features/setup_dot_resolver.sh
diff --git a/linux_configuration/scripts/single_use/features/setup_dwm.sh b/linux_configuration/features/setup_dwm.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/setup_dwm.sh
rename to linux_configuration/features/setup_dwm.sh
diff --git a/linux_configuration/scripts/single_use/features/setup_gitea.sh b/linux_configuration/features/setup_gitea.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_gitea.sh
rename to linux_configuration/features/setup_gitea.sh
index 527284f5..01965b88 100755
--- a/linux_configuration/scripts/single_use/features/setup_gitea.sh
+++ b/linux_configuration/features/setup_gitea.sh
@@ -28,8 +28,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
readonly GITEA_DOMAIN="gitea.kuhy.duckdns.org"
readonly GITEA_ADMIN_USER="kuhyx"
diff --git a/linux_configuration/scripts/single_use/features/setup_kcd2_dice_solver.sh b/linux_configuration/features/setup_kcd2_dice_solver.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_kcd2_dice_solver.sh
rename to linux_configuration/features/setup_kcd2_dice_solver.sh
index 24721ee0..cd09072e 100755
--- a/linux_configuration/scripts/single_use/features/setup_kcd2_dice_solver.sh
+++ b/linux_configuration/features/setup_kcd2_dice_solver.sh
@@ -35,8 +35,8 @@ set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
readonly SCRIPT_DIR
-# shellcheck source=../../lib/common.sh
-source "${SCRIPT_DIR}/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "${SCRIPT_DIR}/../lib/common.sh"
# --- Configuration ----------------------------------------------------------
readonly DICE_DOMAIN="dice.kuhy.duckdns.org"
diff --git a/linux_configuration/scripts/single_use/features/setup_keepass_sync.sh b/linux_configuration/features/setup_keepass_sync.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/setup_keepass_sync.sh
rename to linux_configuration/features/setup_keepass_sync.sh
diff --git a/linux_configuration/scripts/single_use/features/setup_local_llm.sh b/linux_configuration/features/setup_local_llm.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_local_llm.sh
rename to linux_configuration/features/setup_local_llm.sh
index c63f759d..3c79faf7 100755
--- a/linux_configuration/scripts/single_use/features/setup_local_llm.sh
+++ b/linux_configuration/features/setup_local_llm.sh
@@ -24,9 +24,9 @@ readonly WEBUI_VOLUME="open-webui-data"
readonly OLLAMA_DROPIN="/etc/systemd/system/ollama.service.d/local-llm.conf"
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
+# shellcheck source=../lib/common.sh
# shellcheck disable=SC1091
-source "$SCRIPT_DIR/../../lib/common.sh"
+source "$SCRIPT_DIR/../lib/common.sh"
# ── Helpers ───────────────────────────────────────────────────────────────────
section() { printf '\n\033[1;34m══ %s ══\033[0m\n' "$*"; }
diff --git a/linux_configuration/scripts/single_use/features/setup_nextcloud_raspberry.sh b/linux_configuration/features/setup_nextcloud_raspberry.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/setup_nextcloud_raspberry.sh
rename to linux_configuration/features/setup_nextcloud_raspberry.sh
diff --git a/linux_configuration/scripts/single_use/features/setup_personal_website.sh b/linux_configuration/features/setup_personal_website.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_personal_website.sh
rename to linux_configuration/features/setup_personal_website.sh
index 74581b4f..d7634cf2 100755
--- a/linux_configuration/scripts/single_use/features/setup_personal_website.sh
+++ b/linux_configuration/features/setup_personal_website.sh
@@ -33,8 +33,8 @@ set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
readonly SCRIPT_DIR
-# shellcheck source=../../lib/common.sh
-source "${SCRIPT_DIR}/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "${SCRIPT_DIR}/../lib/common.sh"
# --- Configuration ----------------------------------------------------------
readonly WEBSITE_DOMAIN="kuhy.duckdns.org"
diff --git a/linux_configuration/scripts/single_use/features/setup_phone_wireguard.sh b/linux_configuration/features/setup_phone_wireguard.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/features/setup_phone_wireguard.sh
rename to linux_configuration/features/setup_phone_wireguard.sh
diff --git a/linux_configuration/scripts/single_use/features/setup_searxng.sh b/linux_configuration/features/setup_searxng.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_searxng.sh
rename to linux_configuration/features/setup_searxng.sh
index 367b98b0..6ee470d1 100755
--- a/linux_configuration/scripts/single_use/features/setup_searxng.sh
+++ b/linux_configuration/features/setup_searxng.sh
@@ -41,8 +41,8 @@ set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
readonly SCRIPT_DIR
-# shellcheck source=../../lib/common.sh
-source "${SCRIPT_DIR}/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "${SCRIPT_DIR}/../lib/common.sh"
# --- Configuration ----------------------------------------------------------
readonly SEARX_DOMAIN="searx.kuhy.duckdns.org"
diff --git a/linux_configuration/scripts/single_use/features/setup_syncyomi.sh b/linux_configuration/features/setup_syncyomi.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_syncyomi.sh
rename to linux_configuration/features/setup_syncyomi.sh
index 5a8b2898..4b9a921a 100755
--- a/linux_configuration/scripts/single_use/features/setup_syncyomi.sh
+++ b/linux_configuration/features/setup_syncyomi.sh
@@ -44,9 +44,9 @@ SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
readonly SCRIPT_DIR
readonly WG_SCRIPT="${SCRIPT_DIR}/setup_wireguard_ssh.sh"
-# shellcheck source=../../lib/common.sh
+# shellcheck source=../lib/common.sh
# shellcheck disable=SC1091
-source "${SCRIPT_DIR}/../../lib/common.sh"
+source "${SCRIPT_DIR}/../lib/common.sh"
# Config values (populated from CONF_FILE / defaults).
SYNCYOMI_USER=""
diff --git a/linux_configuration/scripts/single_use/features/setup_syncyomi_guard.sh b/linux_configuration/features/setup_syncyomi_guard.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/features/setup_syncyomi_guard.sh
rename to linux_configuration/features/setup_syncyomi_guard.sh
index 5e5e1781..1eac9d40 100755
--- a/linux_configuration/scripts/single_use/features/setup_syncyomi_guard.sh
+++ b/linux_configuration/features/setup_syncyomi_guard.sh
@@ -16,7 +16,7 @@ set -euo pipefail
SCRIPT_NAME="$(basename "$0")"
readonly SCRIPT_NAME
-REPO_ROOT="$(cd "$(dirname "$0")/../../../.." && pwd)"
+REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
readonly REPO_ROOT
readonly UNIT_DIR="${HOME}/.config/systemd/user"
readonly SERVICE_NAME="syncyomi-guard.service"
diff --git a/linux_configuration/scripts/single_use/features/setup_wireguard_ssh.sh b/linux_configuration/features/setup_wireguard_ssh.sh
similarity index 97%
rename from linux_configuration/scripts/single_use/features/setup_wireguard_ssh.sh
rename to linux_configuration/features/setup_wireguard_ssh.sh
index b78b30c5..ad8560b0 100755
--- a/linux_configuration/scripts/single_use/features/setup_wireguard_ssh.sh
+++ b/linux_configuration/features/setup_wireguard_ssh.sh
@@ -14,8 +14,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
readonly WG_IFACE="wg0"
readonly WG_PORT="51820"
diff --git a/linux_configuration/scripts/single_use/features/systemd/keepass-cloud-sync.path b/linux_configuration/features/systemd/keepass-cloud-sync.path
similarity index 100%
rename from linux_configuration/scripts/single_use/features/systemd/keepass-cloud-sync.path
rename to linux_configuration/features/systemd/keepass-cloud-sync.path
diff --git a/linux_configuration/scripts/single_use/features/systemd/keepass-cloud-sync.service b/linux_configuration/features/systemd/keepass-cloud-sync.service
similarity index 100%
rename from linux_configuration/scripts/single_use/features/systemd/keepass-cloud-sync.service
rename to linux_configuration/features/systemd/keepass-cloud-sync.service
diff --git a/linux_configuration/scripts/single_use/feedback-appimage/PKGBUILD b/linux_configuration/feedback-appimage/PKGBUILD
similarity index 100%
rename from linux_configuration/scripts/single_use/feedback-appimage/PKGBUILD
rename to linux_configuration/feedback-appimage/PKGBUILD
diff --git a/linux_configuration/scripts/single_use/fixes/diagnose_arch_performance.sh b/linux_configuration/fixes/diagnose_arch_performance.sh
similarity index 96%
rename from linux_configuration/scripts/single_use/fixes/diagnose_arch_performance.sh
rename to linux_configuration/fixes/diagnose_arch_performance.sh
index 08d083f7..04110797 100755
--- a/linux_configuration/scripts/single_use/fixes/diagnose_arch_performance.sh
+++ b/linux_configuration/fixes/diagnose_arch_performance.sh
@@ -3,8 +3,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
REPORT_DIR="${HOME}/.local/state/system-diagnostics"
REPORT_FILE="$REPORT_DIR/arch-performance-$(date +%Y%m%d_%H%M%S).log"
diff --git a/linux_configuration/scripts/single_use/fixes/diagnose_pacman_hook_stall.sh b/linux_configuration/fixes/diagnose_pacman_hook_stall.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/diagnose_pacman_hook_stall.sh
rename to linux_configuration/fixes/diagnose_pacman_hook_stall.sh
diff --git a/linux_configuration/scripts/single_use/fixes/fix_anki.sh b/linux_configuration/fixes/fix_anki.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_anki.sh
rename to linux_configuration/fixes/fix_anki.sh
index 7e315780..94dfb813 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_anki.sh
+++ b/linux_configuration/fixes/fix_anki.sh
@@ -13,8 +13,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# Colors for output
RED='\033[0;31m'
diff --git a/linux_configuration/scripts/single_use/fixes/fix_arch_performance.sh b/linux_configuration/fixes/fix_arch_performance.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_arch_performance.sh
rename to linux_configuration/fixes/fix_arch_performance.sh
index e94525d8..9b57831e 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_arch_performance.sh
+++ b/linux_configuration/fixes/fix_arch_performance.sh
@@ -22,8 +22,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT"
diff --git a/linux_configuration/scripts/single_use/fixes/fix_bluetooth.sh b/linux_configuration/fixes/fix_bluetooth.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_bluetooth.sh
rename to linux_configuration/fixes/fix_bluetooth.sh
index d93d870b..5900d878 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_bluetooth.sh
+++ b/linux_configuration/fixes/fix_bluetooth.sh
@@ -27,8 +27,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT"
diff --git a/linux_configuration/scripts/single_use/fixes/fix_controller.sh b/linux_configuration/fixes/fix_controller.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/fix_controller.sh
rename to linux_configuration/fixes/fix_controller.sh
diff --git a/linux_configuration/scripts/single_use/fixes/fix_flutter_git_env.sh b/linux_configuration/fixes/fix_flutter_git_env.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_flutter_git_env.sh
rename to linux_configuration/fixes/fix_flutter_git_env.sh
index a754ad8a..600be741 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_flutter_git_env.sh
+++ b/linux_configuration/fixes/fix_flutter_git_env.sh
@@ -59,7 +59,7 @@ write_wrapper() {
#!/bin/bash
# Strip the git-hook environment, then hand off to the real SDK binary.
-# Installed by linux_configuration/scripts/single_use/fixes/fix_flutter_git_env.sh
+# Installed by linux_configuration/fixes/fix_flutter_git_env.sh
# -- see that script for why this exists. Invoked through a symlink named
# after the tool it fronts (flutter, dart).
diff --git a/linux_configuration/scripts/single_use/fixes/fix_stepmania.sh b/linux_configuration/fixes/fix_stepmania.sh
similarity index 97%
rename from linux_configuration/scripts/single_use/fixes/fix_stepmania.sh
rename to linux_configuration/fixes/fix_stepmania.sh
index f58d123c..2d6cb384 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_stepmania.sh
+++ b/linux_configuration/fixes/fix_stepmania.sh
@@ -18,8 +18,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# Colors for output
RED='\033[0;31m'
diff --git a/linux_configuration/scripts/single_use/fixes/fix_systemctl.sh b/linux_configuration/fixes/fix_systemctl.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_systemctl.sh
rename to linux_configuration/fixes/fix_systemctl.sh
index 5a33298d..f6c181d8 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_systemctl.sh
+++ b/linux_configuration/fixes/fix_systemctl.sh
@@ -11,7 +11,7 @@ set -euo pipefail
SERVICE_NAME="media-organizer"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
-DEFAULT_ORGANIZE_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/scripts/utils/organize_downloads.sh"
+DEFAULT_ORGANIZE_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/utils/organize_downloads.sh"
LEGACY_ORGANIZE_SCRIPT="/home/kuhy/linux-configuration/scripts/utils/organize_downloads.sh"
if [[ -f $DEFAULT_ORGANIZE_SCRIPT ]]; then
ORGANIZE_SCRIPT="$DEFAULT_ORGANIZE_SCRIPT"
diff --git a/linux_configuration/scripts/single_use/fixes/fix_thorium.sh b/linux_configuration/fixes/fix_thorium.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_thorium.sh
rename to linux_configuration/fixes/fix_thorium.sh
index 8fce0fbb..023b8157 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_thorium.sh
+++ b/linux_configuration/fixes/fix_thorium.sh
@@ -16,8 +16,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# Configuration
THORIUM_CONFIG_DIR="${HOME}/.config/thorium"
diff --git a/linux_configuration/scripts/single_use/fixes/fix_ubuntu_performance.sh b/linux_configuration/fixes/fix_ubuntu_performance.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_ubuntu_performance.sh
rename to linux_configuration/fixes/fix_ubuntu_performance.sh
index abb45140..8528a2fd 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_ubuntu_performance.sh
+++ b/linux_configuration/fixes/fix_ubuntu_performance.sh
@@ -26,8 +26,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT"
diff --git a/linux_configuration/scripts/single_use/fixes/fix_virtualbox.sh b/linux_configuration/fixes/fix_virtualbox.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/fix_virtualbox.sh
rename to linux_configuration/fixes/fix_virtualbox.sh
index 5dd4190d..dad8ad8f 100755
--- a/linux_configuration/scripts/single_use/fixes/fix_virtualbox.sh
+++ b/linux_configuration/fixes/fix_virtualbox.sh
@@ -4,8 +4,8 @@ set -euo pipefail
# Source common library
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
on_error() {
local exit_code=$?
diff --git a/linux_configuration/scripts/single_use/fixes/fix_waifu2x.sh b/linux_configuration/fixes/fix_waifu2x.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/fix_waifu2x.sh
rename to linux_configuration/fixes/fix_waifu2x.sh
diff --git a/linux_configuration/scripts/single_use/fixes/fix_yay_aur_database.sh b/linux_configuration/fixes/fix_yay_aur_database.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/fix_yay_aur_database.sh
rename to linux_configuration/fixes/fix_yay_aur_database.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/arch_cpu.sh b/linux_configuration/fixes/lib/arch_cpu.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/arch_cpu.sh
rename to linux_configuration/fixes/lib/arch_cpu.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/arch_hardware.sh b/linux_configuration/fixes/lib/arch_hardware.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/arch_hardware.sh
rename to linux_configuration/fixes/lib/arch_hardware.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/arch_perf_fixes.sh b/linux_configuration/fixes/lib/arch_perf_fixes.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/lib/arch_perf_fixes.sh
rename to linux_configuration/fixes/lib/arch_perf_fixes.sh
index 8db0e21a..1cff56bf 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/arch_perf_fixes.sh
+++ b/linux_configuration/fixes/lib/arch_perf_fixes.sh
@@ -65,7 +65,7 @@ fix_media_organizer() {
# Find the organize_downloads.sh script
local script_path=""
local candidates=(
- "${ORGANIZE_SCRIPT_CANDIDATES:-/home/kuhy/testsAndMisc/linux_configuration/scripts/utils/organize_downloads.sh}"
+ "${ORGANIZE_SCRIPT_CANDIDATES:-/home/kuhy/testsAndMisc/linux_configuration/utils/organize_downloads.sh}"
"/home/kuhy/linux-configuration/scripts/utils/organize_downloads.sh"
)
for candidate in "${candidates[@]}"; do
diff --git a/linux_configuration/scripts/single_use/fixes/lib/arch_perf_probes.sh b/linux_configuration/fixes/lib/arch_perf_probes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/arch_perf_probes.sh
rename to linux_configuration/fixes/lib/arch_perf_probes.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/arch_perf_report.sh b/linux_configuration/fixes/lib/arch_perf_report.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/arch_perf_report.sh
rename to linux_configuration/fixes/lib/arch_perf_report.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/arch_sysctl.sh b/linux_configuration/fixes/lib/arch_sysctl.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/arch_sysctl.sh
rename to linux_configuration/fixes/lib/arch_sysctl.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/bt_adapter.sh b/linux_configuration/fixes/lib/bt_adapter.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/bt_adapter.sh
rename to linux_configuration/fixes/lib/bt_adapter.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/bt_audio.sh b/linux_configuration/fixes/lib/bt_audio.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/bt_audio.sh
rename to linux_configuration/fixes/lib/bt_audio.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/bt_pairing.sh b/linux_configuration/fixes/lib/bt_pairing.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/bt_pairing.sh
rename to linux_configuration/fixes/lib/bt_pairing.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/bt_report.sh b/linux_configuration/fixes/lib/bt_report.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/bt_report.sh
rename to linux_configuration/fixes/lib/bt_report.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/hosts_guard_migrate.sh b/linux_configuration/fixes/lib/hosts_guard_migrate.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/hosts_guard_migrate.sh
rename to linux_configuration/fixes/lib/hosts_guard_migrate.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/hosts_guard_rollback.sh b/linux_configuration/fixes/lib/hosts_guard_rollback.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/hosts_guard_rollback.sh
rename to linux_configuration/fixes/lib/hosts_guard_rollback.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/nvidia_config.sh b/linux_configuration/fixes/lib/nvidia_config.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/nvidia_config.sh
rename to linux_configuration/fixes/lib/nvidia_config.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_capture.sh b/linux_configuration/fixes/lib/pacman_hook_stall_capture.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_capture.sh
rename to linux_configuration/fixes/lib/pacman_hook_stall_capture.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_load.sh b/linux_configuration/fixes/lib/pacman_hook_stall_load.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_load.sh
rename to linux_configuration/fixes/lib/pacman_hook_stall_load.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_setup.sh b/linux_configuration/fixes/lib/pacman_hook_stall_setup.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_setup.sh
rename to linux_configuration/fixes/lib/pacman_hook_stall_setup.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_summary.sh b/linux_configuration/fixes/lib/pacman_hook_stall_summary.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_summary.sh
rename to linux_configuration/fixes/lib/pacman_hook_stall_summary.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_usage.sh b/linux_configuration/fixes/lib/pacman_hook_stall_usage.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_usage.sh
rename to linux_configuration/fixes/lib/pacman_hook_stall_usage.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_watch.sh b/linux_configuration/fixes/lib/pacman_hook_stall_watch.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/pacman_hook_stall_watch.sh
rename to linux_configuration/fixes/lib/pacman_hook_stall_watch.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/arch_desktop_harness.sh b/linux_configuration/fixes/lib/tests/arch_desktop_harness.sh
similarity index 95%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/arch_desktop_harness.sh
rename to linux_configuration/fixes/lib/tests/arch_desktop_harness.sh
index f1eaa925..647909a9 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/arch_desktop_harness.sh
+++ b/linux_configuration/fixes/lib/tests/arch_desktop_harness.sh
@@ -9,7 +9,7 @@
# * apply_tweak, redefined verbatim from the entry script -- it lives there
# rather than in any lib, the same arrangement arch_perf_harness.sh
# handles with add_finding/add_action;
-# * the real log_*/has_cmd helpers, via scripts/lib/common.sh.
+# * the real log_*/has_cmd helpers, via lib/common.sh.
#
# NOT to be confused with arch_perf_harness.sh, which serves a different entry
# script (diagnose_arch_performance.sh) and a different set of libs. The two
@@ -23,13 +23,13 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- globals and helpers owned by optimize_arch_desktop.sh ------------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/arch_perf_harness.sh b/linux_configuration/fixes/lib/tests/arch_perf_harness.sh
similarity index 93%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/arch_perf_harness.sh
rename to linux_configuration/fixes/lib/tests/arch_perf_harness.sh
index 9142aa92..ca9e7e8a 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/arch_perf_harness.sh
+++ b/linux_configuration/fixes/lib/tests/arch_perf_harness.sh
@@ -9,7 +9,7 @@
# * add_finding, add_action and run_and_log, redefined verbatim from the
# entry script -- they live there rather than in any lib, the same
# arrangement pacman_hook_stall_harness.sh handles with log_size;
-# * the real log_*/has_cmd helpers, via scripts/lib/common.sh.
+# * the real log_*/has_cmd helpers, via lib/common.sh.
#
# REPORT_FILE points into the throwaway tmpdir, so the probes' report writes
# never leave the sandbox.
@@ -17,13 +17,13 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- globals and helpers owned by diagnose_arch_performance.sh --------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/arch_sysctl_quarantined_cases.sh b/linux_configuration/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
rename to linux_configuration/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
index ee703042..dad35898 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
+++ b/linux_configuration/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
@@ -25,7 +25,7 @@
# stays on meta/shell-coverage-allowlist.txt.
#
# TO RUN THESE CASES:
-# bash linux_configuration/scripts/single_use/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
+# bash linux_configuration/fixes/lib/tests/arch_sysctl_quarantined_cases.sh
#
# TO UN-QUARANTINE: rename back to test_arch_sysctl.sh, then re-measure
# bt_audio.sh through run_all.sh and confirm it is still 127/127 BEFORE
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/bt_harness.sh b/linux_configuration/fixes/lib/tests/bt_harness.sh
similarity index 94%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/bt_harness.sh
rename to linux_configuration/fixes/lib/tests/bt_harness.sh
index 12538ea5..4fea9321 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/bt_harness.sh
+++ b/linux_configuration/fixes/lib/tests/bt_harness.sh
@@ -5,7 +5,7 @@
# Sourced, not executed. Builds on lib_test_core.sh (tmpdir, $FAKE_BIN on
# PATH, the _t_* assertions) and adds the three things the bt libs need:
#
-# 1. the real log_*/has_cmd helpers, by sourcing scripts/lib/common.sh --
+# 1. the real log_*/has_cmd helpers, by sourcing lib/common.sh --
# it is inert at source time (a load guard, two exports and three
# sub-sources), so the libs get the exact helpers they see in production
# rather than reimplementations that could drift;
@@ -23,14 +23,14 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
# Real logging/has_cmd/ask_yes_no helpers, as the entry script gets them.
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- pieces that live in fix_bluetooth.sh, not in a lib ---------------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/hosts_guard_harness.sh b/linux_configuration/fixes/lib/tests/hosts_guard_harness.sh
similarity index 95%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/hosts_guard_harness.sh
rename to linux_configuration/fixes/lib/tests/hosts_guard_harness.sh
index 3d954e01..afdb41a1 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/hosts_guard_harness.sh
+++ b/linux_configuration/fixes/lib/tests/hosts_guard_harness.sh
@@ -10,7 +10,7 @@
# * the LEGACY_HOOKS / LEGACY_UNITS / INSTANCES tables, verbatim;
# * msg/note/warn/err, `run`, instance_spec and instance_registered,
# redefined verbatim -- they live in the entry script, not in any lib;
-# * the real log_*/has_cmd helpers, via scripts/lib/common.sh.
+# * the real log_*/has_cmd helpers, via lib/common.sh.
#
# The entry script marks most of these `readonly`, but it is never sourced
# here: this harness owns its own copies, so nothing is being overwritten.
@@ -18,13 +18,13 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- globals owned by migrate_hosts_guard_to_guard_lib.sh -------------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/lib_test_core.sh b/linux_configuration/fixes/lib/tests/lib_test_core.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/lib_test_core.sh
rename to linux_configuration/fixes/lib/tests/lib_test_core.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/lib_test_path.sh b/linux_configuration/fixes/lib/tests/lib_test_path.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/lib_test_path.sh
rename to linux_configuration/fixes/lib/tests/lib_test_path.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/nvidia_config_harness.sh b/linux_configuration/fixes/lib/tests/nvidia_config_harness.sh
similarity index 91%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/nvidia_config_harness.sh
rename to linux_configuration/fixes/lib/tests/nvidia_config_harness.sh
index 8754d110..aa85a1e4 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/nvidia_config_harness.sh
+++ b/linux_configuration/fixes/lib/tests/nvidia_config_harness.sh
@@ -9,7 +9,7 @@
# prompts or auto-installs;
# * SUDO_USER, which the lib uses both to build the home path and as the
# user it drops to for every git/cmake call;
-# * the real log_*/has_cmd helpers, via scripts/lib/common.sh.
+# * the real log_*/has_cmd helpers, via lib/common.sh.
#
# The four paths the lib writes to are behind overrides that default to the
# real locations, so nothing here can reach /etc or a real home directory.
@@ -17,13 +17,13 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- globals owned by nvidia_troubleshoot.sh and the seams ------------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/pacman_hook_stall_entry_harness.sh b/linux_configuration/fixes/lib/tests/pacman_hook_stall_entry_harness.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/pacman_hook_stall_entry_harness.sh
rename to linux_configuration/fixes/lib/tests/pacman_hook_stall_entry_harness.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/pacman_hook_stall_harness.sh b/linux_configuration/fixes/lib/tests/pacman_hook_stall_harness.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/pacman_hook_stall_harness.sh
rename to linux_configuration/fixes/lib/tests/pacman_hook_stall_harness.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/run_all.sh b/linux_configuration/fixes/lib/tests/run_all.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/run_all.sh
rename to linux_configuration/fixes/lib/tests/run_all.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_cpu.sh b/linux_configuration/fixes/lib/tests/test_arch_cpu.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_cpu.sh
rename to linux_configuration/fixes/lib/tests/test_arch_cpu.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_hardware.sh b/linux_configuration/fixes/lib/tests/test_arch_hardware.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_hardware.sh
rename to linux_configuration/fixes/lib/tests/test_arch_hardware.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_hardware_boot.sh b/linux_configuration/fixes/lib/tests/test_arch_hardware_boot.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_hardware_boot.sh
rename to linux_configuration/fixes/lib/tests/test_arch_hardware_boot.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_fixes.sh b/linux_configuration/fixes/lib/tests/test_arch_perf_fixes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_fixes.sh
rename to linux_configuration/fixes/lib/tests/test_arch_perf_fixes.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_probes.sh b/linux_configuration/fixes/lib/tests/test_arch_perf_probes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_probes.sh
rename to linux_configuration/fixes/lib/tests/test_arch_perf_probes.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_probes_health.sh b/linux_configuration/fixes/lib/tests/test_arch_perf_probes_health.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_probes_health.sh
rename to linux_configuration/fixes/lib/tests/test_arch_perf_probes_health.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_report.sh b/linux_configuration/fixes/lib/tests/test_arch_perf_report.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_report.sh
rename to linux_configuration/fixes/lib/tests/test_arch_perf_report.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_report_fixes.sh b/linux_configuration/fixes/lib/tests/test_arch_perf_report_fixes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_arch_perf_report_fixes.sh
rename to linux_configuration/fixes/lib/tests/test_arch_perf_report_fixes.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_adapter.sh b/linux_configuration/fixes/lib/tests/test_bt_adapter.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_adapter.sh
rename to linux_configuration/fixes/lib/tests/test_bt_adapter.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_adapter_reset.sh b/linux_configuration/fixes/lib/tests/test_bt_adapter_reset.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_adapter_reset.sh
rename to linux_configuration/fixes/lib/tests/test_bt_adapter_reset.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_audio.sh b/linux_configuration/fixes/lib/tests/test_bt_audio.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_audio.sh
rename to linux_configuration/fixes/lib/tests/test_bt_audio.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_audio_connect.sh b/linux_configuration/fixes/lib/tests/test_bt_audio_connect.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_audio_connect.sh
rename to linux_configuration/fixes/lib/tests/test_bt_audio_connect.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_audio_health.sh b/linux_configuration/fixes/lib/tests/test_bt_audio_health.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_audio_health.sh
rename to linux_configuration/fixes/lib/tests/test_bt_audio_health.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_pairing.sh b/linux_configuration/fixes/lib/tests/test_bt_pairing.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_pairing.sh
rename to linux_configuration/fixes/lib/tests/test_bt_pairing.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_pairing_usb.sh b/linux_configuration/fixes/lib/tests/test_bt_pairing_usb.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_pairing_usb.sh
rename to linux_configuration/fixes/lib/tests/test_bt_pairing_usb.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_report.sh b/linux_configuration/fixes/lib/tests/test_bt_report.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_bt_report.sh
rename to linux_configuration/fixes/lib/tests/test_bt_report.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_diagnose_pacman_hook_stall_args.sh b/linux_configuration/fixes/lib/tests/test_diagnose_pacman_hook_stall_args.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_diagnose_pacman_hook_stall_args.sh
rename to linux_configuration/fixes/lib/tests/test_diagnose_pacman_hook_stall_args.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_diagnose_pacman_hook_stall_timing.sh b/linux_configuration/fixes/lib/tests/test_diagnose_pacman_hook_stall_timing.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_diagnose_pacman_hook_stall_timing.sh
rename to linux_configuration/fixes/lib/tests/test_diagnose_pacman_hook_stall_timing.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_hosts_guard_migrate.sh b/linux_configuration/fixes/lib/tests/test_hosts_guard_migrate.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_hosts_guard_migrate.sh
rename to linux_configuration/fixes/lib/tests/test_hosts_guard_migrate.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_hosts_guard_migrate_flow.sh b/linux_configuration/fixes/lib/tests/test_hosts_guard_migrate_flow.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_hosts_guard_migrate_flow.sh
rename to linux_configuration/fixes/lib/tests/test_hosts_guard_migrate_flow.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_hosts_guard_rollback.sh b/linux_configuration/fixes/lib/tests/test_hosts_guard_rollback.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_hosts_guard_rollback.sh
rename to linux_configuration/fixes/lib/tests/test_hosts_guard_rollback.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_nvidia_config.sh b/linux_configuration/fixes/lib/tests/test_nvidia_config.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_nvidia_config.sh
rename to linux_configuration/fixes/lib/tests/test_nvidia_config.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_nvidia_config_pyroveil.sh b/linux_configuration/fixes/lib/tests/test_nvidia_config_pyroveil.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_nvidia_config_pyroveil.sh
rename to linux_configuration/fixes/lib/tests/test_nvidia_config_pyroveil.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_capture.sh b/linux_configuration/fixes/lib/tests/test_pacman_hook_stall_capture.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_capture.sh
rename to linux_configuration/fixes/lib/tests/test_pacman_hook_stall_capture.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_load.sh b/linux_configuration/fixes/lib/tests/test_pacman_hook_stall_load.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_load.sh
rename to linux_configuration/fixes/lib/tests/test_pacman_hook_stall_load.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_setup.sh b/linux_configuration/fixes/lib/tests/test_pacman_hook_stall_setup.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_setup.sh
rename to linux_configuration/fixes/lib/tests/test_pacman_hook_stall_setup.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_summary.sh b/linux_configuration/fixes/lib/tests/test_pacman_hook_stall_summary.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_summary.sh
rename to linux_configuration/fixes/lib/tests/test_pacman_hook_stall_summary.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_usage.sh b/linux_configuration/fixes/lib/tests/test_pacman_hook_stall_usage.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_usage.sh
rename to linux_configuration/fixes/lib/tests/test_pacman_hook_stall_usage.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_watch.sh b/linux_configuration/fixes/lib/tests/test_pacman_hook_stall_watch.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_pacman_hook_stall_watch.sh
rename to linux_configuration/fixes/lib/tests/test_pacman_hook_stall_watch.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_thorium_repairs.sh b/linux_configuration/fixes/lib/tests/test_thorium_repairs.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_thorium_repairs.sh
rename to linux_configuration/fixes/lib/tests/test_thorium_repairs.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_thorium_repairs_deep.sh b/linux_configuration/fixes/lib/tests/test_thorium_repairs_deep.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_thorium_repairs_deep.sh
rename to linux_configuration/fixes/lib/tests/test_thorium_repairs_deep.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_ubuntu_perf_fixes.sh b/linux_configuration/fixes/lib/tests/test_ubuntu_perf_fixes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_ubuntu_perf_fixes.sh
rename to linux_configuration/fixes/lib/tests/test_ubuntu_perf_fixes.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_ubuntu_perf_fixes_oom.sh b/linux_configuration/fixes/lib/tests/test_ubuntu_perf_fixes_oom.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_ubuntu_perf_fixes_oom.sh
rename to linux_configuration/fixes/lib/tests/test_ubuntu_perf_fixes_oom.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/test_ubuntu_perf_more.sh b/linux_configuration/fixes/lib/tests/test_ubuntu_perf_more.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/test_ubuntu_perf_more.sh
rename to linux_configuration/fixes/lib/tests/test_ubuntu_perf_more.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/thorium_harness.sh b/linux_configuration/fixes/lib/tests/thorium_harness.sh
similarity index 93%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/thorium_harness.sh
rename to linux_configuration/fixes/lib/tests/thorium_harness.sh
index b0b6b93f..b678e4ee 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/thorium_harness.sh
+++ b/linux_configuration/fixes/lib/tests/thorium_harness.sh
@@ -11,7 +11,7 @@
# entry script -- they live there rather than in any lib, the same
# arrangement arch_desktop_harness.sh handles with apply_tweak;
# * the colour variables the lib echoes;
-# * the real log_*/has_cmd helpers, via scripts/lib/common.sh.
+# * the real log_*/has_cmd helpers, via lib/common.sh.
#
# The lib takes EVERY path it touches from $THORIUM_CONFIG_DIR, so pointing
# that one variable at the tmpdir is enough to confine it -- no production
@@ -20,13 +20,13 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- globals and helpers owned by fix_thorium.sh ----------------------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/tests/ubuntu_perf_harness.sh b/linux_configuration/fixes/lib/tests/ubuntu_perf_harness.sh
similarity index 92%
rename from linux_configuration/scripts/single_use/fixes/lib/tests/ubuntu_perf_harness.sh
rename to linux_configuration/fixes/lib/tests/ubuntu_perf_harness.sh
index 4b17231c..923d4d90 100755
--- a/linux_configuration/scripts/single_use/fixes/lib/tests/ubuntu_perf_harness.sh
+++ b/linux_configuration/fixes/lib/tests/ubuntu_perf_harness.sh
@@ -7,7 +7,7 @@
#
# * UNDO_SCRIPT, pointed into the throwaway tmpdir, and add_undo which
# appends to it -- both live in the entry script, not in any lib;
-# * the real log_*/has_cmd helpers, via scripts/lib/common.sh.
+# * the real log_*/has_cmd helpers, via lib/common.sh.
#
# JOURNALD_CONF_DIR and UNDO_DIR are the overrides ubuntu_perf_more.sh exposes
# so its two absolute write targets (/etc/systemd/journald.conf.d and /root)
@@ -17,13 +17,13 @@ set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FIXES_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-REPO_ROOT="$(cd "${FIXES_DIR}/../../../.." && pwd)"
+REPO_ROOT="$(cd "${FIXES_DIR}/../.." && pwd)"
# shellcheck source=lib_test_core.sh
. "${SCRIPT_DIR}/lib_test_core.sh"
-# shellcheck source=../../../../lib/common.sh
-. "${REPO_ROOT}/linux_configuration/scripts/lib/common.sh"
+# shellcheck source=../../../lib/common.sh
+. "${REPO_ROOT}/linux_configuration/lib/common.sh"
# --- globals and helpers owned by fix_ubuntu_performance.sh -----------------
diff --git a/linux_configuration/scripts/single_use/fixes/lib/thorium_repairs.sh b/linux_configuration/fixes/lib/thorium_repairs.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/thorium_repairs.sh
rename to linux_configuration/fixes/lib/thorium_repairs.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/ubuntu_perf_fixes.sh b/linux_configuration/fixes/lib/ubuntu_perf_fixes.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/ubuntu_perf_fixes.sh
rename to linux_configuration/fixes/lib/ubuntu_perf_fixes.sh
diff --git a/linux_configuration/scripts/single_use/fixes/lib/ubuntu_perf_more.sh b/linux_configuration/fixes/lib/ubuntu_perf_more.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/lib/ubuntu_perf_more.sh
rename to linux_configuration/fixes/lib/ubuntu_perf_more.sh
diff --git a/linux_configuration/scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh b/linux_configuration/fixes/migrate_hosts_guard_to_guard_lib.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fixes/migrate_hosts_guard_to_guard_lib.sh
rename to linux_configuration/fixes/migrate_hosts_guard_to_guard_lib.sh
diff --git a/linux_configuration/scripts/single_use/fixes/nvidia_troubleshoot.sh b/linux_configuration/fixes/nvidia_troubleshoot.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/nvidia_troubleshoot.sh
rename to linux_configuration/fixes/nvidia_troubleshoot.sh
index 26226fd5..dd7589ca 100755
--- a/linux_configuration/scripts/single_use/fixes/nvidia_troubleshoot.sh
+++ b/linux_configuration/fixes/nvidia_troubleshoot.sh
@@ -10,8 +10,8 @@ set -e # Exit on any error
# Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
# Parse interactive/help arguments
parse_interactive_args "$@"
diff --git a/linux_configuration/scripts/single_use/fixes/optimize_arch_desktop.sh b/linux_configuration/fixes/optimize_arch_desktop.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/fixes/optimize_arch_desktop.sh
rename to linux_configuration/fixes/optimize_arch_desktop.sh
index f3d621ca..6a47cf0d 100755
--- a/linux_configuration/scripts/single_use/fixes/optimize_arch_desktop.sh
+++ b/linux_configuration/fixes/optimize_arch_desktop.sh
@@ -27,8 +27,8 @@
set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../lib/common.sh
-source "$SCRIPT_DIR/../../lib/common.sh"
+# shellcheck source=../lib/common.sh
+source "$SCRIPT_DIR/../lib/common.sh"
parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT"
diff --git a/linux_configuration/scripts/single_use/fresh-install/README.md b/linux_configuration/fresh-install/README.md
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/README.md
rename to linux_configuration/fresh-install/README.md
diff --git a/linux_configuration/scripts/single_use/fresh-install/aur_packages.txt b/linux_configuration/fresh-install/aur_packages.txt
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/aur_packages.txt
rename to linux_configuration/fresh-install/aur_packages.txt
diff --git a/linux_configuration/scripts/single_use/fresh-install/detect_gpu.sh b/linux_configuration/fresh-install/detect_gpu.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/detect_gpu.sh
rename to linux_configuration/fresh-install/detect_gpu.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/detect_gpu_and_install.sh b/linux_configuration/fresh-install/detect_gpu_and_install.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/detect_gpu_and_install.sh
rename to linux_configuration/fresh-install/detect_gpu_and_install.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/install_amd_driver.sh b/linux_configuration/fresh-install/install_amd_driver.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/install_amd_driver.sh
rename to linux_configuration/fresh-install/install_amd_driver.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/install_intel_driver.sh b/linux_configuration/fresh-install/install_intel_driver.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/install_intel_driver.sh
rename to linux_configuration/fresh-install/install_intel_driver.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/install_nvidia_driver.sh b/linux_configuration/fresh-install/install_nvidia_driver.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/install_nvidia_driver.sh
rename to linux_configuration/fresh-install/install_nvidia_driver.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/lib/packages.sh b/linux_configuration/fresh-install/lib/packages.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/lib/packages.sh
rename to linux_configuration/fresh-install/lib/packages.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/main.sh b/linux_configuration/fresh-install/main.sh
similarity index 94%
rename from linux_configuration/scripts/single_use/fresh-install/main.sh
rename to linux_configuration/fresh-install/main.sh
index b3952012..d57c831c 100755
--- a/linux_configuration/scripts/single_use/fresh-install/main.sh
+++ b/linux_configuration/fresh-install/main.sh
@@ -182,13 +182,13 @@ else
fi
cd ~/linux-configuration
-sudo scripts/periodic_background/hosts/install.sh
-scripts/periodic_background/i3-configuration/install.sh
-scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh
-scripts/fixes/nvidia_troubleshoot.sh
-sudo scripts/features/setup_activitywatch.sh
-sudo scripts/utils/setup_media_organizer.sh
-yes | sudo scripts/periodic_background/setup_periodic_system.sh
+sudo periodic_background/hosts/install.sh
+periodic_background/i3-configuration/install.sh
+periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh
+fixes/nvidia_troubleshoot.sh
+sudo features/setup_activitywatch.sh
+sudo utils/setup_media_organizer.sh
+yes | sudo periodic_background/setup_periodic_system.sh
yes | protonup
yes | sudo pacman -Syuu
@@ -197,4 +197,4 @@ yes | sudo pacman -Syuu
#gh repo clone EpicGames/UnrealEngine -- -b release --single-branch
#makepkg -s --nocheck --skipchecksums --skipinteg --skippgpcheck --noconfirm --needed
-scripts/utils/setup_passwordless_system.sh
+utils/setup_passwordless_system.sh
diff --git a/linux_configuration/scripts/single_use/fresh-install/makepkg.conf b/linux_configuration/fresh-install/makepkg.conf
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/makepkg.conf
rename to linux_configuration/fresh-install/makepkg.conf
diff --git a/linux_configuration/scripts/single_use/fresh-install/mkinitcpio.conf b/linux_configuration/fresh-install/mkinitcpio.conf
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/mkinitcpio.conf
rename to linux_configuration/fresh-install/mkinitcpio.conf
diff --git a/linux_configuration/scripts/single_use/fresh-install/mpv.conf b/linux_configuration/fresh-install/mpv.conf
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/mpv.conf
rename to linux_configuration/fresh-install/mpv.conf
diff --git a/linux_configuration/scripts/single_use/fresh-install/packages.txt b/linux_configuration/fresh-install/packages.txt
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/packages.txt
rename to linux_configuration/fresh-install/packages.txt
diff --git a/linux_configuration/scripts/single_use/fresh-install/pacman.conf b/linux_configuration/fresh-install/pacman.conf
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/pacman.conf
rename to linux_configuration/fresh-install/pacman.conf
diff --git a/linux_configuration/scripts/single_use/fresh-install/pacman_packages.txt b/linux_configuration/fresh-install/pacman_packages.txt
similarity index 100%
rename from linux_configuration/scripts/single_use/fresh-install/pacman_packages.txt
rename to linux_configuration/fresh-install/pacman_packages.txt
diff --git a/linux_configuration/scripts/gaming/README.md b/linux_configuration/gaming/README.md
similarity index 94%
rename from linux_configuration/scripts/gaming/README.md
rename to linux_configuration/gaming/README.md
index 6dda07af..cfbe752f 100644
--- a/linux_configuration/scripts/gaming/README.md
+++ b/linux_configuration/gaming/README.md
@@ -28,7 +28,7 @@ sudo chmod 440 /etc/sudoers.d/player2-steam
**4. Symlink the script into PATH:**
```bash
-sudo ln -sf ~/testsAndMisc/linux_configuration/scripts/gaming/start-player2.sh /usr/local/bin/start-player2
+sudo ln -sf ~/testsAndMisc/linux_configuration/gaming/start-player2.sh /usr/local/bin/start-player2
```
**5. Start the getty on tty2** (needed if LightDM autologin is configured, otherwise tty2 has no login prompt):
diff --git a/linux_configuration/scripts/gaming/start-player2.sh b/linux_configuration/gaming/start-player2.sh
similarity index 100%
rename from linux_configuration/scripts/gaming/start-player2.sh
rename to linux_configuration/gaming/start-player2.sh
diff --git a/linux_configuration/install_core_system.sh b/linux_configuration/install_core_system.sh
index 2ec41452..54c5d870 100755
--- a/linux_configuration/install_core_system.sh
+++ b/linux_configuration/install_core_system.sh
@@ -3,7 +3,7 @@
#
# CORE modules (always installed):
# 1. Workout screen locker – python_pkg/screen_locker/
-# 2. Hosts blocking setup – linux_configuration/scripts/periodic_background/hosts/
+# 2. Hosts blocking setup – linux_configuration/periodic_background/hosts/
# 3. Midnight shutdown timer – setup_midnight_shutdown.sh
#
# SECONDARY modules (prompted unless --all / --none given):
@@ -38,21 +38,21 @@ skip() { printf '%s %s\n' "$(yellow "–")" "$*"; }
fail() { printf '%s %s\n' "$(red "✗")" "$*"; }
# ── Argument parsing ─────────────────────────────────────────────────────────
-SECONDARY_MODE="ask" # ask | all | none
+SECONDARY_MODE="ask" # ask | all | none
for arg in "$@"; do
- case "$arg" in
- --all) SECONDARY_MODE="all" ;;
- --none) SECONDARY_MODE="none" ;;
- -h | --help)
- sed -n '2,/^$/p' "$0"
- exit 0
- ;;
- *)
- printf 'Unknown option: %s\n' "$arg" >&2
- exit 1
- ;;
- esac
+ case "$arg" in
+ --all) SECONDARY_MODE="all" ;;
+ --none) SECONDARY_MODE="none" ;;
+ -h | --help)
+ sed -n '2,/^$/p' "$0"
+ exit 0
+ ;;
+ *)
+ printf 'Unknown option: %s\n' "$arg" >&2
+ exit 1
+ ;;
+ esac
done
# ── Result tracking ──────────────────────────────────────────────────────────
@@ -61,63 +61,63 @@ declare -a SKIPPED=()
declare -a FAILED=()
run_installer() {
- local name="$1"
- shift
- header "$name"
- if "$@"; then
- ok "$name installed"
- INSTALLED+=("$name")
- else
- fail "$name failed (exit $?)"
- FAILED+=("$name")
- fi
+ local name="$1"
+ shift
+ header "$name"
+ if "$@"; then
+ ok "$name installed"
+ INSTALLED+=("$name")
+ else
+ fail "$name failed (exit $?)"
+ FAILED+=("$name")
+ fi
}
ask_install() {
- # ask_install
- # Prompts user; respects SECONDARY_MODE override.
- local name="$1"
- shift
+ # ask_install
+ # Prompts user; respects SECONDARY_MODE override.
+ local name="$1"
+ shift
- if [[ $SECONDARY_MODE == "none" ]]; then
- skip "$name (--none)"
- SKIPPED+=("$name")
- return
- fi
+ if [[ $SECONDARY_MODE == "none" ]]; then
+ skip "$name (--none)"
+ SKIPPED+=("$name")
+ return
+ fi
- if [[ $SECONDARY_MODE == "all" ]]; then
- run_installer "$name" "$@"
- return
- fi
+ if [[ $SECONDARY_MODE == "all" ]]; then
+ run_installer "$name" "$@"
+ return
+ fi
- # interactive
- local answer
- printf '\nInstall %s? [y/N] ' "$(bold "$name")"
- read -r answer
- if [[ "${answer,,}" == "y" ]]; then
- run_installer "$name" "$@"
- else
- skip "$name"
- SKIPPED+=("$name")
- fi
+ # interactive
+ local answer
+ printf '\nInstall %s? [y/N] ' "$(bold "$name")"
+ read -r answer
+ if [[ "${answer,,}" == "y" ]]; then
+ run_installer "$name" "$@"
+ else
+ skip "$name"
+ SKIPPED+=("$name")
+ fi
}
# ── Summary ──────────────────────────────────────────────────────────────────
print_summary() {
- printf '\n%s\n' "$(bold "========== INSTALL SUMMARY ==========")"
- if [[ ${#INSTALLED[@]} -gt 0 ]]; then
- printf '%s\n' "$(green "Installed (${#INSTALLED[@]}):")"
- for m in "${INSTALLED[@]}"; do printf ' %s %s\n' "$(green "✓")" "$m"; done
- fi
- if [[ ${#SKIPPED[@]} -gt 0 ]]; then
- printf '%s\n' "$(yellow "Skipped (${#SKIPPED[@]}):")"
- for m in "${SKIPPED[@]}"; do printf ' %s %s\n' "$(yellow "–")" "$m"; done
- fi
- if [[ ${#FAILED[@]} -gt 0 ]]; then
- printf '%s\n' "$(red "Failed (${#FAILED[@]}):")"
- for m in "${FAILED[@]}"; do printf ' %s %s\n' "$(red "✗")" "$m"; done
- return 1
- fi
+ printf '\n%s\n' "$(bold "========== INSTALL SUMMARY ==========")"
+ if [[ ${#INSTALLED[@]} -gt 0 ]]; then
+ printf '%s\n' "$(green "Installed (${#INSTALLED[@]}):")"
+ for m in "${INSTALLED[@]}"; do printf ' %s %s\n' "$(green "✓")" "$m"; done
+ fi
+ if [[ ${#SKIPPED[@]} -gt 0 ]]; then
+ printf '%s\n' "$(yellow "Skipped (${#SKIPPED[@]}):")"
+ for m in "${SKIPPED[@]}"; do printf ' %s %s\n' "$(yellow "–")" "$m"; done
+ fi
+ if [[ ${#FAILED[@]} -gt 0 ]]; then
+ printf '%s\n' "$(red "Failed (${#FAILED[@]}):")"
+ for m in "${FAILED[@]}"; do printf ' %s %s\n' "$(red "✗")" "$m"; done
+ return 1
+ fi
}
# ═══════════════════════════════════════════════════════════════════════════════
@@ -126,13 +126,13 @@ print_summary() {
printf '\n%s\n' "$(bold "Installing CORE modules…")"
run_installer "Workout screen locker" \
- bash "$REPO_ROOT/python_pkg/screen_locker/install_systemd.sh"
+ bash "$REPO_ROOT/python_pkg/screen_locker/install_systemd.sh"
run_installer "Hosts blocking" \
- bash "$LINUX_CONFIG/scripts/periodic_background/hosts/install.sh"
+ bash "$LINUX_CONFIG/scripts/periodic_background/hosts/install.sh"
run_installer "Midnight shutdown timer" \
- bash "$LINUX_CONFIG/scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh"
+ bash "$LINUX_CONFIG/scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh"
# ═══════════════════════════════════════════════════════════════════════════════
# SECONDARY MODULES (prompted unless --all / --none)
@@ -140,16 +140,16 @@ run_installer "Midnight shutdown timer" \
printf '\n%s\n' "$(bold "Secondary modules (${SECONDARY_MODE})…")"
ask_install "Steam backlog enforcer" \
- sudo bash "$REPO_ROOT/python_pkg/steam_backlog_enforcer/install.sh"
+ sudo bash "$REPO_ROOT/python_pkg/steam_backlog_enforcer/install.sh"
ask_install "Pacman wrapper" \
- bash "$LINUX_CONFIG/scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
+ bash "$LINUX_CONFIG/scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
ask_install "i3 configuration" \
- bash "$LINUX_CONFIG/scripts/periodic_background/i3-configuration/install.sh"
+ bash "$LINUX_CONFIG/scripts/periodic_background/i3-configuration/install.sh"
ask_install "Compulsive opening blockade" \
- sudo bash "$LINUX_CONFIG/scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh" install
+ sudo bash "$LINUX_CONFIG/scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh" install
# ═══════════════════════════════════════════════════════════════════════════════
print_summary
diff --git a/linux_configuration/scripts/single_use/install_code_insiders.sh b/linux_configuration/installers/install_code_insiders.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/install_code_insiders.sh
rename to linux_configuration/installers/install_code_insiders.sh
diff --git a/linux_configuration/scripts/single_use/install_feedback.sh b/linux_configuration/installers/install_feedback.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/install_feedback.sh
rename to linux_configuration/installers/install_feedback.sh
diff --git a/linux_configuration/scripts/single_use/install_joplin.sh b/linux_configuration/installers/install_joplin.sh
similarity index 97%
rename from linux_configuration/scripts/single_use/install_joplin.sh
rename to linux_configuration/installers/install_joplin.sh
index d01fe463..7a74abf0 100755
--- a/linux_configuration/scripts/single_use/install_joplin.sh
+++ b/linux_configuration/installers/install_joplin.sh
@@ -70,8 +70,8 @@ install_joplin_desktop() {
}
SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
-# shellcheck source=lib/joplin_server.sh
-source "$SCRIPT_DIR/lib/joplin_server.sh"
+# shellcheck source=joplin_server.sh
+source "$SCRIPT_DIR/joplin_server.sh"
# ── Main ─────────────────────────────────────────────────────────────
main() {
diff --git a/linux_configuration/scripts/single_use/install_ungoogled_chromium_ubuntu.sh b/linux_configuration/installers/install_ungoogled_chromium_ubuntu.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/install_ungoogled_chromium_ubuntu.sh
rename to linux_configuration/installers/install_ungoogled_chromium_ubuntu.sh
diff --git a/linux_configuration/scripts/single_use/lib/joplin_server.sh b/linux_configuration/installers/joplin_server.sh
similarity index 99%
rename from linux_configuration/scripts/single_use/lib/joplin_server.sh
rename to linux_configuration/installers/joplin_server.sh
index 7e14e482..ad307f54 100755
--- a/linux_configuration/scripts/single_use/lib/joplin_server.sh
+++ b/linux_configuration/installers/joplin_server.sh
@@ -5,7 +5,7 @@
# keep that script under the 250-line cap. Expects the caller to have defined
# info/warn/error and the JOPLIN_* and DUCKDNS_* variables. Sourced, not run,
# so it inherits the caller's strict mode; the shebang is for shellcheck and
-# matches scripts/lib/common.sh.
+# matches lib/common.sh.
# ── Set up DuckDNS for stable URL ───────────────────────────────────
diff --git a/linux_configuration/scripts/single_use/test_bad.sh b/linux_configuration/installers/test_bad.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/test_bad.sh
rename to linux_configuration/installers/test_bad.sh
diff --git a/linux_configuration/scripts/single_use/test_removal.sh b/linux_configuration/installers/test_removal.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/test_removal.sh
rename to linux_configuration/installers/test_removal.sh
diff --git a/linux_configuration/scripts/lib/android.sh b/linux_configuration/lib/android.sh
similarity index 100%
rename from linux_configuration/scripts/lib/android.sh
rename to linux_configuration/lib/android.sh
diff --git a/linux_configuration/scripts/lib/common.sh b/linux_configuration/lib/common.sh
similarity index 100%
rename from linux_configuration/scripts/lib/common.sh
rename to linux_configuration/lib/common.sh
diff --git a/linux_configuration/scripts/lib/common_datetime.sh b/linux_configuration/lib/common_datetime.sh
similarity index 100%
rename from linux_configuration/scripts/lib/common_datetime.sh
rename to linux_configuration/lib/common_datetime.sh
diff --git a/linux_configuration/scripts/lib/common_packages.sh b/linux_configuration/lib/common_packages.sh
similarity index 100%
rename from linux_configuration/scripts/lib/common_packages.sh
rename to linux_configuration/lib/common_packages.sh
diff --git a/linux_configuration/scripts/lib/common_services.sh b/linux_configuration/lib/common_services.sh
similarity index 100%
rename from linux_configuration/scripts/lib/common_services.sh
rename to linux_configuration/lib/common_services.sh
diff --git a/linux_configuration/scripts/lib/tests/mtk_harness.sh b/linux_configuration/lib/tests/mtk_harness.sh
similarity index 99%
rename from linux_configuration/scripts/lib/tests/mtk_harness.sh
rename to linux_configuration/lib/tests/mtk_harness.sh
index 04a463e6..cedfe803 100755
--- a/linux_configuration/scripts/lib/tests/mtk_harness.sh
+++ b/linux_configuration/lib/tests/mtk_harness.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
-# lib/tests/mtk_harness.sh — shared fixture for linux_configuration/scripts/lib.
+# lib/tests/mtk_harness.sh — shared fixture for linux_configuration/lib.
#
# Sourced, not executed.
#
diff --git a/linux_configuration/scripts/lib/tests/run_all.sh b/linux_configuration/lib/tests/run_all.sh
similarity index 96%
rename from linux_configuration/scripts/lib/tests/run_all.sh
rename to linux_configuration/lib/tests/run_all.sh
index 32abc744..50a19b5e 100755
--- a/linux_configuration/scripts/lib/tests/run_all.sh
+++ b/linux_configuration/lib/tests/run_all.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
-# Runs every linux_configuration/scripts/lib test.
+# Runs every linux_configuration/lib test.
#
# The glob is test_*.sh, NOT one prefix per subject: a prefix glob silently
# skips every suite added after it — including in the CI discovery step in
diff --git a/linux_configuration/scripts/lib/tests/test_common_datetime.sh b/linux_configuration/lib/tests/test_common_datetime.sh
similarity index 100%
rename from linux_configuration/scripts/lib/tests/test_common_datetime.sh
rename to linux_configuration/lib/tests/test_common_datetime.sh
diff --git a/linux_configuration/scripts/meta/lib/shell_check_discover.sh b/linux_configuration/meta/lib/shell_check_discover.sh
similarity index 100%
rename from linux_configuration/scripts/meta/lib/shell_check_discover.sh
rename to linux_configuration/meta/lib/shell_check_discover.sh
diff --git a/linux_configuration/scripts/meta/lib/shell_check_install.sh b/linux_configuration/meta/lib/shell_check_install.sh
similarity index 100%
rename from linux_configuration/scripts/meta/lib/shell_check_install.sh
rename to linux_configuration/meta/lib/shell_check_install.sh
diff --git a/linux_configuration/scripts/meta/lib/shell_check_lint.sh b/linux_configuration/meta/lib/shell_check_lint.sh
similarity index 100%
rename from linux_configuration/scripts/meta/lib/shell_check_lint.sh
rename to linux_configuration/meta/lib/shell_check_lint.sh
diff --git a/linux_configuration/scripts/meta/shell_check.sh b/linux_configuration/meta/shell_check.sh
similarity index 96%
rename from linux_configuration/scripts/meta/shell_check.sh
rename to linux_configuration/meta/shell_check.sh
index 41c770f9..274a6805 100755
--- a/linux_configuration/scripts/meta/shell_check.sh
+++ b/linux_configuration/meta/shell_check.sh
@@ -7,7 +7,7 @@
# - Prints a summarized report and returns non-zero if any linter reports issues
#
# Usage:
-# scripts/meta/shell_check.sh [--path DIR] [--skip-install] [--install-only] [--list-only] [--verbose]
+# meta/shell_check.sh [--path DIR] [--skip-install] [--install-only] [--list-only] [--verbose]
#
# Notes:
# - Arch install uses pacman: shellcheck shfmt
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/.gitignore b/linux_configuration/misc/testsAndMisc-bash/.gitignore
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/.gitignore
rename to linux_configuration/misc/testsAndMisc-bash/.gitignore
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/.vscode/tasks.json b/linux_configuration/misc/testsAndMisc-bash/.vscode/tasks.json
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/.vscode/tasks.json
rename to linux_configuration/misc/testsAndMisc-bash/.vscode/tasks.json
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/README_clean_audio.md b/linux_configuration/misc/testsAndMisc-bash/README_clean_audio.md
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/README_clean_audio.md
rename to linux_configuration/misc/testsAndMisc-bash/README_clean_audio.md
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/clean_audio.sh b/linux_configuration/misc/testsAndMisc-bash/clean_audio.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/clean_audio.sh
rename to linux_configuration/misc/testsAndMisc-bash/clean_audio.sh
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/compress_images.sh b/linux_configuration/misc/testsAndMisc-bash/compress_images.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/compress_images.sh
rename to linux_configuration/misc/testsAndMisc-bash/compress_images.sh
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/convert.sh b/linux_configuration/misc/testsAndMisc-bash/convert.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/convert.sh
rename to linux_configuration/misc/testsAndMisc-bash/convert.sh
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/copyFolder.sh b/linux_configuration/misc/testsAndMisc-bash/copyFolder.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/copyFolder.sh
rename to linux_configuration/misc/testsAndMisc-bash/copyFolder.sh
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/download.sh b/linux_configuration/misc/testsAndMisc-bash/download.sh
similarity index 100%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/download.sh
rename to linux_configuration/misc/testsAndMisc-bash/download.sh
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/fix_thorium_unity.sh b/linux_configuration/misc/testsAndMisc-bash/fix_thorium_unity.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/fix_thorium_unity.sh
rename to linux_configuration/misc/testsAndMisc-bash/fix_thorium_unity.sh
index 94ac4108..6849d709 100755
--- a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/fix_thorium_unity.sh
+++ b/linux_configuration/misc/testsAndMisc-bash/fix_thorium_unity.sh
@@ -20,8 +20,8 @@ IFS=$'\n\t'
# Source common library for log functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../../lib/common.sh
-source "$SCRIPT_DIR/../../../lib/common.sh"
+# shellcheck source=../../lib/common.sh
+source "$SCRIPT_DIR/../../lib/common.sh"
DO_POLICY=false
SET_DEFAULT=false
diff --git a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/fix_unity.sh b/linux_configuration/misc/testsAndMisc-bash/fix_unity.sh
similarity index 98%
rename from linux_configuration/scripts/single_use/misc/testsAndMisc-bash/fix_unity.sh
rename to linux_configuration/misc/testsAndMisc-bash/fix_unity.sh
index ded48216..689045a3 100755
--- a/linux_configuration/scripts/single_use/misc/testsAndMisc-bash/fix_unity.sh
+++ b/linux_configuration/misc/testsAndMisc-bash/fix_unity.sh
@@ -26,8 +26,8 @@ SCRIPT_NAME="$(basename "$0")"
# Source common library for log functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-# shellcheck source=../../../lib/common.sh
-source "$SCRIPT_DIR/../../../lib/common.sh"
+# shellcheck source=../../lib/common.sh
+source "$SCRIPT_DIR/../../lib/common.sh"
usage() {
cat <&2
- exit 1
+ printf 'FAIL: %s\n' "$1" >&2
+ exit 1
}
assert_eq() {
- local expected=$1
- local actual=$2
- local context=$3
- if [[ "$expected" != "$actual" ]]; then
- fail "$context (expected '$expected', actual '$actual')"
- fi
+ local expected=$1
+ local actual=$2
+ local context=$3
+ if [[ "$expected" != "$actual" ]]; then
+ fail "$context (expected '$expected', actual '$actual')"
+ fi
}
assert_le() {
- local actual=$1
- local expected_max=$2
- local context=$3
- if (( actual > expected_max )); then
- fail "$context (expected <= '$expected_max', actual '$actual')"
- fi
+ local actual=$1
+ local expected_max=$2
+ local context=$3
+ if ((actual > expected_max)); then
+ fail "$context (expected <= '$expected_max', actual '$actual')"
+ fi
}
count_execs() {
- local script_path=$1
- local log_file=$2
- strace -f -o "$log_file" -e trace=execve bash "$script_path" >/dev/null 2>&1
- grep -c 'execve(' "$log_file"
+ local script_path=$1
+ local log_file=$2
+ strace -f -o "$log_file" -e trace=execve bash "$script_path" >/dev/null 2>&1
+ grep -c 'execve(' "$log_file"
}
printf 'Checking interval gating allows first emit per key...\n'
@@ -55,15 +55,15 @@ assert_eq '100' "${I3BLOCKS_LAST_TS[wifi]}" 'first emit should store current tim
printf 'Checking interval gating blocks too-soon second emit...\n'
I3BLOCKS_TEST_NOW_TS=102
if i3blocks_should_emit_by_interval_key "wifi" 5; then
- fail 'second interval check should block when interval has not elapsed'
+ fail 'second interval check should block when interval has not elapsed'
fi
assert_eq '100' "${I3BLOCKS_LAST_TS[wifi]}" 'blocked emit must not overwrite timestamp'
printf 'Checking repeated blocked emits never mutate timestamp...\n'
for _ in {1..200}; do
- if i3blocks_should_emit_by_interval_key "wifi" 5; then
- fail 'repeated blocked interval checks must remain blocked'
- fi
+ if i3blocks_should_emit_by_interval_key "wifi" 5; then
+ fail 'repeated blocked interval checks must remain blocked'
+ fi
done
assert_eq '100' "${I3BLOCKS_LAST_TS[wifi]}" 'repeated blocked checks must preserve original timestamp'
@@ -86,7 +86,7 @@ assert_eq 'connected' "${I3BLOCKS_LAST_STATE[wifi]}" 'first changed state should
printf 'Checking changed-state helper blocks identical state...\n'
if i3blocks_update_if_changed_key "wifi" "connected"; then
- fail 'identical state should be treated as unchanged'
+ fail 'identical state should be treated as unchanged'
fi
printf 'Checking changed-state helper allows new state...\n'
@@ -97,7 +97,7 @@ printf 'Checking empty string first state is treated as changed...\n'
I3BLOCKS_LAST_STATE=()
i3blocks_update_if_changed_key "warp" "" || fail 'first empty state should be treated as changed'
if i3blocks_update_if_changed_key "warp" ""; then
- fail 'second empty state should be treated as unchanged'
+ fail 'second empty state should be treated as unchanged'
fi
printf 'Checking changed-state helper is key-isolated...\n'
@@ -110,17 +110,17 @@ I3BLOCKS_LAST_TS=()
I3BLOCKS_LAST_STATE=()
export I3BLOCKS_TEST_NOW_TS
for i in {1..50}; do
- I3BLOCKS_TEST_NOW_TS=$((1000 + i))
- i3blocks_should_emit_by_interval_key "wifi" 0 || fail 'wifi interleaved emit should pass'
- i3blocks_update_if_changed_key "wifi_state" "wifi-$((i % 3))" || true
+ I3BLOCKS_TEST_NOW_TS=$((1000 + i))
+ i3blocks_should_emit_by_interval_key "wifi" 0 || fail 'wifi interleaved emit should pass'
+ i3blocks_update_if_changed_key "wifi_state" "wifi-$((i % 3))" || true
- I3BLOCKS_TEST_NOW_TS=$((2000 + i))
- i3blocks_should_emit_by_interval_key "wifi_monitor" 0 || fail 'wifi_monitor interleaved emit should pass'
- i3blocks_update_if_changed_key "wifi_monitor_state" "monitor-$((i % 4))" || true
+ I3BLOCKS_TEST_NOW_TS=$((2000 + i))
+ i3blocks_should_emit_by_interval_key "wifi_monitor" 0 || fail 'wifi_monitor interleaved emit should pass'
+ i3blocks_update_if_changed_key "wifi_monitor_state" "monitor-$((i % 4))" || true
- I3BLOCKS_TEST_NOW_TS=$((3000 + i))
- i3blocks_should_emit_by_interval_key "ethernet" 0 || fail 'ethernet interleaved emit should pass'
- i3blocks_update_if_changed_key "ethernet_state" "eth-$((i % 2))" || true
+ I3BLOCKS_TEST_NOW_TS=$((3000 + i))
+ i3blocks_should_emit_by_interval_key "ethernet" 0 || fail 'ethernet interleaved emit should pass'
+ i3blocks_update_if_changed_key "ethernet_state" "eth-$((i % 2))" || true
done
assert_eq '1050' "${I3BLOCKS_LAST_TS[wifi]}" 'wifi key should retain its own timestamp series'
assert_eq '2050' "${I3BLOCKS_LAST_TS[wifi_monitor]}" 'wifi_monitor key should retain its own timestamp series'
@@ -136,7 +136,7 @@ cat >"$fork_probe" </dev/null || true' EXIT
LOCK="$TMP/db.lck"
STUB="$TMP/makepkg.stub"
-printf '#!/bin/bash\nprintf "%%s" "$*" > "%s/args"\n' "$TMP" > "$STUB"
+printf '#!/bin/bash\nprintf "%%s" "$*" > "%s/args"\n' "$TMP" >"$STUB"
chmod +x "$STUB"
# Source the lib once. check_and_handle_db_lock reads $PACMAN_LOCK_FILE at call
# time, so pointing it at the temp lock before sourcing is enough for all cases.
export PACMAN_LOCK_FILE="$LOCK"
-# shellcheck source=../scripts/periodic_background/digital_wellbeing/pacman/pacman_lock_lib.sh
+# shellcheck source=../periodic_background/digital_wellbeing/pacman/pacman_lock_lib.sh
source "$LIB"
# orphaned + --noconfirm -> cleared
-: > "$LOCK"
+: >"$LOCK"
check_and_handle_db_lock --noconfirm >/dev/null 2>&1 || true
if [[ ! -e $LOCK ]]; then ok "orphaned lock + --noconfirm cleared"; else bad "orphaned lock not cleared"; fi
@@ -82,13 +88,13 @@ if [[ ! -e $LOCK ]]; then ok "orphaned lock + --noconfirm cleared"; else bad "or
if check_and_handle_db_lock --noconfirm >/dev/null 2>&1; then ok "absent lock is a no-op"; else bad "absent lock returned non-zero"; fi
# old (>=600s) -> auto-removed without --noconfirm
-: > "$LOCK"
+: >"$LOCK"
touch -d '2 hours ago' "$LOCK"
check_and_handle_db_lock >/dev/null 2>&1 || true
if [[ ! -e $LOCK ]]; then ok "old orphaned lock auto-removed without --noconfirm"; else bad "age-based removal failed"; fi
# running 'pacman' process -> removal blocked (cross-user pgrep guard)
-: > "$LOCK"
+: >"$LOCK"
FAKE="$TMP/pacman"
cp /bin/sleep "$FAKE"
setsid "$FAKE" 20 &
@@ -101,17 +107,17 @@ sleep 0.2
rm -f "$LOCK"
# wrapper: non-install invocation bypasses, leaves lock, execs real makepkg
-: > "$LOCK"
+: >"$LOCK"
MAKEPKG_BIN="$STUB" bash "$WRAPPER" --version >/dev/null 2>&1 || true
if [[ -e $LOCK && "$(cat "$TMP/args" 2>/dev/null)" == "--version" ]]; then ok "wrapper: non-install bypasses, lock untouched"; else bad "wrapper non-install bypass failed"; fi
# wrapper: -sif clears orphaned lock then execs real makepkg
-: > "$LOCK"
+: >"$LOCK"
MAKEPKG_BIN="$STUB" bash "$WRAPPER" -sif --noconfirm >/dev/null 2>&1 || true
if [[ ! -e $LOCK && "$(cat "$TMP/args" 2>/dev/null)" == "-sif --noconfirm" ]]; then ok "wrapper: -sif clears orphaned lock then execs makepkg"; else bad "wrapper install pre-flight failed"; fi
# wrapper: FAKEROOTKEY (build sandbox) bypasses, keeps lock
-: > "$LOCK"
+: >"$LOCK"
MAKEPKG_BIN="$STUB" FAKEROOTKEY=deadbeef bash "$WRAPPER" -sif --noconfirm >/dev/null 2>&1 || true
if [[ -e $LOCK ]]; then ok "wrapper: FAKEROOTKEY bypass keeps lock"; else bad "wrapper fakeroot bypass failed"; fi
diff --git a/linux_configuration/tests/test_music_parallelism.sh b/linux_configuration/tests/test_music_parallelism.sh
index 9a7a83d3..84bab35f 100755
--- a/linux_configuration/tests/test_music_parallelism.sh
+++ b/linux_configuration/tests/test_music_parallelism.sh
@@ -8,22 +8,22 @@ REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
TARGET_SCRIPT="$REPO_DIR/scripts/periodic_background/digital_wellbeing/music_parallelism.sh"
fail() {
- printf 'FAIL: %s\n' "$1" >&2
- exit 1
+ printf 'FAIL: %s\n' "$1" >&2
+ exit 1
}
assert_equals() {
- local expected="$1"
- local actual="$2"
- local context="$3"
- if [[ "$expected" != "$actual" ]]; then
- fail "$context (expected: '$expected', actual: '$actual')"
- fi
+ local expected="$1"
+ local actual="$2"
+ local context="$3"
+ if [[ "$expected" != "$actual" ]]; then
+ fail "$context (expected: '$expected', actual: '$actual')"
+ fi
}
TMP_DIR=$(mktemp -d)
cleanup() {
- rm -rf "$TMP_DIR"
+ rm -rf "$TMP_DIR"
}
trap cleanup EXIT
@@ -31,7 +31,7 @@ WORKTREE="$TMP_DIR/worktree"
BIN_DIR="$TMP_DIR/bin"
# Mirror the script's real position inside the worktree instead of hardcoding
-# it. music_parallelism.sh sources its library as $SCRIPT_DIR/../../lib/common.sh,
+# it. music_parallelism.sh sources its library as $SCRIPT_DIR/../lib/common.sh,
# so the copy must sit at the same depth below the repo root or that path
# resolves outside the worktree. When it did, the script silently fell back to
# the real /usr/local/lib/common.sh and the stub below was never used — the
@@ -39,7 +39,7 @@ BIN_DIR="$TMP_DIR/bin"
# Deriving the path keeps this correct across future reorganisations.
TARGET_REL="${TARGET_SCRIPT#"$REPO_DIR"/}"
if [[ "$TARGET_REL" == "$TARGET_SCRIPT" ]]; then
- fail "TARGET_SCRIPT ($TARGET_SCRIPT) is not below REPO_DIR ($REPO_DIR)"
+ fail "TARGET_SCRIPT ($TARGET_SCRIPT) is not below REPO_DIR ($REPO_DIR)"
fi
WORKTREE_SCRIPT="$WORKTREE/$TARGET_REL"
# The library lives at /scripts/lib/common.sh; keep it relative to the
@@ -56,9 +56,9 @@ cp -r "$(dirname "$TARGET_SCRIPT")/lib" "$(dirname "$WORKTREE_SCRIPT")/lib"
# Fail loudly if the copy cannot reach the stub, rather than letting the script
# fall through to the real library and produce a misleading behavioural failure.
-STUB_FROM_SCRIPT="$(dirname "$WORKTREE_SCRIPT")/../../lib/common.sh"
+STUB_FROM_SCRIPT="$(dirname "$WORKTREE_SCRIPT")/../lib/common.sh"
if [[ "$(realpath -m "$STUB_FROM_SCRIPT")" != "$(realpath -m "$WORKTREE_LIB")" ]]; then
- fail "worktree layout drift: script at $WORKTREE_SCRIPT resolves ../../lib/common.sh to $(realpath -m "$STUB_FROM_SCRIPT"), not the stub at $WORKTREE_LIB"
+ fail "worktree layout drift: script at $WORKTREE_SCRIPT resolves ../lib/common.sh to $(realpath -m "$STUB_FROM_SCRIPT"), not the stub at $WORKTREE_LIB"
fi
cat >"$WORKTREE_LIB" <<'EOF'
@@ -92,47 +92,47 @@ EOF
chmod +x "$WORKTREE_LIB"
create_fake_proc_process() {
- local proc_root="$1"
- local pid="$2"
- local name="$3"
- mkdir -p "$proc_root/$pid"
- printf '%s\n' "$name" >"$proc_root/$pid/comm"
+ local proc_root="$1"
+ local pid="$2"
+ local name="$3"
+ mkdir -p "$proc_root/$pid"
+ printf '%s\n' "$name" >"$proc_root/$pid/comm"
}
run_case() {
- local expected_wait="$1"
- local focus_active="$2"
- local music_proc_name="${3:-}"
- local mode="${4:-instant}"
- local wait_log="$TMP_DIR/wait.log"
- local proc_root="$TMP_DIR/proc"
- local stub_marker="$TMP_DIR/stub.marker"
+ local expected_wait="$1"
+ local focus_active="$2"
+ local music_proc_name="${3:-}"
+ local mode="${4:-instant}"
+ local wait_log="$TMP_DIR/wait.log"
+ local proc_root="$TMP_DIR/proc"
+ local stub_marker="$TMP_DIR/stub.marker"
- : >"$wait_log"
- rm -f "$stub_marker"
- rm -rf "$proc_root"
- mkdir -p "$proc_root"
+ : >"$wait_log"
+ rm -f "$stub_marker"
+ rm -rf "$proc_root"
+ mkdir -p "$proc_root"
- if [[ -n $music_proc_name ]]; then
- create_fake_proc_process "$proc_root" 4242 "$music_proc_name"
- fi
+ if [[ -n $music_proc_name ]]; then
+ create_fake_proc_process "$proc_root" 4242 "$music_proc_name"
+ fi
- PATH="$BIN_DIR:$PATH" \
- MUSIC_PARALLELISM_TEST_WAIT_LOG="$wait_log" \
- MUSIC_PARALLELISM_TEST_EXIT_AFTER_WAIT=1 \
- MUSIC_PARALLELISM_STUB_MARKER="$stub_marker" \
- XDOTOOL_LOG="${XDOTOOL_LOG:-}" \
- PROC_ROOT="$proc_root" \
- MOCK_FOCUS_ACTIVE="$focus_active" \
- bash "$WORKTREE_SCRIPT" "$mode" \
- >/dev/null 2>&1 || true
+ PATH="$BIN_DIR:$PATH" \
+ MUSIC_PARALLELISM_TEST_WAIT_LOG="$wait_log" \
+ MUSIC_PARALLELISM_TEST_EXIT_AFTER_WAIT=1 \
+ MUSIC_PARALLELISM_STUB_MARKER="$stub_marker" \
+ XDOTOOL_LOG="${XDOTOOL_LOG:-}" \
+ PROC_ROOT="$proc_root" \
+ MOCK_FOCUS_ACTIVE="$focus_active" \
+ bash "$WORKTREE_SCRIPT" "$mode" \
+ >/dev/null 2>&1 || true
- # Without this the script can source the real /usr/local/lib/common.sh and
- # still "pass" or fail for reasons that have nothing to do with the daemon.
- [[ -f "$stub_marker" ]] \
- || fail 'stubbed common.sh was not sourced — the script used a different library, so this run measured the live system rather than the mock'
+ # Without this the script can source the real /usr/local/lib/common.sh and
+ # still "pass" or fail for reasons that have nothing to do with the daemon.
+ [[ -f "$stub_marker" ]] ||
+ fail 'stubbed common.sh was not sourced — the script used a different library, so this run measured the live system rather than the mock'
- assert_equals "$expected_wait" "$(<"$wait_log")" "music_parallelism.sh should pick the expected wait interval"
+ assert_equals "$expected_wait" "$(<"$wait_log")" "music_parallelism.sh should pick the expected wait interval"
}
printf 'Checking stable-focus backoff uses the slower interval...\n'
diff --git a/linux_configuration/tests/test_pacman_wrapper_security.sh b/linux_configuration/tests/test_pacman_wrapper_security.sh
index 13763109..eecd5c78 100755
--- a/linux_configuration/tests/test_pacman_wrapper_security.sh
+++ b/linux_configuration/tests/test_pacman_wrapper_security.sh
@@ -4,8 +4,8 @@
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
-WRAPPER_DIR="$SCRIPT_DIR/../scripts/periodic_background/digital_wellbeing/pacman"
-VBOX_DIR="$SCRIPT_DIR/../scripts/periodic_background/digital_wellbeing/virtualbox"
+WRAPPER_DIR="$SCRIPT_DIR/../periodic_background/digital_wellbeing/pacman"
+VBOX_DIR="$SCRIPT_DIR/../periodic_background/digital_wellbeing/virtualbox"
echo "=== Testing Pacman Wrapper Security Enhancements ==="
echo ""
diff --git a/linux_configuration/tests/test_setup_dns_blocker.sh b/linux_configuration/tests/test_setup_dns_blocker.sh
index f687c93c..0c5bbbfd 100755
--- a/linux_configuration/tests/test_setup_dns_blocker.sh
+++ b/linux_configuration/tests/test_setup_dns_blocker.sh
@@ -11,11 +11,11 @@ set -euo pipefail
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
-TARGET_SCRIPT="$REPO_DIR/scripts/single_use/features/setup_dns_blocker.sh"
+TARGET_SCRIPT="$REPO_DIR/./features/setup_dns_blocker.sh"
fail() {
- printf 'FAIL: %s\n' "$1" >&2
- exit 1
+ printf 'FAIL: %s\n' "$1" >&2
+ exit 1
}
TMP_DIR=$(mktemp -d)
@@ -27,20 +27,20 @@ trap cleanup EXIT
# --- Dispatch tests (real script, no root needed) --------------------------
help_out=$("$TARGET_SCRIPT" help)
for cmd in setup status refresh dhcp dhcp-off; do
- [[ "$help_out" == *"$cmd"* ]] || fail "help output missing '$cmd' subcommand"
+ [[ "$help_out" == *"$cmd"* ]] || fail "help output missing '$cmd' subcommand"
done
# Unknown command must exit non-zero.
if "$TARGET_SCRIPT" bogus-cmd >/dev/null 2>&1; then
- fail "unknown command should exit non-zero"
+ fail "unknown command should exit non-zero"
fi
# --- firewall_is_loaded regression (pipefail/SIGPIPE) ----------------------
# Mock 'nft' so the function runs without root. Emit a LARGE ruleset so that a
# reintroduced 'grep -q' pipe would SIGPIPE nft and false-negative under pipefail.
make_nft() {
- local mode="$1" # drop | accept
- cat >"$BIN_DIR/nft" <"$BIN_DIR/nft" <