Tenniarb - нативное macOS-приложение (AppKit) для моделирования диаграмм с вычислениями.
Ключевая идея: структура + вычисления в формате .tenn.
- Язык/платформа: Swift, Xcode project (
Tenniarb.xcodeproj) - UI: программно (без storyboard/xib)
- Вычисления:
JavaScriptCore(ExecutionContext) - Markdown: пакет
cmkdown(SwiftPM, см.Package.resolved)
Tenniarb/- основной код приложенияTenniarb/model/- модель, операции, undo/redo, вычисленияTenniarb/document/- NSDocument-слой, парсинг/чтение/запись.tennTenniarb/document/tenn/- lexer/parser Tenn (TennLexer,TennParser)Tenniarb/views/+ViewController.swift+SceneDrawView.swift- UI и взаимодействиеTenniarb/ElementScene.swift- рендер диаграмм/текстаgo/- Go-версия (план в../my-tasks/tenniarb/roadmap.md), модульgithub.com/haiodo/tenniarb/go.go/tenn- lexer, parser, printer; golden-тест на общихweb/fixtures. Спецификация расширенного формата -docs/spec/tenn-scene.md.web/- TypeScript-версия (план в../my-tasks/tenniarb/plan.md, раздел 3). npm workspacespackages/*, тестыnode:testна.tsбез компиляции.web/bench/- бенчмарки рендера, вне workspaces.web/packages/mindmap- встраиваемый mind map без вычислений (план, раздел 6): текстовый протокол блока, бандлdist/mindmap.js.TenniarbTests/- unit tests (518 тестов, ~70% покрытия);PerformanceTestsвынесены в схемуTenniarb-Performance. Схема скипает все остальные suite поимённо - при добавлении нового тестового класса список надо дополнить, иначе он попадёт в perf-прогон.TenniarbUITests/- UI tests (таргет собирается, но в схемеTenniarbотключен:skipped = "YES").github/workflows/- CI и release pipeline
Все команды собраны в Makefile, make help показывает список:
make build # сборка Debug
make test # unit-тесты (без performance)
make test-only T=TenniarbTests/LexerTests
make perf # только performance-тесты (схема Tenniarb-Performance)
make lint # SwiftLint
make lint-fix # автокоррекции SwiftLint
make format # swift-format --in-place
make format-check # падает если код не отформатирован
make ci # SwiftLint + Xcode-сборка и тесты (локально, для Swift-истории)
make clean
make web # сборка web/packages
make web-test # typecheck + тесты web/
make go-test # go vet + go test для go/Инструменты:
- Линтер - SwiftLint (
.swiftlint.yml), ставится черезbrew install swiftlint. - Форматтер -
swift-formatиз Xcode toolchain (.swift-format), ставить нечего.
Performance-тесты исключены из основного прогона (36 сек из 36.5) через SkippedTests в схеме
Tenniarb. -only-testing не перекрывает SkippedTests, поэтому для них заведена отдельная
схема Tenniarb-Performance, а не флаг.
Если xcodebuild падает из-за plugin/runtime окружения Xcode, сначала привести локальный Xcode в рабочее состояние (xcodebuild -runFirstLaunch) и повторить.
- Пушит только владелец. Агент готовит правку и коммит,
git pushи релизы - на человеке. - Сохранять совместимость формата
.tenn.
- Любые изменения в parser/lexer/persistence должны не ломать чтение существующих файлов.
- Не обходить
ElementModelStoreпри изменениях модели из UI.
- Операции должны идти через store, чтобы сохранялись undo/redo, уведомления и пересчет.
- Учитывать потокобезопасность вычислительного движка.
ExecutionContextсинхронизирован черезsyncQueue; не добавлять доступ к JS-контексту в обход этой модели.
- Сохранять текущий стиль построения UI.
- Окна/контроллеры создаются программно (
Document,Application,AppDelegate), не добавлять storyboard/xib без явной необходимости.
- Не вносить случайные изменения в
project.pbxproj.
- Менять version/build settings только когда это часть задачи.
-
GUI-тесты открывают окна на машине владельца и забирают фокус: спрашивать разрешение перед
GOWT_GUI_TEST=1 go test ./app .... Обычныеgo test ./...окна не открывают. -
Для любых Swift-изменений:
swiftlint lint --config .swiftlint.yml
- Для parser/lexer/persistence:
TenniarbTests/TennTests.swiftTenniarbTests/PersistenceTests.swift
- Для Markdown/рендера текста:
TenniarbTests/MarkDownTests.swift- релевантные участки в
ElementScene.swift
- Для рендера/экспорта:
TenniarbTests/svh-generate/TestSVGGenerate.swift(если затронут экспорт/scene rendering)
- Для изменений в логике модели:
- релевантные тесты + проверка, что undo/redo и refresh-события не регресснули.
- CI workflow (
.github/workflows/ci.yml) проверяет Go (vet + тесты на macOS, Linux и Windows), web-пакеты (typecheck + тесты) и гоняет GUI-тесты под Xvfb. Swift-приложение больше не собирается в CI: Xcode-проект остаётся в дереве как история. - Release workflow (
.github/workflows/release.yml) запускается по тегу:- собирает Release
- архивирует
Tenniarb.appв zip - публикует GitHub Release
- обновляет
MARKETING_VERSIONвTenniarb.xcodeproj/project.pbxprojна default branch
Перед изменениями release-логики проверять, что шаг обновления версии в project.pbxproj останется консистентным.
- Рефакторинг всей архитектуры UI
- Массовая смена формата
.tenn - Смена схемы релизов/тегов без явного запроса