From 4caa0bbbc6837c0727fb5fc14f4fca5fec994542 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 11:47:12 +0000 Subject: [PATCH 01/19] fix: Improve force removal of existing images in install.sh - Increase sleep time to 2 seconds - Add SIGKILL as last resort - Continue with warning if removal fails --- cfg/install.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cfg/install.sh b/cfg/install.sh index e20af6f..54285c7 100644 --- a/cfg/install.sh +++ b/cfg/install.sh @@ -92,10 +92,15 @@ for img in $BACKUP workspace; do if machinectl list-images | grep -q "^$img"; then echo " Removing existing image: $img" machinectl poweroff $img 2>/dev/null || true - sleep 1 + sleep 2 machinectl terminate $img 2>/dev/null || true - sleep 1 - machinectl remove $img + sleep 2 + # Force kill if still running + if machinectl status $img &>/dev/null; then + machinectl kill $img --signal=SIGKILL 2>/dev/null || true + sleep 2 + fi + machinectl remove $img 2>/dev/null || echo " Warning: Could not remove $img (will skip)" fi done From 7abf48a8fd8a2bc7cd6bec39b7a088b3d8c9ddf6 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 12:17:19 +0000 Subject: [PATCH 02/19] feat: Add auto-start claude for ai user in login shell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add claude auto-start to ai user's .zshrc - Only triggers in interactive login shell - Uses exec to replace shell process with claude - Enables seamless AI-first experience Usage: machinectl shell workspace /bin/su - ai → Auto-login + Auto-start claude --- .github/workflows/release.yml | 9 +++++++++ build.zsh | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9227c43..b7d0f9c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -58,6 +58,15 @@ jobs: EOF cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/root/.zshrc cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/home/ai/.zshrc + cat >> root.x86_64/var/lib/machines/arch/home/ai/.zshrc <<'EOF' + + # Auto-start claude in interactive login shell + if [[ -o login ]] && [[ -o interactive ]]; then + if command -v claude &>/dev/null; then + exec claude + fi + fi + EOF arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown ai:ai /home/ai/.zshrc' cp -rf ./cfg/aios.zsh root.x86_64/var/lib/machines/arch/usr/local/bin/aios-startup arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chmod +x /usr/local/bin/aios-startup' diff --git a/build.zsh b/build.zsh index babd919..e669416 100755 --- a/build.zsh +++ b/build.zsh @@ -45,6 +45,18 @@ cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/root/.zshrc # Copy .zshrc for user 'ai' cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/home/ai/.zshrc + +# Add claude auto-start for ai user (login shell only) +cat >> root.x86_64/var/lib/machines/arch/home/ai/.zshrc <<'EOF' + +# Auto-start claude in interactive login shell +if [[ -o login ]] && [[ -o interactive ]]; then + if command -v claude &>/dev/null; then + exec claude + fi +fi +EOF + arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown ai:ai /home/ai/.zshrc' # Copy aios startup script From d65b1242fe71563280a2feab1e972f49f8023ab1 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 12:25:51 +0000 Subject: [PATCH 03/19] refactor: Modularize build.zsh into separate setup scripts Separated build.zsh into 3 clear parts: 1. build.zsh (Arch Linux base construction) - archiso bootstrap - pacstrap base system - install base packages - install Claude Code 2. cfg/setup-user.sh (User setup) - Create ai user - Configure sudoers - Setup auto-login - Configure zshrc and auto-start 3. cfg/setup-claude.sh (Claude/aigpt setup) - Install aigpt - Configure MCP - Setup symlinks - Initialize database Benefits: - Each file has a single, clear responsibility - Easier to maintain and modify - Can skip/customize setup steps if needed - GitHub Actions simplified to just run build.zsh --- .github/workflows/release.yml | 95 ++-------------------- build.zsh | 148 +++++++++++++--------------------- cfg/setup-claude.sh | 56 +++++++++++++ cfg/setup-user.sh | 67 +++++++++++++++ 4 files changed, 188 insertions(+), 178 deletions(-) create mode 100755 cfg/setup-claude.sh create mode 100755 cfg/setup-user.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b7d0f9c..aa565d2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,8 +2,8 @@ name: release on: push: - tags: - - 'v*' + branches: + - main permissions: contents: write @@ -24,93 +24,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Initialize + + - name: Build aios + run: bash ./build.zsh + + - name: Create Docker images run: | - pacman -Syuu --noconfirm base-devel archiso docker git nodejs bc - git clone https://gitlab.archlinux.org/archlinux/archiso - cp -rf ./cfg/profiledef.sh /usr/share/archiso/configs/releng/ - cp -rf ./cfg/profiledef.sh ./archiso/configs/releng/profiledef.sh - cp -rf ./cfg/profiledef.sh ./archiso/configs/baseline/profiledef.sh - cp -rf ./scpt/mkarchiso ./archiso/archiso/mkarchiso - ./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/ - tar xf aios-bootstrap*.tar.gz - mkdir -p root.x86_64/var/lib/machines/arch - pacstrap -c root.x86_64/var/lib/machines/arch base - echo -e 'Server = http://mirrors.cat.net/archlinux/$repo/os/$arch - Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' >> ./root.x86_64/var/lib/machines/arch/etc/pacman.d/mirrorlist - sed -i s/CheckSpace/#CheckeSpace/ root.x86_64/var/lib/machines/arch/etc/pacman.conf - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --init' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --populate archlinux' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux vim git zsh rust openssh openssl jq go nodejs npm docker podman bc sqlite' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /etc/containers/registries.conf.d' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'curl -sL -o /etc/containers/registries.conf.d/ai.conf https://git.syui.ai/ai/os/raw/branch/main/cfg/ai.conf' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chsh -s /bin/zsh' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'npm i -g @anthropic-ai/claude-code' - cp -rf ./cfg/os-release root.x86_64/var/lib/machines/arch/etc/os-release - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'useradd -m -G wheel -s /bin/zsh ai' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "ai:root" | chpasswd' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl" >> /etc/sudoers' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /etc/systemd/system/getty@tty1.service.d' - cat > root.x86_64/var/lib/machines/arch/etc/systemd/system/getty@tty1.service.d/override.conf <<'EOF' - [Service] - ExecStart= - ExecStart=-/usr/bin/agetty --autologin ai --noclear %I $TERM - EOF - cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/root/.zshrc - cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/home/ai/.zshrc - cat >> root.x86_64/var/lib/machines/arch/home/ai/.zshrc <<'EOF' - - # Auto-start claude in interactive login shell - if [[ -o login ]] && [[ -o interactive ]]; then - if command -v claude &>/dev/null; then - exec claude - fi - fi - EOF - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown ai:ai /home/ai/.zshrc' - cp -rf ./cfg/aios.zsh root.x86_64/var/lib/machines/arch/usr/local/bin/aios-startup - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chmod +x /usr/local/bin/aios-startup' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /home/ai/.config/syui/ai/os' - cat > root.x86_64/var/lib/machines/arch/home/ai/.config/syui/ai/os/config.json <<'EOF' - { - "shell": false - } - EOF - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown -R ai:ai /home/ai/.config' - cat >> root.x86_64/var/lib/machines/arch/home/ai/.zshrc <<'EOF' - - # aios startup - source /usr/local/bin/aios-startup - EOF - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /root/.config/syui/ai/claude' - cat > root.x86_64/var/lib/machines/arch/root/.config/syui/ai/claude/claude_desktop_config.json <<'EOF' - { - "mcpServers": { - "aigpt": { - "command": "aigpt", - "args": ["server", "--enable-layer4"] - } - } - } - EOF - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'ln -sf /root/.config/syui/ai/claude /root/.config/claude' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /home/ai/.config/syui/ai/claude' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'cp /root/.config/syui/ai/claude/claude_desktop_config.json /home/ai/.config/syui/ai/claude/' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'ln -sf /home/ai/.config/syui/ai/claude /home/ai/.config/claude' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown -R ai:ai /home/ai/.config/syui' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/ai /bin/ && ai ai' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /root/.config/syui/ai/gpt' - cp -rf ./cfg/mcp.json root.x86_64/var/lib/machines/arch/root/.config/syui/ai/mcp.json - cp -rf ./cfg/config.toml root.x86_64/var/lib/machines/arch/root/.config/syui/ai/config.toml - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'aigpt server --enable-layer4 &' - sleep 2 - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pkill aigpt' - arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'if command -v sqlite3 &>/dev/null; then sqlite3 /root/.config/syui/ai/gpt/memory.db "PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;"; fi' - cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/arch/opt/aios-ctl.zsh - cp -rf ./cfg/install.sh ./install.sh - chmod +x ./install.sh - tar -zcvf aios-bootstrap.tar.gz root.x86_64/ install.sh tar -C ./root.x86_64 -c . | docker import - ${{ env.IMAGE_NAME }} echo "${{ env.DOCKER_TOKEN }}" | docker login -u syui --password-stdin docker push ${{ env.IMAGE_NAME }} diff --git a/build.zsh b/build.zsh index e669416..1677fd1 100755 --- a/build.zsh +++ b/build.zsh @@ -1,22 +1,57 @@ #!/bin/zsh +# aios build script +# 1. Build minimal Arch Linux base +# 2. Setup user (ai) and shell +# 3. Setup Claude Code and aigpt + +set -e + +echo "=== aios build ===" +echo "" + +# ============================================ +# 1. Arch Linux Base Construction +# ============================================ + +echo "=== Step 1: Arch Linux Base ===" + +# Install build dependencies pacman -Syuu --noconfirm base-devel archiso docker git nodejs bc + +# Clone archiso git clone https://gitlab.archlinux.org/archlinux/archiso + +# Copy configuration cp -rf ./cfg/profiledef.sh /usr/share/archiso/configs/releng/ cp -rf ./cfg/profiledef.sh ./archiso/configs/releng/profiledef.sh cp -rf ./cfg/profiledef.sh ./archiso/configs/baseline/profiledef.sh cp -rf ./scpt/mkarchiso ./archiso/archiso/mkarchiso + +# Build bootstrap ./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/ + +# Extract and prepare tar xf aios-bootstrap*.tar.gz mkdir -p root.x86_64/var/lib/machines/arch pacstrap -c root.x86_64/var/lib/machines/arch base + +# Configure pacman echo -e 'Server = http://mirrors.cat.net/archlinux/$repo/os/$arch Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' >> ./root.x86_64/var/lib/machines/arch/etc/pacman.d/mirrorlist sed -i s/CheckSpace/#CheckeSpace/ root.x86_64/var/lib/machines/arch/etc/pacman.conf + +# Initialize pacman keys arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --init' arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --populate archlinux' + +# Install base packages arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux vim git zsh rust openssh openssl jq go nodejs npm docker podman bc sqlite' + +# Configure containers arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /etc/containers/registries.conf.d' arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'curl -sL -o /etc/containers/registries.conf.d/ai.conf https://git.syui.ai/ai/os/raw/branch/main/cfg/ai.conf' + +# Set default shell arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chsh -s /bin/zsh' # Install Claude Code @@ -25,107 +60,40 @@ arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'npm i -g @anthropic-ai # Copy os-release cp -rf ./cfg/os-release root.x86_64/var/lib/machines/arch/etc/os-release -# Create default user 'ai' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'useradd -m -G wheel -s /bin/zsh ai' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "ai:root" | chpasswd' +echo "✓ Arch Linux base complete" +echo "" -# Enable wheel group for sudo (specific commands without password) -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl" >> /etc/sudoers' +# ============================================ +# 2. User Setup +# ============================================ -# Setup auto-login for user 'ai' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /etc/systemd/system/getty@tty1.service.d' -cat > root.x86_64/var/lib/machines/arch/etc/systemd/system/getty@tty1.service.d/override.conf <<'EOF' -[Service] -ExecStart= -ExecStart=-/usr/bin/agetty --autologin ai --noclear %I $TERM -EOF +bash ./cfg/setup-user.sh +echo "" -# Copy .zshrc for root -cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/root/.zshrc +# ============================================ +# 3. Claude & aigpt Setup +# ============================================ -# Copy .zshrc for user 'ai' -cp -rf ./cfg/zshrc root.x86_64/var/lib/machines/arch/home/ai/.zshrc +bash ./cfg/setup-claude.sh +echo "" -# Add claude auto-start for ai user (login shell only) -cat >> root.x86_64/var/lib/machines/arch/home/ai/.zshrc <<'EOF' +# ============================================ +# Finalize +# ============================================ -# Auto-start claude in interactive login shell -if [[ -o login ]] && [[ -o interactive ]]; then - if command -v claude &>/dev/null; then - exec claude - fi -fi -EOF - -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown ai:ai /home/ai/.zshrc' - -# Copy aios startup script -cp -rf ./cfg/aios.zsh root.x86_64/var/lib/machines/arch/usr/local/bin/aios-startup -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chmod +x /usr/local/bin/aios-startup' - -# Create default config directory and file for user 'ai' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /home/ai/.config/syui/ai/os' -cat > root.x86_64/var/lib/machines/arch/home/ai/.config/syui/ai/os/config.json <<'EOF' -{ - "shell": false -} -EOF -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown -R ai:ai /home/ai/.config' - -# Update .zshrc to source startup script -cat >> root.x86_64/var/lib/machines/arch/home/ai/.zshrc <<'EOF' - -# aios startup -source /usr/local/bin/aios-startup -EOF - -# Install aigpt (AI memory system) -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' - -# Setup Claude Code MCP configuration (shared via symlink) -# Create actual config in syui/ai/claude (bind-mounted) -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /root/.config/syui/ai/claude' -cat > root.x86_64/var/lib/machines/arch/root/.config/syui/ai/claude/claude_desktop_config.json <<'EOF' -{ - "mcpServers": { - "aigpt": { - "command": "aigpt", - "args": ["server", "--enable-layer4"] - } - } -} -EOF - -# Create symlink for root -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'ln -sf /root/.config/syui/ai/claude /root/.config/claude' - -# Setup for ai user too -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /home/ai/.config/syui/ai/claude' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'cp /root/.config/syui/ai/claude/claude_desktop_config.json /home/ai/.config/syui/ai/claude/' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'ln -sf /home/ai/.config/syui/ai/claude /home/ai/.config/claude' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chown -R ai:ai /home/ai/.config/syui' - -# Install ai/bot (optional, for backward compatibility) -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/ai /bin/ && ai ai' - -# Create config directory -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /root/.config/syui/ai/gpt' - -# Copy MCP and aios configuration -cp -rf ./cfg/mcp.json root.x86_64/var/lib/machines/arch/root/.config/syui/ai/mcp.json -cp -rf ./cfg/config.toml root.x86_64/var/lib/machines/arch/root/.config/syui/ai/config.toml - -# Initialize aigpt database with WAL mode -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'aigpt server --enable-layer4 &' -sleep 2 -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pkill aigpt' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'if command -v sqlite3 &>/dev/null; then sqlite3 /root/.config/syui/ai/gpt/memory.db "PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;"; fi' +echo "=== Finalizing ===" # Copy aios-ctl.zsh for host machine control cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/arch/opt/aios-ctl.zsh -# Copy install script to root for easy access +# Copy install script cp -rf ./cfg/install.sh ./install.sh chmod +x ./install.sh +# Create tarball tar -zcvf aios-bootstrap.tar.gz root.x86_64/ install.sh + +echo "" +echo "=== Build Complete ===" +echo "Output: aios-bootstrap.tar.gz" +echo "" diff --git a/cfg/setup-claude.sh b/cfg/setup-claude.sh new file mode 100755 index 0000000..86be3be --- /dev/null +++ b/cfg/setup-claude.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# Claude Code and aigpt setup for aios +# Installs aigpt, configures MCP, sets up shared memory + +ROOTFS="root.x86_64/var/lib/machines/arch" + +echo "=== Claude & aigpt Setup ===" + +# Install aigpt (AI memory system) +echo "Installing aigpt..." +arch-chroot $ROOTFS /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' + +# Setup Claude Code MCP configuration (shared via symlink) +echo "Configuring MCP..." +# Create actual config in syui/ai/claude (bind-mounted) +arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /root/.config/syui/ai/claude' +cat > $ROOTFS/root/.config/syui/ai/claude/claude_desktop_config.json <<'EOF' +{ + "mcpServers": { + "aigpt": { + "command": "aigpt", + "args": ["server", "--enable-layer4"] + } + } +} +EOF + +# Create symlink for root +arch-chroot $ROOTFS /bin/sh -c 'ln -sf /root/.config/syui/ai/claude /root/.config/claude' + +# Setup for ai user too +arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /home/ai/.config/syui/ai/claude' +arch-chroot $ROOTFS /bin/sh -c 'cp /root/.config/syui/ai/claude/claude_desktop_config.json /home/ai/.config/syui/ai/claude/' +arch-chroot $ROOTFS /bin/sh -c 'ln -sf /home/ai/.config/syui/ai/claude /home/ai/.config/claude' +arch-chroot $ROOTFS /bin/sh -c 'chown -R ai:ai /home/ai/.config/syui' + +# Install ai/bot (optional, for backward compatibility) +echo "Installing ai/bot..." +arch-chroot $ROOTFS /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/ai /bin/ && ai ai' + +# Create config directory +arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /root/.config/syui/ai/gpt' + +# Copy MCP and aios configuration +echo "Copying configuration files..." +cp -rf ./cfg/mcp.json $ROOTFS/root/.config/syui/ai/mcp.json +cp -rf ./cfg/config.toml $ROOTFS/root/.config/syui/ai/config.toml + +# Initialize aigpt database with WAL mode +echo "Initializing aigpt database..." +arch-chroot $ROOTFS /bin/sh -c 'aigpt server --enable-layer4 &' +sleep 2 +arch-chroot $ROOTFS /bin/sh -c 'pkill aigpt' +arch-chroot $ROOTFS /bin/sh -c 'if command -v sqlite3 &>/dev/null; then sqlite3 /root/.config/syui/ai/gpt/memory.db "PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;"; fi' + +echo "✓ Claude & aigpt setup complete" diff --git a/cfg/setup-user.sh b/cfg/setup-user.sh new file mode 100755 index 0000000..dae6f93 --- /dev/null +++ b/cfg/setup-user.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# User setup for aios +# Creates ai user, configures auto-login, sudo, zshrc + +ROOTFS="root.x86_64/var/lib/machines/arch" + +echo "=== User Setup ===" + +# Create default user 'ai' +echo "Creating user 'ai'..." +arch-chroot $ROOTFS /bin/sh -c 'useradd -m -G wheel -s /bin/zsh ai' +arch-chroot $ROOTFS /bin/sh -c 'echo "ai:root" | chpasswd' + +# Enable wheel group for sudo (specific commands without password) +echo "Configuring sudoers..." +arch-chroot $ROOTFS /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl" >> /etc/sudoers' + +# Setup auto-login for user 'ai' +echo "Setting up auto-login..." +arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /etc/systemd/system/getty@tty1.service.d' +cat > $ROOTFS/etc/systemd/system/getty@tty1.service.d/override.conf <<'EOF' +[Service] +ExecStart= +ExecStart=-/usr/bin/agetty --autologin ai --noclear %I $TERM +EOF + +# Copy .zshrc for root +echo "Copying zshrc..." +cp -rf ./cfg/zshrc $ROOTFS/root/.zshrc + +# Copy .zshrc for user 'ai' +cp -rf ./cfg/zshrc $ROOTFS/home/ai/.zshrc + +# Add claude auto-start for ai user (login shell only) +cat >> $ROOTFS/home/ai/.zshrc <<'EOF' + +# Auto-start claude in interactive login shell +if [[ -o login ]] && [[ -o interactive ]]; then + if command -v claude &>/dev/null; then + exec claude + fi +fi +EOF + +arch-chroot $ROOTFS /bin/sh -c 'chown ai:ai /home/ai/.zshrc' + +# Copy aios startup script +cp -rf ./cfg/aios.zsh $ROOTFS/usr/local/bin/aios-startup +arch-chroot $ROOTFS /bin/sh -c 'chmod +x /usr/local/bin/aios-startup' + +# Create default config directory and file for user 'ai' +arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /home/ai/.config/syui/ai/os' +cat > $ROOTFS/home/ai/.config/syui/ai/os/config.json <<'EOF' +{ + "shell": false +} +EOF +arch-chroot $ROOTFS /bin/sh -c 'chown -R ai:ai /home/ai/.config' + +# Update .zshrc to source startup script +cat >> $ROOTFS/home/ai/.zshrc <<'EOF' + +# aios startup +source /usr/local/bin/aios-startup +EOF + +echo "✓ User setup complete" From 506b93b5f4f86252eca657379ad2e7aa7907d52e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 12:35:19 +0000 Subject: [PATCH 04/19] refactor: Move core aios packages to build.zsh Moved essential aios components to build.zsh (base layer): - sudoers configuration (wheel group permissions) - aigpt install (aios core package) - aibot install (aios core package) - renamed from 'ai' to 'aibot' Updated module responsibilities: - build.zsh: Arch base + aios core packages (required) - setup-user.sh: User customization only - setup-claude.sh: Claude MCP configuration only Benefits: - Clear separation: base vs customization - aigpt/aibot always included (core aios functionality) - Modules can be optionally skipped for customization --- build.zsh | 12 ++++++++++++ cfg/setup-claude.sh | 16 ++++------------ cfg/setup-user.sh | 4 ---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build.zsh b/build.zsh index 1677fd1..a2c017f 100755 --- a/build.zsh +++ b/build.zsh @@ -60,6 +60,18 @@ arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'npm i -g @anthropic-ai # Copy os-release cp -rf ./cfg/os-release root.x86_64/var/lib/machines/arch/etc/os-release +# Configure sudoers for wheel group +echo "Configuring sudoers..." +arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl" >> /etc/sudoers' + +# Install aigpt (aios core package) +echo "Installing aigpt..." +arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' + +# Install aibot (aios core package) +echo "Installing aibot..." +arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/aibot /bin/ && aibot ai' + echo "✓ Arch Linux base complete" echo "" diff --git a/cfg/setup-claude.sh b/cfg/setup-claude.sh index 86be3be..c727420 100755 --- a/cfg/setup-claude.sh +++ b/cfg/setup-claude.sh @@ -1,14 +1,10 @@ #!/bin/bash -# Claude Code and aigpt setup for aios -# Installs aigpt, configures MCP, sets up shared memory +# Claude Code MCP setup for aios +# Configures MCP, sets up shared memory ROOTFS="root.x86_64/var/lib/machines/arch" -echo "=== Claude & aigpt Setup ===" - -# Install aigpt (AI memory system) -echo "Installing aigpt..." -arch-chroot $ROOTFS /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' +echo "=== Claude MCP Setup ===" # Setup Claude Code MCP configuration (shared via symlink) echo "Configuring MCP..." @@ -34,10 +30,6 @@ arch-chroot $ROOTFS /bin/sh -c 'cp /root/.config/syui/ai/claude/claude_desktop_c arch-chroot $ROOTFS /bin/sh -c 'ln -sf /home/ai/.config/syui/ai/claude /home/ai/.config/claude' arch-chroot $ROOTFS /bin/sh -c 'chown -R ai:ai /home/ai/.config/syui' -# Install ai/bot (optional, for backward compatibility) -echo "Installing ai/bot..." -arch-chroot $ROOTFS /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/ai /bin/ && ai ai' - # Create config directory arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /root/.config/syui/ai/gpt' @@ -53,4 +45,4 @@ sleep 2 arch-chroot $ROOTFS /bin/sh -c 'pkill aigpt' arch-chroot $ROOTFS /bin/sh -c 'if command -v sqlite3 &>/dev/null; then sqlite3 /root/.config/syui/ai/gpt/memory.db "PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;"; fi' -echo "✓ Claude & aigpt setup complete" +echo "✓ Claude MCP setup complete" diff --git a/cfg/setup-user.sh b/cfg/setup-user.sh index dae6f93..6147978 100755 --- a/cfg/setup-user.sh +++ b/cfg/setup-user.sh @@ -11,10 +11,6 @@ echo "Creating user 'ai'..." arch-chroot $ROOTFS /bin/sh -c 'useradd -m -G wheel -s /bin/zsh ai' arch-chroot $ROOTFS /bin/sh -c 'echo "ai:root" | chpasswd' -# Enable wheel group for sudo (specific commands without password) -echo "Configuring sudoers..." -arch-chroot $ROOTFS /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl" >> /etc/sudoers' - # Setup auto-login for user 'ai' echo "Setting up auto-login..." arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /etc/systemd/system/getty@tty1.service.d' From 511cf960d6c52827b3de6d7ad0d904711e69b144 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 12:53:12 +0000 Subject: [PATCH 05/19] feat: Pre-create containers in build.zsh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed container creation from install-time to build-time: Before: - build.zsh: create only aios - install.sh: machinectl clone aios → aiosback, workspace After: - build.zsh: create aios + aiosback + workspace (cp -a) - install.sh: just extract and move to /var/lib/machines/ Benefits: - Simpler install.sh (no machinectl clone operations) - Faster installation (no clone overhead) - All containers included in tarball - Consistent initial state --- build.zsh | 8 +++++++- cfg/install.sh | 34 +++++----------------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/build.zsh b/build.zsh index a2c017f..3ace9d2 100755 --- a/build.zsh +++ b/build.zsh @@ -98,11 +98,17 @@ echo "=== Finalizing ===" # Copy aios-ctl.zsh for host machine control cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/arch/opt/aios-ctl.zsh +# Create backup and workspace containers +echo "Creating aiosback and workspace containers..." +cp -a root.x86_64/var/lib/machines/arch root.x86_64/var/lib/machines/aiosback +cp -a root.x86_64/var/lib/machines/arch root.x86_64/var/lib/machines/workspace + # Copy install script cp -rf ./cfg/install.sh ./install.sh chmod +x ./install.sh -# Create tarball +# Create tarball with all containers +echo "Creating tarball..." tar -zcvf aios-bootstrap.tar.gz root.x86_64/ install.sh echo "" diff --git a/cfg/install.sh b/cfg/install.sh index 54285c7..f912950 100644 --- a/cfg/install.sh +++ b/cfg/install.sh @@ -27,11 +27,13 @@ fi echo "1. Extracting $TARBALL..." tar xf "$TARBALL" -# Move to /var/lib/machines/ -echo "2. Installing to /var/lib/machines/$NAME..." -rm -rf /var/lib/machines/$NAME +# Move all containers to /var/lib/machines/ +echo "2. Installing containers to /var/lib/machines/..." +rm -rf /var/lib/machines/$NAME /var/lib/machines/$BACKUP /var/lib/machines/workspace mkdir -p /var/lib/machines mv root.x86_64/var/lib/machines/arch /var/lib/machines/$NAME +mv root.x86_64/var/lib/machines/aiosback /var/lib/machines/$BACKUP +mv root.x86_64/var/lib/machines/workspace /var/lib/machines/workspace # Copy nspawn configuration echo "3. Installing systemd-nspawn configuration..." @@ -86,32 +88,6 @@ mkdir -p /root/.config/syui/ai echo "4. Enabling systemd-machined..." systemctl enable --now systemd-machined -# Remove existing images if they exist -echo "5. Checking for existing images..." -for img in $BACKUP workspace; do - if machinectl list-images | grep -q "^$img"; then - echo " Removing existing image: $img" - machinectl poweroff $img 2>/dev/null || true - sleep 2 - machinectl terminate $img 2>/dev/null || true - sleep 2 - # Force kill if still running - if machinectl status $img &>/dev/null; then - machinectl kill $img --signal=SIGKILL 2>/dev/null || true - sleep 2 - fi - machinectl remove $img 2>/dev/null || echo " Warning: Could not remove $img (will skip)" - fi -done - -# Create initial backup -echo "6. Creating initial backup image..." -machinectl clone $NAME $BACKUP - -# Create workspace container for AI operations -echo "7. Creating workspace container..." -machinectl clone $NAME workspace - echo "" echo "=== Installation complete ===" echo "" From 355c3dceb411fdfaff06530c2c0a9774d2e58a97 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:05:26 +0000 Subject: [PATCH 06/19] fix: Remove exec from claude auto-start to allow manual shell usage Allow users to exit claude and continue using shell manually. When claude exits, user returns to zsh instead of logging out. --- cfg/setup-user.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfg/setup-user.sh b/cfg/setup-user.sh index 6147978..ed86ee4 100755 --- a/cfg/setup-user.sh +++ b/cfg/setup-user.sh @@ -33,7 +33,7 @@ cat >> $ROOTFS/home/ai/.zshrc <<'EOF' # Auto-start claude in interactive login shell if [[ -o login ]] && [[ -o interactive ]]; then if command -v claude &>/dev/null; then - exec claude + claude fi fi EOF From fb31108cf7a66cd58c650bcbd85d7bf8e7d741a0 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:15:36 +0000 Subject: [PATCH 07/19] feat: Add cleanup step to build.zsh before building --- build.zsh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.zsh b/build.zsh index 3ace9d2..8c1894f 100755 --- a/build.zsh +++ b/build.zsh @@ -9,6 +9,10 @@ set -e echo "=== aios build ===" echo "" +# Clean up previous build artifacts +echo "Cleaning up previous build..." +rm -rf root.x86_64/ archiso/ aios-bootstrap*.tar.gz install.sh + # ============================================ # 1. Arch Linux Base Construction # ============================================ From 19337566a927b64d3a739209b467aa83d2513162 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:16:48 +0000 Subject: [PATCH 08/19] fix: Handle missing tarball in cleanup gracefully --- build.zsh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.zsh b/build.zsh index 8c1894f..3567124 100755 --- a/build.zsh +++ b/build.zsh @@ -11,7 +11,8 @@ echo "" # Clean up previous build artifacts echo "Cleaning up previous build..." -rm -rf root.x86_64/ archiso/ aios-bootstrap*.tar.gz install.sh +rm -rf root.x86_64/ archiso/ install.sh +rm -f aios-bootstrap*.tar.gz 2>/dev/null || true # ============================================ # 1. Arch Linux Base Construction From 87738e1e0b017b2e151d814bf3f31a566078ef8e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:19:33 +0000 Subject: [PATCH 09/19] fix: Add bootstrap_packages.x86_64 configuration for mkarchiso --- build.zsh | 3 +++ cfg/profiledef.sh | 1 + 2 files changed, 4 insertions(+) diff --git a/build.zsh b/build.zsh index 3567124..7a8adad 100755 --- a/build.zsh +++ b/build.zsh @@ -32,6 +32,9 @@ cp -rf ./cfg/profiledef.sh ./archiso/configs/releng/profiledef.sh cp -rf ./cfg/profiledef.sh ./archiso/configs/baseline/profiledef.sh cp -rf ./scpt/mkarchiso ./archiso/archiso/mkarchiso +# Create empty bootstrap_packages file +touch ./archiso/configs/releng/bootstrap_packages.x86_64 + # Build bootstrap ./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/ diff --git a/cfg/profiledef.sh b/cfg/profiledef.sh index cf86495..c7e68d5 100644 --- a/cfg/profiledef.sh +++ b/cfg/profiledef.sh @@ -14,6 +14,7 @@ bootmodes=('bios.syslinux.mbr' 'bios.syslinux.eltorito' 'uefi-ia32.grub.eltorito' 'uefi-x64.grub.eltorito') arch="x86_64" pacman_conf="pacman.conf" +bootstrap_packages="bootstrap_packages.x86_64" airootfs_image_type="squashfs" airootfs_image_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M') file_permissions=( From 7b889fd5a26ab99ec1c0cdca596eafbc4e5abbaa Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:22:51 +0000 Subject: [PATCH 10/19] revert: Remove bootstrap_packages configuration (not needed with custom mkarchiso) --- build.zsh | 3 --- cfg/profiledef.sh | 1 - 2 files changed, 4 deletions(-) diff --git a/build.zsh b/build.zsh index 7a8adad..3567124 100755 --- a/build.zsh +++ b/build.zsh @@ -32,9 +32,6 @@ cp -rf ./cfg/profiledef.sh ./archiso/configs/releng/profiledef.sh cp -rf ./cfg/profiledef.sh ./archiso/configs/baseline/profiledef.sh cp -rf ./scpt/mkarchiso ./archiso/archiso/mkarchiso -# Create empty bootstrap_packages file -touch ./archiso/configs/releng/bootstrap_packages.x86_64 - # Build bootstrap ./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/ diff --git a/cfg/profiledef.sh b/cfg/profiledef.sh index c7e68d5..cf86495 100644 --- a/cfg/profiledef.sh +++ b/cfg/profiledef.sh @@ -14,7 +14,6 @@ bootmodes=('bios.syslinux.mbr' 'bios.syslinux.eltorito' 'uefi-ia32.grub.eltorito' 'uefi-x64.grub.eltorito') arch="x86_64" pacman_conf="pacman.conf" -bootstrap_packages="bootstrap_packages.x86_64" airootfs_image_type="squashfs" airootfs_image_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M') file_permissions=( From a833a60bacfa35d72a670c01b4bbeea5798c75d4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:25:43 +0000 Subject: [PATCH 11/19] fix: Remove set -e from build.zsh to prevent early exit on errors --- build.zsh | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.zsh b/build.zsh index 3567124..83ce025 100755 --- a/build.zsh +++ b/build.zsh @@ -4,8 +4,6 @@ # 2. Setup user (ai) and shell # 3. Setup Claude Code and aigpt -set -e - echo "=== aios build ===" echo "" From a447cb98f0f5aa46b0b5938cb8bac6d68c51b316 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 13:26:59 +0000 Subject: [PATCH 12/19] fix: Skip bootstrap_packages validation when not specified in mkarchiso --- scpt/mkarchiso | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/scpt/mkarchiso b/scpt/mkarchiso index 5b08ab0..c6f8d55 100755 --- a/scpt/mkarchiso +++ b/scpt/mkarchiso @@ -1335,17 +1335,19 @@ _validate_requirements_buildmode_bootstrap() { local bootstrap_pkg_list_from_file=() # Check if packages for the bootstrap image are specified - if [[ -e "${bootstrap_packages}" ]]; then - mapfile -t bootstrap_pkg_list_from_file < \ - <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") - bootstrap_pkg_list+=("${bootstrap_pkg_list_from_file[@]}") - if (( ${#bootstrap_pkg_list_from_file[@]} < 1 )); then + if [[ -n "${bootstrap_packages}" ]]; then + if [[ -e "${bootstrap_packages}" ]]; then + mapfile -t bootstrap_pkg_list_from_file < \ + <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") + bootstrap_pkg_list+=("${bootstrap_pkg_list_from_file[@]}") + if (( ${#bootstrap_pkg_list_from_file[@]} < 1 )); then + (( validation_error=validation_error+1 )) + _msg_error "No package specified in '${bootstrap_packages}'." 0 + fi + else (( validation_error=validation_error+1 )) - _msg_error "No package specified in '${bootstrap_packages}'." 0 + _msg_error "Bootstrap packages file '${bootstrap_packages}' does not exist." 0 fi - else - (( validation_error=validation_error+1 )) - _msg_error "Bootstrap packages file '${bootstrap_packages}' does not exist." 0 fi _validate_common_requirements_buildmode_all From a35a6bc87019bf57f0d40a10bdf975e5d1ea948a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 14:28:58 +0000 Subject: [PATCH 13/19] feat: Auto-register aigpt MCP server on first login Add automatic MCP registration in .zshrc that runs after .claude.json is created. On second login, aigpt server will be automatically registered to Claude Code. --- cfg/setup-user.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cfg/setup-user.sh b/cfg/setup-user.sh index ed86ee4..db8b69b 100755 --- a/cfg/setup-user.sh +++ b/cfg/setup-user.sh @@ -27,9 +27,16 @@ cp -rf ./cfg/zshrc $ROOTFS/root/.zshrc # Copy .zshrc for user 'ai' cp -rf ./cfg/zshrc $ROOTFS/home/ai/.zshrc -# Add claude auto-start for ai user (login shell only) +# Add MCP auto-setup and claude auto-start for ai user (login shell only) cat >> $ROOTFS/home/ai/.zshrc <<'EOF' +# MCP auto-setup (run once after .claude.json is created) +if [[ -f ~/.claude.json ]] && ! grep -q '"aigpt"' ~/.claude.json 2>/dev/null; then + if command -v claude &>/dev/null && command -v aigpt &>/dev/null; then + claude mcp add aigpt aigpt server &>/dev/null || true + fi +fi + # Auto-start claude in interactive login shell if [[ -o login ]] && [[ -o interactive ]]; then if command -v claude &>/dev/null; then From e88b241519088255537746b689b12f0d7023dc0d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 14:40:46 +0000 Subject: [PATCH 14/19] fix: Restructure containers - aios contains child containers internally Changed from 3 separate containers to 1 container with child containers inside: - /var/lib/machines/aios/ (main container) - /var/lib/machines/restore-img/ (child container) - /var/lib/machines/workspace/ (child container) ai user operates child containers from within aios using machinectl. --- build.zsh | 19 ++++++++++++++----- cfg/aios-ctl.zsh | 4 ++-- cfg/install.sh | 38 ++++---------------------------------- 3 files changed, 20 insertions(+), 41 deletions(-) diff --git a/build.zsh b/build.zsh index 83ce025..86a4b4c 100755 --- a/build.zsh +++ b/build.zsh @@ -101,16 +101,25 @@ echo "=== Finalizing ===" # Copy aios-ctl.zsh for host machine control cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/arch/opt/aios-ctl.zsh -# Create backup and workspace containers -echo "Creating aiosback and workspace containers..." -cp -a root.x86_64/var/lib/machines/arch root.x86_64/var/lib/machines/aiosback -cp -a root.x86_64/var/lib/machines/arch root.x86_64/var/lib/machines/workspace +# Create child containers inside aios (not separate containers) +echo "Creating child containers inside aios..." +mkdir -p root.x86_64/var/lib/machines/arch/var/lib/machines + +# Copy the base system to temporary location to avoid recursion +cp -a root.x86_64/var/lib/machines/arch /tmp/aios-base-$$ + +# Create child containers inside aios +cp -a /tmp/aios-base-$$ root.x86_64/var/lib/machines/arch/var/lib/machines/restore-img +cp -a /tmp/aios-base-$$ root.x86_64/var/lib/machines/arch/var/lib/machines/workspace + +# Cleanup temporary +rm -rf /tmp/aios-base-$$ # Copy install script cp -rf ./cfg/install.sh ./install.sh chmod +x ./install.sh -# Create tarball with all containers +# Create tarball with aios (contains child containers inside) echo "Creating tarball..." tar -zcvf aios-bootstrap.tar.gz root.x86_64/ install.sh diff --git a/cfg/aios-ctl.zsh b/cfg/aios-ctl.zsh index 41cfd30..05bef2b 100644 --- a/cfg/aios-ctl.zsh +++ b/cfg/aios-ctl.zsh @@ -21,9 +21,9 @@ function aios-shell() { sudo machinectl shell $NAME } -# Login to aios container +# Login to aios container as ai user function aios-login() { - sudo machinectl login $NAME + sudo machinectl shell $NAME /bin/su - ai } # Create backup of current aios diff --git a/cfg/install.sh b/cfg/install.sh index f912950..5319014 100644 --- a/cfg/install.sh +++ b/cfg/install.sh @@ -27,19 +27,17 @@ fi echo "1. Extracting $TARBALL..." tar xf "$TARBALL" -# Move all containers to /var/lib/machines/ -echo "2. Installing containers to /var/lib/machines/..." -rm -rf /var/lib/machines/$NAME /var/lib/machines/$BACKUP /var/lib/machines/workspace +# Install aios (contains child containers inside) +echo "2. Installing aios to /var/lib/machines/..." +rm -rf /var/lib/machines/$NAME mkdir -p /var/lib/machines mv root.x86_64/var/lib/machines/arch /var/lib/machines/$NAME -mv root.x86_64/var/lib/machines/aiosback /var/lib/machines/$BACKUP -mv root.x86_64/var/lib/machines/workspace /var/lib/machines/workspace # Copy nspawn configuration echo "3. Installing systemd-nspawn configuration..." mkdir -p /etc/systemd/nspawn -# Create aios.nspawn +# Create aios.nspawn (only one container needed) cat > /etc/systemd/nspawn/$NAME.nspawn <<'EOF' [Exec] Boot=yes @@ -53,34 +51,6 @@ Bind=/root/.config/syui/ai:/root/.config/syui/ai VirtualEthernet=no EOF -# Create aiosback.nspawn -cat > /etc/systemd/nspawn/$BACKUP.nspawn <<'EOF' -[Exec] -Boot=yes -PrivateUsers=pick -ResolvConf=copy-host - -[Files] -Bind=/root/.config/syui/ai:/root/.config/syui/ai - -[Network] -VirtualEthernet=no -EOF - -# Create workspace.nspawn -cat > /etc/systemd/nspawn/workspace.nspawn <<'EOF' -[Exec] -Boot=yes -PrivateUsers=pick -ResolvConf=copy-host - -[Files] -Bind=/root/.config/syui/ai:/root/.config/syui/ai - -[Network] -VirtualEthernet=no -EOF - # Create bind mount directory mkdir -p /root/.config/syui/ai From 49da9ec86acc51e174fd9fdde351ddc29f22db31 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 14:41:36 +0000 Subject: [PATCH 15/19] fix: Don't pre-create child containers - let ai user create them as needed Changed to only prepare /var/lib/machines/ directory inside aios. ai user will create child containers (workspace, restore-img, etc.) using machinectl as needed. --- build.zsh | 16 +++------------- cfg/install.sh | 2 +- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/build.zsh b/build.zsh index 86a4b4c..299aa16 100755 --- a/build.zsh +++ b/build.zsh @@ -101,25 +101,15 @@ echo "=== Finalizing ===" # Copy aios-ctl.zsh for host machine control cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/arch/opt/aios-ctl.zsh -# Create child containers inside aios (not separate containers) -echo "Creating child containers inside aios..." +# Prepare directory for child containers (ai user will create them as needed) +echo "Preparing directory for child containers..." mkdir -p root.x86_64/var/lib/machines/arch/var/lib/machines -# Copy the base system to temporary location to avoid recursion -cp -a root.x86_64/var/lib/machines/arch /tmp/aios-base-$$ - -# Create child containers inside aios -cp -a /tmp/aios-base-$$ root.x86_64/var/lib/machines/arch/var/lib/machines/restore-img -cp -a /tmp/aios-base-$$ root.x86_64/var/lib/machines/arch/var/lib/machines/workspace - -# Cleanup temporary -rm -rf /tmp/aios-base-$$ - # Copy install script cp -rf ./cfg/install.sh ./install.sh chmod +x ./install.sh -# Create tarball with aios (contains child containers inside) +# Create tarball with aios (ready for child containers) echo "Creating tarball..." tar -zcvf aios-bootstrap.tar.gz root.x86_64/ install.sh diff --git a/cfg/install.sh b/cfg/install.sh index 5319014..6b61215 100644 --- a/cfg/install.sh +++ b/cfg/install.sh @@ -27,7 +27,7 @@ fi echo "1. Extracting $TARBALL..." tar xf "$TARBALL" -# Install aios (contains child containers inside) +# Install aios (base container) echo "2. Installing aios to /var/lib/machines/..." rm -rf /var/lib/machines/$NAME mkdir -p /var/lib/machines From abdb3995523d243bf774d35650fdf3941c3eacb0 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 14:44:43 +0000 Subject: [PATCH 16/19] fix: Remove unused BACKUP variable from install.sh --- cfg/install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/cfg/install.sh b/cfg/install.sh index 6b61215..f25d116 100644 --- a/cfg/install.sh +++ b/cfg/install.sh @@ -4,7 +4,6 @@ set -e NAME="aios" -BACKUP="${NAME}back" TARBALL="aios-bootstrap.tar.gz" echo "=== aios installation ===" From cdf38812fca374e4c2f5fbfe00e7cfb9eba465b6 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 14:50:03 +0000 Subject: [PATCH 17/19] fix: Add securetty config and enable systemd-machined for container operations - Added pts/0-9 to /etc/securetty for systemd-nspawn login - Enabled systemd-machined for ai user to use machinectl - Added arch-install-scripts package for pacstrap support inside aios --- build.zsh | 4 ++-- cfg/setup-user.sh | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/build.zsh b/build.zsh index 299aa16..afd64d4 100755 --- a/build.zsh +++ b/build.zsh @@ -47,8 +47,8 @@ sed -i s/CheckSpace/#CheckeSpace/ root.x86_64/var/lib/machines/arch/etc/pacman.c arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --init' arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --populate archlinux' -# Install base packages -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux vim git zsh rust openssh openssl jq go nodejs npm docker podman bc sqlite' +# Install base packages (including systemd-container for machinectl) +arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux vim git zsh rust openssh openssl jq go nodejs npm docker podman bc sqlite systemd arch-install-scripts' # Configure containers arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /etc/containers/registries.conf.d' diff --git a/cfg/setup-user.sh b/cfg/setup-user.sh index db8b69b..bf22c8e 100755 --- a/cfg/setup-user.sh +++ b/cfg/setup-user.sh @@ -11,6 +11,25 @@ echo "Creating user 'ai'..." arch-chroot $ROOTFS /bin/sh -c 'useradd -m -G wheel -s /bin/zsh ai' arch-chroot $ROOTFS /bin/sh -c 'echo "ai:root" | chpasswd' +# Configure securetty for pts login (required for systemd-nspawn) +echo "Configuring securetty..." +cat >> $ROOTFS/etc/securetty <<'EOF' +pts/0 +pts/1 +pts/2 +pts/3 +pts/4 +pts/5 +pts/6 +pts/7 +pts/8 +pts/9 +EOF + +# Enable systemd-machined for container management +echo "Enabling systemd-machined..." +arch-chroot $ROOTFS /bin/sh -c 'systemctl enable systemd-machined' + # Setup auto-login for user 'ai' echo "Setting up auto-login..." arch-chroot $ROOTFS /bin/sh -c 'mkdir -p /etc/systemd/system/getty@tty1.service.d' From 1aab33cb04f132541b73a3326d6b0d6079a294ed Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 14:54:51 +0000 Subject: [PATCH 18/19] feat: Add automatic workspace container initialization on first login - Created init-containers.sh to create workspace and restore-img - Runs automatically on ai user's first login - Uses ~/.aios-initialized flag to run once - Updated sudoers to allow pacstrap, arch-chroot commands --- build.zsh | 2 +- cfg/init-containers.sh | 46 ++++++++++++++++++++++++++++++++++++++++++ cfg/setup-user.sh | 14 ++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 cfg/init-containers.sh diff --git a/build.zsh b/build.zsh index afd64d4..fde620b 100755 --- a/build.zsh +++ b/build.zsh @@ -65,7 +65,7 @@ cp -rf ./cfg/os-release root.x86_64/var/lib/machines/arch/etc/os-release # Configure sudoers for wheel group echo "Configuring sudoers..." -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl" >> /etc/sudoers' +arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman, /usr/bin/pacstrap, /usr/bin/arch-chroot, /usr/bin/rm, /usr/bin/mkdir, /usr/bin/mv, /usr/bin/cp, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl, /bin/bash" >> /etc/sudoers' # Install aigpt (aios core package) echo "Installing aigpt..." diff --git a/cfg/init-containers.sh b/cfg/init-containers.sh new file mode 100644 index 0000000..8a8dac8 --- /dev/null +++ b/cfg/init-containers.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Initialize child containers for ai user +# This script runs once on first login + +echo "=== Initializing workspace containers ===" +echo "This may take a few minutes..." + +# Create workspace directory +mkdir -p /tmp/workspace-init + +# Create base workspace +echo "Creating workspace container..." +sudo pacstrap -c /tmp/workspace-init base + +# Configure workspace +sudo arch-chroot /tmp/workspace-init /bin/sh -c 'pacman -Syu --noconfirm vim git zsh openssh nodejs npm sqlite' + +# Add securetty for pts login +sudo bash -c 'cat >> /tmp/workspace-init/etc/securetty <> $ROOTFS/home/ai/.zshrc <<'EOF' +# Initialize workspace containers on first login +if [ ! -f ~/.aios-initialized ]; then + echo "First login detected. Initializing workspace containers..." + if command -v sudo &>/dev/null && [ -x /usr/local/bin/init-containers.sh ]; then + /usr/local/bin/init-containers.sh && touch ~/.aios-initialized + fi +fi + # MCP auto-setup (run once after .claude.json is created) if [[ -f ~/.claude.json ]] && ! grep -q '"aigpt"' ~/.claude.json 2>/dev/null; then if command -v claude &>/dev/null && command -v aigpt &>/dev/null; then From e2b0d7a51de0d05612aeb12b039f48cf2ecd4a54 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 15:00:01 +0000 Subject: [PATCH 19/19] refactor: Simplify install.sh and rename arch to aios throughout - Simplified install.sh to just extract and mv - Renamed root.x86_64/var/lib/machines/arch to aios - Updated all references in build.zsh, setup-user.sh, setup-claude.sh --- build.zsh | 34 ++++++++++----------- cfg/install.sh | 72 ++++----------------------------------------- cfg/setup-claude.sh | 2 +- cfg/setup-user.sh | 2 +- 4 files changed, 24 insertions(+), 86 deletions(-) diff --git a/build.zsh b/build.zsh index fde620b..f98598c 100755 --- a/build.zsh +++ b/build.zsh @@ -35,45 +35,45 @@ cp -rf ./scpt/mkarchiso ./archiso/archiso/mkarchiso # Extract and prepare tar xf aios-bootstrap*.tar.gz -mkdir -p root.x86_64/var/lib/machines/arch -pacstrap -c root.x86_64/var/lib/machines/arch base +mkdir -p root.x86_64/var/lib/machines/aios +pacstrap -c root.x86_64/var/lib/machines/aios base # Configure pacman echo -e 'Server = http://mirrors.cat.net/archlinux/$repo/os/$arch -Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' >> ./root.x86_64/var/lib/machines/arch/etc/pacman.d/mirrorlist -sed -i s/CheckSpace/#CheckeSpace/ root.x86_64/var/lib/machines/arch/etc/pacman.conf +Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' >> ./root.x86_64/var/lib/machines/aios/etc/pacman.d/mirrorlist +sed -i s/CheckSpace/#CheckeSpace/ root.x86_64/var/lib/machines/aios/etc/pacman.conf # Initialize pacman keys -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --init' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman-key --populate archlinux' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'pacman-key --init' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'pacman-key --populate archlinux' # Install base packages (including systemd-container for machinectl) -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux vim git zsh rust openssh openssl jq go nodejs npm docker podman bc sqlite systemd arch-install-scripts' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux vim git zsh rust openssh openssl jq go nodejs npm docker podman bc sqlite systemd arch-install-scripts' # Configure containers -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'mkdir -p /etc/containers/registries.conf.d' -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'curl -sL -o /etc/containers/registries.conf.d/ai.conf https://git.syui.ai/ai/os/raw/branch/main/cfg/ai.conf' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'mkdir -p /etc/containers/registries.conf.d' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'curl -sL -o /etc/containers/registries.conf.d/ai.conf https://git.syui.ai/ai/os/raw/branch/main/cfg/ai.conf' # Set default shell -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'chsh -s /bin/zsh' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'chsh -s /bin/zsh' # Install Claude Code -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'npm i -g @anthropic-ai/claude-code' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'npm i -g @anthropic-ai/claude-code' # Copy os-release -cp -rf ./cfg/os-release root.x86_64/var/lib/machines/arch/etc/os-release +cp -rf ./cfg/os-release root.x86_64/var/lib/machines/aios/etc/os-release # Configure sudoers for wheel group echo "Configuring sudoers..." -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman, /usr/bin/pacstrap, /usr/bin/arch-chroot, /usr/bin/rm, /usr/bin/mkdir, /usr/bin/mv, /usr/bin/cp, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl, /bin/bash" >> /etc/sudoers' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman, /usr/bin/pacstrap, /usr/bin/arch-chroot, /usr/bin/rm, /usr/bin/mkdir, /usr/bin/mv, /usr/bin/cp, /usr/bin/poweroff, /usr/bin/reboot, /usr/bin/machinectl, /bin/bash" >> /etc/sudoers' # Install aigpt (aios core package) echo "Installing aigpt..." -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'git clone https://git.syui.ai/ai/gpt && cd gpt && cargo build --release && cp -rf ./target/release/aigpt /bin/' # Install aibot (aios core package) echo "Installing aibot..." -arch-chroot root.x86_64/var/lib/machines/arch /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/aibot /bin/ && aibot ai' +arch-chroot root.x86_64/var/lib/machines/aios /bin/sh -c 'git clone https://git.syui.ai/ai/bot && cd bot && cargo build && cp -rf ./target/debug/aibot /bin/ && aibot ai' echo "✓ Arch Linux base complete" echo "" @@ -99,11 +99,11 @@ echo "" echo "=== Finalizing ===" # Copy aios-ctl.zsh for host machine control -cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/arch/opt/aios-ctl.zsh +cp -rf ./cfg/aios-ctl.zsh root.x86_64/var/lib/machines/aios/opt/aios-ctl.zsh # Prepare directory for child containers (ai user will create them as needed) echo "Preparing directory for child containers..." -mkdir -p root.x86_64/var/lib/machines/arch/var/lib/machines +mkdir -p root.x86_64/var/lib/machines/aios/var/lib/machines # Copy install script cp -rf ./cfg/install.sh ./install.sh diff --git a/cfg/install.sh b/cfg/install.sh index f25d116..b14230b 100644 --- a/cfg/install.sh +++ b/cfg/install.sh @@ -1,81 +1,19 @@ #!/bin/bash # aios installation script -set -e - NAME="aios" TARBALL="aios-bootstrap.tar.gz" echo "=== aios installation ===" -echo "" -# Check if running as root -if [ "$EUID" -ne 0 ]; then - echo "Error: This script must be run as root" - exit 1 -fi - -# Check if tarball exists -if [ ! -f "$TARBALL" ]; then - echo "Error: $TARBALL not found" - echo "Please download aios-bootstrap.tar.gz first" - exit 1 -fi - -# Extract tarball -echo "1. Extracting $TARBALL..." +# Extract and install tar xf "$TARBALL" - -# Install aios (base container) -echo "2. Installing aios to /var/lib/machines/..." -rm -rf /var/lib/machines/$NAME mkdir -p /var/lib/machines -mv root.x86_64/var/lib/machines/arch /var/lib/machines/$NAME +mv root.x86_64/var/lib/machines/aios /var/lib/machines/$NAME -# Copy nspawn configuration -echo "3. Installing systemd-nspawn configuration..." -mkdir -p /etc/systemd/nspawn - -# Create aios.nspawn (only one container needed) -cat > /etc/systemd/nspawn/$NAME.nspawn <<'EOF' -[Exec] -Boot=yes -PrivateUsers=pick -ResolvConf=copy-host - -[Files] -Bind=/root/.config/syui/ai:/root/.config/syui/ai - -[Network] -VirtualEthernet=no -EOF - -# Create bind mount directory -mkdir -p /root/.config/syui/ai - -# Enable systemd-machined -echo "4. Enabling systemd-machined..." -systemctl enable --now systemd-machined - -echo "" echo "=== Installation complete ===" echo "" -echo "Next steps for each user:" -echo " 1. Copy control script to your home:" -echo " cp /var/lib/machines/$NAME/opt/aios-ctl.zsh ~/.aios-ctl.zsh" -echo "" -echo " 2. Add to your .zshrc:" -echo " echo 'source ~/.aios-ctl.zsh' >> ~/.zshrc" -echo " source ~/.zshrc" -echo "" -echo " 3. Start aios:" -echo " aios-start" -echo "" -echo " 4. Login to aios:" -echo " aios-login" -echo "" -echo "Available commands:" -echo " aios-start, aios-stop, aios-shell, aios-login" -echo " aios-backup, aios-reset, aios-update" -echo " aios-help for full list" +echo "Usage:" +echo " sudo machinectl start $NAME" +echo " sudo machinectl shell $NAME /bin/su - ai" echo "" diff --git a/cfg/setup-claude.sh b/cfg/setup-claude.sh index c727420..a0a2981 100755 --- a/cfg/setup-claude.sh +++ b/cfg/setup-claude.sh @@ -2,7 +2,7 @@ # Claude Code MCP setup for aios # Configures MCP, sets up shared memory -ROOTFS="root.x86_64/var/lib/machines/arch" +ROOTFS="root.x86_64/var/lib/machines/aios" echo "=== Claude MCP Setup ===" diff --git a/cfg/setup-user.sh b/cfg/setup-user.sh index 4a307b3..583faf7 100755 --- a/cfg/setup-user.sh +++ b/cfg/setup-user.sh @@ -2,7 +2,7 @@ # User setup for aios # Creates ai user, configures auto-login, sudo, zshrc -ROOTFS="root.x86_64/var/lib/machines/arch" +ROOTFS="root.x86_64/var/lib/machines/aios" echo "=== User Setup ==="