Commit graph

97 commits

Author SHA1 Message Date
6a40ed0560 Pin live npm globals to pi only (Sam & Codex) 2026-05-24 20:30:13 +02:00
c47cd44251 Add .prettierrc + reformat all active markdown to match
Codifies the markdown format Sam applied in bd94b87 / 30cf590 as a
project rule rather than per-file judgment. Prettier 3 defaults with
proseWrap=preserve (no prose reflow), printWidth=80, embedded code
formatting off so we don't touch fenced shell/JSON blocks.

.prettierignore scopes Prettier to active docs:
  - excludes tmp/, cache/, node_modules/, build artifacts
  - excludes CHANGELOG.md + RELEASE-NOTES-*.md (hand-formatted, rigid)
  - excludes .archive/ and .opencode/ (historical / tooling internal)
  - excludes bundled bootstrap.html

Reformatted 16 active .md files: padded markdown tables, blank line
before lists (CommonMark-strict), `*emph*` -> `_emph_`. No content
changes — diffs are all whitespace/alignment/emphasis style.

Verified: `npx prettier@3 --check '**/*.md'` reports all clean.

Build: not run — docs + tooling config only.
Tests: pass — prettier --check is green; git diff confirms no content
deletions, only formatting.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 11:16:42 +02:00
def175d0cb Create tmpfs cache target for early shell logins (Sam & Codex) 2026-05-18 14:17:29 +02:00
b4d1a9c2e0 Harden operator shell PATH and add optional zsh (Sam & Codex) 2026-05-18 14:04:15 +02:00
a83eee7a12 Make bash the Clawdie operator shell
Install and verify the live operator bash profile path so SSH, TTY, terminal, and su login sessions see the npm global pi tooling. Prefer /usr/local/bin/bash for the live and installed clawdie user while retaining /bin/sh fallback during partial firstboot recovery.

No image build run.

---

Build: pass — sh -n build.sh; sh -n firstboot/shell-ssh.sh; sh -n firstboot/shell-system.sh

Tests: pass — git diff --check
2026-05-18 13:52:15 +02:00
4a6f9b41a8 Doc noise sweep — bitchx, stale L7, past-tense the swap (Claude)
Small follow-up after 9e64a82's Firefox + deferred-bundle work landed.
Trims wavering language from docs and historical-banners the QML phase 4
doc to match the pattern used elsewhere.

Changes:

- BUILD.md
    Audit-candidates row for `bitchx`: drop the "Probably belongs in
    the disk-install bundle above; verify before next build" line.
    bitchx stays on the live USB; size impact is negligible and the
    operator may want a quick chat tool on a fresh boot.

- doc/LIVE-SESSION-REVIEW.md
    Remove the L7 "Firefox IS in package list — L5 concern mitigated"
    block. Both the cross-ref to L5 (unrelated to browser packages)
    and the finding itself were redundant noise once the Firefox swap
    landed.
    Past-tense the audio expectation: "After the bundle move +
    Chromium→Firefox swap (both landed in 9e64a82)..." replaces the
    forward-looking phrasing.
    Minor: fix broken-line sentence in the Post-84358ac review header.

- TESTING.md
    Drop "not the older Lumina-first installer flow" — Lumina is fully
    archived; the comparison is no longer informative.

- firstboot/gui/PHASE4-INTEGRATION-COMPLETE.md
    Add a historical banner matching the pattern used on
    ROADMAP-v1.0.0.md and docs/PHASE4-TEST-REPORT-06.APR.2026.md. The
    doc still accurately describes the abandoned Qt6/QML installer
    under firstboot/gui/qml-installer/; the banner makes that clear.

Not touched (verified accurate or intentional):

- BUILD.md "Provider keys, Telegram, and disk deployment are deferred
  on this branch" — accurate present state.
- README.md "later phases" / "intentionally deferred" wording — accurate.
- FIRSTBOOT.md "deferred to runtime" in shell-deploy error handling —
  accurate.
