The cat heredoc inside cloud-init runcmd was indented, causing the
shebang line to become " #!/bin/bash" (with leading spaces) which
makes the script fail to execute as a proper interpreter.
Fixed by removing indentation from the heredoc body. Also improved
the error message to explain that the clone likely failed during
provisioning and show the manual clone command.
Added tmux kill-session before starting new session to avoid
"duplicate session" errors on re-run.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Arch Linux cloud image ignores Proxmox's --ciuser/--cipassword
and the cloud-init chpasswd module depending on version. The previous
approach had three conflicting methods fighting each other.
Fixed by:
- Removed --ciuser/--cipassword from qm set (they conflict with snippet)
- Removed chpasswd cloud-init module (unreliable on Arch)
- Set users: [] to disable cloud-init's default user module
- ALL user setup now done via runcmd (runs as root, always works):
- Sets root password to 'darkforge' as fallback
- Creates darkforge user via useradd + chpasswd
- Grants passwordless sudo via /etc/sudoers.d/
- Enables PermitRootLogin yes as safety net
- Package install via explicit pacman commands instead of packages: module
(Arch cloud-init packages module can be unreliable)
- Added pacman-key --init/--populate before package install
Login credentials:
user: darkforge password: darkforge
user: root password: darkforge (fallback)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Arch Linux cloud images disable SSH password authentication by default.
Added cloud-init directives to:
- Enable ssh_pwauth
- Set the darkforge user password via chpasswd (plaintext, non-expiring)
- Write /etc/ssh/sshd_config.d/99-darkforge.conf enabling PasswordAuthentication
- Restart sshd after config is written
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests now run inside a tmux session so you can disconnect and
reconnect without interrupting multi-hour test runs.
Changes:
- create-vm.sh: cloud-init no longer auto-runs tests, just provisions
packages and clones the repo. Installs a `darkforge-test` command
in /usr/local/bin that wraps run-in-vm.sh in tmux.
- run-in-vm.sh: detects when called as `darkforge-test` and re-execs
inside a tmux session named "darkforge". --tmux flag for internal use.
- README updated with tmux workflow (detach/reattach instructions).
Workflow:
ssh darkforge@<ip>
darkforge-test --quick # starts in tmux
Ctrl+B D # detach, go do other things
tmux attach -t darkforge # come back later
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The CheckUpdates handler now reads has_repo_update to label each
update with its source: [repo], [upstream], or [repo+upstream].
This was the last remaining warning — build should now be fully clean.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Removed both blanket #![allow(dead_code)] from main.rs and lib.rs.
Each warning is now handled individually with a targeted #[allow]
and a comment explaining WHY the item exists and WHEN it will be used.
Fixes:
- resolver/mod.rs: Added missing SourceInfo fields (git, branch, tag,
commit, update_check) to test helper make_pkg() — fixes cargo test
- main.rs: Wire DEFAULT_CONFIG_PATH constant into CLI default_value
instead of hardcoding the string (eliminates unused constant warning)
Targeted #[allow(dead_code)] with justification on:
- config/global.rs: load_default() (future system service mode),
find_package() (future replacement for inline Info search)
- resolver/solib.rs: SharedLib, LibConflict, ConflictResolution structs
(planned upgrade conflict UI), get_soname(), check_upgrade_conflicts(),
format_conflict_report(), collect_provided_sonames(), soname_base()
(entire conflict detection chain — will be wired into dpack upgrade)
- resolver/mod.rs: definition_path field (populated but read in future)
- sandbox/mod.rs: add_ro_bind() (planned dep mounting), staging_dir(),
build_dir() (accessor methods for post-build inspection)
- db/mod.rs: is_installed() (used by tests, future install guard),
who_owns() (planned dpack owns <file> command)
- build/mod.rs: db(), db_mut() (accessors for advanced orchestration)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added 16 missing packages (boost, opencascade, xerces-c, swig,
tcl, tk, nodejs, cbindgen, unibilium, libtermkey, libvterm,
msgpack-c, xcb, xcb-proto, libxau, libxdmcp).
Every package in all 4 repos can now be installed via dpack
with zero unresolvable dependencies.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dpack fixes:
- Fixed missing SourceInfo fields in CRUX/Gentoo converters (git, branch,
tag, commit, update_check fields added to struct initializers)
- Added 'sign' command: downloads source tarballs and computes real SHA256
checksums, updating .toml definitions in-place. Replaces placeholder
checksums. Usage: dpack sign zlib or dpack sign all
Testing:
- tests/run-tests.sh: comprehensive integration test runner for Arch Linux
host. 7 test suites covering host env, dpack build/tests, package defs,
toolchain scripts, kernel config, init system, and QEMU boot.
Generates JSON + text reports for automated debugging.
Usage: bash tests/run-tests.sh [--quick]
ISO builders:
- src/iso/build-iso-arch.sh: builds live ISO from Arch Linux host
Creates rootfs from pre-built base system or busybox fallback,
includes installer + dpack + package repos, UEFI-only boot
- src/iso/build-iso-darkforge.sh: builds live ISO from running DarkForge
Snapshots the live system via rsync, creates redistributable ISO
Package repository (submodule updated):
- 14 new self-hosting packages: qemu, edk2-ovmf, squashfs-tools,
xorriso, mtools, efibootmgr, efivar, rsync, lz4, nasm,
neovim, htop, tmux, libevent
- Total: 138 packages across 4 repos
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dpack features:
- Git source support: packages can specify [source].git for cloning
instead of tarball download. Supports branch, tag, and commit pinning.
SHA256 can be set to "SKIP" for git sources.
- check-updates command: queries upstream APIs (GitHub releases/tags)
to find available updates. Packages set [source].update_check URL.
- CheckUpdates CLI subcommand wired into main.rs
Package changes:
- FreeCAD updated to weekly-2026.03.19 development builds
- dwl: added update_check URL and git source documentation
- src/repos extracted to standalone git repo (danny8632/repos.git)
and added as git submodule
Documentation:
- All 7 README.md files updated with detailed requirements sections
including which Linux distros are supported, exact package names
for Arch/Ubuntu/Fedora, and clear notes about which components
require Linux vs can be built on macOS
- dpack README: added git source and check-updates documentation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>