Files
factory/L0/install-log.md
vitya d1c14849fb L0 11c-2 — interns connected (2 tools)
- 2nd /setup-interns run (after cd $PROJECTS_DIR + restart) succeeded
- /mcp confirms interns √ connected · 2 tools
  (bulk_text_read + transcript_distill; repo_read pending common impl)
- Phases 7/8 cut by usage limit but no actual work remained:
  JSON valid, /mcp clean post-restart
- 1 new gap: skill writes .gitignore at <project-root> even when
  it's not a git repo (~/projects/ here) — file inert, no leak
  (.common/.gitignore covers secrets/). Track as small skill bug.
- Resume table: 11c-2 , 11c-3..5 wait for limit reset 19:20 MSK

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:45:58 +03:00

454 lines
39 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
field-test: new-laptop-2026-05-06
host: tbd (нового ноута имя — спросить)
os: Windows 11
director: existing Windows machine (vitya@.meeting-room)
goal: пройти full L0a + L0b на голой Win11 машине, фиксируя каждую команду; превратить итог в bootstrap.ps1
---
# L0 install log — Win11 field-test 2026-05-06
Каждый шаг: что задумано → команда → фактический результат → пометки (что сработало не так / что неочевидно).
Пометка `⏳` — запланировано, ещё не выполнено.
Пометка `✅` — выполнено, результат записан.
Пометка `❌` — выполнено, но упало; gap для L0a-скрипта.
Пометка `🔄` — выполнено, но потребовало ручной правки.
## L0a — System bootstrap
### Шаг 1 — Verify winget ✅
Win11 поставляется с winget из коробки. Проверка наличия и обновление каталогов.
```powershell
winget --version
winget source update
```
**Ожидание:** версия `v1.x` или новее, source update без ошибок.
**Факт (2026-05-06):**
- Версия: `v1.28.240`
- `source update` — три источника: `msstore` ✅, `winget` ✅, `winget-font` ✅ (третий нестандартный, видимо добавлен ранее — некритично).
- Сессия запущена в `cmd.exe`, не в PowerShell. **Gap для bootstrap.ps1**: на чистой Win11 стартовая консоль у юзера часто = `cmd`. Скрипт надо либо запускать строго через `iwr … | iex` уже из PS, либо первой строкой проверять `$PSVersionTable` и вежливо просить перейти в PS.
---
### Шаг 2 — Установить core dev tools (git, gh, PS7) ✅
```powershell
winget install --id Git.Git -e --source winget --accept-package-agreements --accept-source-agreements
winget install --id GitHub.cli -e --source winget --accept-package-agreements --accept-source-agreements
winget install --id Microsoft.PowerShell -e --source winget --accept-package-agreements --accept-source-agreements
```
После установки — **открыть новый PowerShell 7**, чтобы PATH перечитался. Дальше работаем уже в PS7 (`pwsh`).
**Ожидание:** `git --version`, `gh --version`, `pwsh --version` отвечают.
**Факт (2026-05-06):**
- Git 2.54.0 ✅ (Git Credential Manager входит в комплект)
- GitHub CLI 2.92.0 ✅ — **но для приватного gitea (`git.kzntsv.site`) не работает.** Оставлен на случай GitHub.com mirror'ов; настоящий нативный CLI для gitea — `tea` (см. опциональный шаг). Альтернатива — простой HTTPS + Git Credential Manager.
- PowerShell 7.6.1.0 ✅
- **Gap для bootstrap.ps1**: `gh` для приватного gitea бесполезен. На фабриках с private gitea вместо `GitHub.cli` ставить `gitea.tea` (или сделать оба опциональными). Решение принимать на основе `home.toml#git_host`.
---
### Шаг 3 — Установить mise 🔄
```powershell
winget install --id jdx.mise -e --source winget --accept-package-agreements --accept-source-agreements
```
Активировать в профиле PS7 (`$PROFILE` у PS5 и PS7 разные!):
```powershell
if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
Add-Content -Path $PROFILE -Value 'mise activate pwsh | Out-String | Invoke-Expression'
# ⚠️ ОБЯЗАТЕЛЬНО закрыть pwsh и открыть заново — winget правит PATH, эффект только в новой сессии
. $PROFILE
mise doctor
```
**Ожидание:** `mise --version` отвечает, `mise doctor` без warning'ов.
**Факт (2026-05-06):**
- `winget install jdx.mise` нашёл в каталоге, поставил `2026.5.1 windows-x64`. Зависимость `Microsoft.VCRedist.2015+.x64` подтянулась автоматически.
- Winget предупредил: **"Переменная среды пути изменена; перезапустите оболочку"**, но также создал app-execution-alias `mise` (виден глобально). Поэтому `mise --version` сразу сработал.
- `. $PROFILE` (без перезапуска шелла) → `mise: The term 'mise' is not recognized` — alias работает только в свежей сессии.
- **Решение:** закрыть pwsh, открыть заново — alias подхватывается нормально.
- После рестарта `mise doctor` → ✅ "No problems found"; `MISE_SHELL=pwsh`, shims_on_path=no (нормально для PS — активация env-style, не shims).
- На ноуте обнаружен предустановленный VS Code (в PATH `~\AppData\Local\Programs\Microsoft VS Code\bin`). Конфиг дефолтного терминала на pwsh — отдельный опциональный шаг.
- **Gap для bootstrap.ps1**: после `winget install jdx.mise` обязательно перезапустить себя (re-exec) или сообщить пользователю и завершиться. Не пытаться сделать `. $PROFILE` в той же сессии.
---
### Шаг 4 — Установить runtime'ы через mise ✅
```powershell
mise use --global node@lts python@3.12 go@latest
node --version
python --version
go version
mise list
```
**Ожидание:** все три версии печатаются.
**Факт (2026-05-06):**
- `node@24.15.0` (LTS, npm 11.12.1), `python@3.12.13`, `go@1.26.2` — все три встали из mise mirror'ов.
- Конфиг записан в `C:\Users\vitya\.config\mise\config.toml`.
- ⚠️ Warning во время установки: `mise WARN gpg not found, skipping verification` — sha256 mise проверил, gpg-подпись — нет. На Win11 gpg не предустановлен.
- **Gap для bootstrap.ps1**: либо ставить gpg как зависимость (`winget install GnuPG.Gpg4win` или `GnuPG.GnuPG`), либо явно сообщать "verification skipped — install gpg if you need it" и идти дальше. Не блокер, но решение надо принять.
---
### Шаг 5 — Configure git identity ✅
```powershell
git config --global user.name "<имя>"
git config --global user.email "<почта>"
git config --global init.defaultBranch master
git config --global pull.ff only
git config --global core.autocrlf input
```
**Ожидание:** настройки видны через `git config --global --list`.
**Факт (2026-05-06):**
- `user.name="Victor Kuznetsov"`, `user.email="vitya.kuznetsov@gmail.com"`, `init.defaultBranch=master`, `pull.ff=only`, `core.autocrlf=input`
- Решено: gitea credentials через **PAT + Git Credential Manager (HTTPS)**, не SSH. Причина — Win11 ssh-agent капризный (службу `ssh-agent` надо включать вручную), а GCM встал с Git 2.54 из коробки.
- PAT создаётся пользователем в браузере на `git.kzntsv.site/user/settings/applications` (scopes: `read:repository`, `write:repository`, `read:user`). Будет запрошен GCM'ом при первом `git push`.
- **Gap для bootstrap.ps1**: PAT-creation шаг — не автоматизируется (требует браузера и MFA). Скрипт должен напечатать прямой URL и дождаться "press enter when token created", потом сохранить через `git credential approve` или просто положиться на GCM-prompt.
---
### Шаг 6 — Установить AI-клиент Claude Code 🔄
**Что было предложено (npm):**
```powershell
npm install -g @anthropic-ai/claude-code
claude --version
claude doctor
```
**Что выяснилось:** Claude Code, поставленный через npm-global под mise, попадает в `AppData\Local\mise\installs\node\24.15.0\node_modules\...`. `claude doctor` блокирует auto-updates с warning'ом "Insufficient permissions for auto-updates" (эвристика "не sudo — не можем"). Юзер получит протухшего клиента через пару недель.
**Решение** — переключиться на native installer:
```powershell
claude install # native install в ~\.local\bin\claude.exe
# native installer НЕ добавляет ~\.local\bin в PATH сам — нужен ручной фикс:
$nativePath = "$env:USERPROFILE\.local\bin"
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
if ($userPath -notlike "*$nativePath*") {
[Environment]::SetEnvironmentVariable("Path", "$nativePath;$userPath", "User")
}
$env:Path = "$nativePath;$env:Path"
npm uninstall -g @anthropic-ai/claude-code # убрать зомби-копию
claude --version
where.exe claude # должно быть одно вхождение
claude doctor # должно быть зелёное Update permissions
```
**Факт (2026-05-06):**
- npm install ✅ → Claude Code 2.1.131
- `claude doctor` после npm-install: ⚠ "Insufficient permissions for auto-updates", "Failed to fetch versions"
- `claude install` ✅ → native в `C:\Users\vitya\.local\bin\claude.exe`
- ⚠ Native installer НЕ положил `~\.local\bin` в PATH автоматически. Anthropic просит сделать это руками через GUI.
- Ручной фикс PATH через `[Environment]::SetEnvironmentVariable` — работает.
- `npm uninstall -g @anthropic-ai/claude-code` — убрал зомби.
- Финал: `where.exe claude` → одно вхождение `C:\Users\vitya\.local\bin\claude.exe`. `claude doctor` зелёный: `Currently running: native (2.1.131)`, `Auto-updates: enabled`, `Stable version: 2.1.119`, `Latest version: 2.1.131`. ✅
**Gaps для bootstrap.ps1 (критично):**
-**НЕ ставить через npm-global под mise.** Auto-updates ломаются.
-**Канонический путь** — официальный native installer от Anthropic: `irm https://claude.ai/install.ps1 | iex` (скрипт сам кладёт в `~\.local\bin` И, по идее, добавляет в PATH; в отличие от `claude install` из уже-стоящего клиента).
- ✅ Если по какой-то причине идём через `claude install` — после него ОБЯЗАТЕЛЬНО править PATH из скрипта (см. блок выше).
-Не забыть `npm uninstall -g @anthropic-ai/claude-code` если npm-копия была.
---
### Шаг 7 — Опциональные тулы (по диалогу) ⏳
С интерактивным выбором:
| Тула | winget id | Зачем |
|---|---|---|
| VS Code | `Microsoft.VisualStudioCode` | редактор |
| Cursor | `Anysphere.Cursor` | альтернативный AI-IDE |
| Ollama | `Ollama.Ollama` | локальные LLM (для interns-mcp endpoint local) |
| Docker Desktop | `Docker.DockerDesktop` | контейнеры (нужен для части проектов) |
| Windows Terminal | `Microsoft.WindowsTerminal` | многотабовый терминал |
**Факт:**
---
## L0b — Factory bootstrap
### Шаг 8 — Выбрать projects_dir ✅
Дефолт: `C:\Users\<user>\projects`.
```powershell
$PROJECTS_DIR = "C:\Users\vitya\projects"
New-Item -ItemType Directory -Force -Path $PROJECTS_DIR | Out-Null
Set-Location $PROJECTS_DIR
```
**Факт (2026-05-06):**
- `$PROJECTS_DIR = C:\Users\vitya\projects` ✅ (создан, cwd переключён).
- Параллельно: создан пустой репо `git.kzntsv.site/OpeItcLoc03/factory` (private, без README — чтобы `git push` не упёрся в merge).
- Локальный mapping: gitea-имя `factory` → локальная папка `.factory/`.
---
### Шаг 9 — Склонировать .factory ✅
**Pre-step (на директорской машине):** создать репо `git.kzntsv.site/OpeItcLoc03/factory` (private, без README), `git init -b master` в локальной `.factory/`, commit, `git push -u origin master`. Сделано 2026-05-06, root-commit `7e0c158`, 3 файла + папка L0.
**На новом ноуте:**
```powershell
git clone https://git.kzntsv.site/OpeItcLoc03/factory.git "$PROJECTS_DIR\.factory"
```
**Mapping**: gitea-имя репо = `factory` (без точки — gitea не любит точку в начале); локальная папка после клона = `.factory/` (с точкой, чтобы быть сиблингом `.common`/`.wiki`/etc). Это закреплённая конвенция для всех мета-репо.
**Факт (2026-05-06):**
- `git clone` прошёл без интерактивного запроса PAT — Windows Credential Vault уже знал `git.kzntsv.site` (либо через OAuth, либо PAT был сохранён GCM при предыдущей сессии). Удобно для этого ноута, но **gap** для свежей машины нового сотрудника.
- `git log --oneline``7e0c158 Initial commit: factory skeleton + L0 install log (field-test 2026-05-06)`
- `git remote -v` → origin корректный.
- 3 файла + L0/ ✅
**Gap для bootstrap.ps1:** на голой машине нового сотрудника GCM ещё не знает gitea. Скрипт должен явно открыть `https://git.kzntsv.site/user/settings/applications` в браузере, попросить пользователя сгенерить PAT (scopes: `read:repository` + `write:repository` + `read:user`) и нажать Enter. Дальше первый `git clone` всплывёт с GCM-prompt — пользователь введёт username + PAT, GCM сохранит в Credential Vault. Все последующие clone/push молчаливые.
---
### Шаг 10 — Записать home.toml 🔄
⚠ TOML strings с Windows-путями (backslashes) — должны быть **literal strings** (одинарные кавычки), иначе backslash интерпретируется как escape.
**Первая попытка** — через here-string `@" ... "@` — провалилась: после copy-paste закрывающий `"@` оказался с leading whitespace, PowerShell не закрыл here-string и завис в `>>` continuation prompt.
**Рабочая версия — без here-string, через array + Set-Content** (устойчиво к copy-paste):
```powershell
$cfg = "$env:USERPROFILE\.config\factory"
New-Item -ItemType Directory -Force -Path $cfg | Out-Null
$now = Get-Date -Format 'yyyy-MM-ddTHH:mm:ssZ'
$lines = @(
"# factory home — single source of machine-level state",
"# auto-generated by L0b bootstrap; safe to edit by hand",
"",
"projects_dir = '$PROJECTS_DIR'",
"client = 'claude-code'",
"installed_at = '$now'"
)
$lines | Set-Content -Encoding utf8 "$cfg\home.toml"
Get-Content "$cfg\home.toml"
```
**Факт (2026-05-06):**
- Попытка 1 (here-string) — провалилась из-за whitespace перед `"@`.
- Попытка 2 (array + Set-Content) — ✅. `home.toml` содержит:
```toml
# factory home — single source of machine-level state
# auto-generated by L0b bootstrap; safe to edit by hand
projects_dir = 'C:\Users\vitya\projects'
client = 'claude-code'
installed_at = '2026-05-06T11:41:04Z'
```
- TOML literal strings корректно сохраняют backslashes Windows-пути.
**Gap для bootstrap.ps1**: НЕ использовать here-strings (`@" ... "@`) — слишком хрупкие к whitespace-ошибкам при copy-paste. Писать конфиги через `Set-Content -Value $array` или `[System.IO.File]::WriteAllText(...)`. Если нужна BOM-free UTF-8, на PS5.1 `Set-Content -Encoding utf8` создаёт UTF-8 *с BOM* — для cross-version совместимости лучше `[System.IO.File]::WriteAllText($path, $content, [System.Text.UTF8Encoding]::new($false))`.
---
### Шаг 11 — Запустить L1 (`factory install`) — серия под-шагов
L1 пока не существует (нет Go-бинаря). Вместо него — **manual run** через Claude Code, по под-шагам.
#### Шаг 11a — клонировать claude-skills + установить скилы ✅
```powershell
cd $PROJECTS_DIR
git clone https://git.kzntsv.site/OpeItcLoc03/claude-skills.git
cd claude-skills
pwsh scripts/install.ps1
Get-ChildItem -Path "$env:USERPROFILE\.claude\skills" -Directory | Select-Object Name
```
**Факт (2026-05-06):**
- Клон claude-skills (698 объектов, 557 КБ) ✅
- В `claude-skills/scripts/` изначально не было `install.ps1` — только `install.sh`. Добавлен из директорской машины (commit `ef14594`, push в gitea), на ноуте `git pull --ff-only` подтянул.
- `pwsh scripts/install.ps1` — **21 скилл** установлен в `C:\Users\vitya\.claude\skills\` (active-platform, caveman-*, find-skills, project-bootstrap, project-discipline, pulling-before-work, setup-context7, setup-interns, setup-projects-meta, setup-tasks, setup-wiki, using-context7, using-interns, using-markitdown, using-projects-meta, using-tasks, using-wiki) ✅
- Финальный `Get-ChildItem` — те же 21 имени, всё на месте.
#### Шаг 11b — запустить claude, залогиниться, поставить плагины ✅
```powershell
cd $PROJECTS_DIR\.factory
claude
# в Claude:
# /login — OAuth flow в браузере
# /plugin install superpowers@claude-plugins-official
# /plugin install context7@claude-plugins-official
# /reload-plugins — применить
# /exit
```
**Факт (2026-05-06):**
- OAuth login прошёл через браузер ✅
- `/plugin install superpowers@claude-plugins-official` → ✅ установлен
- `/plugin install context7@claude-plugins-official` → ✅ установлен
- **Открытие**: `/plugin marketplace add claude-plugins-official`**НЕ НУЖНО**. Маркетплейс `claude-plugins-official` уже предзарегистрирован в Claude Code. Команда `/plugin install <name>@claude-plugins-official` работает сразу. Подтверждение — README репо `github.com/anthropics/claude-plugins-official`: "You do NOT need to register the marketplace separately".
- `/active-platform` после reload — отрабатывает, Windows + PowerShell ✅
**Gaps для bootstrap.ps1:**
-Не учить юзера `/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.
#### Шаг 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 <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` 🔄
**Pre-step (на ноуте):** клонировать `.common/` целиком, сохранив существующий sub-репо `lib/projects-meta-mcp/`:
```powershell
$common = "$PROJECTS_DIR\.common"
$tmp = "$PROJECTS_DIR\.common.bak-projects-meta-mcp"
Move-Item "$common\lib\projects-meta-mcp" $tmp
Remove-Item -Recurse -Force $common
git clone https://git.kzntsv.site/OpeItcLoc03/common.git $common
New-Item -ItemType Directory -Force -Path "$common\lib" | Out-Null
Move-Item $tmp "$common\lib\projects-meta-mcp"
```
Verify: `Test-Path "$common\lib\interns-mcp\pyproject.toml"`, `Test-Path "$common\config\interns\config.yaml"`, `Test-Path "$common\lib\projects-meta-mcp\dist\server.js"` — все True.
**Факт первого запуска (2026-05-06):**
- Phase 0 ✅ (Python 3.12.13 в mise, Node 24.15.0)
- Phase 1 ❌ STOP: ".common/lib/interns-mcp/ not found"
- **Причина:** скил `setup-interns` ищет `<project-root>/.common/...` **относительно cwd**. На ноуте `claude` был запущен из `C:\Windows\System32` — там нет `.common/`.
- Сравнение: `setup-projects-meta` SKILL.md уже исправлен на абсолютный `~/projects/.common/...` (через done-задачу `using-projects-meta-fix-paths`). У `setup-interns` тот же баг — task `setup-interns-fix-paths` открыт в `claude-skills/.tasks/STATUS.md`.
**Workaround для field-test:** `cd $PROJECTS_DIR` перед `claude`. Тогда cwd содержит `.common/` как ребёнка, скил его находит.
**Факт второго запуска (2026-05-06, после `cd $PROJECTS_DIR` + claude restart):**
- Phase 0 ✅ Python 3.12.13 (mise), Node 24.15.0
- Phase 1 ✅ source найден в `.common/lib/interns-mcp/`, config в `.common/config/interns/config.yaml`, endpoints: `ollama_cloud`. Module не importable (ожидаемо). Missing key: `OLLAMA_CLOUD_API_KEY`.
- Phase 2 plan: backup → .gitignore add → pip install -e → secrets/interns.env → mcpServers.interns. Юзер дал ключ.
- Phase 3 ✅ backup `~/.claude.json.bak-20260506-153537`
- Phase 4 ✅ `pip install -e .common/lib/interns-mcp/` под mise-Python
- Phase 5 ✅ `.gitignore` (см. gap ниже) + `.common/secrets/interns.env`
- Phase 6 ✅ `mcpServers.interns` добавлен в `~\.claude.json` с абсолютным путём к mise-Python и `cwd: C:/Users/vitya/projects`
- Phase 7/8 — оборваны лимитом Anthropic, но фактически делать было нечего: JSON валиден (проверил `Get-Content … | ConvertFrom-Json`), restart Claude дал `/mcp``interns · √ connected · 2 tools`. ✅
- **2 tools** = `bulk_text_read` + `transcript_distill`. `repo_read` пока отсутствует в `.common/lib/interns-mcp/interns_mcp/interns/` (impl-задача `common#interns-repo-read-impl` ещё не landed; skill-edits зашли вперёд per `claude-skills` task `interns-repo-read-skill-updates`). Это ожидаемое состояние, не gap.
**Gap для bootstrap.ps1 / setup-interns skill:**
- ⚠ Phase 5 пишет `.gitignore` в `<project-root>/.gitignore` — на этой машине это `C:\Users\vitya\projects\.gitignore`, а `~/projects/` НЕ git-репо. Файл инертен (ничего не игнорит). Реальная защита secrets — `.common/.gitignore` (там `secrets/`). Не утечка, но скил создаёт мусор. Канон: проверять `git -C <project-root> rev-parse --is-inside-work-tree` ДО создания .gitignore; если не репо — пропускать (защита делегируется в `.common/.gitignore`).
**11c-2 закрыт.**
##### 11c-3 — `/setup-tasks`, 11c-4 — `/setup-wiki`, 11c-5 — `/setup-context7` ⏳
(в очереди)
---
## Gaps / questions surfaced during field-test
(заполняется по ходу)
- **2026-05-06 шаг 1**: стартовая консоль на чистой Win11 — `cmd`, не PowerShell. bootstrap.ps1 должен или (а) запускаться явно через `powershell -c "iwr … | iex"`, или (б) при старте проверить `$PSVersionTable` и подсказать. На голой Win11 у нового сотрудника `cmd` будет дефолтом.
- **2026-05-06 шаг 2**: `gh` (GitHub CLI) не работает с приватным gitea — лишний пакет. Заменить в bootstrap.ps1 на `gitea.tea` либо сделать выбор по `home.toml#git_host`.
- **2026-05-06 шаг 3**: после `winget install Microsoft.PowerShell` юзер всё ещё может запустить **Windows PowerShell 5.1** вместо PS7 (две разные программы в Start menu, похожие иконки). bootstrap.ps1 должен или явно вызвать `pwsh.exe`, или громко проверить `$PSVersionTable.PSVersion.Major -ge 7` и переоткрыть себя в pwsh. Профили (`$PROFILE`) у 5.1 и 7 разные — путаница приведёт к "mise активирован, но не работает".
- **2026-05-06 conv**: в gitea репо называются БЕЗ точки (`factory`, не `.factory`). Локальная папка — С точкой (`.factory/`). Закрепить mapping `gitea_repo → local_path` в L1 manifest (вероятно как поле `target_dir` отдельно от `source.url`).
- **2026-05-06 шаг 3**: после `winget install jdx.mise` PATH обновлён только для НОВЫХ сессий. App-execution-alias делает `mise --version` рабочим сразу, но команды из `mise activate pwsh` (которые туда не попадают) — нет. bootstrap.ps1 должен после установки mise самозавершиться с инструкцией "открой новую pwsh и запусти `bootstrap.ps1 --resume`" — НЕ пытаться `. $PROFILE` в той же сессии.
- **2026-05-06 VS Code**: на чистой машине VS Code по дефолту цепляет Windows PowerShell 5.1, а не PS7 — даже если PS7 установлен. Нужно явно прописать в `settings.json`: `"terminal.integrated.defaultProfile.windows": "PowerShell"` + профиль с `path: "pwsh.exe"`. Кандидат на L0a опциональный шаг "configure VS Code" (если установлен).
- **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**: `$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 — на усмотрение администратора.
- **2026-05-06 шаг 11c-2 — cwd**: setup-* скилы расходятся в способе адресации `.common/`. `setup-projects-meta` использует абсолютный `~/projects/.common/...` (исправлено в done-задаче `using-projects-meta-fix-paths`). `setup-interns` всё ещё юзает cwd-относительный `<project-root>/.common/...`. На голой Win11 у юзера cwd при первом `claude` часто `C:\Windows\System32` (он не делает `cd`) — `setup-interns` падает в Phase 1. **Канон для bootstrap.ps1**: явно `Set-Location $PROJECTS_DIR` ДО запуска claude. Долгосрочно: фабрикa-aware скилы должны читать `projects_dir` из `~/.config/factory/home.toml`. Открыта задача `setup-interns-fix-paths` в `claude-skills/.tasks/`.
- **2026-05-06 шаг 11c-2 — `.common` clone**: `setup-projects-meta` создаёт только `.common/lib/projects-meta-mcp/` (через `mkdir -p ~/projects/.common/lib && git clone …`), но НЕ клонирует сам репо `.common`. В результате на новой машине после setup-projects-meta существует псевдо-`.common/` без `CLAUDE.md`, `config/`, `prompts/`, `scripts/`, `lib/interns-mcp/` — это ломает `setup-interns` и любой следующий setup-* в цепочке. **Канон для bootstrap.ps1 / для L1 manifest**: `dot-common` — отдельный компонент с `source: { type: git, url: "{gitea}/common" }, target: "{projects_dir}/.common"`, ставится ДО projects-meta-mcp. В текущем field-test'е сделан pre-step вручную (move projects-meta-mcp aside → clone .common → restore).
## Resume point — 2026-05-06 (перерыв)
**Состояние field-test'а на момент паузы:**
| Слой | Шаг | Статус |
|---|---|---|
| L0a | 1. Verify winget | ✅ |
| L0a | 2. Core dev tools (git/gh/PS7) | ✅ |
| L0a | 3. mise install | 🔄 (нужен restart, прошло) |
| L0a | 4. node/python/go через mise | ✅ |
| L0a | 5. git identity | ✅ |
| L0a | 6. Claude Code (npm → native) | 🔄 (npm-зомби убран, native ОК) |
| L0a | 7. Опциональные тулзы | ⏭ skipped (VS Code уже стоял; остальное докатим позже) |
| L0b | 8. projects_dir | ✅ `C:\Users\vitya\projects` |
| L0b | 9. Clone factory | ✅ root-commit `7e0c158` |
| L0b | 10. home.toml | 🔄 (попытка 1 here-string подвисла; попытка 2 array+Set-Content ✅) |
| L1-manual | 11a. claude-skills + 21 skill в `~\.claude\skills\` | ✅ commit `ef14594` (добавил install.ps1) |
| L1-manual | 11b. claude login + плагины superpowers/context7 | ✅ оба плагина встали; `/plugin marketplace add` — не нужен |
| L1-manual | 11c-1. /setup-projects-meta | ✅ 13 projects synced, 14 tools |
| L1-manual | 11c-2. clone .common + /setup-interns | ✅ 2 tools (bulk_text_read + transcript_distill); repo_read pending impl |
| L1-manual | 11c-3. /setup-tasks | ⏳ ждём reset лимита (19:20 МСК) |
| L1-manual | 11c-4. /setup-wiki | ⏳ |
| L1-manual | 11c-5. /setup-context7 | ⏳ (плагин уже встал в 11b — может быть no-op) |
**Что юзер делает в перерыве:** под-шаг 11b — `claude` в `$PROJECTS_DIR\.factory`, OAuth login, `/plugin marketplace add claude-plugins-official`, `/plugin install superpowers@claude-plugins-official`, `/plugin install context7@claude-plugins-official`. После этого `/exit`.
**Первое действие после возвращения:**
1. Спросить юзера: "Чем закончился 11b? Залогинился? Какие плагины встали? Видны `/setup-projects-meta`, `/active-platform` в slash-меню?"
2. Если ОК — переходим к 11c: `/setup-projects-meta` (первый, потому что от него зависят interns и shared wiki). У этого скила интерактивный flow с preview/confirm — нужен PAT в `~/.config/projects-mcp/auth.toml`. Юзер уже в курсе, как генерить PAT.
3. Дальше по списку: `/setup-interns``/setup-tasks``/setup-wiki``/setup-context7` (последний — может уже стоять, если плагин context7 поставился через `/plugin install` в 11b).
**Открытые design-вопросы**`.meeting-room/.brainstorm/factory-bootstrap.md`, секция "Открытые"): Q2 (где живёт factory.yaml), Q3 (slash-bridge для L2), Q4 (версионирование manifest'а), Q5 (secrets unification).
**Где смотреть после возвращения:**
- Этот файл — пошаговый лог.
- `.meeting-room/.brainstorm/factory-bootstrap.md` — design-буфер.
- `git.kzntsv.site/OpeItcLoc03/factory` — если работаешь с другой машины, `git pull` сюда даст актуальный лог.
## Diff plan: log → bootstrap.ps1
После заполнения всех ✅ — пройти список и для каждого шага:
1. Выкинуть всё что было ручной правкой / интерактивным выбором → перенести в `bootstrap.ps1` как функцию с параметрами.
2. Шаги, отмеченные `❌`/`🔄`, сделать первоочередными — там реальные gap'ы native experience.
3. PS-скрипт должен запускаться от user-scope (без admin), кроме шагов где winget сам поднимет UAC.
4. Все интерактивные диалоги — через `Read-Host` или `Select-Object` (ASCII-меню).