From f00e2c8f9e3cde3bccdd9547acdcc2d63b2ab1ba Mon Sep 17 00:00:00 2001 From: vitya Date: Wed, 6 May 2026 11:55:33 +0300 Subject: [PATCH] Brainstorm buffer: factory-bootstrap (in progress) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design buffer for the software-factory bootstrap discussion. Captures: - diagnosis of current dot-folder infrastructure (.common, .organization, .templates, .wiki, .tasks, .meeting-room, .factory) - decision: factory lives at ~/projects/.factory/ (option a, sibling of .common), gitea repo named 'factory' without leading dot - L0a/L0b/L1/L2 architecture - closed Q1 (Go for L1 binary), Q6 (mise + native pkg-mgr for toolchain) - deferred Q7 (access control to v2) - live field-test on a fresh Win11 laptop, log in ../.factory/L0/install-log.md (gitea repo: factory) - resume point recorded; user paused mid-step 11b Buffer remains active — promotion to shared wiki happens via meeting-room-promote-brainstorm once Q2-Q5 are also closed. Co-Authored-By: Claude Opus 4.7 (1M context) --- .brainstorm/factory-bootstrap.md | 189 +++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 .brainstorm/factory-bootstrap.md diff --git a/.brainstorm/factory-bootstrap.md b/.brainstorm/factory-bootstrap.md new file mode 100644 index 0000000..1d12c45 --- /dev/null +++ b/.brainstorm/factory-bootstrap.md @@ -0,0 +1,189 @@ +--- +topic: factory-bootstrap +started: 2026-05-06 +participants: [user, claude-cso] +status: in-progress +problem: > + Установка/обновление инфраструктуры software factory (точечные папки в ~/projects/, + shared MCP-сервера, скилы) для нового сотрудника должна быть "одной кнопкой" — + кросс-платформенной, идемпотентной, нечувствительной к расположению/имени projects-папки, + поддерживающей несколько папок проектов на одной машине, частичные/устаревшие установки + и разные AI-клиенты (Claude Code / Copilot CLI / Gemini CLI). +--- + +# Software factory bootstrap — design buffer + +## Контекст и диагноз (как это выглядит сейчас) + +В `~/projects/` есть 6 точечных папок-модулей будущей "ERP": + +| Модуль | Артефакт | Состояние | +|---|---|---| +| HR / org chart | `.organization/` (roster.md + personas) | частично (CSO/Dev/Analyst в roster, personas/permissions упомянуты но не наполнены) | +| Inventory / templates | `.templates/` | `project/` — частично (`python-package`, `with-wiki-tasks`); `agent/`, `report/` — пустые | +| Knowledge | `.wiki/` (local Karpathy) | живой | +| Knowledge (shared) | `projects-wiki` через `mcp__projects-meta__*` | живой, 13 страниц | +| Tasks / PMO | `.tasks/` (local) + `mcp__projects-meta__tasks_*` (shared) | живой, 13 проектов в кэше | +| Shared services | `.common/` (lib/scripts/secrets/prompts/config) | живой | +| Tooling registry | `claude-skills/` (~20 скилов: 5 setup-*, project-bootstrap, using-*, caveman-*) | живой | +| Bus services | `.common/lib/projects-meta-mcp/`, `.common/lib/interns-mcp/` | живые | +| Communications | `.meeting-room/` | живой (cwd) | + +**Что не работает для онбординга нового сотрудника:** + +1. Нет orchestrator'а — `setup-*` дёргаются по одному вручную из живого Claude. +2. Нет L0 entry point — пока Claude не запущен, ни один setup-* не доступен (chicken-and-egg). +3. Нет manifest'а компонентов — версий, зависимостей, health-check'ов нет нигде; `factory.yaml` отсутствует. +4. Hardcoded `~/projects/` в путях (например `.common/lib/projects-meta-mcp/dist/sync.js`) — переезд / переименование = ручная починка. +5. Multi-vendor (Cursor / Copilot CLI / Gemini CLI): `using-superpowers` уже это учитывает, но `setup-*` пишут только в `~/.claude.json`. +6. `meeting-room` / `meeting-room2` — дубликаты, фабрика сама не убрана. +7. В кросс-проектных задачах ничего нет про factory bootstrap (релевантные находки: только `web4-phase0-bootstrap` в stostayer.new и `active-platform-eval` в claude-skills). В shared wiki — пусто (`knowledge_search "factory bootstrap onboarding new machine"` → 0 hits). + +## Рекомендация (decided) + +**Создать новую дот-папку `~/projects/.factory/` — отдельный репо, сиблинг `.common/`. Manifest-driven cross-platform installer/updater всей мета-инфраструктуры.** + +Размещение **(a)** выбрано потому, что factory должна работать **до того**, как `.common` склонирован. L0 кладёт `.factory/` первым, дальше уже он ставит всё остальное. Альтернативы (b) `.common/lib/factory/` и (c) `claude-skills/skills/factory/` отвергнуты: обе создают cycle dependency на свои родительские модули. + +### Архитектура — три слоя + +**L0 — Pre-Claude bootstrap** (нативный shell, без runtime-зависимостей). Разбит на два под-слоя: + +**L0a — System bootstrap (toolchain).** Голая машина → готовая к работе. +- Системный пакет-менеджер: `winget` (Win11, встроен), `brew` (Mac, `curl … | bash`), `apt`/`dnf`/`pacman` (Linux native). +- `git` + `curl` через системный pkg-mgr. +- `mise` (бывш. rtx) — single-binary unified runtime manager. Через него `node@lts`, `python@latest`, `go@latest`, `rust` по требованию. Кросс-платформенно, без root, один `mise.toml` на проект. Закрывает nvm/pyenv/goenv одной зависимостью. +- Опционально, с интерактивным диалогом (yes/no/skip): Claude Code, Cursor, VS Code, Ollama, Docker Desktop. + +**L0b — Factory bootstrap.** Запускается после L0a. +- `bootstrap.ps1` + `bootstrap.sh` — запуск через `iwr … | iex` / `curl … | bash` +- Делает только: detect platform → спросить `$PROJECTS_DIR` → clone `.factory/` (gitea) → передать управление в L1 +- Единое состояние машины: `~/.config/factory/home.toml` со схемой: + ```toml + projects_dir = "C:/Users/vitya/projects" + client = "claude-code" # | "copilot-cli" | "gemini-cli" + installed_at = "2026-05-06T..." + ``` +- Если на машине несколько `projects_dir` — `home.toml` хранит активный, флаг `--projects-dir ` переключает. + +**L1 — `factory.yaml` + `factory` CLI** (один скомпилированный бинарь — Go или deno-single-file) +- Manifest-схема (черновик): + ```yaml + components: + - name: dot-common + source: { type: git, url: "{gitea}/.common" } + target: "{projects_dir}/.common" + health_check: "test -f {target}/scripts/claude-switch.ps1" + + - name: projects-meta-mcp + source: { type: git, url: "{gitea}/projects-meta-mcp" } + target: "{projects_dir}/.common/lib/projects-meta-mcp" + deps: [dot-common] + setup_skill: setup-projects-meta # делегируется в L2 + health_check: "mcp_tool_available mcp__projects-meta__meta_status" + + - name: dot-wiki + target: "{projects_dir}/.wiki" + deps: [projects-meta-mcp] + setup_skill: setup-wiki + health_check: "test -f {target}/CLAUDE.md && test -f {target}/index.md" + + - name: claude-skills + source: { type: git, url: "{gitea}/claude-skills" } + target: "{projects_dir}/claude-skills" + post_install: "bash {target}/scripts/install.sh" + health_check: "test -d ~/.claude/skills/project-bootstrap" + + # ... .organization, .templates, .meeting-room, dot-tasks, interns-mcp + ``` +- Команды: + - `factory install` — пройти DAG зависимостей, поставить всё что не прошло health-check + - `factory update` — git pull + re-run health-checks + - `factory status` — таблица: `name | version | health | deps` + - `factory diagnose ` — verbose run health-check, печать stderr +- Идемпотентность по health-check'у — re-run = no-op. + +**L2 — `setup-*` skills остаются как есть.** `factory` их триггерит через печать инструкции пользователю ("запусти `/setup-projects-meta`") до тех пор, пока не появится программный slash-command-bridge. Когда появится — `setup_skill: ` будет вызываться напрямую. + +### Что закрывает каждое требование + +| Требование | Решение | +|---|---| +| Папка `~/projects` в произвольном месте | `{projects_dir}` substitution в manifest, источник — `~/.config/factory/home.toml` | +| Произвольное имя папки | То же; manifest нигде не хардкодит "projects" | +| Несколько папок на одной машине | Несколько профилей в `home.toml` (`[profiles.work]`, `[profiles.personal]`); флаг `--profile` | +| Cross-platform | L0 — два нативных скрипта; L1 — single-file бинарь под Win/Mac/Linux; L2 — уже работает | +| Частичные / устаревшие установки | health_check на каждый компонент; `factory status` показывает дельту; `factory update` чинит | +| Multi-vendor (не только Anthropic) | `client` в `home.toml`; manifest-компоненты помечены `clients: [claude-code, copilot-cli]`; не-совместимые скипаются | + +### Anti-recommendations (чего не делать) + +- Один монолитный bash/ps скрипт без manifest'а — за год превратится в legacy. +- Python-orchestrator с pip-зависимостями — сам требует bootstrap'а python (тот же chicken-and-egg). +- Повторять логику установки в L0 и L2. health_check — single source of truth. +- Складывать `factory` в `claude-skills/` — фабрика > tooling; claude-skills должен быть **компонентом** manifest'а, не корнем. + +## Quick wins (параллельные, не блокируют дизайн) + +- Заполнить пустые `.templates/agent/`, `.templates/report/`. +- Разобрать duplicate `meeting-room` / `meeting-room2`. +- После promotion — заингестить итог в shared wiki как `concepts/factory-bootstrap` (через `knowledge_ingest`). +- Завести в `claude-skills/.tasks/` задачу `factory-bootstrap-design` со ссылкой на promoted concept. + +## Открытые вопросы + +### Решённые + +- **Q1 — runtime для L1**: ✅ **Go**. Решено 2026-05-06. + - Главные аргументы: размер бинаря (5–10 МБ vs 80–100 МБ Deno), старт ~5 мс, тривиальная кросс-компиляция (включая Win/macOS ARM), `go-git/go-git` снимает зависимость от системного git, cobra даёт shell-completion из коробки. + - Стек: Go 1.23+, `go-git/go-git`, `goccy/go-yaml`, `spf13/cobra`, опционально `charmbracelet/lipgloss`. Поставка — pre-built бинари в `.factory/dist/`, скачиваются L0b. + - Контраргументы (Deno/Rust/Bun) отброшены: Deno слишком жирный для curl-pipe, Rust learning curve не оправдывает экономию 5 МБ, Bun на Windows ARM ещё не дозрел. + +- **Q6 — toolchain layer в L0**: ✅ **`mise` поверх системного pkg-mgr**. Решено 2026-05-06. + - L0a: системный pkg-mgr (winget/brew/apt) → ставит git + curl + mise → mise ставит node/python/go/rust. + - Опциональный интерактивный слой: Claude Code, Cursor, VS Code, Ollama, Docker Desktop. + - Не отдельные nvm + pyenv + goenv — у каждого свой bootstrap, mise унифицирует. + - Не свой пакет-менеджер — winget/brew/apt уже стоят на любой целевой ОС. + +### Открытые + +- **Q2 — где живёт каноничный manifest в production**: в `.factory/factory.yaml` (один на машину) или в shared Gitea с per-machine override? Склоняюсь к "default в `.factory/` репе, override через `~/.config/factory/home.toml#overrides`". +- **Q3 — slash-command-bridge для L2**: ждать пока Anthropic / другие вендоры дадут программное API, или поднять свой через MCP-сервер `factory-mcp` (тулы: `factory_install`, `factory_status`)? Второе — независимее, но стоит ещё одного сервера. +- **Q4 — версионирование manifest'а**: semver на `factory.yaml` сам? Или per-component версии в pinned-формате `name@v1.2.3`? Last вероятно правильнее, повторяет npm/cargo. +- **Q5 — secrets**: где хранятся токены (gitea, ollama, anthropic) в multi-machine setup? Сейчас ad-hoc в `.common/secrets/` и `~/.config/projects-mcp/auth.toml`. factory должен это унифицировать. +- **Q7 — access control / discoverability** (deferred to v2): иерархия видимости компонентов фабрики (`public` / `internal` / `secret`) с фильтром при `factory install`. В v0 — все компоненты `public`, secrets живут только в `.common/secrets/` с `.gitignore`. Не блокирует v0. + +## v0 plan — live bootstrap нового ноута как field-test + +Stop-condition этого подхода: **не сидеть в чистом дизайне до победного — у пользователя есть свежая машина, на ней проверяем дизайн руками**. + +Алгоритм: +1. Узнать ОС нового ноута (Q6 ответ — определяет первую команду L0a). +2. Бутстрапить машину пошагово, я директирую каждую команду. +3. Каждая выполненная команда логгируется в `.factory/L0/install-log.md` — это сырьё для будущих `bootstrap.ps1` / `bootstrap.sh`. +4. После того как factory поднимется на новом ноуте end-to-end (включая `setup-projects-meta`, `setup-interns`, claude-skills install, `.wiki`/`.tasks`/`.organization` clone), формализуем log в скрипты. +5. Только после успешного field-test'а садимся за L1 (Go-бинарь и `factory.yaml`). + +**Артефакты этого этапа:** +- `.factory/L0/install-log.md` — пошаговый лог команд (на новом ноуте). +- Diff между "что я сделал руками" и "что должен делать L0 скрипт" — readme-черновик `.factory/L0/README.md`. +- Список найденных gaps (что не получилось / что было неочевидно) — кандидаты в Q-список. + +## Действия после промоушена + +1. `meeting-room-promote-brainstorm factory-bootstrap` → + - shared wiki: `concepts/factory-bootstrap` (целевой проект — `_meta` или новый `factory`) + - `claude-skills/.tasks/`: `factory-bootstrap-design` (status=ready, next_action="ответить на Q1–Q5, прототипировать L0") + - `.archive/2026-05-06-factory-bootstrap.md` + +## Resume point — 2026-05-06 (перерыв) + +Field-test на новом Win11 ноуте идёт. Полный пошаговый лог + текущее состояние шагов — в `.factory/L0/install-log.md` (запушено в `git.kzntsv.site/OpeItcLoc03/factory`). + +Краткий summary: L0a (toolchain) ✅, L0b (factory clone + home.toml) ✅, 11a (claude-skills + 21 skill) ✅. Юзер в перерыв сам прогоняет 11b (claude login + плагины superpowers/context7). После возвращения — 11c (setup-* скилы по очереди). + +Основной артефакт field-test'а: список **gap'ов для bootstrap.ps1**, накапливающийся в install-log.md в секции "Gaps / questions surfaced during field-test". Когда field-test завершится — этот список напрямую конвертируется в скрипт. + +## Stop-condition этого буфера + +Дизайн доводится до состояния, где открытые вопросы Q1–Q5 закрыты. После — promote и переход в плановую фазу (L0 → L1 → manifest → миграция существующих setup-* в L2-делегирование).