From c4dcd2b63ae2904e1c8048472ec2812e81df55d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Thu, 27 Aug 2026 16:29:34 -0400 Subject: [PATCH] Document and test the [omarchy] mirror wiring Static suite assertions pin the stable conf's server order and keep edge/rc upstream-only; the guard test proves exact-line semantics. docs/pacman-repo.md gains the mirror section with the honest operational contract: staleness is invisible to pacman, fallback fires only on retrieval failure, and omarchy-refresh-pacman's -Syyuu downgrade wipes the cn layer while upstream ships older omarchy-dev. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019hLK3wsDuKVAC37GgDqg6H --- AGENTS.md | 5 +++-- docs/pacman-repo.md | 10 ++++++++++ test/shell.d/omarchycn-test.sh | 29 +++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index bbc1b48c..d1f46040 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -19,12 +19,13 @@ This fork carries the OmarchyCN China-integration layer on top of upstream `base - `cn/` holds the data layer: `mirrors.json`, `dev-mirrors.json`, `apps.json`, `registry/` (AI providers/harnesses/compatibility), `fcitx5/`, `fontconfig/`, `keys/`, `lib/` (sourced helpers), `release` (cn release number) - cn migrations live in `cn/migrations/*.sh`, run by `omarchy-cn-update` with per-file completion markers under `~/.local/state/omarchycn/` - Packaging: `packages/omarchy-pkgs-cn.patch` must be applied to the sibling `omarchy-pkgs` checkout so `omarchy-dev` ships `cn/`; keyring in `packages/omarchycn-keyring/` +- Upstream repo mirror: `packages/sync-omarchy-repo.sh` + `.gitea/workflows/pkg-repo-sync.yml` mirror the upstream `[omarchy]` stable channel into the Gitea Arch registry every 6h; `pacman-stable.conf` lists the mirror first (upstream fallback), clients must trust the registry key (install import + cn migration), `omarchycn doctor mirror --fix` re-heals the line; see `docs/pacman-repo.md` - ISO: `packages/omarchy-iso-cn.patch` must be applied to the sibling `omarchy-iso` checkout — Chinese installer (cage+foot graphical console with English VT fallback) and live-env packages - Release process: `docs/release-checklist.md`; signing: `docs/release-signing.md`; pacman repo: `docs/pacman-repo.md` - Chinese-first defaults: OmarchyCN ships Simplified Chinese as the default UX. User-visible strings in `default/omarchy/omarchy-menu.jsonc` (all labels), `default/hypr/bindings/*.lua` (bind descriptions, including the generated workspace/group/panel loops), `bin/omarchy-menu-keybindings` (its merge list and priority patterns must match the shipped Chinese descriptions), `bin/omarchy-update-confirm`, and `install/user/first-run/*` notifications are Chinese with brand names kept in English; menu search stays reachable in English through leaf ids. When syncing upstream, translate new strings in these files and resolve string conflicts toward our Chinese text. - Default set changes vs upstream: `install/omarchy-base.packages` adds fcitx5-rime/chinese-addons/configtool and drops aether/libreoffice-fresh/obs-studio; the Basecamp/Discord/HEY/Google/WhatsApp/X launchers, their webapp keybindings, the whatsapp-slim extension, and the HEY mailto handler are removed (preinstall add/remove lists, launcher.hides, chromium flags, and mimeapps stay in sync); `install/user/cn-chinese.sh` seeds IME/font config on zh_CN systems -- AI: `cn/registry/` drives providers (DeepSeek/Kimi/Z.AI/MiniMax) with zero-code adapters; `omarchy-default-agent` also accepts kimi (official installer script, not mise) and deepcode (mise npm); the Default Agent menu carries them plus an AI Hub combo entry -- Upstream sync: `.gitea/workflows/upstream-sync.yml` opens a PR per upstream change; keep upstream file edits minimal and inventoried (currently: one `GROUP_DESCRIPTIONS[cn]` line in `bin/omarchy`, the localized menu/bindings/update/first-run surfaces above, the western-app removals above, a rewritten `README.md` (known recurring sync conflict, resolve toward ours), `AGENTS.md` additions, and two `.gitignore` lines) +- AI: `cn/registry/` drives providers (DeepSeek/Kimi/Z.AI/MiniMax/Ollama-local) with zero-code adapters; Ollama uses a fixed `static_token` and runtime-listed models (`models_dynamic`); `omarchy-default-agent` also accepts kimi (official installer script, not mise), deepcode, dim, and dsh (mise npm); the Default Agent menu carries them plus an AI Hub combo entry +- Upstream sync: `.gitea/workflows/upstream-sync.yml` opens a PR per upstream change; keep upstream file edits minimal and inventoried (currently: one `GROUP_DESCRIPTIONS[cn]` line in `bin/omarchy`, the localized menu/bindings/update/first-run surfaces above, the western-app removals above, the cn agent roster in `bin/omarchy-default-agent` / `bin/omarchy-agent` (kimi/deepcode/dim/dsh), the `[omarchy]` mirror line in `default/pacman/pacman-stable.conf`, the registry-key import in `install/post-install/pacman.sh`, a rewritten `README.md` (known recurring sync conflict, resolve toward ours), `AGENTS.md` additions, and two `.gitignore` lines) - cn tests: `test/shell.d/omarchycn-test.sh`, `test/shell.d/omarchycn-ai-test.sh`; localized UI expectations live in the upstream suites (menu, keybindings-menu, hyprland-default-config, binding-conflicts, clock, screenrecording, update-disk-space) # Documentation Layout diff --git a/docs/pacman-repo.md b/docs/pacman-repo.md index ba7af9a4..d2b3a061 100644 --- a/docs/pacman-repo.md +++ b/docs/pacman-repo.md @@ -3,6 +3,16 @@ OmarchyCN 的 pacman 仓库托管在 Gitea Arch package registry,每个上传的包由 registry 密钥自动签名,数据库同源生成。 +# [omarchy] 上游仓库镜像 + +上游 `pkgs.omarchy.org`(Cloudflare 托管)的 stable 通道被完整镜像到同一 Gitea registry 的 `omarchy` 仓库。`packages/sync-omarchy-repo.sh` 按文件名对上游与镜像 db 做差集,缺失包转传、上游移除的按 name/version/arch 精确删除;`.gitea/workflows/pkg-repo-sync.yml` 每 6 小时调度一次(幂等,可手动 dispatch)。正常情况下镜像滞后不超过一个周期;调度失败或 runner 掉线时滞后会持续到下一次成功运行。注意 pacman 无法感知"陈旧":只要镜像可达,客户端就使用镜像的 db,看到的是滞后版本;只有镜像无法提供所请求的 db/包文件(宕机、404)时才回退到上游 Server。 + +客户端接线(`default/pacman/pacman-stable.conf`):`[omarchy]` 段镜像行在前、上游为兜底。镜像 db 由 registry 密钥签名,因此系统必须信任该公钥——安装期由 `install/post-install/pacman.sh` 导入,既有系统由 cn 迁移 `1787861071.sh` 处理。仅 stable 被镜像:Gitea 仓库名必须等于 pacman 段名(客户端固定请求 `omarchy.db`),edge/rc 通道保持上游直连。 + +`omarchy-refresh-pacman` 会用检出内模板覆写 `/etc/pacman.conf`:ISO/包安装系统的模板自带镜像行;overlay 系统的模板来自上游,覆写后镜像行丢失,用 `omarchycn doctor mirror --fix` 重新插入。 + +已知事实:上游仓库本身含 `omarchy`/`omarchy-dev` 包,当前版本(4.0.0.r1832)低于 cn 层自构建版本(r1955+)。常规 `pacman -Syu` 不会降级覆盖;但 `omarchy-refresh-pacman` 收尾运行的是 `pacman -Syyuu`,`-uu` 明确允许降级——在任何 cn 系统上执行都会把 `omarchy-dev` 降回上游版本、抹掉 cn 层(该风险先于本镜像存在,镜像只是如实转载上游内容)。若上游版本号超过 cn 构建,普通 `-Syu` 也会覆盖 cn 层——每次发布前需核对上游版本。 + ## 接入 ```bash diff --git a/test/shell.d/omarchycn-test.sh b/test/shell.d/omarchycn-test.sh index 73ba4c23..cb54b591 100755 --- a/test/shell.d/omarchycn-test.sh +++ b/test/shell.d/omarchycn-test.sh @@ -80,6 +80,35 @@ if missing or not weak_appends: PYEOF pass "fontconfig priority file carries SC/JP/KR rules and weak fallback" +# [omarchy] mirror wiring: stable is mirror-first with upstream fallback +mapfile -t stable_servers < <(sed -n '/^\[omarchy\]/,$p' "$ROOT/default/pacman/pacman-stable.conf" | grep '^Server = ') +[[ ${stable_servers[0]:-} == "Server = https://git.zacharyzhang.com/api/packages/ZacharyZhang-NY/arch/omarchy/x86_64" ]] || + fail "stable conf lists the OmarchyCN mirror first" "${stable_servers[0]:-none}" +[[ ${stable_servers[1]:-} == 'Server = https://pkgs.omarchy.org/stable/$arch' ]] || + fail "stable conf keeps the upstream fallback second" "${stable_servers[1]:-none}" +for ch in edge rc; do + if grep -q git.zacharyzhang.com "$ROOT/default/pacman/pacman-$ch.conf"; then + fail "$ch conf must stay upstream-only (mirror carries stable only)" + fi +done +bash -n "$ROOT/cn/migrations/1787861071.sh" || fail "mirror migration parses" +grep -q "pacman-key --add" "$ROOT/install/post-install/pacman.sh" || fail "install imports the registry key" +pass "[omarchy] mirror wiring: stable mirror-first, edge/rc untouched, key import present" + +# Mirror-line guard: comments and substrings must not count as present +tmpconf=$(mktemp) +printf 'Server = https://pkgs.omarchy.org/stable/$arch\n' > "$tmpconf" +( + source "$ROOT/cn/lib/mirror.sh" + OMARCHYCN_PACMAN_CONF=$tmpconf cn_mirror_omarchy_repo_ok && exit 1 + printf '# Server = %s\n' "$CN_OMARCHY_MIRROR" >> "$tmpconf" + OMARCHYCN_PACMAN_CONF=$tmpconf cn_mirror_omarchy_repo_ok && exit 1 + printf 'Server = %s\n' "$CN_OMARCHY_MIRROR" >> "$tmpconf" + OMARCHYCN_PACMAN_CONF=$tmpconf cn_mirror_omarchy_repo_ok +) || fail "omarchy repo guard exact-line semantics" +rm -f "$tmpconf" +pass "omarchy mirror guard ignores comments and matches only the exact line" + # Menu: OmarchyCN entries parse and reference only existing commands node -e ' const fs = require("fs");