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

10 KiB
Raw Blame History

Промт для следующей сессии

Скопируй блок ниже как стартовое сообщение новой сессии 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-я ось у ksMeshCopyDefinitionSetAxis2+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):
    $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, затем первый инкремент — линейный массив.