colgen
Colgen — коллекции и конвертеры Go-структур. Используй, когда пишешь цикл, который собирает id, строит map по полю, группирует, заполняет связи или конвертирует список между слоями (включая лямбды в `Map`/`mcp.Map`); при новом DTO или модели домена; при правке collection.go.
- License 许可
- MIT
- 最近更新
- 2026-11-05
- Stars
- ★ 7
- Forks
- 1
01 前言 Front Matter
- name
- colgen
- description
- Colgen — коллекции и конвертеры Go-структур. Используй, когда пишешь цикл, который собирает id, строит map по полю, группирует, заполняет связи или конвертирует список между слоями (включая лямбды в `Map`/`mcp.Map`); при новом DTO или модели домена; при правке collection.go.
03 SKILL.md 正文
Colgen
Upstream: https://github.com/vmkteam/colgen Docs: https://vmkteam.dev/colgen/
Генерирует коллекции (XxxList []Xxx) с утилитарными методами из директив в collection.go. Также: inline-сниппеты, LLM-режимы.
Директивы
//go:generate colgen— запуск генератора в файле//colgen:News,Tag— базовая генерация типов +IDs()+Index()(если есть полеID)//colgen:News:<Method>[,<Method>...]— дополнительные методы- Код должен компилироваться перед запуском — парсинг через AST
Методы
| Директива | Эффект |
|---|---|
NewsID |
NewsIDs() []int (если поле ID нестандартное) |
Index(Field) |
IndexByField() map[T]News |
UniqueField |
уникальные значения (поддерживает *T c nil-check) |
Count(Field) |
CountByField(v) int |
Group(Field) |
GroupByField() map[T]NewsList; для []T — fan-out |
Fill(Target,Junction) |
заполняет связи; режим определяется типом junction |
Cast(Interface) |
Interfaces() []Interface через pointer receiver |
Map(pkg) / MapP(pkg) |
конструктор NewNewsList(in []pkg.News) NewsList |
map/mapp |
то же в lowercase (приватный конструктор) |
Поведение <Field> по типу
- Скаляр
StatusID int→StatusIDs() []int - Слайс
TagIDs []int→ flatten в[]int(не[][]int) - Указатель
Author *Author→[]Authorс nil-check и разыменованием
Fill — определение режима
Fill(Tags,TagIDs) где TagIDs []int → many-to-many через related.Index() + append
Fill(Author,AuthorID) где AuthorID *int → one-to-one с nil-check
Все FillXxx возвращают ll для чейнинга: news.FillTags(tags).FillAuthor(authors)
Map / MapP — конвертеры между слоями
//go:generate colgen -imports=newsportal/pkg/db
//colgen:News,Tag
//colgen:News:UniqueTagIDs,Map(db)
Требования:
- Проект должен содержать дженерики
Map[T,M]/MapP[T,M](pointer-версия) MapP(db)— еслиNewNewsпринимает*db.Newsmap/mapp(lowercase) — приватные конструкторы- Разное имя в
db-слое:Map(db.News)(полный путь) - Структура не в базовой директиве → конструктор вернёт
[]NewsвместоNewsList - Другой пакет для
Map/MapP:-funcpkg=<pkg>+ имя пакета в-importsчерез запятую. ДженерикиMap/MapPживут в пакете домена, API-пакеты берут их оттуда, а не заводят свои:// pkg/rpc/collection.go (vmkteam-reviewer) //go:generate colgen -funcpkg=reviewer -imports=reviewsrv/pkg/reviewer //colgen:Review:mapp(reviewer)
Порядок первой генерации (gotcha)
- Базовые директивы + методы (без Map/MapP)
- Inline-сниппеты конструкторов (
//colgen@NewNews(db)) - Добавить дженерики
Map/MapPв проект - Только теперь добавить
Map(db)в colgen
Если добавить Map(db) сразу — не скомпилируется (нет NewNews), AST-парсинг упадёт.
Восстановление
Если всё сломалось — удалить *_colgen.go и перегенерировать. Но: если сгенерированные функции уже используются в коде — удаление даст нерабочий код, и генератор не запустится. Временно удалить использования, перегенерировать, вернуть.
Рекомендация: один colgen на пакет, директивы в collection.go.
Ручные сборки — сигнал применить colgen
Если в коде собирается вручную то, что генерирует colgen, — замени на метод коллекции, а не пиши ещё один цикл:
| Ручная сборка | Метод colgen |
|---|---|
цикл с map[int]bool для уникальных id поля |
Unique<Field>s() |
map[id]entity из списка |
Index() / IndexBy<Field>() |
[]int id из поля элементов списка |
<Field>s() / IDs() |
map[key][]entity |
Group<Field>() |
mcp.Map(list, func(x dom.X) Y {…}) |
именованный newY(dom.X) Y + //colgen:Y:map(dom.X) с -funcpkg=mcp |
второй Map/MapP в пакете API |
-funcpkg=<domain> |
цикл по []db.X в домене |
из репозитория — сразу NewXs (MapP(db)), коллекция и её методы — в collection.go домена |
Нужного метода нет — добавь директиву в collection.go и make generate.
Коллекции — на моделях домена и API. В pkg/db colgen не кладём, если есть domain-слой: db тонкий (/gold-arch).
Inline-сниппеты
//colgen@<Name>(<pkg>) заменяется прямо в файле на тип + конструктор.
//colgen@NewNews(db) // embed-стиль (домен-слой)
//colgen@newNewsSummary(db.News,full,json) // full + json-теги (API-слой)
Embed-вариант:
type News struct { db.News }
func NewNews(in *db.News) *News { ... }
Full-вариант — явные поля с тегами json:"..." (поле ID получает тег json:"<entityName>Id").
На сложных объектах сниппет может быть невалиден — редактировать вручную.
LLM-режимы
Нужен API-ключ. Отправляется содержимое файла (+ тест) + промт.
//colgen@ai:review→.mdс ревью//colgen@ai:readme→README.mdпо файлу//colgen@ai:tests→_test.go
Суффикс (deepseek) или (claude). DeepSeek по умолчанию.
Маркеры
- Generated:
*_colgen.goс// Code generated by colgen; DO NOT EDIT. - Редактируемые:
collection.go(директивы), файлы inline-сниппетов после первой генерации
04 同仓库更多 Skills
zenrpc
Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.
youtrack
YouTrack — задачи через REST API и pcurl. Используй для поиска issues, создания, обновления описаний, смены assignee/stage/приоритета, логирования времени и работы с комментариями.
topsrv
topsrv — метрики, алерты, CVE и HTTP-логи серверов проекта через публичный JSON-RPC API app.topsrv.io. Используй, когда нужна загрузка CPU, памяти или диска хоста, метрики PostgreSQL/nginx/angie агента topsrv (`topsrv_*`), какие алерты горят, уязвимые пакеты на серверах или кто (боты, сети, IP) нагружает сайт.
testing
Testing — используй всегда, когда пишешь или правишь Go-тесты (*_test.go), в том числе по сценариям Given/When/Then из spec: фреймворк как в соседних файлах, префикс TestDB, фабрики pkg/db/test, реальная БД без моков. Также при настройке TestMain/test-short и когда тесты падают в gate, но проходят локально.
solve
Solve — полный цикл решения задачи из YouTrack: preflight → анализ → план → реализация → ревью → коммит. Используй при любой YouTrack-задаче (`/solve PLF-819`); флаг `--fast` сокращает HITL для тривиальных багфиксов.
skills-check
Skills Check — smoke-тесты интеграций из project-index.md. Используй для проверки что pcurl-профили и URL всех data-source скиллов ещё живы.