Skip to content
Apothem
Руководства по эксплуатации

Контрольный список проверки межмашинной синхронизации

Процедура проверки, подтверждающая, что адаптер Claude Code корректно устанавливается, валидируется и удаляется на новом хосте, с полными проверками переносимости.

Область применения. Этот контрольный список проверяет переносимость слоя установки и удаления адаптера Claude Code на новом втором хосте. У других окружений есть собственные рецепты проверки для каждого хоста, задокументированные в site/content/docs/harnesses/<harness>.mdx.

Два пути, две роли. Не смешивайте их при чтении этого контрольного списка. $HOME/.apothem — это домашний каталог движка: сюда клонируется дерево исходного кода и отсюда читают установщики; его можно переопределить через APOTHEM_HOME. ~/.claude/ — это корень конфигурации Claude Code, выходная поверхность адаптера, куда попадают материализованный settings.json и поддерево поддержки. Движок никогда не устанавливается в ~/.claude/; при проверке другого окружения подставьте выходной путь, нативный для его адаптера.

Проверка слоя переносимости установки и удаления на новом втором хосте, проводимая оператором. Уровень публикации (vX.Y.Z) был создан на одном хосте Windows; утверждение о переносимости (CLAUDE.md portability: universal) требует сквозного прогона на втором хосте, прежде чем инвариант для нескольких хостов получит вес. Этот контрольный список — канонический рецепт проверки на втором хосте (адаптер Claude Code).


1. Предварительные условия на втором хосте

Выполните на втором хосте перед началом проверки:

ПунктКомандаОжидается
Git установленgit --versionGit 2.40+
Python 3.10+ доступенpython3 --version (POSIX) или py -3 --version (Windows)3.10 / 3.11 / 3.12 / 3.13
Аутентификация GitHub (необязательно, для клонирования и проверок API с аутентификацией)gh auth statusВыполнен вход под авторизованной учётной записью репозитория при использовании рабочих процессов с аутентификацией
Оболочка доступнаbash --version (POSIX) или pwsh --version (Windows)Bash 4+ или PowerShell 7+
Домашний каталог движка ещё не существуетls "$HOME/.apothem" 2>&1"No such file or directory" — если он есть, сделайте резервную копию перед продолжением

2. Проверка клонирования и установки

Выполните на втором хосте:

# Clone the published repo to the engine home. This is NOT ~/.claude — that
# is the Claude Code configuration root the adapter writes into, and cloning
# a source tree on top of it would bury the harness's own config.
git clone https://github.com/ahmed-g-gad/apothem.git "$HOME/.apothem"
cd "$HOME/.apothem"

# (POSIX path) Run scripts/installer/install.sh dry-run first
bash scripts/installer/install.sh --dry-run                                    # exit 0; prints Dry-run complete — no changes were made.

# (POSIX path) Run scripts/installer/install.sh for real
bash scripts/installer/install.sh                                               # exit 0; idempotent

# (Windows path) PowerShell parallel
pwsh -File scripts/installer/install.ps1 -DryRun                                # exit 0; prints Dry-run complete - no changes were made.
pwsh -File scripts/installer/install.ps1                                        # exit 0

Зафиксируйте код выхода и баннер stdout каждой команды. Запишите результаты в <second-host>/.audit/cross-machine-clone-install.md.

3. Дисциплина четырёх элементов (согласно src/apothem/rules/production-ready-prs.md)

Проверьте каждый из четырёх инвариантов на втором хосте:

3.1 Безопасность существующего назначения

# Re-run installer at the same destination.
bash scripts/installer/install.sh                                               # POSIX
pwsh -File scripts/installer/install.ps1                                        # Windows

Ожидается: Установщик обнаруживает существующий домашний каталог движка и извлекает в нём тег релиза вместо переустановки или дублирования; код выхода 0.

3.2 Проверка предварительных требований

# Run from a copy outside any checkout, with git not on PATH.
d="$(mktemp -d)" && cp scripts/installer/install.sh "$d/" && PATH=<directory holding python3, click, rich and coreutils, but no git> /bin/sh "$d/install.sh"                            # POSIX (no git)

Ожидается: Установщик отказывается запускаться и выводит явную диагностику "git not found"; код выхода ненулевой.

3.3 Идемпотентный повторный запуск

# Run installer N times back-to-back.
for i in 1 2 3 4 5; do bash scripts/installer/install.sh; done                  # POSIX
1..5 | ForEach-Object { pwsh -File scripts/installer/install.ps1 }              # Windows

Ожидается: Каждый вызов завершается с кодом 0; после первого вызова нет побочных эффектов, нет дублирующихся файлов и нет дублирования записей в RC-файле профиля оболочки.

3.4 Настройка через переменные окружения

# Install to a non-default engine home. APOTHEM_HOME is the destination
# override the installers actually read; see the installer-environment-variables
# reference for the full set.
APOTHEM_HOME=/tmp/alt-apothem bash scripts/installer/install.sh                 # POSIX
$env:APOTHEM_HOME='C:\tmp\alt-apothem'; pwsh -File scripts/installer/install.ps1   # Windows