- ROADMAP-v1.0.0.md, RELEASE-NOTES-v0.9.0.md, docs/PHASE4-TEST-REPORT-*
  — already banner-marked as historical.
- BUILD.md's two remaining Chromium references — both explain *why*
  Firefox was chosen (the chain it avoids). Useful context, kept.

Build: pass — sh -n build.sh
Tests: pass — git diff --check
2026-05-18 12:06:51 +02:00
9dbfa70132 Consolidate firstboot docs and archive superseded plans (Sam & Claude)
Top-level doc count: 24 → 13. No plans or technical content removed —
this commit is pure consolidation and archival.

Merge (3 → 1):

  SHELL-ARCHITECTURE.md (665 lines)
  SHELL-MODULES.md (769 lines)
  firstboot/MODULE-MANIFEST.md (628 lines)
      → FIRSTBOOT.md (710 lines)

The three deleted files described the same firstboot/ codebase from three
angles (philosophy, function reference, dependency graph). A reader trying
to understand a module had to cross-reference all three; FIRSTBOOT.md
unifies them as one doc with sections (philosophy, architecture, dependency
graph, per-module reference, error handling, testing, POSIX rules).

Archive (8 docs → .archive/completed-work/):

  CLAWDIE-ISO.md                       (self-flagged DEPRECATED)
  QT6-IMPLEMENTATION-PLAN.md           (Qt6 installer direction abandoned)
  PHASE4-SUMMARY.md                    (phase complete)
  PHASE4-TESTING-INSTRUCTIONS.md       (phase complete)
  INSTALLER-PLAN.md                    (Apr 2026 plan, predates xfce-operator-usb)
  doc/ISO-LIVE-GUI-SETUP-PROPOSAL.md   (proposal; design now in code)
  doc/NOMADBSD-XFCE-USB-POC.md         (POC findings; SDDM+XFCE design now in code)
  doc/OPERATOR-USB-XFCE-PROPOSAL.md    (proposal → reality)

Link updates in active docs:

  README.md            two links replaced by FIRSTBOOT.md reference
  TESTING.md           two links replaced by FIRSTBOOT.md reference
  doc/SESSION-STAB-HANDOFF.md  CLAWDIE-ISO.md reference re-pathed to
                              .archive/completed-work/

Left intentionally untouched:

  CHANGELOG.md             historical v0.9.0 entry naming SHELL-MODULES.md —
                           release notes are version-frozen
  RELEASE-NOTES-v0.9.0.md  same reason

End state:
  Top-level docs:  24 → 13
  Visible KB:      ~290 → ~170
  Plans preserved: 100% (8 archived, 3 merged)

Build: pass — sh -n build.sh
Tests: pass — git diff --check
2026-05-18 10:31:40 +02:00
6443a63eee Drop legacy Lumina and autologin plan artifacts
Remove unused Lumina/live-installer package lists, keep SDDM on an interactive-greeter path with the Clawdie XFCE session preselected, and clean active docs that still described the superseded Lumina or autologin plans.

---

Build: pass — sh -n build.sh

Tests: pass — git diff --check
2026-05-18 09:45:36 +02:00
6be97f195a Replace LightDM with SDDM on live operator USB (Sam & Claude)
The xfce-operator-usb live USB has been failing with the documented
FreeBSD-specific LightDM+XFCE login-loop bug: ConsoleKit session
activation fails on FreeBSD, X session exits rc=1, LightDM restarts
the greeter, loop. The FreeBSD forum thread tracking this exact symptom
remains unresolved upstream as of January 2026.

NomadBSD — the FreeBSD live-USB spin we already borrow ideas from —
switched from SLiM to SDDM for the same class of reasons. SDDM does
not depend on ConsoleKit the same way LightDM does, and its QtQuick
greeter shares a toolkit with the QML installer we already maintain.

