From 965cdb788c0736afe8aaecae6ac5977454677833 Mon Sep 17 00:00:00 2001 From: vitya Date: Wed, 6 May 2026 15:18:33 +0300 Subject: [PATCH] L0 11c-1: setup-projects-meta complete on field-test laptop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 13 projects synced, MCP connected (14 tools), backup saved - Surface 4 gaps for skills/bootstrap script: * skill clones with token-in-URL on auth-failure retry → leaks into .git/config * Bash tool runs git non-interactive — GCM not available * fresh ~/.claude.json lacks mcpServers root key (skill added it OK) * security: PAT exchanged via chat — user accepted leak (private gitea) - Followup task: setup-projects-meta-token-leak in claude-skills/.tasks/ Co-Authored-By: Claude Opus 4.7 (1M context) --- L0/install-log.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/L0/install-log.md b/L0/install-log.md index dfa37f5..eb6d92b 100644 --- a/L0/install-log.md +++ b/L0/install-log.md @@ -315,11 +315,38 @@ claude - ✅ Не учить юзера `/plugin marketplace add claude-plugins-official` — это лишний шаг. Сразу `/plugin install @claude-plugins-official`. Предыдущая инструкция в наследии установок устарела. - ⚠ После выхода из `claude` и открытия **новой** PowerShell-сессии переменная `$PROJECTS_DIR` не видна (PS-переменные живут только внутри сессии; нужен `$env:PROJECTS_DIR` через `[Environment]::SetEnvironmentVariable(..., "User")` если хотим персистентности, или просто перезадать в новой сессии). bootstrap.ps1 должен после рестартов либо (а) читать `projects_dir` из `~\.config\factory\home.toml`, либо (б) экспортировать `$env:PROJECTS_DIR` на уровне User через `SetEnvironmentVariable`. Вариант (а) каноничнее — home.toml уже SoT. -#### Шаг 11c — пройтись по setup-* скилам ⏳ +#### Шаг 11c — пройтись по setup-* скилам Порядок: `/setup-projects-meta` → `/setup-interns` → `/setup-tasks` → `/setup-wiki` → `/setup-context7` (последний может уже работать через установленный плагин). -(в работе) +##### 11c-1 — `/setup-projects-meta` 🔄 + +**Факт (2026-05-06):** +- Phase 0/1 read-only checks ✅ (git/node/npm OK, gitea reachable HTTP 200) +- Phase 1 нашёл: проектов-мета MCP не установлен, build отсутствует, .wiki не клонирована, токена нигде нет, `mcpServers` в `~\.claude.json` отсутствует. +- Phase 2 спросил PAT — юзер вставил. +- Phase 4 первая попытка `git clone https://...` без auth → ❌ `Failed to authenticate user`. **Скил автоматически переключился на `https://USER:TOKEN@host/...`** — клон прошёл, но **токен попал в `.git/config` обоих репо** (projects-meta-mcp + projects-wiki). Это утечка. +- npm install + build ✅ (`dist/server.js` построен, tsc без ошибок). +- Phase 5: `auth.toml` записан с токеном. +- Phase 6: `mcpServers.projects-meta` добавлен в `~\.claude.json`. JSON валиден. Бэкап `.claude.json.bak-20260506-151111` сохранён. +- Phase 7: `node dist/sync.js` → `synced 13 projects, 0 errors`. Кэш `~\.cache\projects-mcp\tasks.json` создан. +- После рестарта Claude `/mcp` показал `projects-meta · ✓ connected · 14 tools` ✅ + +**Gaps для bootstrap.ps1 / для setup-projects-meta skill (критично):** +- ❌ **Утечка токена в `.git/config`**: при первой неудаче без creds скил пересобирает URL с `https://USER:TOKEN@host/...`. Git сохраняет этот URL в `.git/config` клонированного репо — токен на диске. Канон: `git -c http.extraheader="Authorization: token $T" clone ` — per-invocation, не персистится. Открыть задачу в `claude-skills/.tasks/`: `setup-projects-meta-token-leak`. +- ⚠ В Bash tool под Claude `git clone` без явного credential helper не поднимает GCM (non-interactive). На голой машине нужно либо явно использовать extraheader, либо предварительно настроить cred helper, либо клонировать ДО запуска скила (вручную, в интерактивной PS, чтобы GCM запросил и сохранил). +- ⚠ После каждого `cd` Bash tool reset'ит cwd на исходную в следующем вызове — скил это компенсировал через `cd … && cmd`. Не блокер, но при пайплайнах лучше использовать `git -C` / `npm --prefix`. +- ⚠ На голой Win11 у Claude в `~\.claude.json` нет ключа `mcpServers` вообще — все setup-* должны добавлять его идемпотентно (этот добавил корректно). + +**Решение по экспозиции токена:** PAT (`9e0f1f71...546d`) утёк в чат и в `.git/config` двух клонов. Юзер сознательно скипнул ротацию (private gitea на собственном сервере, риск приемлемый). Зафиксировано как факт; технический gap для скила setup-projects-meta — отдельная задача `setup-projects-meta-token-leak` в `claude-skills/.tasks/`. + +##### 11c-2 — `/setup-interns` ⏳ + +(после ротации токена) + +##### 11c-3 — `/setup-tasks`, 11c-4 — `/setup-wiki`, 11c-5 — `/setup-context7` ⏳ + +(в очереди) --- @@ -336,6 +363,9 @@ claude - **2026-05-06 шаг 11a**: в `claude-skills/scripts/` есть только `install.sh` (bash) — `install.ps1` отсутствует. На Windows-машине нативный путь — pwsh, а не git-bash. Нужно добавить `install.ps1` в `claude-skills` (PR в репо), сейчас обходимся inline-PS-блоком. - **2026-05-06 шаг 11b**: маркетплейс `claude-plugins-official` уже **предзарегистрирован** в Claude Code — `/plugin marketplace add claude-plugins-official` лишний. Сразу `/plugin install @claude-plugins-official`. Любые наследуемые from-the-internet инструкции с `marketplace add` — устарели. - **2026-05-06 шаг 11b**: `$PROJECTS_DIR` (PS-переменная сессии) **не переживает рестарт shell** — после выхода из `claude` и открытия новой PS она пуста. bootstrap.ps1 должен полагаться на `~\.config\factory\home.toml#projects_dir` (уже SoT) или через `[Environment]::SetEnvironmentVariable("PROJECTS_DIR", $val, "User")` экспортировать на User-уровень. Канон — читать из home.toml в каждой новой сессии. +- **2026-05-06 шаг 11c-1 / setup-projects-meta**: при first-clone без creds скил fallback'ается на `https://USER:TOKEN@host/...` → токен пишется в `.git/config` клонированного репо. Это утечка. Канон в скиле: `git -c http.extraheader="Authorization: token $T" clone …` (per-invocation, не персистит). Создать задачу `setup-projects-meta-token-leak` в `claude-skills/.tasks/`. +- **2026-05-06 шаг 11c-1**: `~\.claude.json` после первого `claude login` — без ключа `mcpServers`. Все setup-* должны идемпотентно добавлять корневой ключ. setup-projects-meta это сделал правильно — ок. +- **2026-05-06 шаг 11c-1 — security**: PAT, выданный юзером в чат, оказался в (a) транскрипте Claude / телеметрии, (b) `.git/config` двух клонов, (c) `auth.toml`. Юзер скипнул ротацию (private gitea, low-stakes). **Канон для bootstrap.ps1 (на будущее, для public hosts)**: токен запрашивать через `Read-Host -AsSecureString` в shell-промпте до запуска `claude`, не через чат. Для приватных gitea — на усмотрение администратора. ## Resume point — 2026-05-06 (перерыв)