Ожидается: Установщик учитывает переменную окружения; каталог по умолчанию $HOME/.apothem НЕ создаётся; альтернативное назначение содержит ожидаемую структуру.

4. Проверка набора валидаторов (после установки)

cd "$HOME/.apothem"
make validate                                                 # conformity gate --all --strict; exit 0
make headers-doctor                                           # file-header-grep → passed:true
make ai-surfaces-doctor                                       # multi-surface-coherence → passed:true
make plans-doctor                                             # no-global-plans + plans-discipline-language
make lint                                                     # ruff check + ruff format --check + mypy
make test                                                     # exit 0, no failures

Ожидается: Каждый шлюз проходит (зелёный). Зафиксируйте коды выхода и строки сводки.

5. Проверка удаления

# POSIX path — interactive uninstall
bash scripts/installer/uninstall.sh                           # answers: "y" to confirm
PYTHONPATH="$HOME/.apothem/src/apothem/_vendor:$HOME/.apothem/src" python3 -m apothem verify --harness claude-code    # reports the harness as not installed

# Re-install from the kept checkout, then uninstall non-interactively
bash scripts/installer/install.sh
bash scripts/installer/uninstall.sh --yes
PYTHONPATH="$HOME/.apothem/src/apothem/_vendor:$HOME/.apothem/src" python3 -m apothem verify --harness claude-code    # reports the harness as not installed

Ожидается: интерактивный поток запрашивает подтверждение; --yes пропускает запрос для пакетных запусков; оба потока оставляют корень конфигурации Claude Code свободным от файлов, материализованных Apothem; shim apothem удаляется (~/.local/bin/apothem; shim apothem.cmd в %LOCALAPPDATA%\Microsoft\WindowsApps удаляется только через uninstall.ps1).

6. Проверка защитных механизмов безопасности

Защитный механизм деинсталлятора — это проверка формы дерева исходного кода, а не файл-сторож: он продолжает работу только тогда, когда в целевом каталоге есть src/apothem/ вместе с pyproject.toml или .claude-plugin/. Запускайте эти проверки с помощью APOTHEM_HOME — переменной, которую читает скрипт. Проверка, написанная для переменной, которую скрипт игнорирует, не проверяет защиту: она запустит деинсталлятор против вашей реальной установки.

# Run uninstall against a directory that is not an apothem source tree.
mkdir -p /tmp/not-an-apothem-install
APOTHEM_HOME=/tmp/not-an-apothem-install bash scripts/installer/uninstall.sh --yes

Ожидается: Деинсталлятор отказывается и выводит No apothem source found at /tmp/not-an-apothem-install — nothing to uninstall; код выхода ненулевой. Путь НЕ затронут.

# Run uninstall against $HOME and /.
APOTHEM_HOME=$HOME bash scripts/installer/uninstall.sh --yes 2>&1 | tail -3
APOTHEM_HOME=/ bash scripts/installer/uninstall.sh --yes 2>&1 | tail -3

Ожидается: APOTHEM_HOME=$HOME и APOTHEM_HOME=/ каждый отказывают с диагностикой No apothem source found at …, и ни один не затрагивает файловую систему. Пустой APOTHEM_HOME намеренно исключён: он переходит к ~/.apothem, где может находиться настоящая установка.

# An explicit APOTHEM_SOURCE that is not a source tree is rejected separately.
APOTHEM_SOURCE=/tmp/not-an-apothem-install bash scripts/installer/uninstall.sh --yes

Ожидается: Отказ с APOTHEM_SOURCE is not an apothem source tree: /tmp/not-an-apothem-install; код выхода ненулевой.

7. Отчётность

После прогона на втором хосте зафиксируйте результаты в:

  • <second-host>/.audit/cross-machine-clone-install.md (результаты команд клонирования и установки)
  • <second-host>/.audit/cross-machine-validators.md (результаты валидаторов из раздела 4)
  • <second-host>/.audit/cross-machine-uninstall.md (результаты удаления и проверок безопасности из разделов 5–6)

Передайте результаты сопровождающему:

  • ✅ все инварианты дисциплины четырёх элементов выполняются, все шлюзы валидаторов зелёные и все защитные механизмы удаления отклонили небезопасные цели → утверждение публикации portability: universal проверено сквозным образом
  • ❌ любой сбой → заведите задачу на https://github.com/ahmed-g-gad/apothem/issues/new с указанием сбойного раздела и захваченного вывода; сопровождающий сортирует задачи

8. Критерии приёмки

  • §1 предварительные условия выполнены
  • §2 клонирование и установка проходят в оболочках POSIX и Windows
  • §3 дисциплина четырёх элементов соблюдается (безопасность существующего назначения; проверка предварительных требований; идемпотентность; настройка через переменные окружения)
  • §4 каждый шлюз валидаторов зелёный
  • §5 интерактивное удаление проходит успешно; --yes проходит без запроса
  • §6 срабатывает каждый отказ защитного механизма безопасности
  • §7 результаты зафиксированы по документированным путям аудита

Когда на новом втором хосте отмечены все пункты выше, проверка межмашинной синхронизации завершена, а утверждение portability: universal проверено сквозным образом.

On this page