[grade=A] Expand README with VERSION SSOT section, test suite table, repo layout, voice-bridge prototype status
SamiOS CI / lint-and-test (push) Successful in 10s
SamiOS CI / lint-and-test (push) Successful in 10s
This commit is contained in:
@@ -1,24 +1,34 @@
|
|||||||
# SamiOS - A Custom Arch Linux Distribution
|
# SamiOS — A Custom Arch Linux Distribution
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
SamiOS is a custom Linux distribution based on Arch Linux, designed as a Windows replacement for personal use.
|
|
||||||
|
SamiOS is a custom Linux distribution based on Arch Linux, designed as a
|
||||||
|
personal daily-driver desktop OS. It ships a custom CLI (`samios`), an
|
||||||
|
automated disk installer, a single-source-of-truth version system, and
|
||||||
|
a voice-bridge prototype for hands-free OS control via Hermes.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- Rolling release (Arch-based)
|
|
||||||
- Custom CLI tool (`samios`) for system management
|
- **Rolling release** Arch-based
|
||||||
- Automated installation scripts
|
- **Custom CLI** (`samios`) for system management — version, status, update, install, remove, services, fonts
|
||||||
- Custom branding and configuration
|
- **Automated installer** (`samios-installer.sh`) — UEFI/BIOS, partitioning, pacstrap, GRUB, user creation
|
||||||
- Font policy: excludes fonts with "7777" in the name
|
- **VERSION single-source-of-truth** — one file drives every component
|
||||||
|
- **Custom branding** — GRUB theme, MOTD, bashrc, zshrc, pacman welcome message
|
||||||
|
- **Font policy** — excludes fonts with "7777" in the filename (personal branding)
|
||||||
|
- **Voice bridge prototype** — `voice-bridge.py` listens to SamiType transcripts and routes to Hermes (command mode) or `xdotool` (dictation mode)
|
||||||
|
- **CI** — Gitea Actions runs `make check` on pushes to `master` / `main` and on pull requests targeting those branches
|
||||||
|
|
||||||
## Building from Source
|
## Building from Source
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# On Arch Linux
|
# On Arch Linux
|
||||||
sudo pacman -S archiso git
|
sudo pacman -S archiso git shellcheck
|
||||||
```
|
```
|
||||||
|
|
||||||
### Clone and Build
|
### Clone and Build
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://git.sami/sami7777/samios.git
|
git clone https://git.sami/sami7777/samios.git
|
||||||
cd samios/packaging/archiso
|
cd samios/packaging/archiso
|
||||||
@@ -28,30 +38,217 @@ sudo ./build.sh
|
|||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### From ISO
|
### From ISO
|
||||||
1. Boot from the generated ISO
|
|
||||||
2. Run the automated installer:
|
1. Boot the generated ISO. The ISO ships the live environment, the
|
||||||
|
`samios` package-management CLI, and `/etc/samios-version` (the
|
||||||
|
mirrored VERSION file). It does **not** ship
|
||||||
|
`samios-installer.sh` automatically — that script lives in
|
||||||
|
`packaging/scripts/` in the source repo and is invoked manually
|
||||||
|
after boot (or copied into the live environment first).
|
||||||
|
2. To install SamiOS to disk from the live ISO, run the installer:
|
||||||
```bash
|
```bash
|
||||||
samios install
|
sudo /root/samios-installer.sh # if you copied it into the live env
|
||||||
|
# — or —
|
||||||
|
sudo bash /path/to/samios-installer.sh
|
||||||
|
```
|
||||||
|
The installer is interactive by default; pass `--disk`, `--user`,
|
||||||
|
and `--password` to drive it non-interactively from automation:
|
||||||
|
```bash
|
||||||
|
sudo /path/to/samios-installer.sh --disk /dev/sda --user sami --password ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **Note:** `samios install` (the CLI subcommand on the live system
|
||||||
|
> and on the installed OS) is the **package** installer — e.g.
|
||||||
|
> `samios install firefox`. It does **not** invoke the OS installer.
|
||||||
|
> The OS installer is the `samios-installer.sh` script.
|
||||||
|
|
||||||
### Manual Installation
|
### Manual Installation
|
||||||
See `docs/installation.md` for detailed instructions.
|
|
||||||
|
See [`docs/installation.md`](docs/installation.md) for detailed
|
||||||
|
instructions.
|
||||||
|
|
||||||
|
## Repository Layout
|
||||||
|
|
||||||
|
```
|
||||||
|
samios/
|
||||||
|
├── VERSION # Single source of truth for the release version
|
||||||
|
├── Makefile # Targets: test, lint, check, version, version-set, version-sync, build, clean, help (see "Makefile Targets" below)
|
||||||
|
├── README.md # This file
|
||||||
|
├── branding/ # GRUB theme, pacman welcome, fonts
|
||||||
|
├── docs/ # roadmap, installation, voice-to-Hermes design
|
||||||
|
├── packaging/
|
||||||
|
│ ├── archiso/ # The archiso profile (profiledef.sh, packages, airootfs overlay)
|
||||||
|
│ │ └── airootfs/
|
||||||
|
│ │ ├── etc/samios-version # Mirrored from /VERSION by `make version-sync`
|
||||||
|
│ │ └── usr/local/bin/samios # The CLI tool (installed)
|
||||||
|
│ ├── packages/
|
||||||
|
│ │ └── samios-branding/ # PKGBUILD (also reads ../../../VERSION)
|
||||||
|
│ └── scripts/
|
||||||
|
│ ├── samios-installer.sh # The disk installer
|
||||||
|
│ ├── samios-desktop-setup.sh # Post-install KDE/desktop setup
|
||||||
|
│ └── voice-bridge.py # Voice command/dictation bridge prototype
|
||||||
|
└── tests/ # Test suite (see "Test Suite" below)
|
||||||
|
```
|
||||||
|
|
||||||
|
## VERSION Single Source of Truth
|
||||||
|
|
||||||
|
There is exactly **one** authoritative source for the release version:
|
||||||
|
the `VERSION` file at the repo root. Each consumer resolves it via
|
||||||
|
its own mechanism:
|
||||||
|
|
||||||
|
- **`samios` CLI** (`packaging/archiso/airootfs/usr/local/bin/samios`) —
|
||||||
|
walks up from `$0` to find `./VERSION`, falls back to
|
||||||
|
`/etc/samios-version`, then to a documented placeholder.
|
||||||
|
- **`samios-installer.sh`** (`packaging/scripts/samios-installer.sh`) —
|
||||||
|
walks up from `$0` to find `./VERSION`, falls back to
|
||||||
|
`/etc/samios-version`, then to a documented placeholder. Same
|
||||||
|
algorithm as the CLI it emits.
|
||||||
|
- **`voice-bridge.py`** (`packaging/scripts/voice-bridge.py`) —
|
||||||
|
walks up from its own location to find `./VERSION`, falls back to
|
||||||
|
`/etc/samios-version`, then to a documented placeholder.
|
||||||
|
- **`profiledef.sh`** (`packaging/archiso/profiledef.sh`) —
|
||||||
|
walks up from `$0` to find `./VERSION`, then to the documented
|
||||||
|
placeholder. (No `/etc/samios-version` fallback — this runs at
|
||||||
|
ISO *build* time, not at runtime.)
|
||||||
|
- **`PKGBUILD`** (`packaging/packages/samios-branding/PKGBUILD`) —
|
||||||
|
reads `$startdir/../../../VERSION` first, falls back to
|
||||||
|
`../../../VERSION`, then **fails loudly** with `exit 1`. There is
|
||||||
|
no walk-up and no placeholder — the SSOT invariant is absolute: a
|
||||||
|
release build without VERSION is a build error.
|
||||||
|
- **`.bashrc` / `.zshrc`** (in the airootfs overlay — run in the live
|
||||||
|
ISO when root opens a shell) — read `/etc/samios-version` directly;
|
||||||
|
fall back to the documented placeholder. (No walk-up: the live ISO
|
||||||
|
ships `/etc/samios-version` via `make version-sync`. Note: the
|
||||||
|
installer does **not** copy these root dotfiles to installed
|
||||||
|
systems — it writes its own `/etc/bash.bashrc` instead.)
|
||||||
|
|
||||||
|
The `test_version.sh` suite enforces this invariant: any X.Y.Z literal
|
||||||
|
introduced into a production file fails CI. To bump the version:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make version-set NEW=<your-version>
|
||||||
|
```
|
||||||
|
|
||||||
|
That edits `./VERSION` and mirrors it into
|
||||||
|
`packaging/archiso/airootfs/etc/samios-version` (the on-system anchor
|
||||||
|
that installed systems read at runtime). Then commit and push.
|
||||||
|
|
||||||
|
If you prefer editing manually:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Write your target version to the SSOT file:
|
||||||
|
echo "<NEW>" > VERSION
|
||||||
|
# Mirror into the airootfs overlay:
|
||||||
|
make version-sync
|
||||||
|
# Verify the SSOT invariant still holds:
|
||||||
|
make check
|
||||||
|
```
|
||||||
|
|
||||||
|
(The exact X.Y.Z string is intentionally omitted from this README —
|
||||||
|
the version lives in the `VERSION` file, not in documentation.)
|
||||||
|
|
||||||
|
## Makefile Targets
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make help # Show all targets
|
||||||
|
make version # Print current SamiOS VERSION
|
||||||
|
make version-set NEW=<NEW> # Bump VERSION (semver-ish, X.Y.Z[-suffix])
|
||||||
|
make version-sync # Mirror VERSION into the airootfs overlay
|
||||||
|
make test # Run the test suite
|
||||||
|
make lint # Run shellcheck on all shell scripts
|
||||||
|
make check # Run lint + test (CI entry point)
|
||||||
|
make build # Build the SamiOS ISO (requires archiso + root)
|
||||||
|
make clean # Remove build artifacts
|
||||||
|
```
|
||||||
|
|
||||||
|
## Test Suite
|
||||||
|
|
||||||
|
The test suite lives under `tests/` and is wired into
|
||||||
|
`tests/run_tests.sh`. It contains **142+ assertions across 8 test files**:
|
||||||
|
|
||||||
|
| Test file | What it covers |
|
||||||
|
|-----------|----------------|
|
||||||
|
| `test_profiledef.sh` | archiso profiledef.sh — script presence, package lists, hooks |
|
||||||
|
| `test_packages.sh` | package list shape and required packages |
|
||||||
|
| `test_pacman_conf.sh` | pacman.conf configuration |
|
||||||
|
| `test_samios_cli.sh` | the installed `samios` CLI — syntax, --help, version, status, fonts |
|
||||||
|
| `test_font_policy.sh` | 7777-exclusion font policy |
|
||||||
|
| `test_version.sh` | VERSION single-source-of-truth — 55+ assertions across all 7 components |
|
||||||
|
| `test_installer.sh` | `samios-installer.sh` — syntax, SSOT, heredoc-emitted CLI |
|
||||||
|
| `test_voice_bridge.sh` | `voice-bridge.py` — 20 hermetic behavioral assertions |
|
||||||
|
|
||||||
|
Run them with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test # just the tests
|
||||||
|
make lint # just shellcheck
|
||||||
|
make check # both (the CI entry point)
|
||||||
|
```
|
||||||
|
|
||||||
|
Individual tests can be run directly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash tests/test_voice_bridge.sh --verbose
|
||||||
|
```
|
||||||
|
|
||||||
## CLI Tool
|
## CLI Tool
|
||||||
|
|
||||||
The `samios` command provides system management:
|
The `samios` command provides system management:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
samios status # Show system status
|
samios version # Show SamiOS version
|
||||||
samios update # Update system
|
samios status # Show system status (disk, memory, network)
|
||||||
samios install # Install packages
|
samios update # Update system packages
|
||||||
samios fonts # Manage fonts
|
samios install # Install a package
|
||||||
|
samios remove # Remove a package
|
||||||
|
samios services # List running services
|
||||||
|
samios fonts # Check installed fonts and the 7777-exclusion policy
|
||||||
samios help # Show all commands
|
samios help # Show all commands
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The CLI walks up at runtime to find `./VERSION` (or `/etc/samios-version`
|
||||||
|
on a freshly installed system) so the version is never duplicated.
|
||||||
|
|
||||||
|
## Voice Bridge (Prototype)
|
||||||
|
|
||||||
|
`packaging/scripts/voice-bridge.py` is an early prototype of the
|
||||||
|
voice-to-Hermes pipeline. It listens for transcripts on stdin
|
||||||
|
(eventually from SamiType's STT socket), parses them, and:
|
||||||
|
|
||||||
|
- If the transcript starts with the wake word **"computer"**, strips the
|
||||||
|
wake word and POSTs the remainder to the Hermes API at
|
||||||
|
`http://localhost:8765/command`.
|
||||||
|
- If the transcript is **"start dictation"**, enters dictation mode and
|
||||||
|
routes subsequent phrases to `xdotool type` (with `xdotool key` for
|
||||||
|
dictation commands like "new paragraph", "tab", "scratch that").
|
||||||
|
- If the transcript is **"stop dictation"**, exits dictation mode.
|
||||||
|
|
||||||
|
The script also exposes `--version` / `-V` which prints
|
||||||
|
`SamiOS voice-bridge v<VERSION>` — the version comes from the same
|
||||||
|
`./VERSION` walk-up resolver used by every other component.
|
||||||
|
|
||||||
|
The bridge is a **prototype**: it does not yet connect to a real
|
||||||
|
SamiType socket, does not implement TTS feedback, and uses
|
||||||
|
`localhost:8765` as a placeholder Hermes endpoint. See
|
||||||
|
[`docs/voice-hermes-pipeline.md`](docs/voice-hermes-pipeline.md) and
|
||||||
|
[`docs/voice-integration-architecture.md`](docs/voice-integration-architecture.md)
|
||||||
|
for the design direction. The 20 behavioral assertions in
|
||||||
|
`tests/test_voice_bridge.sh` guard the version SSOT, the wake-word
|
||||||
|
routing, the dictation mode state machine, and the documented fallbacks.
|
||||||
|
|
||||||
## Font Policy
|
## Font Policy
|
||||||
SamiOS excludes any fonts with "7777" in the filename as these are personal branding fonts.
|
|
||||||
|
SamiOS excludes any fonts with "7777" in the filename as these are
|
||||||
|
personal branding fonts. `samios fonts` enforces this at runtime; the
|
||||||
|
CI test `test_font_policy.sh` enforces it at build time.
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
This project is under active development. See `docs/roadmap.md` for planned features.
|
|
||||||
|
This project is under active development. See
|
||||||
|
[`docs/roadmap.md`](docs/roadmap.md) for planned features and the
|
||||||
|
current phase, and [`docs/developer-guide.md`](docs/developer-guide.md)
|
||||||
|
for build/test/release workflows.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
TBD
|
TBD
|
||||||
|
|||||||
Reference in New Issue
Block a user