Resolve the login pin across a git worktree #34

Closed
opened 2026-08-10 12:33:06 +00:00 by claude · 1 comment
Collaborator

Summary

_gitea.find_pin (skills/sync/scripts/_gitea.py:51-69) ищет
.claude/settings.local.json, поднимаясь только по предкам CWD. Каталог
git worktree — сосед основного чекаута, а не его потомок, поэтому пин туда не
доходит, и вся трекерная половина плагина внутри worktree мертва. При этом стор
из того же worktree резолвится правильно: issue.repo_root (issue.py:81-95)
специально умеет читать .git как файл.

Spec

skills/sync/scripts/_gitea.py

Steps to reproduce

  1. Завести worktree рядом с чекаутом (стандартная схема работы над issue):

    git worktree add -b feat/x ../tea-worktrees/x origin/main
    cd ../tea-worktrees/x
    
  2. Создать локальную issue и попробовать её опубликовать:

    python3 skills/issue/scripts/issue_new.py --type bug --title "Something" ...
    python3 skills/sync/scripts/push.py <slug>
    

Expected

Пин находится: это тот же репозиторий, тот же оператор, тот же remote. Файл
.claude/settings.local.json лежит в общем корне
(/Users/naudachu/Documents/projects/llm/is/tea), и .git внутри worktree
прямо на него указывает:

$ cat .git
gitdir: /Users/naudachu/Documents/projects/llm/is/tea/.git/worktrees/evict-closed-issues

Actual

$ python3 skills/sync/scripts/push.py correct-the-branch-write-back-claim-in-the-sync
push.py: no login pinned (.claude/settings.local.json env.GITEA_LOGIN). Run /tea:auth.

--dry-run при этом проходит целиком — сети он не касается, — так что проблема
всплывает ровно в тот момент, когда работа готова к отправке.

Два последствия, оба неприятные:

  • Совет в тексте ошибки ведёт не туда. /tea:auth внутри worktree создаст
    второй settings.local.json в каталоге, который будет удалён вместе с
    worktree, — и попросит оператора выбирать логин, который уже выбран.
  • Обходной путь портит данные. Единственный способ отправить issue —
    запускать скрипт с CWD в основном чекауте и передавать
    --out <worktree>/tmp/issues. Тогда push.py:202-214 (git_branch) читает
    ветку основного чекаута, и в Gitea уезжает ref: main вместо ветки, на
    которой работа реально живёт. Ровно то поле, ради которого branch:
    существует.

Environment

Ветка main, коммит 2ac3015. macOS, git worktree, пин в
/Users/naudachu/Documents/projects/llm/is/tea/.claude/settings.local.json.
Затрагивает все скрипты, зовущие _gitea.require_login: pull.py, push.py,
comment.py, remote.py, labels.py, wiki_*.py.

Acceptance criteria

  • push.py и pull.py, запущенные из каталога worktree, находят пин
    основного чекаута и не требуют /tea:auth
  • поиск по-прежнему идёт от CWD вверх (плагин, установленный вне репозитория
    и наведённый на чужой проект, не должен смотреть на свой собственный
    каталог); worktree — дополнительная ветка поиска через gitdir: из файла
    .git
  • второй settings.local.json в worktree не создаётся
  • branch: у issue, отправленной из worktree, равен ветке worktree
  • есть тест: временный репозиторий с пином в корне, worktree рядом, запуск
    из worktree находит логин
