Перейти к основному содержимому

Схема dagstack.toml

Полная таблица полей манифеста плагина. Нормативный JSON Schema 2020-12 — в spec-репозитории _meta/manifest.schema.json.

Манифест может жить в одном из четырёх форматов:

  • dagstack.toml (Python и Go convention) — основной формат.
  • dagstack.json (TypeScript/Node convention).
  • Секция [tool.dagstack.plugin] в pyproject.toml (для Python-плагинов на PyPI).
  • Поле dagstack в package.json (для TypeScript-плагинов на npmjs.org).

При наличии нескольких форматов приоритет: dagstack.tomldagstack.json → встроенный в пакет.

Корневая секция [plugin]

Обязательные поля

ПолеТипОписание
schema_versionstringВерсия JSON-схемы манифеста. На v1.0 = "1".
namestringИмя плагина, уникальное в пределах kind. Строчные буквы, цифры, -, _.
kindstringВид плагина — opaque string для ядра; приложение определяет список видов.
runtimestring | string[]Исполняющая среда: "in_process" / "mcp_stdio" / "mcp_http". Допустим массив.
core_versionstringSemver range для версии dagstack-plugin-system. Пример: "^0.2", ">=0.3.0 <1.0.0".
entry_pointstringМодуль и класс: "module:ClassName". REQUIRED для in_process.

Метаинформация

ПолеТипПо умолчаниюОписание
versionstringSemver собственная версия плагина.
descriptionstringКраткое описание для человека.
authorsstring[][]Список авторов.
homepagestringURL домашней страницы плагина.
licensestringSPDX-идентификатор лицензии (например, "Apache-2.0").

Lifecycle и порядок (ADR-0002)

ПолеТипПо умолчаниюОписание
priorityint (0..100)0Приоритет для dispatch и lifecycle-ordering. Больше = раньше/важнее. Range [1000, ∞) зарезервирован за horizontal-middleware (ADR-0005).
depends_onstring[] | object[][]Список имён плагинов-зависимостей (или массив объектов {kind, name} для полной формы).
tryfirstboolfalseEscape-hatch для отладки: форсированно первым. Не замена priority/depends_on в production.
trylastboolfalseФорсированно последним. Несовместимо с tryfirst=true.
startup_timeout_secint30Таймаут на setup() плагина.
teardown_timeout_secint15Таймаут на teardown().

Dispatch (ADR-0002)

ПолеТипПо умолчаниюОписание
execution_modelstring"sync""async" / "sync" / "thread_cpu_bound" / "process_cpu_bound".
in_process_onlyboolfalseЕсли true, плагин живёт только в in_process-runtime (не может быть изолирован через MCP).
supports_languagesstring[][]Для capability-dispatch: языки, которые плагин обрабатывает.
supports_extensionsstring[][]Для capability-dispatch: расширения файлов.
supports_mime_typesstring[][]Для capability-dispatch: MIME-типы.
fallbackboolfalseЕсли true, плагин принимает все входы, не подошедшие другим. Ровно один на kind.
capabilitiesstring[][]Произвольные capability-идентификаторы (для governance-filtering и custom routing).

Секция [plugin.resources]

Декларация ресурсов, которые плагин ожидает получить через PluginContext.resources.

ПолеТипПо умолчаниюОписание
requiredstring[][]Обязательные ресурсы. При несоответствии плагин помечается unavailable.
optionalstring[][]Опциональные. Доступ даёт None если не предоставлено.

Стандартные имена ресурсов — на странице Стандартные ресурсы.

Секция [plugin.unit_of_work]

Для долгоживущих плагинов, выполняющих UoW через orchestrator (ADR-0003 §5).

ПолеТипПо умолчаниюОписание
declaredboolfalsetrue — плагин является UoW-плагином.
partition_keystringКлюч шардирования (tenant_id, repo_id, ...).
estimated_duration_secintОценка длительности — подсказка планировщику.
idempotency_modestring"none""input_hash" / "output_hash" / "none".
checkpointableboolfalseПоддерживает ли плагин resume через ctx.checkpoint.
content_hashstring[][]Перечень полей для вычисления ключа идемпотентности.

Секция [plugin.mcp_stdio] (для runtime = "mcp_stdio")

ПолеТипПо умолчаниюОписание
commandstring[]REQUIRED. Команда запуска подпроцесса (аргументы передаются массивом).
working_dirstringcwd процессаРабочая директория подпроцесса.
envobject{}Переменные окружения для подпроцесса.
startup_timeout_secint30Таймаут initial handshake.

Секция [plugin.mcp_http] (для runtime = "mcp_http")

ПолеТипПо умолчаниюОписание
urlstringREQUIRED. Базовый URL MCP-сервиса.
auth_headerstringИмя HTTP-заголовка для передачи bearer-токена.
auth_secret_envstringИмя env-переменной, содержащей secret (host подставит в заголовок).
timeout_secint60Таймаут на один запрос.
tls_ca_bundlestringПуть к корпоративному CA-bundle для TLS (опционально).

Секция [plugin.metadata]

Произвольные ключи, не интерпретируемые ядром plugin-system. Могут использоваться приложением или горизонтальными middleware.

[plugin.metadata]
owner_team = "search-platform"
runbook = "https://runbook.example.org/chunker"
on_call = "search-oncall@example.com"

Полный пример

plugins/advanced-chunker/dagstack.toml
[plugin]
schema_version = "1"
name = "advanced-chunker"
kind = "chunker"
runtime = ["in_process", "mcp_stdio"]
core_version = ">=0.1.0,<1.0.0"
entry_point = "plugin:AdvancedChunker"
version = "1.2.0"
description = "Семантический чанкер на основе Tree-sitter с fallback на длину."
authors = ["dagstack"]
license = "Apache-2.0"

priority = 50
depends_on = ["tokenizer"]
execution_model = "thread_cpu_bound"

supports_languages = ["python", "typescript", "go"]
supports_extensions = [".py", ".ts", ".go"]
fallback = false

[plugin.resources]
required = ["clock"]
optional = ["blob_store"]

[plugin.unit_of_work]
declared = true
partition_key = "repo_id"
idempotency_mode = "input_hash"
checkpointable = true

[plugin.mcp_stdio]
command = ["python", "-m", "advanced_chunker.server"]
startup_timeout_sec = 60

[plugin.metadata]
owner_team = "search-platform"
runbook = "https://runbook.example.org/chunker"

Валидация

Ядро валидирует манифест при discover() против JSON-Schema 2020-12. Нарушения — ManifestInvalid с указанием поля и типа ошибки. Примеры типичных ошибок:

  • Отсутствует обязательное поле (name, kind, runtime, ...).
  • Неверный тип (priority = "50" вместо числа).
  • Неверное значение enum (runtime = "in-process" с дефисом вместо "in_process").
  • Семвер-несовместимость (core_version = "0.1" вместо диапазона).

См. также