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

39 KiB
Raw Permalink Blame History

field-test, host, os, director, goal
field-test host os director goal
new-laptop-2026-05-06 tbd (нового ноута имя — спросить) Windows 11 existing Windows machine (vitya@.meeting-room) пройти 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 из коробки. Проверка наличия и обновление каталогов.

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)

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 🔄

winget install --id jdx.mise -e --source winget --accept-package-agreements --accept-source-agreements

Активировать в профиле PS7 ($PROFILE у PS5 и PS7 разные!):

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

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

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):

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:

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.

$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.

На новом ноуте:

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 --oneline7e0c158 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):

$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 содержит:
    # 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 + установить скилы

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.ps121 скилл установлен в 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, залогиниться, поставить плагины

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.jssynced 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/:

$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 дал /mcpinterns · √ 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-меню).