<!-- tea:id resolve-the-login-pin-across-a-git-worktree --> ## Summary `_gitea.find_pin` (`skills/sync/scripts/_gitea.py:51-69`) ищет `.claude/settings.local.json`, поднимаясь только по предкам CWD. Каталог `git worktree` — сосед основного чекаута, а не его потомок, поэтому пин туда не доходит, и вся трекерная половина плагина внутри worktree мертва. При этом стор из того же worktree резолвится правильно: `issue.repo_root` (`issue.py:81-95`) специально умеет читать `.git` как файл. ## Spec skills/sync/scripts/_gitea.py ## Steps to reproduce 1. Завести worktree рядом с чекаутом (стандартная схема работы над issue): ```bash git worktree add -b feat/x ../tea-worktrees/x origin/main cd ../tea-worktrees/x ``` 2. Создать локальную issue и попробовать её опубликовать: ```bash python3 skills/issue/scripts/issue_new.py --type bug --title "Something" ... python3 skills/sync/scripts/push.py <slug> ``` ## Expected Пин находится: это тот же репозиторий, тот же оператор, тот же remote. Файл `.claude/settings.local.json` лежит в общем корне (`/Users/naudachu/Documents/projects/llm/is/tea`), и `.git` внутри worktree прямо на него указывает: ``` $ cat .git gitdir: /Users/naudachu/Documents/projects/llm/is/tea/.git/worktrees/evict-closed-issues ``` ## Actual ``` $ python3 skills/sync/scripts/push.py correct-the-branch-write-back-claim-in-the-sync push.py: no login pinned (.claude/settings.local.json env.GITEA_LOGIN). Run /tea:auth. ``` `--dry-run` при этом проходит целиком — сети он не касается, — так что проблема всплывает ровно в тот момент, когда работа готова к отправке. Два последствия, оба неприятные: - **Совет в тексте ошибки ведёт не туда.** `/tea:auth` внутри worktree создаст второй `settings.local.json` в каталоге, который будет удалён вместе с worktree, — и попросит оператора выбирать логин, который уже выбран. - **Обходной путь портит данные.** Единственный способ отправить issue — запускать скрипт с CWD в основном чекауте и передавать `--out <worktree>/tmp/issues`. Тогда `push.py:202-214` (`git_branch`) читает ветку основного чекаута, и в Gitea уезжает `ref: main` вместо ветки, на которой работа реально живёт. Ровно то поле, ради которого `branch:` существует. ## Environment Ветка `main`, коммит `2ac3015`. macOS, `git worktree`, пин в `/Users/naudachu/Documents/projects/llm/is/tea/.claude/settings.local.json`. Затрагивает все скрипты, зовущие `_gitea.require_login`: `pull.py`, `push.py`, `comment.py`, `remote.py`, `labels.py`, `wiki_*.py`. ## Acceptance criteria - [ ] `push.py` и `pull.py`, запущенные из каталога worktree, находят пин основного чекаута и не требуют `/tea:auth` - [ ] поиск по-прежнему идёт от CWD вверх (плагин, установленный вне репозитория и наведённый на чужой проект, не должен смотреть на свой собственный каталог); worktree — дополнительная ветка поиска через `gitdir:` из файла `.git` - [ ] второй `settings.local.json` в worktree не создаётся - [ ] `branch:` у issue, отправленной из worktree, равен ветке worktree - [ ] есть тест: временный репозиторий с пином в корне, worktree рядом, запуск из worktree находит логин
claude added this to the Self-improvement milestone 2026-08-10 12:33:06 +00:00
claude added the comp/sync
severity
medium
type
bug
labels 2026-08-10 12:33:06 +00:00
naudachu added the comp/tea-guard label 2026-08-10 12:38:07 +00:00
Author
Collaborator

Дубликат #24 — закрываю в его пользу.

Проблема поймана тремя независимыми агентами в один заход, поэтому каноническая
issue теперь несёт все случаи сразу.

Уникальные вклады этой issue перенесены в #24 целиком:

  • .git внутри worktree — файл с gitdir:, и это готовая ветка поиска;
    добавлено в Environment вместе с выводом cat .git;
  • --dry-run проходит полностью, поэтому отказ всплывает ровно в момент
    отправки — добавлено в Actual;
  • обходной путь портит данные: push.py:202-214 (git_branch) читает ветку по
    CWD, и в Gitea уезжает ref: main вместо ветки worktree;
  • ограничение «резолв не переносится на __file__» — вынесено в отдельную
    секцию Constraints, потому что оно противоречило исходному критерию #24 и
    выигрывает: плагин, установленный вне репозитория, не должен смотреть на свой
    каталог;
  • критерии «второй settings.local.json не создаётся» и «branch: равен ветке
    worktree», плюс тест на второе.

Покрытие тестами теперь одно на все случаи — см. критерии в #24.

Дубликат #24 — закрываю в его пользу. Проблема поймана тремя независимыми агентами в один заход, поэтому каноническая issue теперь несёт все случаи сразу. Уникальные вклады этой issue перенесены в #24 целиком: - `.git` внутри worktree — файл с `gitdir:`, и это готовая ветка поиска; добавлено в Environment вместе с выводом `cat .git`; - `--dry-run` проходит полностью, поэтому отказ всплывает ровно в момент отправки — добавлено в Actual; - обходной путь портит данные: `push.py:202-214` (`git_branch`) читает ветку по CWD, и в Gitea уезжает `ref: main` вместо ветки worktree; - ограничение «резолв не переносится на `__file__`» — вынесено в отдельную секцию Constraints, потому что оно противоречило исходному критерию #24 и выигрывает: плагин, установленный вне репозитория, не должен смотреть на свой каталог; - критерии «второй settings.local.json не создаётся» и «`branch:` равен ветке worktree», плюс тест на второе. Покрытие тестами теперь одно на все случаи — см. критерии в #24.
Sign in to join this conversation.