L0 11c-1: setup-projects-meta complete on field-test laptop
- 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) <noreply@anthropic.com>
This commit is contained in:
@@ -315,11 +315,38 @@ claude
|
|||||||
- ✅ Не учить юзера `/plugin marketplace add claude-plugins-official` — это лишний шаг. Сразу `/plugin install <name>@claude-plugins-official`. Предыдущая инструкция в наследии установок устарела.
|
- ✅ Не учить юзера `/plugin marketplace add claude-plugins-official` — это лишний шаг. Сразу `/plugin install <name>@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.
|
- ⚠ После выхода из `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` (последний может уже работать через установленный плагин).
|
Порядок: `/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 <url>` — 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 шаг 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 <name>@claude-plugins-official`. Любые наследуемые from-the-internet инструкции с `marketplace add` — устарели.
|
- **2026-05-06 шаг 11b**: маркетплейс `claude-plugins-official` уже **предзарегистрирован** в Claude Code — `/plugin marketplace add claude-plugins-official` лишний. Сразу `/plugin install <name>@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 шаг 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 (перерыв)
|
## Resume point — 2026-05-06 (перерыв)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user