- Mark step 11b ✅: superpowers + context7 installed via /plugin install - Gap: /plugin marketplace add claude-plugins-official is NOT needed (marketplace pre-registered per github.com/anthropics/claude-plugins-official) - Gap: $PROJECTS_DIR (PS session var) does not survive shell restart; bootstrap.ps1 should re-read projects_dir from ~/.config/factory/home.toml in every new session (home.toml is already SoT) - Update Resume table: 11b ✅, 11c starting Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
28 KiB
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 --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):
$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. Добавлен из директорской машины (commitef14594, 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, залогиниться, поставить плагины ✅
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 (последний может уже работать через установленный плагин).
(в работе)
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/). Закрепить mappinggitea_repo → local_pathв L1 manifest (вероятно как полеtarget_dirотдельно отsource.url). - 2026-05-06 шаг 3: после
winget install jdx.misePATH обновлён только для НОВЫХ сессий. 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 в каждой новой сессии.
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. setup-* скилы (projects-meta, interns, tasks, wiki, context7) | ⏳ начинаем сейчас |
Что юзер делает в перерыве: под-шаг 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.
Первое действие после возвращения:
- Спросить юзера: "Чем закончился 11b? Залогинился? Какие плагины встали? Видны
/setup-projects-meta,/active-platformв slash-меню?" - Если ОК — переходим к 11c:
/setup-projects-meta(первый, потому что от него зависят interns и shared wiki). У этого скила интерактивный flow с preview/confirm — нужен PAT в~/.config/projects-mcp/auth.toml. Юзер уже в курсе, как генерить PAT. - Дальше по списку:
/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
После заполнения всех ✅ — пройти список и для каждого шага:
- Выкинуть всё что было ручной правкой / интерактивным выбором → перенести в
bootstrap.ps1как функцию с параметрами. - Шаги, отмеченные
❌/🔄, сделать первоочередными — там реальные gap'ы native experience. - PS-скрипт должен запускаться от user-scope (без admin), кроме шагов где winget сам поднимет UAC.
- Все интерактивные диалоги — через
Read-HostилиSelect-Object(ASCII-меню).