Files
kompas3d-mcp/docs/superpowers/NEXT-SESSION.md
T

104 lines
10 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 должен быть запущен (нужен для интеграционных тестов).
## Текущее состояние (main, синхронизирован с origin)
- 70 MCP-инструментов, 119 тестов зелёных (69 unit + 50 integration).
- Пакет A «богаче эскизы» — готов (дуга×2, эллипс, ломаная, многоугольник, сплайн, точка).
- Пакет B «формообразующие» — основная часть готова: shell, rib, sweep, loft.
- Пакет C «массивы и зеркало» — ГОТОВ: `linear_pattern`, `circular_pattern`,
`mirror_operation`, `mirror_body`. Источник копирования — id операций из реестра `_features`
(хелпер `RequireFeature`); оси — `CoordinateAxis`/`CoordinateAxes` (`Core/Modeling`).
- `hole` — отверстия ГОТОВЫ (через **API7**, в API5 определения нет): `HoleService`
(`Core/Modeling/HoleService.cs`). Все типы: простое (`hole`), цековка (`hole_counterbore`,
`ksHTCounterbore`), зенковка (`hole_countersink`, `ksHTCountersinking`), коническое
(`hole_conic`, `ksHTConic`). `HoleCore` рефакторен под `configure`-колбэк (`HoleParameters`
после `HoleType`). Прецедент: первая формообразующая на API7. Направление в тело — по убыли
объёма. Ещё не сделано: резьба (`ShowThread`/`IThread`) — трудно тестировать (нет Δобъёма).
- `draft` — уклон граней ГОТОВ (через **API5** `ksInclineDefinition`/`o3d_incline=42` — операция
«Incline», не «Draft»; стандартный паттерн `PartModeler.Features.cs`, регистрируется в `_features`).
Эмпирика: `direction=false`=расширение, `true`=сужение → маппинг `!outward`.
- Пакет D «параметрика» НАЧАТ: переменные модели — `create_variable`, `set_variable`,
`delete_variable` (`VariableService`, API5 `ksVariable`). Создание на коллекции корневого
`ksFeature` (СВОЙСТВО `VariableCollection`); `Expression` ведущее; `RebuildModel`+re-fetch.
`list_variables` починен (видит все переменные). ОГРАНИЧЕНИЕ: переменные драйвят геометрию лишь
в параметрических эскизах (у нас эскизы на литералах — пока не драйвят).
- Пакет E начат: смещённая плоскость (`sketch_create_on_offset_plane`).
- `PartModeler` разбит на partial: `PartModeler.cs` (ядро + helpers `SelectFaceByIndex`/
`SelectEdgeByIndex` + `RequireFeature` + `NewParam<T>`), `.Sketch.cs` (эскизы/примитивы),
`.Features.cs` (операции, включая массивы/зеркало/уклон). API7-сервисы: `HoleService`, `FaceEditService`.
- Чистые маппинги/валидация — в `SketchGeometry` (Core/Modeling); тип точки — `SketchPoint` (Host).
- Прочитай память: `kompas-formative-features-api5` (definition в API5; draft=Incline есть),
`kompas-pattern-mirror-api5` (пакет C), `kompas-hole-api7` (hole + цековка/зенковка),
`kompas-variables-api5` (переменные), `kompas-parametric-sketch-findings` (тупик — не повторять).
## ОТРИЦАТЕЛЬНЫЙ результат (не повторять)
- **Параметрические эскизы (переменная двигает геометрию) — НЕДОСТИЖИМЫ через доступный COM-API.**
Решающий spike: `ksCDimWithVariable` (`IDrawingObject1.NewConstraint`) `Create()`=FALSE из внешней
автоматизации; `ksCFixedLenght` строится, но игнорирует `Expression` со ссылкой на переменную.
Полная разведка: `docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md`. Параметрика
ограничена CRUD переменных (готово). НЕ тратить время на этот путь повторно.
## Задача следующей сессии (по приоритету)
1. Расширения пакета C: **2D-сетка линейного массива** (2-я ось у `ksMeshCopyDefinition`
`SetAxis2`+`count2`), выбор оси массива/нейтральной плоскости по ребру/грани, массив вдоль
кривой (`o3d_curveCopy=37`/`ksCurveCopyDefinition`). Низкий риск (паттерн пакета C известен).
2. Расширения draft: уклон от ребра (`IDraftFromEdges`, API7); нейтральная плоскость по грани.
3. **2D-чертёж** / **сборки** — крупные отдельные вехи (ассоциативные виды детали; вставка
компонентов, сопряжения). Самый ценный нереализованный класс после геометрии детали.
4. Резьба отверстия (`ShowThread`/`IThread`) — мелочь, трудно тестировать.
Типы отверстий завершены (простое/цековка/зенковка/коническое). Параметрика — CRUD переменных
(управление геометрией недостижимо, см. findings). Деталь как класс операций близка к насыщению —
дальше логично 2D-чертёж и сборки.
Бери по одной операции за инкремент, доводи до зелёного и merge+push, потом следующую.
Не пытайся сделать весь пакет одним заходом — инкремент надёжнее.
## Процесс на каждую операцию (отлажен в прошлых сессиях)
1. Рефлексия interop — найди definition и `Obj3dType`. Пример команды (PowerShell):
```powershell
$a5=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/Kompas6API5.dll'))
$c3=[Reflection.Assembly]::LoadFrom((Resolve-Path 'libs/kompas-interop/Kompas6Constants3D.dll'))
# перечисли Obj3dType со словом array/pattern/mirror; покажи свойства/методы ksXxxDefinition
```
Если definition в API5 нет — проверь API7 или отметь блокером (как draft).
2. Семантику параметров уточняй через навык `kompas-sdk-research` (субагент Sonnet),
не рой справку сам.
3. Краткий спек в `docs/superpowers/specs/` → коммит → ОТДАЙ НА РЕВЬЮ Codex (`codex:rescue`,
`--fresh` для новой темы) → внеси обоснованные правки (оценивай технически, не слепо).
4. Реализация TDD: метод в `PartModeler.Features.cs` (паттерн `NewEntity(o3d_*)` →
`GetDefinition` → настройка → `Create` → регистрация в `_features`, возврат id), инструмент
в `FeatureTools.cs`, интеграционный тест в `FeatureOpsTests.cs`.
5. Codex-ревью реализации (`--resume` того же треда) → правки.
6. Документация через навык `docs-delegate` (Sonnet обновит README/CLAUDE/ARCHITECTURE/
presentation.html, сверит счётчики по факту).
7. `merge --no-ff` в main, удали ветку, `push origin main`.
## Паттерн интеграционного теста
`CreateAsync(Part)` → построить геометрию → операция → `RebuildAsync` →
проверить объём (`GetPartInfoAsync`) и/или габарит (`GetBoundingBoxAsync`); `finally CloseAsync`.
Считай ожидаемый объём аналитически и сверяй `InRange ±5%`; для нестрогих форм — ±10% или
проверка габарита / «after vs before».
## Ключевые ловушки (проверено)
- Выбор грани/ребра — по стабильному индексу из `list_faces`/`list_edges` (helper'ы
`SelectFaceByIndex`/`SelectEdgeByIndex` в ядре); индекс валиден, пока геометрия не менялась.
- Углы у эскизных/формообразующих — в градусах.
- param-структуры (эллипс/полигон/nurbs) — через `NewParam<T>(StructType2DEnum)`, освобождать.
- Валидацию выноси в `SketchGeometry` как чистые static (unit-тестируемо); проверяй
`double.IsFinite` (NaN проходит через `<= 0`), дедуплицируй списки индексов.
- НЕ освобождай транзитные RCW точечно в одной операции — это общий отложенный долг
(OPEN_QUESTIONS v2-2), консистентность важнее; единый рефакторинг — отдельной задачей.
- Команды: `dotnet build -c Release`; `dotnet test --filter "Category=Unit"`;
`dotnet test --filter "Category=Integration"` (нужен запущенный КОМПАС).
Начни с рефлексии interop для массивов (пакет C) и `kompas-sdk-research` по найденному
definition, затем первый инкремент — линейный массив.