# Сборка claude-brain — фаза 4a: конфиги + runbook копирования

> **Для исполнителя:** floor-safe шаги (Write новых файлов) исполняются под стеной. Bulk-копирование и `npm install` — owner-операция (maintenance-окно), вынесена в раздел «Runbook (owner)».

**Goal:** Создать каталог `C:\моя\проекты\claude-brain` с авторскими конфигами автономного управляющего слоя (`package.json`, `vitest.config.tools.mjs` с исправленными путями, `.gitignore`); подготовить точный runbook копирования рабочего слоя + установки зависимостей для owner.

**Architecture:** `claude-brain` — отдельный node-проект. Конфиги авторские (пишутся здесь, floor-safe). Рабочий слой (`tools/`, `docs/observer`, `docs/registry`, квинтет и т.д. по корзине A {#D2}) копируется массово robocopy в maintenance-окне. Зависимости — собственный `npm install`, набор best-effort + refine по результату тест-прогона.

**Tech Stack:** node ≥20, vitest 4.1, ESM `.mjs`.

---

## Файлы (создаются под стеной, floor-safe Write)

- Create: `C:/моя/проекты/claude-brain/package.json`
- Create: `C:/моя/проекты/claude-brain/vitest.config.tools.mjs`
- Create: `C:/моя/проекты/claude-brain/.gitignore`

## Цель

Заложить автономный каркас `claude-brain`: манифест зависимостей + тест-конфиг с путями под новое расположение (`tools/` рядом с корнем, не `../tools/`) + игнор. Это floor-safe часть фазы 4 ({#D4} п.1) — без копирования рабочего слоя и без `npm install` (они в runbook owner). Refine зависимостей — по первому тест-прогону.

## Шаги

```skills-json
[]
```

```steps-json
[
  {"op": "Write", "object": "C:/моя/проекты/claude-brain/package.json", "ref": "D5"},
  {"op": "Write", "object": "C:/моя/проекты/claude-brain/vitest.config.tools.mjs", "ref": "D5"},
  {"op": "Write", "object": "C:/моя/проекты/claude-brain/.gitignore", "ref": "D5"}
]
```

### Содержимое шага 1 — `package.json`

```json
{
  "name": "claude-brain",
  "version": "0.1.0",
  "private": true,
  "description": "Управляющий слой Claude (router / mentor / observer / registry / enforcement-машинерия M1–M7)",
  "scripts": {
    "test:tools": "npx vitest run --config vitest.config.tools.mjs",
    "brain:dashboard": "node tools/brain-dashboard-server.mjs"
  },
  "devDependencies": {
    "vitest": "^4.1.5"
  },
  "dependencies": {
    "@xenova/transformers": "^2.17.2",
    "shell-quote": "^1.8.1",
    "js-yaml": "^4.1.1",
    "ajv": "^8.20.0",
    "ajv-formats": "^3.0.1",
    "keytar": "^7.9.0",
    "proper-lockfile": "^4.1.2",
    "glob": "^11.0.0",
    "natural": "^8.0.1",
    "undici": "^6.21.0"
  },
  "engines": {
    "node": ">=20.0.0"
  }
}
```

Версии `vitest`/`ajv`/`ajv-formats`/`js-yaml` сверены с `app/package.json`; `@xenova/transformers`/`shell-quote` — с корневым `package.json`. `keytar`/`proper-lockfile`/`glob`/`natural`/`undici` — оценочные последние мажоры (динамические импорты/спецификация {#D5}); уточняются по тест-прогону (раздел «Критерий»). `eval:llm` намеренно опущен — promptfoo тяжёлый и его конфиг (`docs/ml/...`) на стороне Лидерры; добавится отдельно при переносе ML-доков.

### Содержимое шага 2 — `vitest.config.tools.mjs` (пути исправлены под корень)

```js
import { defineConfig } from 'vitest/config';

// Vitest config для tools/*.test.mjs управляющего слоя (Node, без Vue/DOM).
// claude-brain: конфиг в корне, tools/ рядом → пути без '../' (в отличие от app/).
export default defineConfig({
  test: {
    globals: true,
    environment: 'node',
    include: ['tools/*.test.mjs'],
    exclude: ['tools/ruflo-*.test.mjs', 'tools/subagent-prompt-prefix.test.mjs'],
  },
});
```

### Содержимое шага 3 — `.gitignore`

```gitignore
node_modules/
.mcp.json.bak-*
*.bak
.DS_Store
graphify-out/
graphify-out-*/
~/.claude/runtime
```

## Runbook (owner — maintenance-окно, НЕ floor-safe)

Эти операции упираются в floor (`npm install` — правило install; bulk-копирование вне репо). Выполняются owner'ом при выключенной стене (`"hooks": {}` + перезапуск) ИЛИ напрямую в терминале owner'а:

1. **Скопировать рабочий слой** (корзина A {#D2}) в `claude-brain` (PowerShell robocopy из корня репо `Документация`):
   - `robocopy tools "C:\моя\проекты\claude-brain\tools" /E /XD liderra-monitoring` — все `tools/*` кроме `liderra-monitoring`.
   - `robocopy docs\observer "C:\моя\проекты\claude-brain\docs\observer" /E` ; `robocopy docs\registry "C:\моя\проекты\claude-brain\docs\registry" /E`.
   - router-доки: `docs\router-procedure.md`, `docs\routing-off-phase.md`, `docs\discovery`, управляющие `docs\superpowers` (по {#D3}).
   - квинтет (5 файлов), `cspell-words.txt`, управляющие агенты `.claude\agents\{normative-sync,reviewer-agent}.md`, память мозга.
2. **Установить зависимости:** `cd C:\моя\проекты\claude-brain && npm install`.
3. **Прогон тестов:** `npx vitest run --config vitest.config.tools.mjs`.
4. **Refine deps:** если vitest падает «Cannot find package X» — добавить X в `dependencies` и повторить `npm install` + прогон.

## Крайние случаи

- Пути тест-конфига обязаны быть `tools/*.test.mjs` (не `../tools/`), иначе тесты не находятся {#D5}.
- `node_modules` НЕ копируется — только `npm install` в `claude-brain` (нельзя полагаться на `app/node_modules` {#D5}).
- `liderra-monitoring` исключается из копирования `tools/` ({#D2} корзина A).

## Критерий

- Каталог `C:/моя/проекты/claude-brain` содержит три валидных конфига (`package.json` парсится, `vitest.config.tools.mjs` импортирует `vitest/config`, `.gitignore` непустой).
- После owner-runbook: `npx vitest run` в `claude-brain` даёт ту же зелёную сумму, что `test:tools` в исходном репо (~3931 passed, exclude `ruflo-*`/`subagent-prompt-prefix`) {#D6}.

```verified-context-json
[
  {"id": "vc-tools-data", "kind": "EXTRACTED", "ref": "tools/cost-pricing.mjs", "anchor": "export const PRICING = Object.freeze("},
  {"id": "vc-test-tools", "kind": "EXTRACTED", "ref": "package.json", "anchor": "\"test:tools\": \"cd app && npx vitest run"},
  {"id": "vc-vitest-config", "kind": "EXTRACTED", "ref": "app/vitest.config.tools.mjs", "anchor": "include: ['../tools/*.test.mjs']"}
]
```
