Initial commit: factory skeleton + L0 install log (field-test 2026-05-06)
This commit is contained in:
18
.gitignore
vendored
Normal file
18
.gitignore
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# Build artefacts (will appear once L1 Go binary is built)
|
||||
dist/*-linux-*
|
||||
dist/*-darwin-*
|
||||
dist/*-windows-*.exe.bak
|
||||
|
||||
# Local dev state
|
||||
*.log
|
||||
.vscode/
|
||||
.idea/
|
||||
.DS_Store
|
||||
|
||||
# Secrets — never commit
|
||||
secrets/
|
||||
*.pem
|
||||
*.key
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
272
L0/install-log.md
Normal file
272
L0/install-log.md
Normal file
@@ -0,0 +1,272 @@
|
||||
---
|
||||
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 ⏳
|
||||
|
||||
```powershell
|
||||
git clone https://git.kzntsv.site/OpeItcLoc03/factory.git "$PROJECTS_DIR\.factory"
|
||||
```
|
||||
|
||||
**Mapping**: gitea-имя репо = `factory` (без точки — gitea не любит точку в начале); локальная папка после клона = `.factory/` (с точкой, чтобы быть сиблингом `.common`/`.wiki`/etc). Это закреплённая конвенция для всех мета-репо.
|
||||
|
||||
**Замечание:** `factory` пока не в gitea (новый репо). До field-test'а нужно либо запушить с этой машины, либо bootstrap-ить через `--via-zip` (TBD).
|
||||
|
||||
**Факт:** ⏳
|
||||
|
||||
---
|
||||
|
||||
### Шаг 10 — Записать home.toml ⏳
|
||||
|
||||
```powershell
|
||||
$cfg = "$env:USERPROFILE\.config\factory"
|
||||
New-Item -ItemType Directory -Force -Path $cfg | Out-Null
|
||||
@"
|
||||
projects_dir = "$PROJECTS_DIR"
|
||||
client = "claude-code"
|
||||
installed_at = "$(Get-Date -Format 'yyyy-MM-ddTHH:mm:ssZ')"
|
||||
"@ | Out-File -Encoding utf8 "$cfg\home.toml"
|
||||
```
|
||||
|
||||
**Факт:** ⏳
|
||||
|
||||
---
|
||||
|
||||
### Шаг 11 — Запустить L1 (`factory install`) ⏳
|
||||
|
||||
L1 пока не существует (нет Go-бинаря). Вместо него — **manual run** через Claude Code:
|
||||
|
||||
1. Запустить `claude` в `$PROJECTS_DIR`.
|
||||
2. Авторизоваться (`claude login`).
|
||||
3. Установить плагины superpowers + claude-skills (через `bash <claude-skills>/scripts/install.sh` после клонирования claude-skills).
|
||||
4. По очереди вызывать `/setup-projects-meta`, `/setup-interns`, `/setup-tasks`, `/setup-wiki`, `/setup-context7` — каждый со своим preview/confirm.
|
||||
|
||||
Этот шаг — самый "ручной", и именно он должен превратиться в L1 manifest после field-test'а.
|
||||
|
||||
**Факт:** ⏳
|
||||
|
||||
---
|
||||
|
||||
## 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" (если установлен).
|
||||
|
||||
## 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-меню).
|
||||
23
README.md
Normal file
23
README.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# .factory — software factory orchestrator
|
||||
|
||||
Размещение: `<projects_dir>/.factory/` (сиблинг `.common/`).
|
||||
|
||||
## Слои
|
||||
|
||||
- **L0a — System bootstrap (toolchain).** Голая ОС → git, mise, runtime'ы (node/python/go), опционально Claude Code / Cursor / Ollama. Native shell скрипты.
|
||||
- **L0b — Factory bootstrap.** Спросить `$PROJECTS_DIR` → склонировать `.factory/` (если ещё нет) → записать `~/.config/factory/home.toml` → отдать управление в L1.
|
||||
- **L1 — `factory` CLI** (Go-бинарь). Читает `factory.yaml`, обходит DAG зависимостей, запускает health-check'и и, при необходимости, setup-инструкции (L2).
|
||||
- **L2 — `setup-*` skills** в `claude-skills/`. Уже существуют. L1 их вызывает (или печатает инструкцию запустить через slash-command).
|
||||
|
||||
## Статус
|
||||
|
||||
- Дизайн: `~/projects/.meeting-room/.brainstorm/factory-bootstrap.md`
|
||||
- L0a в разработке (field-test на новом Win11 ноуте, лог в `L0/install-log.md`)
|
||||
- L0b — нет
|
||||
- L1 — нет (Go-бинарь, после L0)
|
||||
- `factory.yaml` — нет (черновик в design-буфере)
|
||||
|
||||
## Точки входа
|
||||
|
||||
- Новый сотрудник на голой машине: запускает L0a (`bootstrap.ps1` / `bootstrap.sh`) → L0a кончает L0b → L0b кончает `factory install` (L1) → L1 проходит manifest → готово.
|
||||
- Существующая машина (миграция): `factory install` напрямую, L0a/b пропускаем (всё уже стоит).
|
||||
Reference in New Issue
Block a user