This commit:

- Drops lightdm/lightdm-gtk-greeter, adds sddm in pkg-list-xfce.
- Replaces live/operator-session/lightdm-live.conf with
  live/operator-session/sddm.conf, installed to
  /usr/local/etc/sddm.conf.d/50-clawdie-live.conf.
- Drops autologin by default. The live USB now boots to the SDDM
  greeter; the operator logs in as clawdie with the documented live
  password (quindecim when built with --live-default-password).
  Autologin can be re-enabled per machine by setting User= and
  Session= under [Autologin] in the installed sddm.conf.d file.
- Flips rc.conf to sddm_enable / display_manager=sddm in build.sh,
  firstboot/shell-system.sh, and firstboot/shell-desktop.sh.
- Updates the clawdie_live_gpu rc.d ordering directive from
  BEFORE: lightdm to BEFORE: sddm so the GPU detector still runs
  before the display manager.
- Removes the LightDM placeholder-config workaround in build.sh
  (SDDM has no equivalent pkg-script requirement).
- Removes the unused live/installer-session/lightdm-live.conf
  (build.sh hasn't referenced it since the move to XFCE).
- Sweeps LightDM references in README, BUILD, TESTING, SHELL-MODULES,
  SHELL-ARCHITECTURE, and MODULE-MANIFEST. Leaves historical
  validation findings in doc/NOMADBSD-XFCE-USB-POC.md alone (those
  document prior LightDM-era inspections and should remain accurate
  for that point in time).

Build: pass — sh -n build.sh, sh -n firstboot/shell-system.sh,
            sh -n firstboot/shell-desktop.sh
Tests: pass — git diff --check
2026-05-18 09:20:08 +02:00
03dd170dac Update operator USB documentation (Sam & Claude)
Refresh build, testing, requirements, and historical design docs for the current XFCE operator USB path, including pre-LightDM GPU detection, mdo-based operator actions, and the published quindecim workflow.

---

Build: pass — sh -n build.sh

Tests: pass — git diff --check
2026-05-16 20:56:07 +02:00
e137772647 Enable ZFS support on operator USB and target (Sam & Codex) 2026-05-16 15:27:42 +02:00
c52534c74e Add Bastille to operator USB tools (Sam & Claude)
Keep the first rebuild explicit with mdo-based Bastille use, fix rc.conf list appends, and clean new ISO skill EOF whitespace.

---

Build: pass — sh -n build.sh; sh -n firstboot/shell-system.sh

Tests: pass — git diff --check
2026-05-16 12:19:13 +02:00
0c17577770 Harden ISO build and target virtualization baseline (Sam & Codex) 2026-05-16 11:47:19 +02:00
0c19888c0a Add OSS XFCE mixer and clean USB docs (Sam & Claude)
Include xfce4-mixer in the active XFCE package list, align the proposal with the fixed clawdie USB user and post-boot Tailscale authentication flow, and remove seatd from the firstboot LightDM/X11 service path.

---
Build: pass — ./build.sh completed without --skip-fetch
Tests: pass — mounted-image static inspection confirmed xfce4-mixer installed and no seatd_enable in rc.conf; runtime boot unavailable on nested KVM host
2026-05-14 16:50:36 +02:00
73b3c03050 Pivot live image to XFCE operator USB (Sam & Codex) 2026-05-14 14:02:13 +02:00
d5b93bd004 Bundle current pi package and enable evdev 2026-05-13 07:56:04 +02:00
5ad9b3a4e4 Fix stale TESTING.md banner and embedding bake-through in .env seed (Sam & Claude)
- TESTING.md: expected output banner now matches updated integration-test.sh
- shell-env.sh: EMBED_BASE_URL defaults to empty when no OpenRouter key exists, letting config.ts resolve dynamically at runtime instead of baking localhost:8080 into .env
2026-05-12 20:07:07 +02:00
bdf6d637d9 Align ISO config docs with post-install setup 2026-05-12 19:58:33 +02:00
a0956e241f Fix LOCAL_LLM_PROVIDER value: llama.cpp -> llama_cpp to match shell modules (Sam & Claude)
shell-deploy.sh:592 checks for llama_cpp, not llama.cpp. Only affects non-live fallback path.
2026-05-12 18:35:50 +02:00
02cfbc8d2e Align live installer defaults before image rebuild (Sam & Codex) 2026-05-12 18:30:53 +02:00
bdfa65b975 Clean up warden0 bridge documentation 2026-05-12 18:24:51 +02:00
b6fac29d55 Fix bridge naming to warden0 and correct setup token wording (Sam & Claude)
- shell-pf.sh: BRIDGE is now always warden0 (matches jail-config.ts and AGENTS.md)
- CompletePage.qml: token text now says will be generated after first boot
- NETWORKING.md: updated to reflect warden0 fix
2026-05-12 18:18:12 +02:00
e13c19c39a Use absolute sudo path in live installer 2026-05-12 17:44:52 +02:00
e336caa04e Make ISO build PATH independent 2026-05-12 17:38:33 +02:00
74ace43f26 Add ISO build manifest metadata 2026-05-12 17:10:54 +02:00
f1e3a94d4b Add remote-safe setup access slice (Sam & Codex)
Collect optional SSH public key and Tailscale auth key in the live installer, keep the controlplane loopback-bound by default, allow SSH over tailscale0, and rotate the post-install setup token into /var/db/clawdie-installer/setup-token with MOTD guidance for SSH tunnel access.

This slice is install-mode only; upgrade runs do not mint a new setup token.

Build: pass
Tests: pass — sh -n + QML build + config-format + mocked setup-token writer dry-run
Real-disk / bhyve install: NOT YET TESTED
2026-05-12 15:39:50 +02:00
af6ac3e763 Wire live installer commit path (Sam & Codex)
Live GUI installs now write runtime handoff files under /var/run/clawdie-installer, invoke bsdinstall script through a dedicated commit helper, persist the installed handoff for first HDD boot, and point the operator at /setup after reboot.

The live autologin user is restricted to a narrow sudoers rule for the commit helper and reboot only.

Build: pass
Tests: pass — sh -n + QML build + config-format + stubbed live-commit dry-run
Real-disk / bhyve install: NOT YET TESTED
2026-05-12 14:34:42 +02:00
4a5f9bf370 Boot live installer session and narrow install-time contract (Sam & Codex) 2026-05-12 12:20:45 +02:00
3b46b5ee71 Narrow installer contract to identity-only and fix cross-repo alignment (Sam & Claude)
ISO-LIVE-GUI-SETUP-PROPOSAL:
- Remove LLM keys and Telegram from install-time field collection
- Add explicit 'not collected at install time' section with rationale
- Narrow clawdie-handoff.sealed scope (no provider keys or Telegram)
- Add QML alignment note about removing ANTHROPIC_API_KEY serialization

setup-import.sh:
- Replace hard-require loop for OPENROUTER/TELEGRAM with identity-only
  validation (ASSISTANT_NAME, AGENT_DOMAIN, TZ)
- Add ZAI_API_KEY, ZAI_API_BASE, OPENAI_API_KEY, ANTHROPIC_API_KEY,
  CLAUDE_CODE_OAUTH_TOKEN to allowed parse keys
- Add provider detection defaults for z.ai, OpenAI, Anthropic with
  z.ai as the new default (matches Clawdie-AI shell-env.sh)

NETWORKING.md:
- Add architecture note: browser jail replaces cage/wayvnc for autonomous
  execution; operator refresh moves to host-side xpra
- Add alignment note: bridge naming must converge to warden0 per
  Clawdie-AI AGENTS.md

README.md:
- Add architecture note on glasspane section with forward reference to
  browser jail and operator browser architecture docs
2026-05-12 08:36:14 +02:00
0841e96abe Enable mac_do framework during bootstrap (Codex)
Configure FreeBSD 15 installs to load mac_do with an empty rule set for future narrowly scoped UID transitions.
2026-05-10 21:55:47 +02:00
988bdf367a Bump FreeBSD 14→15 docs, add CLAWDIE_PROFILE to firstboot
- REQUIREMENTS.md: remove 14.2 minimum floor (15.0+ only)
- firstboot/shell-env.sh: set CLAWDIE_PROFILE=core in fresh install and upgrade append
- AGENTS.md: document mac_do adoption plan reference

---
Build: n/a | Tests: n/a (shell scripts, Linux agent)
2026-05-10 14:25:55 +02:00
b916b1e7c0 feat(firstboot): unify setup import across USB and VPS 2026-04-27 11:58:07 +02:00
5f480e7474 Default ISO code hosting: git (no Forgejo)
---

Build: n/a | Tests: n/a (bash -n ok)
2026-04-19 10:36:55 +00:00
d5d0df6ccf feat(firstboot): add controlplane auth + git jail env vars to .env seed
Generate CONTROLPLANE_SHARED_SECRET and BETTER_AUTH_SECRET at install
time via openssl rand. Add CONTROLPLANE_HOST_IP, CONTROLPLANE_AUTH_MODE,
CONTROLPLANE_PORT, BETTER_AUTH_URL, GIT_LOCAL_URL to both install heredoc
and upgrade append path. Default to bare git repo (CODE_HOSTING_MODE=git)
instead of Forgejo.

---
Build: pass | Tests: not run (Linux) — shell script, bash -n validated
2026-04-19 12:22:54 +02:00
8b90808c61 fix(installer): Phase A — stable ZFS, safe upgrades, module matrix
Four critical fixes before v1.0.0 VM test, informed by PC-BSD failure
modes and GhostBSD's improvements:

1. shell-zfs.sh: zpool labelclear on fresh install
   Clear ZFS labels from every device that was in the old pool before
   bsdinstall writes new ones. Prevents the "can't find pool by GUID"
   boot failure that made PC-BSD reinstalls unreliable.

2. shell-zfs.sh: pre-upgrade snapshot
   When operator selects Upgrade, take zfs snapshot -r
   pool@pre-upgrade-{timestamp} before any changes. One reboot to
   roll back if the upgrade goes wrong. UPGRADE_SNAPSHOT exported for
   downstream modules to reference.

3. shell-env.sh: never overwrite secrets on upgrade
   clawdie_shell_env_generate() now checks CLAWDIE_BOOT_MODE. In
   upgrade mode it calls clawdie_shell_env_append_new_keys() instead
   of regenerating — reads existing .env and appends only keys that
   are absent. Existing DB passwords, JWT secrets, API keys are never
   touched. This fixes the root cause of the orphaned-database bug:
   new passwords that don't match the existing pool's data.

4. firstboot.sh: module execution matrix via run_step_if
   New run_step_if "<modes>" wrapper marks steps as done without
   running them when not applicable to the current boot mode.
   Upgrade skips: gpu, nvidia, ssh, system, desktop, pf, tailscale
   Upgrade runs: pkg, env (append-only), npm-globals, deploy
   Prevents SSH key resets, rc.conf overwrites, and firewall rewrites
   during upgrade — all of which undid operator customisations.

Also adds INSTALLER-PLAN.md: full architecture plan for unified
GUI/TUI installer with Fresh / Upgrade / Repair modes, boot
environment support, and a clear phase roadmap to v1.1.0.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:09:51 +00:00
18c21472a3 fix(firstboot): run installer as root so rc.d service is installed
shell-deploy.sh was dropping to the clawdie user before running
just install. setup/service.ts checks isRoot() to decide whether
to install the rc.d service or generate start/stop wrappers — so
running as clawdie meant the agent was never registered with
FreeBSD's service manager and never started at boot.

Fix: run the installer as root. setup/service.ts already handles
privilege separation correctly when invoked as root: it writes
/usr/local/etc/rc.d/{agent}, adds -u {agent} to daemon args so
the running process is never root, and chowns data/logs/groups to
the agent user to prevent EACCES on first write.

Also adds DB_RUNTIME to the generated .env seed so operators can
see the jail vs host postgres option without reading the docs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 08:42:50 +00:00
0e2733271b feat(iso): bundle clawdie-ai node_modules for offline install
- build.sh now runs npm ci at ISO build time and bundles node_modules into the clawdie-ai payload tarball\n- firstboot deploy ensures node_modules exist (fallback: npm ci, network required)\n- test mode skips venv/model seeding + verify to avoid host side effects\n- docs/tests updated to match
2026-04-14 19:04:41 +00:00
9a0ce49b0d fix(firstboot): use just install
ISO deploy module now runs `just install` (with a dev fallback to `npm run install`) instead of `npm run install-all`, and docs/tests are updated accordingly.
2026-04-14 18:53:06 +00:00
7d0524e796 docs: update ISO docs for Aider+Pi harness completion and sync with main codebase
- Updated firstboot completion messages: Aider and Pi now listed as primary harnesses, Codex as optional
- Added [Unreleased] section to CHANGELOG documenting Aider venv provisioning and harness integration
- Reflects completion of Aider+Pi harness migration across clawdie-ai and clawdie-iso

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-12 09:24:37 +00:00
d0f3f98b76 Fix PF shell module and VPS test defaults 2026-04-12 06:43:25 +00:00
065cba8d92 Set locale/keymap defaults and move npm globals to /opt 2026-04-12 06:10:27 +00:00
c3549de88c Verify Aider CLI after ISO deploy 2026-04-12 05:10:38 +00:00
86ca69215a Add Aider prerequisites to ISO 2026-04-12 04:58:20 +00:00
d8d99d939d feat: bundle Aider and Forgejo packages, add ZAI_API_BASE to .env seed (Sam & Claude)
Add py311-aider_chat to host baseline for the controlplane harness
(Aider + Pi multi-agent orchestrator). Add forgejo package to jail
list for the code service. Bake ZAI_API_BASE into firstboot .env
to fix litellm endpoint mismatch discovered during Aider testing.

---
Build: pass | Tests: not run (Linux)
2026-04-12 06:52:23 +02:00
0b7803d79e docs: align firstboot module docs 2026-04-08 18:24:48 +00:00
448f4482bd feat(iso): bundle claude/gemini/pi npm CLIs for offline first-boot install
Ships @anthropic-ai/claude-code, @google/gemini-cli, and
@mariozechner/pi-coding-agent as prebuilt .tgz tarballs on the install
media so the agent runtime has its CLI dependencies on first boot
without network access.

Critical: installs to /home/clawdie/.npm-global to match the
npm_config_prefix set by shell-system.sh in /etc/profile.d/clawdie.sh,
so the clawdie user's PATH (and the agent's commandExists() probes)
actually resolve the binaries.

