[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
|
||||
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
|
||||
- Rolling release (Arch-based)
|
||||
- Custom CLI tool (`samios`) for system management
|
||||
- Automated installation scripts
|
||||
- Custom branding and configuration
|
||||
- Font policy: excludes fonts with "7777" in the name
|
||||
|
||||
- **Rolling release** Arch-based
|
||||
- **Custom CLI** (`samios`) for system management — version, status, update, install, remove, services, fonts
|
||||
- **Automated installer** (`samios-installer.sh`) — UEFI/BIOS, partitioning, pacstrap, GRUB, user creation
|
||||
- **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
|
||||
|
||||
### Prerequisites
|
||||
|
||||
```bash
|
||||
# On Arch Linux
|
||||
sudo pacman -S archiso git
|
||||
sudo pacman -S archiso git shellcheck
|
||||
```
|
||||
|
||||
### Clone and Build
|
||||
|
||||
```bash
|
||||
git clone https://git.sami/sami7777/samios.git
|
||||
cd samios/packaging/archiso
|
||||
@@ -28,30 +38,217 @@ sudo ./build.sh
|
||||
## Installation
|
||||
|
||||
### 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
|
||||
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
|
||||
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
|
||||
|
||||
The `samios` command provides system management:
|
||||
|
||||
```bash
|
||||
samios status # Show system status
|
||||
samios update # Update system
|
||||
samios install # Install packages
|
||||
samios fonts # Manage fonts
|
||||
samios version # Show SamiOS version
|
||||
samios status # Show system status (disk, memory, network)
|
||||
samios update # Update system packages
|
||||
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
|
||||
```
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
TBD
|
||||
|
||||
Reference in New Issue
Block a user