- 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>
454 lines
39 KiB
Markdown
454 lines
39 KiB
Markdown
---
|
||
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-меню).
|