454a90100a
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>
117 lines
11 KiB
Markdown
117 lines
11 KiB
Markdown
# Промт для следующей сессии
|
||
|
||
Скопируй блок ниже как стартовое сообщение новой сессии 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) спайк до спека.
|