Find the login pin from a git worktree #33

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

Summary

_gitea.require_login ищет закреплённый логин, поднимаясь только от cwd
(skills/sync/scripts/_gitea.py:72). В git worktree, созданном рядом с
репозиторием, .claude/settings.local.json не является предком рабочей
директории, и все скрипты слоя sync падают — при том что хук tea-guard в той
же сессии логин находит.

Spec

skills/sync/scripts/_gitea.py:51-75

Steps to reproduce

  1. Создать worktree за пределами каталога проекта — ровно так, как это делает
    рабочий процесс с ветками:

    cd /path/to/tea
    git worktree add -b feat/x ../tea-worktrees/x origin/main
    
  2. Из worktree создать issue и попытаться опубликовать её:

    cd /path/to/tea-worktrees/x
    python3 skills/issue/scripts/issue_new.py --type bug --title "Some bug"
    python3 skills/sync/scripts/push.py some-bug
    

Expected

Публикация проходит. Логин закреплён оператором для проекта, а worktree — это
тот же проект: хук tea-guard в этой же сессии его находит и подставляет.

Actual

push.py: no login pinned (.claude/settings.local.json env.GITEA_LOGIN).
Run /tea:auth.

Ошибка предлагает /tea:auth, хотя логин закреплён и работает: сообщение
уводит к повторному закреплению вместо настоящей причины — путь поиска.

Два слоя ищут пин по-разному:

где откуда идёт поиск
hooks/tea-guard.sh:120 CLAUDE_PROJECT_DIR, затем cwd из payload, затем os.getcwd()
skills/sync/scripts/_gitea.py:72 только os.getcwd()

Тот же слой уже решил ровно эту задачу для стора: issue.store_root идёт
вверх от __file__, а не от cwd, именно чтобы cd ничего не менял
(skills/issue/scripts/issue.py:56-70). Поиск логина остался на cwd.

Обходной путь — звать скрипт worktree из каталога основного клона:

cd /path/to/tea
python3 /path/to/tea-worktrees/x/skills/sync/scripts/push.py some-bug \
    --out /path/to/tea-worktrees/x/tmp/issues

Он работает, но требует помнить про --out: без него легко попасть в чужой
стор, а стор оператора трогать нельзя.

Environment

  • macOS 25.5.0, Python 3.14.5, git worktree в ../tea-worktrees/
  • claude-skills/tea, пин в /path/to/tea/.claude/settings.local.json
  • воспроизведено на push.py; pull.py, comment.py, remote.py,
    labels.py зовут тот же require_login

Acceptance criteria

  • push.py из worktree находит пин основного клона и публикует issue
  • порядок поиска у скриптов и у хука один и тот же, и он записан в одном
    месте
  • доменный слой не задет: skills/issue/scripts/ по-прежнему stdlib-only
    и ничего не знает о логине
  • при отсутствии пина сообщение по-прежнему указывает на /tea:auth
  • есть тест: временный каталог вне дерева проекта, пин найден; и каталог
    без пина, где выход по-прежнему с ошибкой
