Compare commits

...

84 Commits

Author SHA1 Message Date
imbytecat 8e411c4c97 feat(base): 添加 Adobe 思源黑体和宋体中文字体 2026-04-17 14:21:14 +08:00
imbytecat e94eda2a5f feat(fish): 绑定 Up 键到 Atuin 前缀搜索 2026-04-10 16:59:15 +08:00
imbytecat ac66aadea2 feat(dev): 添加 oxlint 全局包 2026-04-10 11:15:09 +08:00
imbytecat 04bf913d35 feat(base): 添加 chromium 浏览器 2026-04-10 10:54:41 +08:00
imbytecat d2b2c7376f fix(mise): 添加 usage 工具以支持 completions 2026-04-10 09:45:42 +08:00
imbytecat b84368259d fix(fish): 将 \e\e 绑定语法更新为 Fish 4.0+ 的 escape,escape 2026-04-10 09:37:29 +08:00
imbytecat 3895221c48 fix(fish): 修复 Ctrl+Space 绑定的语法错误,将 \c@ 替换为 ctrl-space 2026-04-10 09:34:42 +08:00
imbytecat 27d4c68f23 fix(docker): 改用 SourceError 处理组信息查询失败 2026-04-09 16:05:04 +08:00
imbytecat af42eb913f fix(fish): 改用 SourceError 处理 shell 查询失败 2026-04-09 15:51:45 +08:00
imbytecat 33f4beb72a refactor(zsh): 移除 zsh 模块与配置 2026-04-09 15:50:34 +08:00
imbytecat 193cbdb11b feat(fish): 添加 fish 模块与交互配置 2026-04-09 15:50:34 +08:00
imbytecat 99f9608282 feat(base): 添加 fastfetch 系统信息工具 2026-04-09 12:09:54 +08:00
imbytecat b96e144e82 refactor(modules): 添加类型注解并优化 WSL 检测
- 全模块补全类型注解 (files, after_update, on_change)
- docker: 仅在 WSL 环境禁用 networkd-wait-online
- docker: 添加 _is_wsl() 自动检测函数
- zsh/docker: 改进错误输出使用 decman.error
- wsl-init: 统一使用 [[ ]] 并格式化代码
2026-04-09 12:09:00 +08:00
imbytecat 4182b3c300 docs(agents): 完善 AGENTS.md 并添加别名依赖表
- 添加 .zshrc 别名与包的绑定表,防止误删依赖
- 简化 Agent 须知第5、6条表述
- 修正仓库结构描述
2026-04-09 11:52:40 +08:00
imbytecat ff31160602 feat(base): 精简 WSL 开发环境包列表
移除 WSL 下冗余的媒体处理和工具包:
- chafa, fastfetch, ffmpeg, imagemagick, poppler, resvg, tealdeer, xh

保留核心开发工具:
- micro (友好编辑器) - .zshrc 通过 alias vi=nvim 使用
- gomi-bin (回收站) - .zshrc 通过 alias rm=gomi 使用

同时移除 .zshrc 中的 http 别名 (xh 已移除)

优化后:78 个包 (原 87 个)
2026-04-09 11:51:53 +08:00
imbytecat 34e71deed0 feat(zsh): 优化补全匹配与 eza 别名 2026-04-09 11:10:23 +08:00
imbytecat e34d7da3ea feat(zsh): WSL 下让 Windows Terminal 新标签继承当前目录 2026-04-08 13:34:57 +08:00
imbytecat e9a77f907e feat(base): 补齐 yazi 预览依赖
yazi 的预览能力依赖外部工具,按官方推荐补齐:

- ffmpeg: 视频缩略图
- poppler: PDF 预览
- imagemagick: 图片预览(含 HEIC/JPEG XL/字体)
- resvg: SVG 预览
- chafa: 终端不支持图片协议时的 ASCII fallback
  (Windows Terminal 旧版本无 sixel 时的兜底)
2026-04-08 13:26:03 +08:00
imbytecat 77d51c65b3 feat(zsh): 现代化 zshrc 配置并删除冗余 vim
zshrc 配置更新:
- 新增 EDITOR/VISUAL/MANPAGER/PAGER 环境变量,让 git commit、
  visudo、man 等工具默认使用 nvim 与 bat
- zoxide init --cmd cd 直接接管 cd,删除手动 alias cd=z/cdi=zi
- 新增 yazi yy wrapper:退出时自动 cd 到最后浏览的目录
- FZF 默认配置:fd 联动 + 现代 UI(高度/边框/预览窗口)
- compinit 缓存优化:每天重建一次 zcompdump,平时复用
- eza alias 公共参数提取到 _EZA_BASE,所有列表都带 --git
- 新增 Ctrl+Space 接受 zsh-autosuggestions 建议

base.py 同步:
- 删除冗余 vim:neovim 已装且 EDITOR=nvim 已设置,
  visudo 等工具会通过 $EDITOR fallback 到 nvim
2026-04-08 13:21:59 +08:00
imbytecat 2b3544b4a5 refactor(base): 切换回收站工具 trash-cli → gomi-bin
trash-cli 是 Python 写的老牌方案,启动开销大且 5 年未发布正式
release。gomi 是 Go 实现的现代替代品:

- 完整兼容 freedesktop.org Trash 规范,与 yazi/GNOME/KDE 互通
- 提供交互式 TUI 浏览/恢复界面(gomi 无参数即进入)
- 性能比 trash-cli 快约 10 倍
- 极活跃维护,AUR 提供预编译 gomi-bin

回收站数据无缝迁移:两者都使用 ~/.local/share/Trash/。

- pacman: -trash-cli
- aur: +gomi-bin
- .zshrc: alias rm: trash-put → gomi
2026-04-08 13:21:16 +08:00
imbytecat d4cb2f8acb refactor(base): 用 ouch 替换 atool 与冗余解压器
atool 上次更新于 2016 年,且依赖外部 unzip/unrar/p7zip 二进制。
ouch 是纯 Rust 实现,所有常见格式(zip/7z/rar/tar/gz/bz2/xz/zst 等)
通过 Rust crates 原生支持,运行时零外部依赖。

