From d65b1242fe71563280a2feab1e972f49f8023ab1 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Nov 2025 12:25:51 +0000 Subject: [PATCH] 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"