<!-- tea:id find-the-login-pin-from-a-git-worktree --> ## Summary `_gitea.require_login` ищет закреплённый логин, поднимаясь только от `cwd` (`skills/sync/scripts/_gitea.py:72`). В git worktree, созданном рядом с репозиторием, `.claude/settings.local.json` не является предком рабочей директории, и все скрипты слоя sync падают — при том что хук `tea-guard` в той же сессии логин находит. ## Spec skills/sync/scripts/_gitea.py:51-75 ## Steps to reproduce 1. Создать worktree за пределами каталога проекта — ровно так, как это делает рабочий процесс с ветками: ```bash cd /path/to/tea git worktree add -b feat/x ../tea-worktrees/x origin/main ``` 2. Из worktree создать issue и попытаться опубликовать её: ```bash cd /path/to/tea-worktrees/x python3 skills/issue/scripts/issue_new.py --type bug --title "Some bug" python3 skills/sync/scripts/push.py some-bug ``` ## Expected Публикация проходит. Логин закреплён оператором для проекта, а worktree — это тот же проект: хук `tea-guard` в этой же сессии его находит и подставляет. ## Actual ``` push.py: no login pinned (.claude/settings.local.json env.GITEA_LOGIN). Run /tea:auth. ``` Ошибка предлагает `/tea:auth`, хотя логин закреплён и работает: сообщение уводит к повторному закреплению вместо настоящей причины — путь поиска. Два слоя ищут пин по-разному: | где | откуда идёт поиск | |---|---| | `hooks/tea-guard.sh:120` | `CLAUDE_PROJECT_DIR`, затем `cwd` из payload, затем `os.getcwd()` | | `skills/sync/scripts/_gitea.py:72` | только `os.getcwd()` | Тот же слой уже решил ровно эту задачу для стора: `issue.store_root` идёт вверх от `__file__`, а не от `cwd`, именно чтобы `cd` ничего не менял (`skills/issue/scripts/issue.py:56-70`). Поиск логина остался на `cwd`. Обходной путь — звать скрипт worktree из каталога основного клона: ```bash cd /path/to/tea python3 /path/to/tea-worktrees/x/skills/sync/scripts/push.py some-bug \ --out /path/to/tea-worktrees/x/tmp/issues ``` Он работает, но требует помнить про `--out`: без него легко попасть в чужой стор, а стор оператора трогать нельзя. ## Environment - macOS 25.5.0, Python 3.14.5, git worktree в `../tea-worktrees/` - claude-skills/tea, пин в `/path/to/tea/.claude/settings.local.json` - воспроизведено на `push.py`; `pull.py`, `comment.py`, `remote.py`, `labels.py` зовут тот же `require_login` ## Acceptance criteria - [ ] `push.py` из worktree находит пин основного клона и публикует issue - [ ] порядок поиска у скриптов и у хука один и тот же, и он записан в одном месте - [ ] доменный слой не задет: `skills/issue/scripts/` по-прежнему stdlib-only и ничего не знает о логине - [ ] при отсутствии пина сообщение по-прежнему указывает на `/tea:auth` - [ ] есть тест: временный каталог вне дерева проекта, пин найден; и каталог без пина, где выход по-прежнему с ошибкой
claude added this to the Self-improvement milestone 2026-08-10 12:32:43 +00:00
claude added the comp/sync
severity
medium
type
bug
labels 2026-08-10 12:32:43 +00:00
naudachu added the comp/tea-guard label 2026-08-10 12:38:07 +00:00
Author
Collaborator

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

Проблема поймана тремя независимыми агентами в один заход, поэтому каноническая
issue теперь несёт все случаи сразу: путь issue_new.pypush.py, отдельный
remote.py, контраст с хуком, таблица «откуда каждый слой ищет пин», чтение
.git как файла с gitdir:, и порча branch: обходным путём.

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

  • таблица расхождения порядка поиска между hooks/tea-guard.sh:120 и
    _gitea.py:72;
  • критерий «порядок поиска у скриптов и у хука один и тот же, и он записан в
    одном месте»;
  • критерий «доменный слой не задет, skills/issue/scripts/ по-прежнему
    stdlib-only»;
  • ловушка обходного пути с --out: без него запись уходит в чужой стор;
  • список затронутых скриптов и gitdir:-ветка поиска как решение.

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

Дубликат #24 — закрываю в его пользу. Проблема поймана тремя независимыми агентами в один заход, поэтому каноническая issue теперь несёт все случаи сразу: путь `issue_new.py` → `push.py`, отдельный `remote.py`, контраст с хуком, таблица «откуда каждый слой ищет пин», чтение `.git` как файла с `gitdir:`, и порча `branch:` обходным путём. Уникальные вклады этой issue перенесены в #24 целиком: - таблица расхождения порядка поиска между `hooks/tea-guard.sh:120` и `_gitea.py:72`; - критерий «порядок поиска у скриптов и у хука один и тот же, и он записан в одном месте»; - критерий «доменный слой не задет, `skills/issue/scripts/` по-прежнему stdlib-only»; - ловушка обходного пути с `--out`: без него запись уходит в чужой стор; - список затронутых скриптов и `gitdir:`-ветка поиска как решение. Покрытие тестами теперь тоже одно на все случаи — см. критерии в #24.
Sign in to join this conversation.