docs: 添加 AGENTS.md 代码规范文档
This commit is contained in:
@@ -0,0 +1,262 @@
|
||||
# AGENTS.md - Arch Linux Configuration Repository
|
||||
|
||||
## Project Overview
|
||||
|
||||
This is a declarative Arch Linux configuration repository managed by `dcli` (Declarative CLI for Arch). The project uses YAML-based configuration files to manage packages, modules, and system files across different hosts.
|
||||
|
||||
**Primary Tool**: `dcli` - Declarative package and configuration manager for Arch Linux
|
||||
**Target Environment**: Arch Linux (primarily WSL, but supports bare metal)
|
||||
**Language**: Shell scripts (Bash), YAML configuration files
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
.
|
||||
├── config.yaml # Main config (specifies active host)
|
||||
├── hosts/ # Host-specific configurations
|
||||
│ └── wsl.yaml # WSL host config (enabled modules, AUR helper)
|
||||
├── modules/ # Modular package definitions
|
||||
│ ├── base.yaml # Core utilities (git, neovim, ripgrep, etc.)
|
||||
│ ├── dev-tools.yaml # Development tools (nodejs, bun, mise)
|
||||
│ └── zsh/ # Zsh module with dotfiles
|
||||
│ ├── module.yaml
|
||||
│ └── packages.yaml
|
||||
├── files/ # System configuration files to sync
|
||||
│ └── etc/ # Files that go to /etc
|
||||
├── scripts/ # Installation and setup scripts
|
||||
│ ├── install.sh # Main installation script
|
||||
│ └── wsl-init.sh # WSL-specific initialization
|
||||
└── state/ # dcli state directory (auto-generated)
|
||||
```
|
||||
|
||||
## Build/Test/Sync Commands
|
||||
|
||||
### Primary Commands
|
||||
|
||||
```bash
|
||||
# Apply configuration (install/update packages, sync files)
|
||||
dcli sync
|
||||
|
||||
# Check what would change without applying
|
||||
dcli sync --dry-run
|
||||
|
||||
# Update configuration from git
|
||||
cd ~/.config/arch-config && git pull && dcli sync
|
||||
```
|
||||
|
||||
### Installation Commands
|
||||
|
||||
```bash
|
||||
# WSL first-time setup (as root)
|
||||
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/wsl-init.sh | bash -s -- <username>
|
||||
|
||||
# Install dcli and clone config (as regular user)
|
||||
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
||||
|
||||
# Then sync configuration
|
||||
dcli sync
|
||||
```
|
||||
|
||||
### Testing Scripts
|
||||
|
||||
```bash
|
||||
# Test shell scripts for syntax errors
|
||||
bash -n scripts/install.sh
|
||||
bash -n scripts/wsl-init.sh
|
||||
|
||||
# Run shellcheck if available
|
||||
shellcheck scripts/*.sh
|
||||
```
|
||||
|
||||
### Package Management
|
||||
|
||||
```bash
|
||||
# Install packages manually (if needed)
|
||||
sudo pacman -S <package> # Official repos
|
||||
yay -S <package> # AUR packages
|
||||
|
||||
# Update system
|
||||
sudo pacman -Syu
|
||||
```
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
### Shell Scripts
|
||||
|
||||
**Shebang & Options**:
|
||||
- Always use `#!/bin/bash` (not `#!/bin/sh`)
|
||||
- Start with `set -euo pipefail` for safety
|
||||
- Exit on errors, undefined variables, and pipe failures
|
||||
|
||||
**Error Handling**:
|
||||
- Check command success with `if ! command; then`
|
||||
- Validate user input before proceeding
|
||||
- Provide clear error messages in Chinese (matching project language)
|
||||
- Exit with non-zero status on errors
|
||||
|
||||
**Variables**:
|
||||
- Use `UPPERCASE` for constants and environment variables
|
||||
- Use `lowercase` for local variables
|
||||
- Always quote variables: `"$VAR"` not `$VAR`
|
||||
- Use `${VAR}` for clarity when needed
|
||||
|
||||
**Conditionals**:
|
||||
- Prefer `[[ ]]` over `[ ]` for tests
|
||||
- Use `&> /dev/null` for suppressing output
|
||||
- Check file existence: `if [ -e "$FILE" ]; then`
|
||||
- Check command existence: `if command -v cmd &> /dev/null; then`
|
||||
|
||||
**User Feedback**:
|
||||
- Use `echo "==> Action..."` for major steps
|
||||
- Use Chinese for user-facing messages
|
||||
- Show clear success indicators: `✓`
|
||||
- Provide next steps after completion
|
||||
|
||||
**Example Pattern**:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
USERNAME="${1:-}"
|
||||
if [ -z "$USERNAME" ]; then
|
||||
echo "用法: script.sh <参数>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "==> 执行操作..."
|
||||
if ! some_command; then
|
||||
echo "错误:操作失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ 完成!"
|
||||
```
|
||||
|
||||
### YAML Configuration Files
|
||||
|
||||
**Structure**:
|
||||
- Use `---` document separator at the start
|
||||
- Use 2-space indentation (no tabs)
|
||||
- Keep files minimal and focused
|
||||
|
||||
**Module Files** (`modules/*.yaml`):
|
||||
```yaml
|
||||
---
|
||||
description: 模块描述
|
||||
packages:
|
||||
- package-name
|
||||
- another-package
|
||||
```
|
||||
|
||||
**Module with Dotfiles** (`modules/*/module.yaml`):
|
||||
```yaml
|
||||
---
|
||||
description: 模块描述
|
||||
dotfiles:
|
||||
- source: dotfiles/.config/file
|
||||
target: ~/.config/file
|
||||
```
|
||||
|
||||
**Host Files** (`hosts/*.yaml`):
|
||||
```yaml
|
||||
host: hostname
|
||||
aur_helper: yay
|
||||
auto_prune: true
|
||||
|
||||
enabled_modules:
|
||||
- base
|
||||
- module-name
|
||||
|
||||
system_backups:
|
||||
enabled: false
|
||||
```
|
||||
|
||||
**Main Config** (`config.yaml`):
|
||||
```yaml
|
||||
host: hostname
|
||||
```
|
||||
|
||||
**Naming Conventions**:
|
||||
- Use lowercase with hyphens for module names: `dev-tools`, not `DevTools`
|
||||
- Use descriptive names in Chinese for descriptions
|
||||
- Keep package lists alphabetically sorted
|
||||
|
||||
### File Organization
|
||||
|
||||
**Adding New Modules**:
|
||||
1. Create `modules/module-name.yaml` with package list
|
||||
2. Add module to `hosts/*.yaml` under `enabled_modules`
|
||||
3. Run `dcli sync` to apply
|
||||
|
||||
**Adding Dotfiles**:
|
||||
1. Create `modules/module-name/dotfiles/` directory
|
||||
2. Add dotfile mapping in `modules/module-name/module.yaml`
|
||||
3. Place actual dotfiles in the dotfiles subdirectory
|
||||
|
||||
**Adding System Files**:
|
||||
1. Place files in `files/` matching target path structure
|
||||
2. Example: `files/etc/pacman.d/mirrorlist` → `/etc/pacman.d/mirrorlist`
|
||||
3. Scripts handle copying with proper permissions
|
||||
|
||||
### Git Workflow
|
||||
|
||||
**Commit Messages**:
|
||||
- Follow commitlint conventional commits format
|
||||
- Use Chinese for commit messages (matching project language)
|
||||
- Format: `<type>(<scope>): <subject>`
|
||||
- Types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
|
||||
- Examples:
|
||||
- `feat(modules): 添加开发工具模块`
|
||||
- `fix(scripts): 更新 WSL 初始化脚本`
|
||||
- `docs: 更新 README 说明`
|
||||
- `chore(deps): 更新包列表`
|
||||
|
||||
**Branching**:
|
||||
- Main branch: `main`
|
||||
- Work directly on main for personal config repos
|
||||
- Test changes with `dcli sync --dry-run` before committing
|
||||
|
||||
## Important Notes for Agents
|
||||
|
||||
1. **dcli is the source of truth**: Don't manually install packages. Add them to module YAML files and run `dcli sync`.
|
||||
|
||||
2. **Host-specific configuration**: The active host is defined in `config.yaml`. Different hosts can have different enabled modules.
|
||||
|
||||
3. **AUR packages**: This repo uses `yay` as the AUR helper. Both official and AUR packages go in the same `packages:` list.
|
||||
|
||||
4. **WSL-specific**: The default configuration targets WSL. For bare metal, create a new host file and switch `config.yaml`.
|
||||
|
||||
5. **File syncing**: Files in `files/` are copied to system locations. Maintain the directory structure matching the target paths.
|
||||
|
||||
6. **No tests**: This is a configuration repository. Testing is done via `dcli sync --dry-run` and manual verification.
|
||||
|
||||
7. **Language**: User-facing messages and documentation are in Chinese. Keep this consistent.
|
||||
|
||||
8. **Safety first**: Scripts use `set -euo pipefail` and validate inputs. Maintain this pattern.
|
||||
|
||||
9. **Idempotency**: Scripts should be safe to run multiple times. Check if resources exist before creating.
|
||||
|
||||
10. **State management**: The `state/` directory is managed by dcli. Don't modify it manually.
|
||||
|
||||
## Common Tasks
|
||||
|
||||
**Add a new package**:
|
||||
- Edit appropriate module YAML file
|
||||
- Add package name to `packages:` list
|
||||
- Run `dcli sync`
|
||||
|
||||
**Create a new module**:
|
||||
- Create `modules/new-module.yaml`
|
||||
- Add packages and optional dotfiles config
|
||||
- Enable in `hosts/*.yaml`
|
||||
- Run `dcli sync`
|
||||
|
||||
**Update system configuration file**:
|
||||
- Edit file in `files/` directory
|
||||
- Run install script or manually copy to system location
|
||||
- Restart affected services if needed
|
||||
|
||||
**Switch to a different host**:
|
||||
- Create `hosts/new-host.yaml` if needed
|
||||
- Edit `config.yaml` to change `host:` value
|
||||
- Run `dcli sync`
|
||||
Reference in New Issue
Block a user