Files
kompas3d-mcp/docs/superpowers/NEXT-SESSION.md
T
mikhail 454a90100a refactor: навыки-делегаторы → нативные субагенты
docs-delegate и kompas-sdk-research были навыками-обёртками: их тело —
шаблон системного промпта, который Opus вручную копировал в вызов
general-purpose агента на Sonnet. Переоформлены в нативных субагентов
(.claude/agents/), где промпт живёт в теле определения, модель и набор
инструментов фиксируются во frontmatter.

- docs-delegate → docs-maintainer (имя по роли, а не по механизму);
  tools: Read/Edit/Write/Glob/Grep.
- kompas-sdk-research: read-only (tools: Glob/Grep/Read) — запрет правок
  теперь структурный, а не правило в промпте.
- Делегация теперь один вызов Agent(subagent_type, prompt) без копирования
  шаблона → экономия контекста Opus.
- Переписаны живые ссылки: CLAUDE.md, kompas-3d/SKILL.md, README.md,
  ARCHITECTURE.md, NEXT-SESSION.md. Старые каталоги навыков удалены.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 18:55:13 +03:00

117 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Промт для следующей сессии
Скопируй блок ниже как стартовое сообщение новой сессии Claude Code.
---
Продолжаем разработку MCP-сервера КОМПАС-3D (kompas3d-mcp). Работай автономно, с коммитами и
пушами в `main`; используй Codex для ревью КАЖДОЙ реализованной фичи (спека и реализации).
КОМПАС-3D должен быть запущен (нужен для интеграционных тестов).
**Фокус — продолжать ВЕХУ 2D-ЧЕРТЁЖ** (самый ценный развивающийся класс). Деталь и сборки близки
к насыщению. Следующий инкремент — **радиальный/угловой размер** ИЛИ **рамка/формат листа** (см.
«Следующий инкремент»).
## Текущее состояние (main = origin)
**76 MCP-инструментов, 218 тестов зелёных (141 unit + 77 integration).** Сборка Release чистая.
Три класса функционала:
- **ДЕТАЛЬ** (насыщена): эскизы (полный набор 2D-примитивов), формообразующие (extrude/revolve/
fillet/chamfer/shell/rib/sweep/loft), массивы и зеркало, уклон (`draft`), все типы отверстий
(`hole`/`_counterbore`/`_countersink`/`_conic`), переменные (`create/set/delete_variable`),
STEP import/export, прямое редактирование B-rep (`move_face`/`split_solid_by_plane`/`move_body`/
`boolean_union`), структурный осмотр (`describe_model`/`list_*`/`measure`).
- **СБОРКИ — завершены** (`AssemblyService`, namespace `Kompas.Mcp.Core.Assemblies`, API7):
- `assembly_add_component(filePath, x, y, z)` — вставка детали/подсборки `.m3d`/`.a3d` с позицией.
`IParts7.AddFromFile(path,true,true)``part.Placement.SetOrigin``UpdatePlacement(true)`
`top.RebuildModel(true)`.
- `assembly_add_mate(mateType, x1,y1,z1, x2,y2,z2, value)` — сопряжение граней двух компонентов
(`coincidence`/`distance`). `(IMateConstraints3D)top.MateConstraints.Add(...)``BaseObject1/2`
(грани через `top.FindObjectsByPoint(x,y,z,FirstLevel=false)`) → `Update` → проверка `mate.Valid`.
- `list_components` (чтение сборки) был и раньше.
- **2D-ЧЕРТЁЖ — 4 инкремента готовы** (`DrawingService`, namespace `Kompas.Mcp.Core.Drawings`, API7):
1. `drawing_create_standard_views(partFilePath, scale, x, y)` — стандартные виды (спереди/сверху/
слева) сохранённой модели; возвращает `ViewNumbers` (для адресации видов при простановке размеров).
2. `drawing_fill_title_block(designation?, name?, material?)` — основная надпись (графы 2/1/3).
3. `drawing_add_linear_dimension(x1,y1,x2,y2,x3,y3, orientation, viewNumber)` — линейный размер
(horizontal/vertical/parallel).
4. `drawing_add_diametral_dimension(xc,yc,radius,angle°, viewNumber)` — диаметральный размер (Ø=2R).
Спеки всех фич — в `docs/superpowers/specs/2026-05-27-*.md`. Память (читать перед работой):
`kompas-drawing-api7` (чертёж: виды, штамп, размеры — все приёмы), `kompas-assembly-insert-api7`
(сборки: вставка + сопряжения), `kompas-step-and-assembly-api`, `kompas-hole-api7` (паттерн API7-
сервиса), `kompas-parametric-sketch-findings` (тупик — не повторять).
## Следующий инкремент (на выбор; оба расписаны)
### Вариант A — радиальный / угловой размер (продолжает размеры, ценнее)
Тот же контейнер, что у линейного/диаметрального — `ISymbols2DContainer` (QI от вида); есть готовый
хелпер `RequireSymbols2DContainer(viewNumber)` в `DrawingService`. Точки входа (рефлексия подтвердила):
- Радиальный: `symbols.RadialDimensions` (`IRadialDimensions.Add()``IRadialDimension`):
`Xc,Yc,Radius,Angle` + `DimensionType` + ветви (`AddBranch`/`AddBranchByArcParam`/`ShelfX,Y`).
- Угловой: `symbols.AngleDimensions` (`IAngleDimension`) — задание через две прямые/точки.
**Сделай спайк ДО спека** (у радиального — `DimensionType`/ветви; у углового — что измеряет и как
задаются стороны угла; что в `NominalValue`). Значение читается `((IDimensionText)dim).NominalValue`.
Тест — `*Dimensions.Count` целевого вида вырос + значение (как у диаметрального).
### Вариант B — рамка / формат листа (проще, без спайка)
`ILayoutSheet.Format` (`SheetFormat`) — задать формат листа (A4/A3) и ориентацию. Детерминированно
тестируется (задать формат → прочитать). `doc2d.LayoutSheets.ItemByNumber[1]``.Format`.
Менее ценно, чем размеры, но низкий риск.
## ОТРИЦАТЕЛЬНЫЙ результат (не повторять)
**Параметрические эскизы (переменная двигает геометрию) — НЕДОСТИЖИМЫ через COM-API.**
`ksCDimWithVariable` (`IDrawingObject1.NewConstraint`) `Create()`=FALSE из внешней автоматизации;
`ksCFixedLenght` игнорирует `Expression`-ссылку. См.
`docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md`. НЕ трогать.
## Процесс на каждый инкремент (отлажен — 6 фич за прошлую сессию)
1. **Рефлексия interop** — подтверди сигнатуры (имена/типы могут отличаться от справки):
```powershell
$a7=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/KompasAPI7.dll').Path)
($a7.GetTypes()|?{$_.Name -eq 'IRadialDimension'}).GetProperties()|%{ "$($_.PropertyType.Name) $($_.Name)" }
```
Enum'ы — в `Kompas6Constants`/`Kompas6Constants3D`. **Тестовый проект НЕ ссылается на эти
constants-сборки** → COM-enum в публичном API сервиса оборачивай СВОИМ enum (как `MateType`/
`DimensionOrientation`), unit-тесть по `(int)`-коду нельзя — проверяй только свой enum/Parse.
2. **Семантику API** уточняй субагентом `kompas-sdk-research` (Sonnet, read-only), не рой справку сам.
3. **При неопределённости (привязка к геометрии, координаты, единицы) — СПАЙК ДО СПЕКА**: черновой
метод сервиса + временный `*SpikeTests.cs`, прогнать, зафиксировать находку. (Так делалось для
сопряжений, видов, штампа, линейного и диаметрального размеров — всегда окупалось.)
4. **Краткий спек** в `docs/superpowers/specs/` → коммит → **ревью Codex** (`codex:rescue --fresh` для
новой темы) → внеси обоснованные правки (оценивай технически, отклоняй неуместное с обоснованием —
напр. точечный release RCW отклоняется по конвенции v2-2).
5. **TDD**: метод в `DrawingService` (или новом сервисе), инструмент в `*Tools.cs`, чистые валидаторы
в static (unit), интеграционный тест в `*Tests.cs` (наследует `IntegrationTestBase`, Collection
`KompasCollection`). Спайк-методы/тесты УДАЛИ, промотировав в финальный код.
6. **Ревью Codex реализации** (`--resume` того же треда) → правки.
7. **Документация** субагентом `docs-maintainer` (Sonnet: README/CLAUDE/ARCHITECTURE/OPEN_QUESTIONS/
presentation.html). **Число тестов задавай ТОЧНО по `dotnet test` раннеру** (НЕ по числу
`[Fact]`/`[Theory]` — теории разворачиваются в несколько кейсов).
8. `merge --no-ff` в main → удали ветку → `push origin main` → обнови этот handoff + память.
## Паттерн интеграционного теста
`CreateAsync(...)` → построить/вставить → операция → проверить → `finally CloseAsync`.
- ДЕТАЛЬ — объём/габарит/МЦХ. СБОРКА — габарит/`list_components`.
- ЧЕРТЁЖ — числом, не объёмом: **виды** — `Views.Count`/`ObjectCount`; **размеры** — НЕ в
`IView.ObjectCount` (они в `ISymbols2DContainer`) → считать `ISymbols2DContainer.*Dimensions.Count`
целевого вида; **значение размера** — `((IDimensionText)dim).NominalValue`.
- Артефакты (`.m3d` детали для видов/сборок) — в gitignored `.scratch/` (`TestPaths.NewFile`).
- Возможен ТРАНЗИЕНТНЫЙ сбой пакета сразу после большого прогона (нестабильность КОМПАС) — перезапусти.
## Ключевые ловушки (проверено)
- Все COM-вызовы — на STA-потоке (`KompasDispatcher.InvokeAsync`). Контейнеры берём COM-QI:
`(IModelContainer)part`, `(ISymbols2DContainer)view`, `(IMateConstraints3D)top.MateConstraints`.
- **Размеры чертежа** — в `ISymbols2DContainer` (QI ОТ КОНКРЕТНОГО `IView`), координаты — в ЛОКАЛЬНОЙ
СК вида (= координаты модели на плоскости вида при 1:1). `AutoNominalValue=true` авто-измеряет.
- Углы 2D-размеров — в РАДИАНАХ в API (инструмент экспонирует градусы → `DimensionAngles.ToRadians`).
- Валидацию — в чистые static (unit-тестируемо), проверяй `double.IsFinite`. Проверяй результат
`Update()`/`RebuildModel()`; при неуспехе после `Add()` — откат `.Delete()`.
- НЕ освобождай транзитные RCW точечно — общий отложенный долг (OPEN_QUESTIONS v2-2).
- Команды: `dotnet build -c Release`; `dotnet test --filter "Category=Unit"`;
`dotnet test --filter "Category=Integration"` (нужен запущенный КОМПАС).
Начни с выбора варианта (A — радиальный/угловой размер, рекомендуется; B — рамка/формат листа),
затем рефлексия interop соответствующих интерфейсов + (для A) спайк до спека.