- pacman: -atool -unrar -unzip +ouch
- 保留 7zip:yazi 用作存档预览/提取的可选依赖
- .zshrc: alias x: aunpack → ouch decompress
2026-04-08 13:20:55 +08:00
imbytecat 0b6830f6d8 docs: 添加 WSL 安装 Arch Linux 的说明 2026-04-08 12:56:08 +08:00
imbytecat 9befd389af docs: 修正 AGENTS.md 与重构后代码不符的描述
- zsh 模块描述: oh-my-zsh → 插件 + 自动 chsh(实际无 oh-my-zsh)
- source.py 分区描述: 删除已不存在的"系统文件→用户配置→pacman→AUR"分区
- source.py 结构: 同步删除"校验插件存在性"(对应 source.py 死代码清理)
- 模块组织原则: 删除矛盾的"直接在 source.py 用 File()"路径
- Pacman vs AUR 路径: decman.pacman.packages → @pacman_packages 装饰器
- 常见任务: 添加包/文件/dotfile 步骤更新到模块路径
2026-04-08 12:37:57 +08:00
imbytecat f626c12e49 fix(dev): hook 失败改为 raise SourceError 而非静默警告
全局包安装失败原本只 print 警告,decman 退出码仍为 0,违反声明式语义。
改为汇总后 raise decman.SourceError,符合官方 docstring 推荐(失败应被感知,
下次 sync 会重试)。保留"尝试所有包"逻辑,一次性看到全部失败。
2026-04-08 12:37:49 +08:00
imbytecat 04d517a2c2 refactor: 清理 source.py 死代码与空 __init__.py
- source.py: 删除插件存在性检查,modules import 阶段已会 ImportError
- modules/__init__.py: 删除空文件,PEP 420 namespace package 不需要
2026-04-08 12:37:41 +08:00
imbytecat 171aaa55fd fix(docker): 禁用 systemd-networkd-wait-online 解决 docker 启动卡两分钟 2026-04-08 12:18:04 +08:00
imbytecat f4c42d3d94 refactor(zsh): 将 Starship PHP 模块替换为 Python 2026-04-08 11:25:09 +08:00
imbytecat 1f94c3f63f feat(git): 通过 include 支持本地身份配置 2026-04-08 11:25:09 +08:00
imbytecat 885926335f refactor(zsh): 移除 oh-my-zsh 依赖,改用原生配置 2026-04-08 10:45:09 +08:00
imbytecat b1dd39f54e chore: 去除 archlinux wsl 检测 2026-04-08 02:03:59 +00:00
imbytecat 71349611ab feat(zsh): 更新 Starship 配置,采用 powerline 风格主题 2026-04-08 09:49:21 +08:00
imbytecat 63975a334d fix(dev): 修正 dockerfile LSP 包名并添加国内镜像 2026-04-08 09:39:01 +08:00
imbytecat 5c851ea250 feat(dev): 添加 Vue LSP 2026-04-03 16:56:33 +08:00
imbytecat 4a147ea7f3 feat(dev): 添加 ruff 和 dockerfile-language-server LSP 2026-04-03 16:46:31 +08:00
imbytecat af6ed36fdc feat(dev): 添加 TypeScript 和 Go 的 LSP 支持 2026-04-03 16:38:39 +08:00
imbytecat d1a48ffedc feat(dev): 添加 shell LSP 支持 2026-04-03 16:29:53 +08:00
imbytecat 4e64c20cf1 chore(dev): 移除 pi-coding-agent 2026-04-03 16:16:26 +08:00
imbytecat bc2fee84b5 style(scripts): 统一脚本输出格式,使用语义化 emoji 前缀 2026-04-03 16:08:26 +08:00
imbytecat 4c7d0b57bd refactor(base): 增强配置健壮性与开发体验
- 新增 pacman.conf 管理(Color + ILoveCandy + ParallelDownloads)
- dev 模块改用 decman 原生 user/mimic_login 替代手拼 su -
- dev 模块异常处理改为收集汇总,不再静默吞掉
- install.sh 改用 mktemp + trap 清理临时目录
- 移除 AGENTS.md 中不存在的 wsl.py 引用
2026-04-03 15:49:59 +08:00
imbytecat c87f440017 refactor: 改进代码健壮性与文档一致性 2026-04-03 15:07:26 +08:00
imbytecat ffb200fd43 refactor(install): 移除 yay 依赖,decman 改为直接 makepkg 安装 2026-04-03 14:36:49 +08:00
imbytecat bbb192ffd5 feat: 现代化终端体验升级
- 新增包:starship, atuin, direnv, xh, yq, sd, zellij
- 重写 .zshrc:Starship 提示符、Atuin 历史搜索、fzf 键绑定、
  增强别名(eza --icons, ll, la, lt)、shell 选项、WSL 剪贴板
- 新增 starship.toml 配置
- 优化 git config:SSL 限定到内网地址、pull.rebase、
  push.autoSetupRemote、rerere、delta line-numbers
