Контракт упаковки когорт
Стабильный, потребляемый ниже по потоку контракт для упаковки когорт и манифестов плагинов — перечислить когорты и разрешить их нативные цели по окружениям без повторного выведения сопоставления.
Контракт упаковки когорт
Этот документ задаёт стабильный, потребляемый ниже по потоку контракт для упаковки когорт и манифестов плагинов. Потребитель читает этот контракт, чтобы перечислить когорты и разрешить их нативные цели по окружениям без повторного выведения сопоставления.
Артефакты
| Артефакт | Роль |
|---|---|
src/apothem/schemas/cohort.schema.json | JSON Schema для документа манифеста когорты. |
src/apothem/schemas/cohort-manifest.yaml | Экземпляр манифеста когорт — все шесть когорт (core, developer, security, research, ai-engineering, full) заполнены своими наборами участников; full — это объединение остальных пяти. |
src/apothem/schemas/plugin.schema.json | JSON Schema для манифеста плагина на пакет (plugin.json). |
src/apothem/lib/propagation-manifest.yaml | Источник истины для нативных целей по окружениям. |
Форма манифеста когорт
Манифест когорт — это объект верхнего уровня с тремя ключами:
version— строка SemVer манифеста.cohorts[]— одна запись на когорту. Каждая запись имеетid(из закрытого набораcore | developer | security | research | ai-engineering | full),name,descriptionиmembers(объект, группирующий идентификаторы участников по типу каталога:skills/agents/commands/rules/hooks).per_harness_targets— контракт разрешения (ниже).
Каждый идентификатор участника — это стабильное имя в kebab-case, которое
соответствует реальному артефакту под src/apothem/ (skills/<name>/,
agents/<name>.md, commands/<name>.md, rules/<name>.md или записи hooks/).
Перечисление когорт
Потребитель загружает cohort-manifest.yaml, проверяет его относительно
cohort.schema.json, затем перебирает cohorts[]. Для каждой когорты он читает
members.<type>, чтобы получить идентификаторы участников каждого типа каталога.
Разрешение нативных целей по окружениям (без повторного выведения)
Манифест когорт не повторяет сопоставление окружений. Вместо этого
per_harness_targets.source указывает на lib/propagation-manifest.yaml —
единственный источник истины. Правило разрешения:
Для участника когорты типа каталога
T(один изskills,agents,commands,rules,hooks) и целевого окруженияH(одного из перечисленных вper_harness_targets.harnesses) нативная цель плагина — это полеtargetзаписи вlib/propagation-manifest.yamlподharnesses.H.install, чейsourceсовпадает сT/.
Например, skill когорты core, установленный для claude_code, разрешается
через запись harnesses.claude_code.install с source: "skills/" в
target: "${HARNESS_ROOT}/skills/". Тот же skill для opencode разрешается в
${HARNESS_ROOT}/skills/; для gemini_cli — в ${PROJECT_ROOT}/.gemini/skills/.
Потребители никогда не выдумывают цели окружений — они их ищут.
Плейсхолдеры ${HARNESS_ROOT} / ${PROJECT_ROOT} разрешаются во время установки
каждым адаптером окружения; потребители когорт трактуют разрешённую target
буквально.
Роль манифеста плагина
plugin.schema.json описывает plugin.json — самоописывающий пакет участников
каталога (skills / commands / agents / hooks / rules) с обязательным
name, SemVer version и description. Манифест плагина — это единица, которую
адаптер окружения материализует в свою нативную поверхность плагина; когорты
выбирают, каких участников несёт плагин, а манифест распространения разрешает, где
эти участники приземляются по окружениям.
Решение об упаковке — один зонтичный пакет, логические когорты
Когорты — это логический слой выбора (этот манифест), а не набор отдельных, независимо устанавливаемых пакетов. Apothem поставляет один зонтичный пакет, несущий полный каталог; манифест когорт позволяет потребителю выбрать согласованное подмножество, а манифест распространения разрешает, где приземляется каждый выбранный участник по окружениям.
Разбиение каталога на отдельные пакеты по когортам (например, один пакет на
семейство developer / security / research) достижимо без дублирования на
уровне репозитория через паттерн символических ссылок мета-плагина,
задокументированный основной поверхностью распространения: один каталог
маркетплейса перечисляет несколько плагинов когорт, и каждый каталог плагина
когорты содержит символические ссылки на общий каталог с единым источником
вместо копий. Когда когорта устанавливается, окружение разыменовывает каждую
символическую ссылку внутри маркетплейса — копируя содержимое цели в кэш этой
когорты — так что установленная когорта самодостаточна, тогда как репозиторий
сохраняет единый источник истины, связанный символическими ссылками (связывание
вместо избыточности, ровно так, как предпочитает дисциплина дедупликации). Раннее
прочтение о том, что пакеты когорт «механически дублируют» каталог, смешивало
дублирование кэша во время установки (обычное копирование на плагин,
выполняемое окружением) с дублированием репозитория; паттерн символических
ссылок избегает последнего.
Apothem в настоящее время поставляет один зонтичный пакет, потому что это самая простая поверхность распространения, а не потому, что когорты механически невозможны. Принятие формы по когортам — это подлинный компромисс между UX и сопровождением, а не нарушение дедупликации: преимущество — более тонкий опыт «установить только это семейство»; затраты — сопровождение N каталогов символических ссылок когорт плюс их записей в маркетплейсе, более крупная поверхность соответствия / тестов / golden и копии кэша во время установки по когортам. Логический слой когорт выше уже обеспечивает результат выбора «установить только то, что нужно» из единого пакета; упаковка по когортам — это следующий шаг, когда требуется более тонкий UX установки.