- scripts/fetch-npm-globals.sh: npm pack the 3 CLIs into tmp/npm-globals/
- firstboot/shell-npm-globals.sh: offline install as clawdie user with
  matching prefix, runs between pkg setup and deploy
- build.sh: fetch + bundle into ${SHARE}/npm-globals/
- firstboot.sh: source module and run_step before deploy

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 08:20:49 +00:00
bb42140f2a feat: add Claude auth fields to firstboot wizard (Sam & Claude)
Add ANTHROPIC_API_KEY and CLAUDE_CODE_OAUTH_TOKEN as optional password
fields to both shell wizard and GUI installer. Fields flow through to
.env via shell-env.sh. Document /tmp exemption in AGENTS.md.
2026-04-07 18:10:33 +02:00
aee688cb9e fix: Phase 4 blockers — path detection + progress tracking (Sam & Claude)
Fix 2 critical issues preventing Phase 4 from working on FreeBSD:

1. Path Detection (main.cpp:438-447)
   - Detect firstboot.sh location at runtime
   - Try /usr/local/share/clawdie-iso/firstboot/firstboot.sh (live ISO)
   - Fall back to /home/clawdie/clawdie-iso/firstboot/firstboot.sh (dev)
   - Error with helpful message if neither found
   - Closes blocker: installer now works on both dev + ISO

