CLI и библиотека для валидации, анализа и генерации архитектуры микросервисных систем, описанной "as Code" (PlantUML C4, Structurizr).
Инструменты для работы с архитектурой в формате "as Code":
- Код и примеры покрытия тестами микросервисной архитектуры, описанной в plantuml (#)
- Автогенерация архитектуры (#)
- Тестирование архитектуры модульного монолита (#)
Планы развития инструментов и репозитория. PullRequest'ы и Issues'ы приветствуются.
Справочник принципов и паттернов проектирования с примерами покрытия их тестами (пополняется...)
Телеграм-канал: Архитектура распределённых систем
aact можно использовать двумя способами: как CLI (npx aact check, авто-фикс, генерация артефактов) или как библиотеку (импортировать checkAcl, analyzeArchitecture и пр. в свои тесты на vitest/jest). CLI — ниже, library-режим — в соответствующем разделе.
В пустой папке:
# Создаёт aact.config.ts и стартовый architecture.puml с одним
# умышленным нарушением, чтобы было что чинить
npx aact init
# Покажет 1 нарушение CRUD-правила (orders → orders_db напрямую)
npx aact check
# Применит auto-fix: добавит orders_repo как посредника к БД
npx aact check --fix
# Снова чисто
npx aact checkПосле этого правь architecture.puml под свою систему — синтаксис
C4-PlantUML.
npx aact check --dry-run # preview auto-fix без записи
npx aact analyze # coupling/cohesion метрики
npx aact generate --format plantuml # сгенерировать .puml из источника
npx aact generate --format kubernetesДля
structurizrукажитеsource.writePathвaact.config.ts— путь кworkspace.dsl, в который пишутся правки от--fix.
Два файла рядом:
aact.config.ts— настройки источника и набор включённых правил. Используетimport type { AactConfig }— рантайм-резолва пакета не происходит, поэтомуnpx aact checkработает безnpm install aact.architecture.puml— стартовая C4-схема с одним сервисом, одной БД и умышленным нарушением CRUD-правила. Замени на свою.
// aact.config.ts (фрагмент)
import type { AactConfig } from "aact";
const config: AactConfig = {
source: {
type: "plantuml", // "plantuml" | "structurizr"
path: "./architecture.puml",
},
rules: {
acl: true,
acyclic: true,
apiGateway: true,
crud: true,
dbPerService: true,
cohesion: true,
stableDependencies: true,
commonReuse: true,
},
};
export default config;import {
loadPlantumlElements,
mapContainersFromPlantumlElements,
checkAcl,
checkAcyclic,
checkCrud,
analyzeArchitecture,
} from "aact";
const elements = await loadPlantumlElements("architecture.puml");
const model = mapContainersFromPlantumlElements(elements);
// Проверка правил
const aclViolations = checkAcl(model.allContainers);
const cyclicViolations = checkAcyclic(model.allContainers);
// Анализ метрик
const { report } = analyzeArchitecture(model);
console.log(`Elements: ${report.elementsCount}`);Запускаемые из коробки (склонируй репо, cd examples/<name>, npx aact check):
examples/ecommerce-structurizr/— Structurizr-источник сworkspace.json+workspace.dsl, полный цикл правил и auto-fix.examples/violations-demo/— мини-набор умышленных нарушений по каждому правилу — чтобы посмотреть, как выглядит вывод и какие правки предлагает--fix.
Тестовые сценарии (для разработчиков пакета, запускаются через vitest):
examples/banking-plantuml/иexamples/microservices-structurizr/— интеграционные тесты архитектуры изresources/.
- Справочник паттернов — принципы и паттерны с примерами тестов
- ADR — Architecture Decision Records
- Roadmap — планы развития
https://www.youtube.com/watch?v=POIbWZh68Cg https://www.youtube.com/watch?v=tZ-FQeObSjY

https://www.youtube.com/watch?v=fb2UjqjHGUE
Раз архитектура — «as Code», почему бы её не покрыть тестами?!
Тема идеи и данный открытый репозиторий вызвал неожиданную волну позитивных отзывов о попадании в яблочко болей и о применимости и полезности решения :)
Подход помогает решить проблемы неактуальности, декларативности и отсутствия контроля ИТ-архитектур и инфраструктуры (ограничение и требование — архитектура и инфраструктура должны быть "as code").
Тесты проверяют 2 больших блока:
- актуальность архитектуры реальному работающему в продакшне решению
- соответствие "нарисованной" архитектуры выбранным принципам и паттернам проектирования
Подробнее о подходе, решаемых проблемах, схеме работы представленного в репозитории примера и проверяемых в тестах репозитория принципах — на слайдах.
- find diff in configs and uml containers — проверяет актуальность списка микросервисов на архитектуре и в конфигурации инфраструктуры
- find diff in configs and uml dependencies — проверяет актуальность зависимостей (связей) микросервисов на архитектуре и в конфигурации инфраструктуры
- check that urls and topics from relations exist in config — проверяет соответствие между параметрами связей микросервисов (REST-урлы, топики kafka) на архитектуре и в конфигурации инфраструктуры
- only acl can depend on external systems — проверяет, что не нарушен выбранный принцип построения интеграций с внешними системами только через ACL (Anti Corruption Layer). Проверяет, что только acl-микросервисы имеют зависимости от внешних систем.
- connect to external systems only by API Gateway or kafka — проверяет, что все внешние интеграции идут через API Gateway или через kafka
Сравнение белковой составленной вручную архитектуры и сгенерированной.
Тестами можно покрывать не только архитектуру микросервисов, но архитектуру монолитов, особенно, если они модульные.
Информацию об архитектуре реализованной системы можно извлечь и из ее кода, особенно, если он написан качественно;)