diff --git a/AGENTS.md b/AGENTS.md index 46e268c8..70bc3151 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,7 +18,7 @@ This fork carries the OmarchyCN China-integration layer on top of upstream `base - `bin/omarchycn` routes to `omarchy cn `; all cn commands are `bin/omarchy-cn-*` and follow the upstream bin conventions (metadata, helpers, `$OMARCHY_PATH` — bootstrap exceptions: the overlay installer resolves its own checkout, and `omarchy-cn-convert` / `omarchy-cn-revert` are curl-able standalone scripts that default `OMARCHY_PATH` because they run before/while the cn tree exists) - Convert/revert: `omarchy-cn-convert` turns a vanilla package-based Omarchy into OmarchyCN (registry key + [omarchycn] repo, `--ask=4` package swap to the cn-built omarchy-dev/omarchy-settings-dev published by `packages/publish-cn-packages.sh`, [omarchy] mirror line, zh_CN locale, fcitx5 seeding, plymouth rebrand) recording pre-state in `/var/lib/omarchycn/convert-state`; `omarchy-cn-revert` restores that state; checkout installs are refused toward the overlay - `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-migrate` with per-file completion markers under `~/.local/state/omarchycn/`; the update pipeline (`bin/omarchy-update`) calls it after `omarchy-migrate`, and `omarchy-cn-update` serves both install forms (overlay: git pull + reinstall + migrate; package: exec `omarchy-update`) +- cn migrations live in `cn/migrations/*.sh`, run by `omarchy-cn-migrate` with per-file completion markers under `~/.local/state/omarchycn/`; `bin/omarchy-migrate` calls it after the upstream migrations, and `omarchy-cn-update` serves both install forms (overlay: git pull + reinstall + migrate; package: exec `omarchy-update`) - 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 @@ -27,7 +27,7 @@ This fork carries the OmarchyCN China-integration layer on top of upstream `base - 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/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 `omarchy-cn-migrate` line in `bin/omarchy-update`, 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) +- 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 `omarchy-cn-migrate` line in `bin/omarchy-migrate`, 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/bin/omarchy-cn-update b/bin/omarchy-cn-update index 53d9c91d..7f015c2c 100755 --- a/bin/omarchy-cn-update +++ b/bin/omarchy-cn-update @@ -54,11 +54,11 @@ stable) ;; esac -# Never move onto a tree that predates the channel mechanism: its update -# command cannot switch back, stranding the install -if [[ ! -f $src/bin/omarchy-cn-channel ]]; then +# Never move onto a tree that predates the channel or migrate mechanism: +# it cannot switch back or finish this update's migration step +if [[ ! -f $src/bin/omarchy-cn-channel || ! -f $src/bin/omarchy-cn-migrate ]]; then git -C "$src" checkout -q "$old" - echo "$channel 通道的目标发布早于通道机制,已回退;请使用 nightly 或更新的发布" >&2 + echo "$channel 通道的目标发布早于当前更新机制,已回退;请使用 nightly 或更新的发布" >&2 exit 1 fi diff --git a/bin/omarchy-migrate b/bin/omarchy-migrate index 056a578d..e8755b5f 100755 --- a/bin/omarchy-migrate +++ b/bin/omarchy-migrate @@ -96,6 +96,9 @@ while IFS=$'\t' read -r name file marker; do fi done < <(migration_entries) +# Here (not omarchy-update) so the first update from a pre-cn package runs them +OMARCHY_PATH="$OMARCHY_PATH" omarchy-cn-migrate + # Clear a login-time notification the user left sitting there and then resolved # by running migrations some other way. The substring matches both the current # and legacy notification titles. diff --git a/bin/omarchy-update b/bin/omarchy-update index 682fd9f2..e71e8086 100755 --- a/bin/omarchy-update +++ b/bin/omarchy-update @@ -46,7 +46,6 @@ if [[ ${1:-} == "-y" ]] || omarchy-update-confirm; then # takes the update with it rather than migrating against what is still on disk. omarchy-update-system-pkgs omarchy-migrate - omarchy-cn-migrate omarchy-hook post-update omarchy-update-aur-pkgs omarchy-update-mise diff --git a/test/shell.d/migrate-scope-test.sh b/test/shell.d/migrate-scope-test.sh index f877847b..e8c80f69 100644 --- a/test/shell.d/migrate-scope-test.sh +++ b/test/shell.d/migrate-scope-test.sh @@ -22,7 +22,7 @@ SH calls="$test_tmp/calls" -if ! HOME="$test_home" OMARCHY_PATH="$test_root" "$ROOT/bin/omarchy-migrate" --pending >"$test_tmp/pending.out"; then +if ! HOME="$test_home" OMARCHY_PATH="$test_root" PATH="$ROOT/bin:$PATH" "$ROOT/bin/omarchy-migrate" --pending >"$test_tmp/pending.out"; then fail "migration runner reports pending migrations before state exists" fi grep -q '^100-first\.sh$' "$test_tmp/pending.out" || fail "migration runner lists first pending migration filename" @@ -33,6 +33,7 @@ HOME="$test_home" \ OMARCHY_PATH="$test_root" \ TEST_EXPECTED_OMARCHY_PATH="$test_root" \ TEST_CALLS="$calls" \ +PATH="$ROOT/bin:$PATH" \ "$ROOT/bin/omarchy-migrate" >"$test_tmp/first-run.out" [[ $(sed -n '1p' "$calls") == "first" ]] || fail "migration runner runs first migration" [[ $(sed -n '2p' "$calls") == "second" ]] || fail "migration runner runs second migration" @@ -44,11 +45,12 @@ HOME="$test_home" \ OMARCHY_PATH="$test_root" \ TEST_EXPECTED_OMARCHY_PATH="$test_root" \ TEST_CALLS="$calls" \ +PATH="$ROOT/bin:$PATH" \ "$ROOT/bin/omarchy-migrate" >"$test_tmp/second-run.out" [[ $(wc -l <"$calls") -eq 2 ]] || fail "migration runner skips completed migrations" pass "migration runner skips completed migrations" -if HOME="$test_home" OMARCHY_PATH="$test_root" "$ROOT/bin/omarchy-migrate" --pending >"$test_tmp/not-pending.out"; then +if HOME="$test_home" OMARCHY_PATH="$test_root" PATH="$ROOT/bin:$PATH" "$ROOT/bin/omarchy-migrate" --pending >"$test_tmp/not-pending.out"; then fail "migration runner reports no pending migrations after state exists" fi pass "migration runner detects no pending migrations" @@ -67,6 +69,7 @@ set +e HOME="$failure_home" \ OMARCHY_PATH="$failure_root" \ TEST_CALLS="$calls" \ +PATH="$ROOT/bin:$PATH" \ "$ROOT/bin/omarchy-migrate" >"$test_tmp/failure.out" 2>"$test_tmp/failure.err" failure_status=$? set -e