2. Progress Tracking (firstboot.sh:49-65, 253-262)
   - Add optional _step_num parameter to run_step() function
   - Write PROGRESS=N to progress file after each step completes
   - Update all 10 step calls with step numbers (1-8)
   - Closes blocker: progress bar now moves from 0% to 100%

3. Privilege Escalation (main.cpp:460)
   - Add sudo wrapper to firstboot.sh execution
   - Prompts for password when needed
   - Closes blocker: pkg/sysrc operations now succeed

Files changed:
- main.cpp: +13 lines (path detection + sudo)
- firstboot.sh: +7 lines (progress tracking)

All changes validate:
- C++ compiles clean (2 pre-existing warnings)
- Shell syntax valid (sh -n)
- Binary created: 115 KB

Status: Ready for ISO build + FreeBSD testing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:59:26 +00:00
160c02f12f feat: Phase 4 shell integration - GUI config writer and firstboot.sh sourcing
Implements complete GUI → shell integration pipeline:

- Add startInstall() method to InstallerBackend
- Write shell-compatible config to /tmp/clawdie-install.conf
- Source GUI config in firstboot.sh (skips text wizard)
- Add 4 package selection properties (desktop, devtools, nvidia, llm)
- Update PackagesPage to save selections
- Update ProgressPage to trigger installation
- Add test-config-format.sh validation script
- Add comprehensive Phase 4 documentation

