Skip to content

2 аккаунат - #19

Merged
Greem4 merged 5 commits into
mainfrom
2-аккаунат
Aug 31, 2026

Hidden character warning

The head ref may contain hidden characters: "2-\u0430\u043a\u043a\u0430\u0443\u043d\u0430\u0442"
Merged

Greem4 merged 5 commits into
mainfrom
2-аккаунат

Conversation

@Greem4

@Greem4 Greem4 commented Aug 31, 2026

Copy link
Copy Markdown
Owner

No description provided.

Greem4 and others added 5 commits August 31, 2026 17:57
Аккаунты Claude Code различает конфиг-дом, и второй дом держит свой токен,
не выбивая первый. Как только каталог появляется, в заголовке панели встают
два знака Claude: выбранный горит оранжевым, второй гаснет до серого, а кто
из них кто — говорит подсказка с адресом из `claude auth status`. Каталога
нет — нет и переключателя, всё работает как раньше.

У каждого аккаунта своё всё: лимит, снимок, подобранный бюджет, отсечка
счёта и журнал уведомлений. Файлы второго лежат рядом с приставкой
`secondary-`; общими их сделать было нельзя — обновление одного стирало бы
снимок другого. Первому имена оставлены прежние: в них накопленный счёт.

Имя записи Keychain второго дома Claude Code не публикует. Выводить его
формулой значило бы закрепить догадку о чужой внутренней детали: она
сменится с обновлением CLI, и виджет молча покажет цифры не того аккаунта.
Поэтому имя не выводится, а находится по организации, которую назвал
`claude auth status`, и совпадение проверяет машина. Аккаунту без входа
достаётся SignedOutCredentials, а не nil: nil в ResolvingProvider означает
«Keychain по умолчанию», то есть запись первого аккаунта.

Заодно починил разбор конфига: незнакомое значение activeAccount бросало
исключение, а оно обрывало чтение файла целиком — человек молча терял все
настройки разом. Повод не выдуманный, сборка с Codex писала сюда `claude`.

Проверок стало 534. Обновил README, docs/USAGE.md, docs/ARCHITECTURE.md и
журнал; make-app.sh кладёт в бандл ресурсы SwiftPM — без них Bundle.module
обрывается fatalError'ом ещё до отрисовки панели.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rK6AqLE4HgSaXzqGJCRt2
Вкладка «Доступ» показывала «не вошли» у аккаунта, в котором человек
работает прямо сейчас. Состояние дома выясняется вызовом `claude auth
status`, и вызывали мы его всегда с `CLAUDE_CONFIG_DIR`.

А эта переменная, выставленная даже в тот же самый путь `~/.claude` —
тот, что Claude Code берёт по умолчанию, — заставляет его отвечать
`loggedIn: false`, тогда как без переменной тот же дом отвечает `true`
(проверено на 2.1.251). Ячейку учётных данных выбирает не путь сам по
себе, а факт установки переменной.

Теперь переменная ставится только для нестандартного дома, а
унаследованная из окружения снимается: приложение могли запустить из
оболочки, где она уже выставлена, — например из сеанса под вторым
аккаунтом. Заодно перестал судить по коду возврата: у невошедшего
аккаунта это единица, но JSON в ответе осмысленный.

Проверок стало 538. Записал грабли в docs/ARCHITECTURE.md и docs/USAGE.md
и поправил счётчик в README.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rK6AqLE4HgSaXzqGJCRt2
Абзац объяснял, что второй аккаунт — это отдельный конфиг-дом, и как его
завести. В настройках это была документация, а не настройка: тот же текст
уже лежит в docs/USAGE.md, куда за ним и приходят.

Осталась одна строка — про то, что у каждого аккаунта свой лимит, снимок и
отсечка счёта. Она объясняет, что делает переключатель рядом, и потому
остаётся на месте.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rK6AqLE4HgSaXzqGJCRt2
Пробел №10 «Только один аккаунт за раз» стал неправдой: аккаунтов в панели
два, состояние у каждого своё, и обратное переключение ничего не теряет.
По формату этого файла закрытый пункт уходит из списка пробелов в журнал —
туда же ушли и грабли с CLAUDE_CONFIG_DIR.

Нумерация подтянулась: «Сборки не нотаризованы» стали десятым пунктом,
поправлено оглавление.

Честно записал, что осталось за бортом: аккаунтов ровно два, произвольного
числа нет — под него пришлось бы заводить список в конфиге, а спроса на
третий пока не видно.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rK6AqLE4HgSaXzqGJCRt2
Claude Code 2.1.251 убрал `organizationUuid` из записи Keychain, и поиск
записи перебором со сверкой этого поля перестал находить хоть что-нибудь:
второй аккаунт показывал «в этот аккаунт ещё не вошли», хотя вход был.
Имя записи теперь выводится из пути конфиг-дома — так же, как его собирает
сам Claude Code, — и формулу сторожит тест с живым вектором. Промах формулы
даёт «нет доступа», а не чужой токен: имя зависит от дома, а не от аккаунта.

Принадлежность токена приписывается снаружи, от `claude auth status`, — иначе
метка аккаунта не собиралась бы и отсечка счёта не замечала входа другим
аккаунтом. Форма метки прежняя, накопленный счёт на месте.
@Greem4
Greem4 merged commit 5f853fc into main Aug 31, 2026
1 check passed
Greem4 added a commit that referenced this pull request Aug 31, 2026
Знак Claude в переключателе аккаунтов читался через `Bundle.module`, а
генерируемый SwiftPM аксессор ищет ресурсный бандл ровно в двух местах: в
корне `.app`, куда `make-app.sh` его не кладёт (в бандле macOS всё живёт
под `Contents/`), и по абсолютному пути в `.build` машины сборки. У
собиравшего второй путь есть, поэтому локальные сборки работали; в образе
из релиза он вёл в `/Users/runner/work/…`, и приложение обрывалось
fatalError'ом через секунду после запуска.

Наружу это выглядело так, что обновление ломает программу: образ вставал
успешно, новая версия умирала при первой отрисовке панели, в строке меню
оставалась прежняя — и назавтра проверка снова находила ту же версию.
Пришло с 0.2.1 (#19), до неё `Bundle.module` в коде не было.

Ресурсы теперь лежат в `Contents/Resources` и читаются через
`Bundle.main`, а пропавшая картинка заменяется вопросительным знаком, как
и задумано, вместо падения процесса.

Годность проверяет сборка, а не человек на слово: `make-app.sh` сверяет,
что каждый ресурс лёг туда, откуда его возьмёт `Bundle.main`, и не отдаёт
бандл, если `Bundle.module` вернётся в код приложения. Прежняя проверка
убеждалась только в том, что ресурсный бандл есть в `.build`, — он был на
месте всё то время, пока приложение падало.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKiCAGzMAbrjh4T2wSDKXx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant