refactor: 从 dcli 迁移到 decman 声明式配置管理
- 新增 source.py 统一声明包、系统文件和 dotfiles - 简化 install.sh,由 decman 接管系统文件和 locale 配置 - 移除 dcli 配置(config.yaml、hosts/、modules/、state/) - 添加 pyproject.toml 和 uv.lock 用于开发环境类型提示 - 更新 README.md 和 AGENTS.md 适配 decman 工作流
This commit is contained in:
+2
-1
@@ -1 +1,2 @@
|
|||||||
system-packages-*.yaml
|
.venv/
|
||||||
|
__pycache__/
|
||||||
|
|||||||
@@ -2,31 +2,26 @@
|
|||||||
|
|
||||||
## Project Overview
|
## 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.
|
This is a declarative Arch Linux configuration repository managed by `decman` (Declarative package & configuration manager for Arch Linux). The project uses a Python source file to declare packages, system files, and dotfiles.
|
||||||
|
|
||||||
**Primary Tool**: `dcli` - Declarative package and configuration manager for Arch Linux
|
**Primary Tool**: `decman` - Declarative package & configuration manager for Arch Linux
|
||||||
**Target Environment**: Arch Linux (primarily WSL, but supports bare metal)
|
**Target Environment**: Arch Linux (primarily WSL, but supports bare metal)
|
||||||
**Language**: Shell scripts (Bash), YAML configuration files
|
**Language**: Shell scripts (Bash), Python configuration (source.py)
|
||||||
|
|
||||||
## Repository Structure
|
## Repository Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
.
|
.
|
||||||
├── config.yaml # Main config (specifies active host)
|
├── source.py # decman main configuration (packages, system files, dotfiles)
|
||||||
├── hosts/ # Host-specific configurations
|
├── files/ # System configuration files to deploy
|
||||||
│ └── wsl.yaml # WSL host config (enabled modules, AUR helper)
|
│ └── etc/
|
||||||
├── modules/ # Modular package definitions
|
│ ├── pacman.d/mirrorlist
|
||||||
│ ├── base.yaml # Core utilities (git, neovim, ripgrep, etc.)
|
│ └── sudoers.d/10-wheel
|
||||||
│ ├── dev-tools.yaml # Development tools (nodejs, bun, mise)
|
├── dotfiles/ # User dotfiles to deploy
|
||||||
│ └── zsh/ # Zsh module with dotfiles
|
│ └── .zshrc
|
||||||
│ ├── module.yaml
|
└── scripts/
|
||||||
│ └── packages.yaml
|
├── install.sh # Bootstrap script (git → yay → decman → first sync)
|
||||||
├── files/ # System configuration files to sync
|
└── wsl-init.sh # WSL-specific initialization (user creation)
|
||||||
│ └── 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
|
## Build/Test/Sync Commands
|
||||||
@@ -35,13 +30,20 @@ This is a declarative Arch Linux configuration repository managed by `dcli` (Dec
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Apply configuration (install/update packages, sync files)
|
# Apply configuration (install/update packages, sync files)
|
||||||
dcli sync
|
sudo decman
|
||||||
|
|
||||||
# Check what would change without applying
|
# First-time run (specify source file)
|
||||||
dcli sync --dry-run
|
sudo decman --source ~/.config/arch-config/source.py
|
||||||
|
|
||||||
# Update configuration from git
|
# Skip specific plugins
|
||||||
cd ~/.config/arch-config && git pull && dcli sync
|
sudo decman --skip aur
|
||||||
|
sudo decman --skip flatpak
|
||||||
|
|
||||||
|
# Only apply file operations
|
||||||
|
sudo decman --no-hooks --only files
|
||||||
|
|
||||||
|
# Debug mode
|
||||||
|
sudo decman --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
### Installation Commands
|
### Installation Commands
|
||||||
@@ -50,11 +52,8 @@ cd ~/.config/arch-config && git pull && dcli sync
|
|||||||
# WSL first-time setup (as root)
|
# 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>
|
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)
|
# Install decman and apply config (as regular user)
|
||||||
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
||||||
|
|
||||||
# Then sync configuration
|
|
||||||
dcli sync
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Testing Scripts
|
### Testing Scripts
|
||||||
@@ -66,17 +65,9 @@ bash -n scripts/wsl-init.sh
|
|||||||
|
|
||||||
# Run shellcheck if available
|
# Run shellcheck if available
|
||||||
shellcheck scripts/*.sh
|
shellcheck scripts/*.sh
|
||||||
```
|
|
||||||
|
|
||||||
### Package Management
|
# Validate Python syntax
|
||||||
|
python -c "import py_compile; py_compile.compile('source.py', doraise=True)"
|
||||||
```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
|
## Code Style Guidelines
|
||||||
@@ -86,7 +77,6 @@ sudo pacman -Syu
|
|||||||
**Shebang & Options**:
|
**Shebang & Options**:
|
||||||
- Always use `#!/bin/bash` (not `#!/bin/sh`)
|
- Always use `#!/bin/bash` (not `#!/bin/sh`)
|
||||||
- Start with `set -euo pipefail` for safety
|
- Start with `set -euo pipefail` for safety
|
||||||
- Exit on errors, undefined variables, and pipe failures
|
|
||||||
|
|
||||||
**Error Handling**:
|
**Error Handling**:
|
||||||
- Check command success with `if ! command; then`
|
- Check command success with `if ! command; then`
|
||||||
@@ -98,19 +88,16 @@ sudo pacman -Syu
|
|||||||
- Use `UPPERCASE` for constants and environment variables
|
- Use `UPPERCASE` for constants and environment variables
|
||||||
- Use `lowercase` for local variables
|
- Use `lowercase` for local variables
|
||||||
- Always quote variables: `"$VAR"` not `$VAR`
|
- Always quote variables: `"$VAR"` not `$VAR`
|
||||||
- Use `${VAR}` for clarity when needed
|
|
||||||
|
|
||||||
**Conditionals**:
|
**Conditionals**:
|
||||||
- Prefer `[[ ]]` over `[ ]` for tests
|
- Prefer `[[ ]]` over `[ ]` for tests
|
||||||
- Use `&> /dev/null` for suppressing output
|
- Use `&> /dev/null` for suppressing output
|
||||||
- Check file existence: `if [ -e "$FILE" ]; then`
|
|
||||||
- Check command existence: `if command -v cmd &> /dev/null; then`
|
- Check command existence: `if command -v cmd &> /dev/null; then`
|
||||||
|
|
||||||
**User Feedback**:
|
**User Feedback**:
|
||||||
- Use `echo "==> Action..."` for major steps
|
- Use `echo "==> Action..."` for major steps
|
||||||
- Use Chinese for user-facing messages
|
- Use Chinese for user-facing messages
|
||||||
- Show clear success indicators: `✓`
|
- Show clear success indicators: `✓`
|
||||||
- Provide next steps after completion
|
|
||||||
|
|
||||||
**Example Pattern**:
|
**Example Pattern**:
|
||||||
```bash
|
```bash
|
||||||
@@ -132,72 +119,36 @@ fi
|
|||||||
echo "✓ 完成!"
|
echo "✓ 完成!"
|
||||||
```
|
```
|
||||||
|
|
||||||
### YAML Configuration Files
|
### Python Configuration (source.py)
|
||||||
|
|
||||||
**Structure**:
|
**Structure**:
|
||||||
- Use `---` document separator at the start
|
- Use section dividers (`# ── Section ──`) to separate logical groups
|
||||||
- Use 2-space indentation (no tabs)
|
- Group packages by purpose (基础工具, 开发工具, Zsh)
|
||||||
- Keep files minimal and focused
|
- Keep packages in sets (`|=` syntax)
|
||||||
|
- Use `os.environ.get("SUDO_USER")` for dynamic username
|
||||||
|
|
||||||
**Module Files** (`modules/*.yaml`):
|
**Example Pattern**:
|
||||||
```yaml
|
```python
|
||||||
---
|
import os
|
||||||
description: 模块描述
|
import decman
|
||||||
packages:
|
from decman import File
|
||||||
- package-name
|
|
||||||
- another-package
|
USERNAME = os.environ.get("SUDO_USER", "imbytecat")
|
||||||
|
HOME = f"/home/{USERNAME}"
|
||||||
|
|
||||||
|
decman.pacman.packages |= {"git", "neovim", "zsh"}
|
||||||
|
decman.aur.packages |= {"decman", "bun"}
|
||||||
|
|
||||||
|
decman.files["/etc/pacman.d/mirrorlist"] = File(
|
||||||
|
source_file="./files/etc/pacman.d/mirrorlist",
|
||||||
|
)
|
||||||
|
|
||||||
|
decman.files[f"{HOME}/.zshrc"] = File(
|
||||||
|
source_file="./dotfiles/.zshrc",
|
||||||
|
owner=USERNAME,
|
||||||
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
**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
|
### Git Workflow
|
||||||
|
|
||||||
**Commit Messages**:
|
**Commit Messages**:
|
||||||
@@ -206,57 +157,54 @@ host: hostname
|
|||||||
- Format: `<type>(<scope>): <subject>`
|
- Format: `<type>(<scope>): <subject>`
|
||||||
- Types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
|
- Types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
|
||||||
- Examples:
|
- Examples:
|
||||||
- `feat(modules): 添加开发工具模块`
|
- `feat(source): 添加开发工具包`
|
||||||
- `fix(scripts): 更新 WSL 初始化脚本`
|
- `fix(scripts): 更新安装脚本`
|
||||||
- `docs: 更新 README 说明`
|
- `docs: 更新 README 说明`
|
||||||
- `chore(deps): 更新包列表`
|
- `chore(files): 更新镜像源列表`
|
||||||
|
|
||||||
**Branching**:
|
**Branching**:
|
||||||
- Main branch: `main`
|
- Main branch: `main`
|
||||||
- Work directly on main for personal config repos
|
- Work directly on main for personal config repos
|
||||||
- Test changes with `dcli sync --dry-run` before committing
|
|
||||||
|
|
||||||
## Important Notes for Agents
|
## 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`.
|
1. **decman is the source of truth**: Don't manually install packages. Add them to `source.py` and run `sudo decman`.
|
||||||
|
|
||||||
2. **Host-specific configuration**: The active host is defined in `config.yaml`. Different hosts can have different enabled modules.
|
2. **Pacman vs AUR**: Packages must be correctly categorized into `decman.pacman.packages` (official repos) and `decman.aur.packages` (AUR).
|
||||||
|
|
||||||
3. **AUR packages**: This repo uses `yay` as the AUR helper. Both official and AUR packages go in the same `packages:` list.
|
3. **System files**: Files in `files/` are copied (not symlinked) to system locations by decman. Use `File(source_file=..., permissions=...)` with correct permissions.
|
||||||
|
|
||||||
4. **WSL-specific**: The default configuration targets WSL. For bare metal, create a new host file and switch `config.yaml`.
|
4. **Dotfiles**: Files in `dotfiles/` are copied to user home by decman. Use `File(source_file=..., owner=USERNAME)`.
|
||||||
|
|
||||||
5. **File syncing**: Files in `files/` are copied to system locations. Maintain the directory structure matching the target paths.
|
5. **No dry-run**: decman does not have a `--dry-run` option. Review changes in `source.py` before running `sudo decman`.
|
||||||
|
|
||||||
6. **No tests**: This is a configuration repository. Testing is done via `dcli sync --dry-run` and manual verification.
|
6. **Runs as root**: `sudo decman` executes `source.py` as root. `SUDO_USER` contains the original username.
|
||||||
|
|
||||||
7. **Language**: User-facing messages and documentation are in Chinese. Keep this consistent.
|
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.
|
8. **Safety first**: Scripts use `set -euo pipefail` and validate inputs.
|
||||||
|
|
||||||
9. **Idempotency**: Scripts should be safe to run multiple times. Check if resources exist before creating.
|
9. **Idempotency**: Scripts should be safe to run multiple times.
|
||||||
|
|
||||||
10. **State management**: The `state/` directory is managed by dcli. Don't modify it manually.
|
10. **Bootstrap flow**: `scripts/install.sh` handles one-time setup (yay, decman, locale-gen, chsh). After that, `sudo decman` handles ongoing management.
|
||||||
|
|
||||||
## Common Tasks
|
## Common Tasks
|
||||||
|
|
||||||
**Add a new package**:
|
**Add a new package**:
|
||||||
- Edit appropriate module YAML file
|
- Determine if it's pacman or AUR
|
||||||
- Add package name to `packages:` list
|
- Add to the appropriate set in `source.py`
|
||||||
- Run `dcli sync`
|
- Run `sudo decman`
|
||||||
|
|
||||||
**Create a new module**:
|
**Add a new system file**:
|
||||||
- Create `modules/new-module.yaml`
|
- Place the file in `files/` matching target path structure (e.g., `files/etc/foo.conf` → `/etc/foo.conf`)
|
||||||
- Add packages and optional dotfiles config
|
- Add `decman.files["/etc/foo.conf"] = File(source_file="./files/etc/foo.conf")` to `source.py`
|
||||||
- Enable in `hosts/*.yaml`
|
- Run `sudo decman`
|
||||||
- Run `dcli sync`
|
|
||||||
|
|
||||||
**Update system configuration file**:
|
**Add a new dotfile**:
|
||||||
- Edit file in `files/` directory
|
- Place the file in `dotfiles/`
|
||||||
- Run install script or manually copy to system location
|
- Add `decman.files[f"{HOME}/.config/foo"] = File(source_file="./dotfiles/foo", owner=USERNAME)` to `source.py`
|
||||||
- Restart affected services if needed
|
- Run `sudo decman`
|
||||||
|
|
||||||
**Switch to a different host**:
|
**Update an existing configuration file**:
|
||||||
- Create `hosts/new-host.yaml` if needed
|
- Edit the source file in `files/` or `dotfiles/`
|
||||||
- Edit `config.yaml` to change `host:` value
|
- Run `sudo decman`
|
||||||
- Run `dcli sync`
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Arch Linux 配置仓库
|
# Arch Linux 配置仓库
|
||||||
|
|
||||||
使用 dcli 声明式管理 Arch Linux 配置。
|
使用 [decman](https://github.com/kiviktnm/decman) 声明式管理 Arch Linux 系统配置。
|
||||||
当前默认主机为 `wsl`;非 WSL 环境请先新增/切换 host,再执行同步。
|
当前默认面向 WSL 环境;裸机使用请按需修改 `source.py`。
|
||||||
|
|
||||||
## 使用方式
|
## 使用方式
|
||||||
|
|
||||||
@@ -23,7 +23,6 @@ wsl --terminate archlinux
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
||||||
dcli sync
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### B. 普通 Arch 安装(已存在普通用户)
|
### B. 普通 Arch 安装(已存在普通用户)
|
||||||
@@ -32,20 +31,33 @@ dcli sync
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
|
||||||
dcli sync
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> 注意:当前 `config.yaml` 的 `active_host` 是 `wsl`。非 WSL 环境请先新增对应 `hosts/*.yaml` 并切换 `active_host`。
|
|
||||||
|
|
||||||
## 配置说明
|
|
||||||
|
|
||||||
- `hosts/` - 主机配置
|
|
||||||
- `modules/` - 模块化包管理
|
|
||||||
- `files/` - 配置文件(自动同步)
|
|
||||||
|
|
||||||
## 更新配置
|
## 更新配置
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/.config/arch-config && git pull
|
cd ~/.config/arch-config && git pull && sudo decman
|
||||||
dcli sync
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 仓库结构
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── source.py # decman 主配置(包、系统文件、dotfiles)
|
||||||
|
├── files/ # 系统配置文件源
|
||||||
|
│ └── etc/
|
||||||
|
│ ├── pacman.d/mirrorlist
|
||||||
|
│ └── sudoers.d/10-wheel
|
||||||
|
├── dotfiles/ # 用户配置文件源
|
||||||
|
│ └── .zshrc
|
||||||
|
└── scripts/
|
||||||
|
├── install.sh # 安装脚本(bootstrap → decman)
|
||||||
|
└── wsl-init.sh # WSL 首次初始化(创建用户)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 配置说明
|
||||||
|
|
||||||
|
- `source.py` — 所有声明集中在一个文件:pacman 包、AUR 包、系统文件、dotfiles
|
||||||
|
- `files/` — 需要部署到 `/etc/` 的系统配置文件,目录结构对应目标路径
|
||||||
|
- `dotfiles/` — 需要部署到用户目录的配置文件
|
||||||
|
- `scripts/` — 一次性引导脚本,安装完成后由 `sudo decman` 接管日常管理
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
host: wsl
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
host: wsl
|
|
||||||
aur_helper: yay
|
|
||||||
auto_prune: true
|
|
||||||
|
|
||||||
enabled_modules:
|
|
||||||
- base
|
|
||||||
- zsh
|
|
||||||
- dev-tools
|
|
||||||
|
|
||||||
system_backups:
|
|
||||||
enabled: false
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
description: 基础工具
|
|
||||||
packages:
|
|
||||||
- base-devel
|
|
||||||
- bat
|
|
||||||
- curl
|
|
||||||
- dcli-arch-git
|
|
||||||
- fd
|
|
||||||
- fzf
|
|
||||||
- git
|
|
||||||
- neovim
|
|
||||||
- ripgrep
|
|
||||||
- sudo
|
|
||||||
- trash-cli
|
|
||||||
- vim
|
|
||||||
- wget
|
|
||||||
- yay
|
|
||||||
- zoxide
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
description: 开发工具
|
|
||||||
packages:
|
|
||||||
- bun
|
|
||||||
- mise
|
|
||||||
- nodejs
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
description: Zsh 及插件
|
|
||||||
dotfiles:
|
|
||||||
- source: dotfiles/.zshrc
|
|
||||||
target: ~/.zshrc
|
|
||||||
post_install_hook: set-default-shell.sh
|
|
||||||
hook_behavior: once
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
packages:
|
|
||||||
- fzf-tab-git
|
|
||||||
- oh-my-zsh-git
|
|
||||||
- zsh
|
|
||||||
- zsh-autosuggestions
|
|
||||||
- zsh-completions
|
|
||||||
- zsh-syntax-highlighting
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [ "$SHELL" != "$(which zsh)" ]; then
|
|
||||||
echo "==> 设置默认 shell 为 zsh..."
|
|
||||||
sudo chsh -s "$(which zsh)" "$USER"
|
|
||||||
echo "✓ 默认 shell 已设置为 zsh(重新登录后生效)"
|
|
||||||
else
|
|
||||||
echo "默认 shell 已经是 zsh"
|
|
||||||
fi
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[project]
|
||||||
|
name = "archlinux-config"
|
||||||
|
version = "0.0.0"
|
||||||
|
requires-python = ">=3.13"
|
||||||
|
|
||||||
|
[dependency-groups]
|
||||||
|
dev = ["decman", "decman-pacman"]
|
||||||
|
|
||||||
|
[tool.uv.sources]
|
||||||
|
decman = { git = "https://github.com/kiviktnm/decman.git" }
|
||||||
|
decman-pacman = { git = "https://github.com/kiviktnm/decman.git", subdirectory = "plugins/decman-pacman" }
|
||||||
|
|
||||||
|
[tool.ty.environment]
|
||||||
|
python = ".venv"
|
||||||
+19
-17
@@ -17,34 +17,36 @@ else
|
|||||||
git clone "$REPO_URL" "$CONFIG_DIR"
|
git clone "$REPO_URL" "$CONFIG_DIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "==> 配置系统文件..."
|
|
||||||
sudo cp "$CONFIG_DIR/files/etc/pacman.d/mirrorlist" /etc/pacman.d/mirrorlist
|
|
||||||
sudo cp "$CONFIG_DIR/files/etc/sudoers.d/10-wheel" /etc/sudoers.d/10-wheel
|
|
||||||
sudo chmod 440 /etc/sudoers.d/10-wheel
|
|
||||||
|
|
||||||
echo "==> 配置 locale..."
|
|
||||||
sudo sed -i 's/^#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen
|
|
||||||
sudo locale-gen
|
|
||||||
echo "LANG=en_US.UTF-8" | sudo tee /etc/locale.conf > /dev/null
|
|
||||||
|
|
||||||
echo "==> 更新系统..."
|
echo "==> 更新系统..."
|
||||||
sudo pacman -Syu --noconfirm
|
sudo pacman -Syu --noconfirm
|
||||||
|
|
||||||
echo "==> 安装基础工具..."
|
echo "==> 安装 base-devel..."
|
||||||
sudo pacman -S --needed --noconfirm base-devel
|
sudo pacman -S --needed --noconfirm base-devel
|
||||||
|
|
||||||
echo "==> 安装 yay..."
|
echo "==> 安装 yay..."
|
||||||
if ! command -v yay &> /dev/null; then
|
if ! command -v yay &> /dev/null; then
|
||||||
rm -rf /tmp/yay
|
rm -rf /tmp/yay
|
||||||
git clone https://aur.archlinux.org/yay.git /tmp/yay
|
git clone https://aur.archlinux.org/yay.git /tmp/yay
|
||||||
cd /tmp/yay
|
(cd /tmp/yay && makepkg -si --noconfirm)
|
||||||
makepkg -si --noconfirm
|
rm -rf /tmp/yay
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "==> 安装 dcli..."
|
echo "==> 安装 decman..."
|
||||||
yay -S --needed --noconfirm dcli-arch-git
|
yay -S --needed --noconfirm decman
|
||||||
|
|
||||||
|
echo "==> 应用系统配置..."
|
||||||
|
sudo decman --source "$CONFIG_DIR/source.py"
|
||||||
|
|
||||||
|
echo "==> 生成 locale..."
|
||||||
|
sudo locale-gen
|
||||||
|
|
||||||
|
echo "==> 设置默认 shell 为 zsh..."
|
||||||
|
if [ "$SHELL" != "$(which zsh)" ]; then
|
||||||
|
sudo chsh -s "$(which zsh)" "$USER"
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "✓ 安装完成!"
|
echo "✓ 安装完成!重新登录以使用 zsh。"
|
||||||
echo ""
|
echo ""
|
||||||
echo "下一步:运行 dcli sync 应用配置"
|
echo "后续更新配置:"
|
||||||
|
echo " cd $CONFIG_DIR && git pull && sudo decman"
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
"""
|
||||||
|
Arch Linux 声明式系统配置 — decman
|
||||||
|
|
||||||
|
用法:
|
||||||
|
首次:sudo decman --source /path/to/source.py
|
||||||
|
后续:sudo decman
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
import decman
|
||||||
|
from decman import File
|
||||||
|
|
||||||
|
assert decman.pacman is not None
|
||||||
|
assert decman.aur is not None
|
||||||
|
|
||||||
|
# ── 用户 ──────────────────────────────────────────────────────
|
||||||
|
# sudo decman 时 SUDO_USER 为调用 sudo 的原始用户
|
||||||
|
USERNAME = os.environ.get("SUDO_USER", "imbytecat")
|
||||||
|
HOME = f"/home/{USERNAME}"
|
||||||
|
|
||||||
|
# ── Pacman 包(官方仓库)──────────────────────────────────────
|
||||||
|
decman.pacman.packages |= {
|
||||||
|
"base-devel",
|
||||||
|
"bat",
|
||||||
|
"curl",
|
||||||
|
"fd",
|
||||||
|
"fzf",
|
||||||
|
"git",
|
||||||
|
"neovim",
|
||||||
|
"nodejs",
|
||||||
|
"ripgrep",
|
||||||
|
"sudo",
|
||||||
|
"trash-cli",
|
||||||
|
"vim",
|
||||||
|
"wget",
|
||||||
|
"zoxide",
|
||||||
|
"zsh-autosuggestions",
|
||||||
|
"zsh-completions",
|
||||||
|
"zsh-syntax-highlighting",
|
||||||
|
"zsh",
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── AUR 包 ────────────────────────────────────────────────────
|
||||||
|
decman.aur.packages |= {
|
||||||
|
"decman", # 管理自身更新
|
||||||
|
# 开发工具
|
||||||
|
"bun",
|
||||||
|
"mise",
|
||||||
|
# Zsh 插件
|
||||||
|
"fzf-tab-git",
|
||||||
|
"oh-my-zsh-git",
|
||||||
|
}
|
||||||
|
|
||||||
|
# yay 由 bootstrap 脚本安装,decman 不管理其生命周期
|
||||||
|
decman.aur.ignored_packages |= {"yay"}
|
||||||
|
|
||||||
|
# ── 系统文件(/etc/)──────────────────────────────────────────
|
||||||
|
decman.files["/etc/pacman.d/mirrorlist"] = File(
|
||||||
|
source_file="./files/etc/pacman.d/mirrorlist",
|
||||||
|
)
|
||||||
|
|
||||||
|
decman.files["/etc/sudoers.d/10-wheel"] = File(
|
||||||
|
source_file="./files/etc/sudoers.d/10-wheel",
|
||||||
|
permissions=0o440,
|
||||||
|
)
|
||||||
|
|
||||||
|
decman.files["/etc/locale.conf"] = File(content="LANG=en_US.UTF-8\n")
|
||||||
|
|
||||||
|
# 仅保留需要的 locale;修改后需手动执行 locale-gen
|
||||||
|
decman.files["/etc/locale.gen"] = File(content="en_US.UTF-8 UTF-8\n")
|
||||||
|
|
||||||
|
# ── 用户 Dotfiles ────────────────────────────────────────────
|
||||||
|
decman.files[f"{HOME}/.zshrc"] = File(
|
||||||
|
source_file="./dotfiles/.zshrc",
|
||||||
|
owner=USERNAME,
|
||||||
|
)
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
*
|
|
||||||
!.gitignore
|
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
version = 1
|
||||||
|
revision = 3
|
||||||
|
requires-python = ">=3.13"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "archlinux-config"
|
||||||
|
version = "0.0.0"
|
||||||
|
source = { virtual = "." }
|
||||||
|
|
||||||
|
[package.dev-dependencies]
|
||||||
|
dev = [
|
||||||
|
{ name = "decman" },
|
||||||
|
{ name = "decman-pacman" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
|
||||||
|
[package.metadata.requires-dev]
|
||||||
|
dev = [
|
||||||
|
{ name = "decman", git = "https://github.com/kiviktnm/decman.git" },
|
||||||
|
{ name = "decman-pacman", git = "https://github.com/kiviktnm/decman.git?subdirectory=plugins%2Fdecman-pacman" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "certifi"
|
||||||
|
version = "2026.2.25"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "charset-normalizer"
|
||||||
|
version = "3.4.6"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "decman"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = { git = "https://github.com/kiviktnm/decman.git#8c54220dbcb793836e99c567c43718aaed08acd2" }
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "decman-pacman"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = { git = "https://github.com/kiviktnm/decman.git?subdirectory=plugins%2Fdecman-pacman#8c54220dbcb793836e99c567c43718aaed08acd2" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "decman" },
|
||||||
|
{ name = "pyalpm" },
|
||||||
|
{ name = "requests" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "idna"
|
||||||
|
version = "3.11"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyalpm"
|
||||||
|
version = "0.10.12"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/fa/33/fb965c94a703b2f62741a52911446fe85e7effc677d54d1a8cd0033f4848/pyalpm-0.10.12.tar.gz", hash = "sha256:8c6cb4bbba819f99fe6c2547f25a861f68905d96729caf1ea15ba6c43d4f1127", size = 52295, upload-time = "2025-05-27T10:33:58.208Z" }
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "requests"
|
||||||
|
version = "2.33.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "certifi" },
|
||||||
|
{ name = "charset-normalizer" },
|
||||||
|
{ name = "idna" },
|
||||||
|
{ name = "urllib3" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "urllib3"
|
||||||
|
version = "2.6.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user