2026-04-03 13:46:26 +08:00
imbytecat f607c95bf0 feat(base): 添加 git credential.helper store 配置 2026-04-03 09:43:45 +08:00
imbytecat 8845398d84 feat(dev): 添加 oh-my-opencode 依赖(ast-grep, github-cli, tmux) 2026-04-02 21:14:53 +08:00
imbytecat 0aaf26a529 fix: 移除 wsl 模块及 WSL 检测逻辑 2026-04-02 20:57:59 +08:00
imbytecat 064f1dc0bb fix(dev): mise 配置添加 [settings] 区块 2026-04-02 20:49:03 +08:00
imbytecat 10dfc70a21 chore(zsh): 精简 .zshrc.local 注释 2026-04-02 20:47:35 +08:00
imbytecat 87ecc69601 refactor(zsh): 移除 .zshenv,PATH 移入 .zshrc 并支持 .zshrc.local
- 删除 .zshenv,PATH 声明合并至 .zshrc 顶部
- 末尾加载 ~/.zshrc.local 用于机密和机器特定配置
- zsh 模块不再声明 .zshenv 文件
2026-04-02 20:46:34 +08:00
imbytecat 443afbccb1 refactor: 合并 cli 模块至 base,移除 cli.py 2026-04-02 20:41:09 +08:00
imbytecat 5d081f87d1 fix: mise 配置归属 dev 模块,更新 AGENTS.md 匹配当前结构
- 将 mise config.toml 从 base 移至 dev(包与配置同模块)
- AGENTS.md 仓库结构图更新为 modules/ 目录
- 验证命令改为遍历 modules/*.py
- 模块示例代码同步为当前写法
2026-04-02 20:37:51 +08:00
imbytecat 339a27d736 refactor: 拆分 cli 模块,分离现代终端工具与开发工具链
- 新增 cli 模块:bat, btop, duf, dust, eza, fastfetch, fd,
  git-delta, jq, micro, procs, ripgrep, tealdeer, trash-cli,
  yazi, zoxide + git/mise 用户配置
- dev 瘦身为纯开发工具:语言运行时、LSP、编辑器
- base 还原为无参构造,移除用户配置文件职责
- git config 添加 delta pager 配置
2026-04-02 20:24:23 +08:00
imbytecat c58276b18b chore: 添加 CLAUDE.md 作为 AGENTS.md 的符号链接 2026-04-02 20:11:45 +08:00
imbytecat caed1d5b4e feat(dev,base): 添加 mise 全局信任和 Git 跳过 SSL 验证配置
- mise: 信任根目录下所有配置 (trusted_config_paths = ["/"])
- git: 全局禁用 SSL 证书验证 (http.sslVerify = false)
2026-04-02 20:10:14 +08:00
imbytecat 7d0ceb4e1c fix: 修复模块收敛性、异常处理和引导脚本健壮性
- dev: 异常捕获改为 except Exception 适配 decman 自定义异常
- docker/zsh/wsl: on_enable 改为 after_update + 状态检查确保收敛
- docker/zsh: subprocess 失败时 early return 避免误触发
- wsl: systemctl 调用加 try/except 防止 systemd 不可用时崩溃
- zsh: shell 路径改为精确解析 passwd 字段
- docker: decorator 别名统一为 pacman_packages
- install.sh: 开头验证 sudo 权限、mkdir -p 确保父目录、[ 改 [[
- wsl-init.sh: pacman -Sy 改 -Syu 避免 partial upgrade、已有用户补 wheel 组
2026-03-26 20:41:54 +08:00
imbytecat 769ca0a44b refactor(wsl): 统一 WSL 检测方式为 WSLInterop 文件检查 2026-03-26 19:23:56 +08:00
imbytecat bd04de439c feat(wsl): 添加 WSL 模块,mask systemd-networkd-wait-online.service 2026-03-26 19:13:14 +08:00
imbytecat abd93310b8 fix(dev): 使用 after_update 替代 on_change 确保每次同步都安装全局包 2026-03-26 17:21:02 +08:00
imbytecat b5217b27c4 feat(docker): 在主配置中启用 DockerModule 2026-03-26 17:05:07 +08:00
imbytecat b6a2209603 feat(base): 添加 base 包;fix(source): 精简错误提示文案 2026-03-26 16:55:43 +08:00
imbytecat a2f3ceb6b5 refactor(zsh): 将 PATH 配置提取到 .zshenv 2026-03-26 16:11:52 +08:00
imbytecat 2734133d62 feat(dev): 添加 Go 并将 comment-checker 改用 go install 安装 2026-03-26 16:07:06 +08:00
imbytecat ba1bf38c71 refactor(modules): 拆分开发工具为独立 DevModule,替换 DockerModule 2026-03-26 15:53:53 +08:00
imbytecat b3e7d059ec feat(docker): 改用 socket activation 并在启用时加入 docker 用户组 2026-03-26 15:17:02 +08:00
imbytecat ccbd2c55d4 chore(base): 将 yay 替换为 yay-bin 加速安装 2026-03-26 15:06:42 +08:00
imbytecat a98a46bee8 feat(base): 添加 eza;feat(zsh): 添加 ls/tree/cat alias 2026-03-26 14:49:24 +08:00
imbytecat 91829a621d refactor(source): 移除冗余注释;feat(base): 添加 btop/fastfetch/lazygit/micro 2026-03-26 14:40:44 +08:00
imbytecat afeaddca12 refactor(modules): 提取 BaseModule,将基础包和系统文件移入模块 2026-03-26 14:39:24 +08:00
imbytecat 6ea16d27e1 refactor(modules): 提取 ZshModule 并将所有模块移入 modules/ 包 2026-03-26 14:26:07 +08:00
imbytecat f6c0c8791b fix(source): 将 bun 和 mise 从 AUR 迁移到 pacman 官方仓库 2026-03-26 14:06:48 +08:00
imbytecat 019222529b fix(scripts): 修复 curl | bash 下 decman 交互提示无法读取输入的问题 2026-03-26 14:00:05 +08:00
imbytecat 0ee258f666 docs: 精简 README、更新 AGENTS.md、统一目录名为 archlinux-config 2026-03-26 13:54:23 +08:00
imbytecat a8a394c8f2 fix(source): 移除 hardcoded 用户名 fallback,强制要求 sudo 运行 2026-03-26 13:39:59 +08:00
imbytecat fab934ace9 feat(docker): 添加 Docker 支持并重排 source.py 声明顺序 2026-03-26 13:31:44 +08:00
imbytecat 4118392c64 refactor(locale): 提取 locale 配置为 decman Module 2026-03-26 11:10:39 +08:00
imbytecat 976be7b75d fix(source): 将 yay 纳入 decman AUR 包管理 2026-03-26 10:49:40 +08:00
imbytecat 759c7b7384 refactor: 重命名 files/ 为 system/、dotfiles/ 为 home/ 2026-03-26 10:47:29 +08:00
imbytecat 66ae60a69b fix: 恢复 .gitignore 2026-03-26 10:43:44 +08:00
imbytecat 56a2cc483f 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 工作流
2026-03-26 10:31:07 +08:00
imbytecat 34d4325f09 fix(modules): 修正 zsh hook 脚本路径 2026-03-25 16:21:46 +08:00
imbytecat efa5fd835c feat(modules): 添加 zsh 默认 shell 自动设置 2026-03-25 16:19:55 +08:00
imbytecat 67fc622926 feat(scripts): 添加 locale 配置到安装脚本 2026-03-25 16:00:12 +08:00
imbytecat 6150cf166f docs: 添加 AGENTS.md 代码规范文档 2026-03-25 15:45:47 +08:00
imbytecat 92c1f26667 更新 zsh 配置与插件清单 2026-03-25 15:37:09 +08:00
imbytecat 669edf8dc3 调整基础与开发模块包分组 2026-03-25 15:37:09 +08:00
30 changed files with 1145 additions and 145 deletions
+216 -1
View File
@@ -1 +1,216 @@
system-packages-*.yaml
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[codz]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py.cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
# Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
# poetry.lock
# poetry.toml
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
# pdm.lock
# pdm.toml
.pdm-python
.pdm-build/
# pixi
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
# pixi.lock
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
# in the .venv directory. It is recommended not to include this directory in version control.
.pixi
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# Redis
*.rdb
*.aof
*.pid
# RabbitMQ
mnesia/
rabbitmq/
rabbitmq-data/
# ActiveMQ
activemq-data/
# SageMath parsed files
*.sage.py
# Environments
.env
.envrc
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
# .idea/
# Abstra
# Abstra is an AI-powered process automation framework.
# Ignore directories containing user credentials, local state, and settings.
# Learn more at https://abstra.io/docs
.abstra/
# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# Marimo
marimo/_static/
marimo/_lsp/
__marimo__/
# Streamlit
.streamlit/secrets.toml
+165
View File
@@ -0,0 +1,165 @@
# AGENTS.md — Arch Linux 声明式配置仓库
## 概要
使用 [decman](https://github.com/kiviktnm/decman) 声明式管理 Arch Linux 系统配置。Python 源文件声明包、系统文件、dotfiles 和 systemd 服务。
- **运行环境**Arch Linux(主要面向 WSL,兼容裸机)
- **语言**Python(配置)、Bash(引导脚本)
- **包管理器**:uv(开发依赖)、pacman(系统包)、decman AUR 插件(AUR 包)
## 仓库结构
```
.
├── source.py # decman 主配置入口
├── modules/
│ ├── base.py # 基础模块(系统包 + CLI 工具 + dotfiles
│ ├── dev.py # 开发模块(语言运行时 + LSP + 工具链)
│ ├── docker.py # Docker 模块(packages + systemd units
│ ├── locale.py # locale 模块(on_change hook 示例)
│ └── fish.py # Fish 模块(shell + fzf + 自动 chsh
├── system/etc/ # 系统配置文件源 → /etc/
├── home/ # 用户配置文件源 → ~/(必须指定 owner)
├── scripts/
│ ├── install.sh # 引导脚本(curl | bash
│ └── wsl-init.sh # WSL 首次初始化
└── pyproject.toml # 开发依赖(decman 插件,仅类型检查)
```
## 命令
```bash
# 应用配置(安装/更新包、同步文件、启用服务)
sudo decman
# 首次运行(需指定 source 路径)
sudo decman --source ~/.config/archlinux-config/source.py
# 跳过特定插件
sudo decman --skip aur
sudo decman --skip systemd
# 仅同步文件
sudo decman --no-hooks --only files
# 调试模式
sudo decman --debug
```
### 验证
```bash
# Python 语法检查(所有模块)
python -c "import py_compile; py_compile.compile('source.py', doraise=True)"
for f in modules/*.py; do python -c "import py_compile; py_compile.compile('$f', doraise=True)"; done
# Shell 语法检查
bash -n scripts/install.sh
bash -n scripts/wsl-init.sh
# 同步开发依赖
uv sync
```
## decman 执行顺序
声明顺序必须匹配执行顺序,从上到下阅读即从上到下执行:
```
files → pacman → aur → systemd
```
`source.py` 是纯模块注册入口,所有 files / packages / units 声明都在各 Module 内部实现。
## 代码风格
### Pythonsource.py 及模块)
**source.py 结构**
- 纯模块注册入口,不直接声明文件或包
- 校验 `SUDO_USER`(插件缺失时 `import modules.*` 阶段会直接 ImportError,无需运行时检查)
- 通过 `decman.modules += [...]` 注册所有模块
**模块模式**(适用于需要 hook 或跨步骤声明的场景):
```python
from decman import Module
from decman.plugins.pacman import packages as pacman_packages
from decman.plugins.systemd import units
class DockerModule(Module):
def __init__(self, user: str):
super().__init__("docker")
self.user = user
@pacman_packages
def pacman_packages(self) -> set[str]:
return {"docker", "docker-compose"}
@units
def units(self) -> set[str]:
return {"docker.socket"}
```
**模块组织原则**:所有 files / packages / units 声明都通过 Module 封装,按领域拆分(base / dev / docker / locale / fish)。新增功能优先加到对应现有模块;跨领域、需要 lifecycle hook(`on_change` / `after_update`)或需要绑定 packages + systemd units 时再新建模块。
### Shell 脚本
- Shebang`#!/bin/bash`
- 安全选项:`set -euo pipefail`
- 变量引用:始终加双引号 `"$VAR"`
- 条件测试:优先 `[[ ]]`
- 命令检测:`if command -v cmd &> /dev/null; then`
- 用户消息:中文,用语义 emoji 前缀标记步骤(`🔄` 更新、`📦` 安装、`🔑` 验证、`📥` 克隆、`⚙️` 配置、`👤` 用户、`🔐` 安全),`🎉` 表示完成,`⏩` 表示跳过
- 错误消息:`echo "❌ 描述"` + `exit 1`
### Git
- 提交消息:中文,conventional commits 格式
- 格式:`<type>(<scope>): <中文描述>`
- 类型:`feat` / `fix` / `docs` / `refactor` / `chore`
- 示例:`feat(docker): 添加 Docker 支持并重排声明顺序`
- 分支:直接在 `main` 上工作
## 关键依赖关系
`.config/fish/config.fish` 别名与包的绑定(修改前务必检查):
| 别名 | 依赖包 | 位置 |
|------|--------|------|
| `rm="gomi"` | `gomi-bin` (AUR) | `base.py` |
| `cat="bat"` | `bat` | `base.py` |
| `ls="eza"` | `eza` | `base.py` |
| `vi="nvim"` | `neovim` | `dev.py` |
| `lg="lazygit"` | `lazygit` | `dev.py` |
| `x="ouch decompress"` | `ouch` | `base.py` |
## Agent 须知
1. **decman 是唯一真相**:不要手动装包,加到 `source.py` 或模块里,跑 `sudo decman`
2. **Pacman vs AUR**:用 `pacman -Ss` 确认包在官方仓库还是 AUR,分别加到对应模块的 `@pacman_packages``@aur_packages` 装饰器方法返回集合。
3. **系统文件**:源文件放 `system/`,目录结构对应目标路径(`system/etc/foo.conf``/etc/foo.conf`)。decman 复制(非 symlink)到目标位置。
4. **用户配置**:源文件放 `home/`,必须指定 `owner=USERNAME`
5. **环境变量**`sudo decman` 以 root 执行,`SUDO_USER` 是原始用户名。配置内不要 fallback 到 `os.getenv("USER")`
6. **开发依赖**`pyproject.toml` 仅用 uv 管理类型检查依赖,不影响运行时。修改依赖后运行 `uv sync`
7. **幂等性**:所有脚本和配置必须可安全重复执行。
8. **语言**:用户消息、文档、提交消息使用中文。
## 常见任务
**添加包**:确认 pacman/AUR → 加到对应模块的 `@pacman_packages` / `@aur_packages` 方法返回集合 → `sudo decman`
**添加系统文件**:放 `system/` → 在对应模块的 `files()` 方法加 `File(source_file=...)``sudo decman`
**添加 dotfile**:放 `home/` → 在对应模块的 `files()` 方法加 `File(source_file=..., owner=self.user)``sudo decman`
**添加需要 systemd 服务的软件**:创建 Module 文件,用 `@packages` + `@units` 装饰器 → 在 `source.py` 注册 → `sudo decman`
**添加开发依赖(decman 插件)**:加到 `pyproject.toml``[dependency-groups] dev``[tool.uv.sources]``uv sync`
Symlink
+1
View File
@@ -0,0 +1 @@
AGENTS.md
+21 -24
View File
@@ -1,11 +1,22 @@
# Arch Linux 配置仓库
使用 dcli 声明式管理 Arch Linux 配置。
当前默认主机为 `wsl`;非 WSL 环境请先新增/切换 host,再执行同步
使用 [decman](https://github.com/kiviktnm/decman) 声明式管理 Arch Linux 系统配置。
默认面向 WSL 环境;裸机使用请按需修改 `source.py`
## 使用方式
## 使用
### A. Arch on WSL 首次启动(默认 root 登录
### 安装 Arch LinuxWSL
需要 Windows 10/11 并已启用 WSL 2。在 PowerShell 中执行:
```powershell
wsl --update
wsl --install archlinux
```
安装完成后,可通过开始菜单的 `archlinux` 应用或命令 `wsl -d archlinux` 启动,首次进入默认以 `root` 身份登录。
### WSL 首次启动(默认 root 登录)
1. 初始化普通用户:
@@ -13,39 +24,25 @@
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/wsl-init.sh | bash -s -- <用户名>
```
2. 在 PowerShell 中重启 WSL
2. 在 PowerShell 中设置默认用户并重启:
```powershell
wsl --manage archlinux --set-default-user <用户名>
wsl --terminate archlinux
```
3. 重新进入 Arch WSL,以普通用户执行:
3. 重新进入 WSL,以普通用户执行:
```bash
curl -fsSL https://git.furtherverse.com/imbytecat/archlinux-config/raw/branch/main/scripts/install.sh | bash
dcli sync
```
### B. 普通 Arch 安装(已存在普通用户)
### 非 WSL 环境
跳过 WSL 初始化,直接执行:
```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/` - 配置文件(自动同步)
直接执行第 3 步。
## 更新配置
```bash
cd ~/.config/arch-config && git pull
dcli sync
cd ~/.config/archlinux-config && git pull && sudo decman
```
-1
View File
@@ -1 +0,0 @@
host: wsl
+90
View File
@@ -0,0 +1,90 @@
fish_add_path "$HOME/go/bin" "$HOME/.bun/bin"
set -gx EDITOR nvim
set -gx VISUAL nvim
set -gx PAGER less
set -gx MANPAGER "sh -c 'col -bx | bat -l man -p'"
set -g fish_greeting
function __prepend_sudo
set -l buffer (commandline)
if test -z "$buffer"
commandline -f up-line
set buffer (commandline)
end
if test -n "$buffer"
if not string match -qr '^sudo\b' -- "$buffer"
commandline -r "sudo $buffer"
end
commandline -f end-of-line repaint
end
end
bind escape,escape __prepend_sudo # Fish 4.0+ 语法:双击 Escape 添加 sudo
bind ctrl-space accept-autosuggestion # Fish 4.0+ 语法
set -gx FZF_DEFAULT_OPTS '--height=50% --layout=reverse --border --preview-window=right:60%'
set -gx FZF_DEFAULT_COMMAND 'fd --type f --hidden --follow --exclude .git'
set -gx FZF_CTRL_T_COMMAND "$FZF_DEFAULT_COMMAND"
set -gx FZF_ALT_C_COMMAND 'fd --type d --hidden --follow --exclude .git'
alias ..='cd ..'
alias ...='cd ../..'
function ls
command eza --icons --group-directories-first --git $argv
end
function l
command eza -la --icons --group-directories-first --git $argv
end
function ll
command eza -l --icons --group-directories-first --git $argv
end
function la
command eza -lA --icons --group-directories-first --git $argv
end
function lt
command eza --tree --level=2 --icons --group-directories-first --git $argv
end
alias cat='bat --paging=never'
alias rm='gomi'
alias lg='lazygit'
alias vi='nvim'
alias x='ouch decompress'
if set -q WSL_DISTRO_NAME
alias pbcopy='clip.exe'
alias pbpaste='powershell.exe -noprofile -c Get-Clipboard'
function keep_current_path --on-event fish_prompt
printf '\e]9;9;%s\e\\' (wslpath -w "$PWD")
end
end
if status is-interactive
zoxide init fish --cmd cd | source
mise activate fish | source
set -g direnv_fish_mode eval_after_arrow
direnv hook fish | source
fzf --fish | source
set -gx ATUIN_NOBIND true
atuin init fish | source
bind \cr _atuin_search
bind up _atuin_bind_up
starship init fish | source
end
if test -f ~/.config/fish/config.local.fish
source ~/.config/fish/config.local.fish
end
+12
View File
@@ -0,0 +1,12 @@
function yy
set -l tmp (mktemp -t yazi-cwd.XXXXXX)
command yazi $argv --cwd-file="$tmp"
if set -l cwd (command cat -- "$tmp")
if test -n "$cwd" -a "$cwd" != "$PWD"
builtin cd -- "$cwd"
end
end
command rm -f -- "$tmp"
end
+24
View File
@@ -0,0 +1,24 @@
[http "https://202.127.0.42:32443"]
sslVerify = false
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true
side-by-side = true
line-numbers = true
[credential]
helper = store
[merge]
conflictstyle = zdiff3
[pull]
rebase = true
[push]
autoSetupRemote = true
[init]
defaultBranch = main
[rerere]
enabled = true
[include]
path = ~/.config/git/config.local
+5
View File
@@ -0,0 +1,5 @@
[settings]
trusted_config_paths = ["/"]
[tools]
usage = "latest"
+66
View File
@@ -0,0 +1,66 @@
"$schema" = 'https://starship.rs/config-schema.json'
format = """
[░▒▓](#a3aed2)\
[  ](bg:#a3aed2 fg:#090c0c)\
[](bg:#769ff0 fg:#a3aed2)\
$directory\
[](fg:#769ff0 bg:#394260)\
$git_branch\
$git_status\
[](fg:#394260 bg:#212736)\
$nodejs\
$rust\
$golang\
$python\
[](fg:#212736 bg:#1d2230)\
$time\
[ ](fg:#1d2230)\
\n$character"""
[directory]
style = "fg:#e3e5e5 bg:#769ff0"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"
[directory.substitutions]
"Documents" = "󰈙 "
"Downloads" = " "
"Music" = " "
"Pictures" = " "
[git_branch]
symbol = ""
style = "bg:#394260"
format = '[[ $symbol $branch ](fg:#769ff0 bg:#394260)]($style)'
[git_status]
style = "bg:#394260"
format = '[[($all_status$ahead_behind )](fg:#769ff0 bg:#394260)]($style)'
[nodejs]
symbol = ""
style = "bg:#212736"
format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)'
[rust]
symbol = ""
style = "bg:#212736"
format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)'
[golang]
symbol = ""
style = "bg:#212736"
format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)'
[python]
symbol = ""
style = "bg:#212736"
format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)'
[time]
disabled = false
time_format = "%R" # Hour:Minute Format
style = "bg:#1d2230"
format = '[[  $time ](fg:#a0a9cb bg:#1d2230)]($style)'
-11
View File
@@ -1,11 +0,0 @@
host: wsl
aur_helper: yay
auto_prune: true
enabled_modules:
- base
- zsh
- dev-tools
system_backups:
enabled: false
+73
View File
@@ -0,0 +1,73 @@
from decman import File, Module
from decman.plugins.aur import packages as aur_packages
from decman.plugins.pacman import packages as pacman_packages
class BaseModule(Module):
def __init__(self, user: str):
super().__init__("base")
self.user = user
def files(self) -> dict[str, File]:
return {
"/etc/pacman.conf": File(
source_file="./system/etc/pacman.conf",
),
"/etc/pacman.d/mirrorlist": File(
source_file="./system/etc/pacman.d/mirrorlist",
),
"/etc/sudoers.d/10-wheel": File(
source_file="./system/etc/sudoers.d/10-wheel",
permissions=0o440,
),
f"/home/{self.user}/.config/git/config": File(
source_file="./home/.config/git/config",
owner=self.user,
),
f"/home/{self.user}/.config/starship.toml": File(
source_file="./home/.config/starship.toml",
owner=self.user,
),
}
@pacman_packages
def pacman_packages(self) -> set[str]:
return {
"7zip",
"adobe-source-han-sans-cn-fonts",
"adobe-source-han-serif-cn-fonts",
"atuin",
"base-devel",
"base",
"bat",
"btop",
"chromium",
"curl",
"direnv",
"duf",
"dust",
"eza",
"fastfetch",
"fd",
"git-delta",
"git",
"jq",
"micro",
"ouch",
"procs",
"ripgrep",
"sd",
"starship",
"sudo",
"wget",
"yazi",
"yq",
"zoxide",
}
@aur_packages
def aur_packages(self) -> set[str]:
return {
"decman",
"gomi-bin",
}
-12
View File
@@ -1,12 +0,0 @@
description: 基础工具
packages:
- base-devel
- sudo
- git
- curl
- wget
- vim
- neovim
- yay
- dcli-arch-git
-9
View File
@@ -1,9 +0,0 @@
description: 开发工具
packages:
- fzf
- ripgrep
- fd
- bat
- mise
- zoxide
+85
View File
@@ -0,0 +1,85 @@
import decman
from decman import File, Module
from decman.plugins.pacman import packages as pacman_packages
BUN_GLOBAL_PACKAGES: list[str] = [
"@vue/language-server",
"dockerfile-language-server-nodejs",
"oxlint",
"opencode-ai",
]
GO_INSTALL_PACKAGES: list[str] = [
"github.com/code-yeongyu/go-claude-code-comment-checker/cmd/comment-checker@latest",
]
class DevModule(Module):
def __init__(self, user: str):
super().__init__("dev")
self.user = user
def files(self) -> dict[str, File]:
return {
f"/home/{self.user}/.config/mise/config.toml": File(
source_file="./home/.config/mise/config.toml",
owner=self.user,
),
}
@pacman_packages
def pacman_packages(self) -> set[str]:
return {
"ast-grep",
"bash-language-server",
"biome",
"bun",
"github-cli",
"go",
"gopls",
"lazygit",
"mise",
"neovim",
"nodejs",
"ruff",
"shellcheck",
"shfmt",
"tmux",
"typescript-language-server",
"uv",
"yaml-language-server",
"zellij",
}
def after_update(self, store: object) -> None:
failures: list[str] = []
for pkg in BUN_GLOBAL_PACKAGES:
try:
decman.prg(
[
"bun",
"add",
"-g",
pkg,
"--registry=https://registry.npmmirror.com",
],
user=self.user,
mimic_login=True,
)
except Exception as e:
failures.append(f"bun: {pkg} ({e})")
for pkg in GO_INSTALL_PACKAGES:
try:
decman.prg(
["go", "install", pkg],
user=self.user,
env_overrides={"GOPROXY": "https://goproxy.cn"},
mimic_login=True,
)
except Exception as e:
failures.append(f"go: {pkg} ({e})")
if failures:
raise decman.SourceError(
f"{len(failures)} 个全局包安装失败:\n"
+ "\n".join(f" - {f}" for f in failures)
)
+58
View File
@@ -0,0 +1,58 @@
import subprocess
from pathlib import Path
import decman
from decman import Module
from decman.plugins.pacman import packages as pacman_packages
from decman.plugins.systemd import units
def _is_wsl() -> bool:
"""检测是否在 WSL 环境"""
try:
return "microsoft" in Path("/proc/version").read_text().lower()
except OSError:
return False
class DockerModule(Module):
def __init__(self, user: str):
super().__init__("docker")
self.user = user
self._is_wsl = _is_wsl()
@pacman_packages
def pacman_packages(self) -> set[str]:
return {"docker", "docker-compose"}
@units
def units(self) -> set[str]:
return {"docker.socket"}
def after_update(self, store: object) -> None:
self._ensure_user_in_docker_group()
if self._is_wsl:
self._disable_networkd_wait_online()
def _ensure_user_in_docker_group(self) -> None:
result = subprocess.run(
["id", "-nG", self.user],
capture_output=True,
text=True,
check=False,
)
if result.returncode != 0:
raise decman.SourceError(f"无法读取用户 {self.user} 的组信息")
if "docker" not in result.stdout.split():
decman.prg(["gpasswd", "-a", self.user, "docker"])
def _disable_networkd_wait_online(self) -> None:
"""WSL 环境:禁用 systemd-networkd-wait-online 避免启动阻塞"""
result = subprocess.run(
["systemctl", "is-enabled", "systemd-networkd-wait-online.service"],
capture_output=True,
text=True,
check=False,
)
if result.returncode == 0 and result.stdout.strip() == "enabled":
decman.prg(["systemctl", "disable", "systemd-networkd-wait-online.service"])
+44
View File
@@ -0,0 +1,44 @@
import subprocess
import decman
from decman import File, Module
from decman.plugins.pacman import packages as pacman_packages
class FishModule(Module):
def __init__(self, user: str):
super().__init__("fish")
self.user = user
def files(self) -> dict[str, File]:
return {
f"/home/{self.user}/.config/fish/config.fish": File(
source_file="./home/.config/fish/config.fish",
owner=self.user,
),
f"/home/{self.user}/.config/fish/functions/yy.fish": File(
source_file="./home/.config/fish/functions/yy.fish",
owner=self.user,
),
}
@pacman_packages
def pacman_packages(self) -> set[str]:
return {
"fish",
"fzf",
}
def after_update(self, store: object) -> None:
result = subprocess.run(
["getent", "passwd", self.user],
capture_output=True,
text=True,
check=False,
)
if result.returncode != 0:
raise decman.SourceError(f"无法读取用户 {self.user} 的 passwd 信息")
# passwd 格式: name:x:uid:gid:gecos:home:shell
shell = result.stdout.strip().split(":")[-1]
if shell != "/usr/bin/fish":
decman.prg(["chsh", "-s", "/usr/bin/fish", self.user])
+16
View File
@@ -0,0 +1,16 @@
import decman
from decman import File, Module
class LocaleModule(Module):
def __init__(self):
super().__init__("locale")
def files(self) -> dict[str, File]:
return {
"/etc/locale.conf": File(content="LANG=en_US.UTF-8\n"),
"/etc/locale.gen": File(content="en_US.UTF-8 UTF-8\n"),
}
def on_change(self, store: object) -> None:
decman.prg(["locale-gen"])
-20
View File
@@ -1,20 +0,0 @@
# Oh My Zsh
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="robbyrussell"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
source $ZSH/oh-my-zsh.sh
# mise
if command -v mise &> /dev/null; then
eval "$(mise activate zsh)"
fi
# zoxide
if command -v zoxide &> /dev/null; then
eval "$(zoxide init zsh)"
fi
# Aliases
alias ls='ls --color=auto'
alias ll='ls -lah'
alias cd='z'
-5
View File
@@ -1,5 +0,0 @@
description: Zsh 及插件
dotfiles:
- source: dotfiles/.zshrc
target: ~/.zshrc
-6
View File
@@ -1,6 +0,0 @@
packages:
- zsh
- zsh-completions
- oh-my-zsh-git
- zsh-autosuggestions
- zsh-syntax-highlighting
+15
View File
@@ -0,0 +1,15 @@
[project]
name = "archlinux-config"
version = "0.0.0"
requires-python = ">=3.13"
[dependency-groups]
dev = ["decman", "decman-pacman", "decman-systemd"]
[tool.uv.sources]
decman = { git = "https://github.com/kiviktnm/decman.git" }
decman-pacman = { git = "https://github.com/kiviktnm/decman.git", subdirectory = "plugins/decman-pacman" }
decman-systemd = { git = "https://github.com/kiviktnm/decman.git", subdirectory = "plugins/decman-systemd" }
[tool.ty.environment]
python = ".venv"
+29 -29
View File
@@ -2,44 +2,44 @@
set -euo pipefail
REPO_URL="https://git.furtherverse.com/imbytecat/archlinux-config.git"
CONFIG_DIR="$HOME/.config/arch-config"
CONFIG_DIR="$HOME/.config/archlinux-config"
echo "==> 安装 git..."
sudo pacman -S --needed --noconfirm git
echo "🔑 验证 sudo 权限..."
sudo -v </dev/tty || {
echo "❌ 需要 sudo 权限,请确认当前用户已配置 sudo"
exit 1
}
echo "==> 克隆配置仓库..."
if [ -d "$CONFIG_DIR/.git" ]; then
echo "配置仓库已存在:$CONFIG_DIR,跳过克隆"
elif [ -e "$CONFIG_DIR" ]; then
echo "目标路径已存在且不是 git 仓库:$CONFIG_DIR"
echo "🔄 更新系统..."
sudo pacman -Syu --noconfirm
echo "📦 安装基础依赖..."
sudo pacman -S --needed --noconfirm git base-devel
echo "📥 克隆配置仓库..."
mkdir -p "$(dirname "$CONFIG_DIR")"
if [[ -d "$CONFIG_DIR/.git" ]]; then
echo "⏩ 配置仓库已存在,跳过克隆"
elif [[ -e "$CONFIG_DIR" ]]; then
echo "❌ 目标路径已存在且不是 git 仓库:$CONFIG_DIR"
exit 1
else
git clone "$REPO_URL" "$CONFIG_DIR"
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 "==> 更新系统..."
sudo pacman -Syu --noconfirm
echo "==> 安装基础工具..."
sudo pacman -S --needed --noconfirm base-devel
echo "==> 安装 yay..."
if ! command -v yay &> /dev/null; then
rm -rf /tmp/yay
git clone https://aur.archlinux.org/yay.git /tmp/yay
cd /tmp/yay
makepkg -si --noconfirm
echo "📦 安装 decman..."
if ! command -v decman &>/dev/null; then
_tmpdir=$(mktemp -d)
trap 'rm -rf "$_tmpdir"' EXIT
git clone https://aur.archlinux.org/decman.git "$_tmpdir"
(cd "$_tmpdir" && makepkg -si --noconfirm)
fi
echo "==> 安装 dcli..."
yay -S --needed --noconfirm dcli-arch-git
echo "⚙️ 应用系统配置..."
sudo decman --source "$CONFIG_DIR/source.py" </dev/tty
echo ""
echo " 安装完成!"
echo "🎉 安装完成!重新登录以使用 fish。"
echo ""
echo "下一步:运行 dcli sync 应用配置"
echo "后续更新配置"
echo " cd $CONFIG_DIR && git pull && sudo decman"
+15 -14
View File
@@ -1,35 +1,36 @@
#!/bin/bash
set -euo pipefail
if [ "$(id -u)" -ne 0 ]; then
echo "请以 root 身份运行此脚本"
exit 1
fi
if ! grep -qiE '(microsoft|wsl)' /proc/sys/kernel/osrelease 2>/dev/null; then
echo "此脚本仅用于 Arch Linux on WSL 的首次初始化"
if [[ "$(id -u)" -ne 0 ]]; then
echo "请以 root 身份运行此脚本"
exit 1
fi
USERNAME="${1:-}"
if [ -z "$USERNAME" ]; then
if [[ -z "$USERNAME" ]]; then
echo "用法: wsl-init.sh <用户名>"
echo "示例: wsl-init.sh imbytecat"
exit 1
fi
echo "==> 同步数据库并安装 sudo..."
pacman -Sy --needed --noconfirm sudo
echo "🔄 更新系统..."
pacman -Syu --noconfirm
echo "==> 配置 sudo 权限..."
if ! command -v sudo &>/dev/null; then
echo "📦 安装 sudo..."
pacman -S --needed --noconfirm sudo
fi
echo "🔐 配置 sudo 权限..."
cat >/etc/sudoers.d/10-wheel <<'EOF'
%wheel ALL=(ALL) NOPASSWD: ALL
EOF
chmod 440 /etc/sudoers.d/10-wheel
echo "==> 创建用户 $USERNAME..."
echo "👤 创建用户 $USERNAME..."
if id "$USERNAME" &>/dev/null; then
echo "用户 $USERNAME 已存在,跳过创建"
echo "用户 $USERNAME 已存在,确保 wheel 组成员"
usermod -aG wheel "$USERNAME"
else
useradd -m -G wheel -s /bin/bash "$USERNAME"
echo "请设置 $USERNAME 的密码:"
@@ -37,7 +38,7 @@ else
fi
echo ""
echo " WSL 初始化完成!"
echo "🎉 WSL 初始化完成!"
echo ""
echo "下一步:"
echo " 1. 在 PowerShell 中设置默认用户:"
+21
View File
@@ -0,0 +1,21 @@
import os
import decman
import modules.base
import modules.dev
import modules.docker
import modules.locale
import modules.fish
USERNAME = os.environ.get("SUDO_USER")
if not USERNAME:
raise decman.SourceError("请使用 sudo 运行")
decman.modules += [
modules.base.BaseModule(USERNAME),
modules.dev.DevModule(USERNAME),
modules.docker.DockerModule(USERNAME),
modules.locale.LocaleModule(),
modules.fish.FishModule(USERNAME),
]
-2
View File
@@ -1,2 +0,0 @@
*
!.gitignore
+26
View File
@@ -0,0 +1,26 @@
#
# /etc/pacman.conf
#
[options]
HoldPkg = pacman glibc
Architecture = auto
Color
ILoveCandy
VerbosePkgLists
ParallelDownloads = 5
CheckSpace
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
# [multilib]
# Include = /etc/pacman.d/mirrorlist
Generated
+152
View File
@@ -0,0 +1,152 @@
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" },
{ name = "decman-systemd" },
]
[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" },
{ name = "decman-systemd", git = "https://github.com/kiviktnm/decman.git?subdirectory=plugins%2Fdecman-systemd" },
]
[[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 = "decman-systemd"
version = "1.1.0"
source = { git = "https://github.com/kiviktnm/decman.git?subdirectory=plugins%2Fdecman-systemd#8c54220dbcb793836e99c567c43718aaed08acd2" }
dependencies = [
{ name = "decman" },
]
[[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" },
]