Status: Implementation complete, ready for FreeBSD testing

Files changed:
- main.cpp: +109 lines (config writer + package properties)
- firstboot.sh: +7 lines (GUI config sourcing)
- PackagesPage.qml: +4 lines (save selections)
- ProgressPage.qml: +5 lines (startInstall call)
- README.md: +15 lines (Phase 4 status)

Known issues (testing required):
- Verify firstboot.sh path on live ISO
- Align progress file format (step names vs PROGRESS=N)
- Add privilege escalation (sudo wrapper)

(Sam & Claude)
2026-04-06 16:41:49 +02:00
40464af468 feat: Complete Phase 3 QML installer — 8-page wizard (Sam & Claude)
Expand single-page prototype into full multi-page installer wizard with
real backend integration for GPU, disk, and progress tracking.

Architecture:
- InstallerBackend: Central controller (context property)
- GPUDetector: Real pciconf-based GPU detection (Intel/AMD/NVIDIA/VMware)
- DiskModel: QAbstractListModel for disk enumeration (camcontrol devlist)
- ProgressTracker: QTimer-based progress file polling

Pages (8 total):
1. Welcome — system info + intro
2. License — acceptance gate
3. Disk selection — ListView from DiskModel
4. User creation — form with password validation
5. GPU configuration — real detection + NVIDIA driver choice
6. Packages — optional package checkboxes
7. Progress — progress bar + live log tail
8. Complete — success/error summary + reboot

UI/UX:
- StackView for page navigation (push/pop pattern)
- Dark header across all pages
- Navigation guards (license accepted, disk selected, passwords match)
- Responsive layout (900x700 window)

Build:
- Added c++17 and concurrent Qt modules
- All 8 pages bundled via qml.qrc resource file
- Binary: 103 KB ELF executable

Build: SUCCESS
Tests: All 603 vitest passing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 13:57:45 +00:00