[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MWYRXNF7HHT87RAQY9071X":3,"skill-same:01M6MWYRXNF7HHT87RAQY9071X":54},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":6,"ownerHtmlUrl":38,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":39,"install":40,"resources":53},"01M6MWYRXNF7HHT87RAQY9071X","colgen",null,"Colgen — коллекции и конвертеры Go-структур. Используй, когда пишешь цикл, который собирает id, строит map по полю, группирует, заполняет связи или конвертирует список между слоями (включая лямбды в `Map`\u002F`mcp.Map`); при новом DTO или модели домена; при правке collection.go.","vmkteam\u002Fclaude-plugins","vmkteam","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F55537877?v=4","01M6MWYAFDCD63N1M8MBJA6T0S","01M6MWYAKHK0QCPR0Y7AW5SH0R",7,"MIT","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fcolgen\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,23,24,25,26,27],"MCP","go","collection","map","id","2026-11-10 10:12:30",false,"---\nname: colgen\ndescription: \"Colgen — коллекции и конвертеры Go-структур. Используй, когда пишешь цикл, который собирает id, строит map по полю, группирует, заполняет связи или конвертирует список между слоями (включая лямбды в `Map`\u002F`mcp.Map`); при новом DTO или модели домена; при правке collection.go.\"\n---\n\n# Colgen\n\nUpstream: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fcolgen\nDocs: https:\u002F\u002Fvmkteam.dev\u002Fcolgen\u002F\n\nГенерирует коллекции (`XxxList []Xxx`) с утилитарными методами из директив в `collection.go`. Также: inline-сниппеты, LLM-режимы.\n\n## Директивы\n\n- `\u002F\u002Fgo:generate colgen` — запуск генератора в файле\n- `\u002F\u002Fcolgen:News,Tag` — базовая генерация типов + `IDs()` + `Index()` (если есть поле `ID`)\n- `\u002F\u002Fcolgen:News:\u003CMethod>[,\u003CMethod>...]` — дополнительные методы\n- Код **должен компилироваться** перед запуском — парсинг через AST\n\n### Методы\n\n| Директива | Эффект |\n|-----------|--------|\n| `NewsID` | `NewsIDs() []int` (если поле ID нестандартное) |\n| `Index(Field)` | `IndexByField() map[T]News` |\n| `UniqueField` | уникальные значения (поддерживает `*T` c nil-check) |\n| `Count(Field)` | `CountByField(v) int` |\n| `Group(Field)` | `GroupByField() map[T]NewsList`; для `[]T` — fan-out |\n| `Fill(Target,Junction)` | заполняет связи; режим определяется типом junction |\n| `Cast(Interface)` | `Interfaces() []Interface` через pointer receiver |\n| `Map(pkg)` \u002F `MapP(pkg)` | конструктор `NewNewsList(in []pkg.News) NewsList` |\n| `map`\u002F`mapp` | то же в lowercase (приватный конструктор) |\n\n### Поведение `\u003CField>` по типу\n\n- Скаляр `StatusID int` → `StatusIDs() []int`\n- Слайс `TagIDs []int` → **flatten** в `[]int` (не `[][]int`)\n- Указатель `Author *Author` → `[]Author` с nil-check и разыменованием\n\n### Fill — определение режима\n\n`Fill(Tags,TagIDs)` где `TagIDs []int` → many-to-many через `related.Index()` + append\n`Fill(Author,AuthorID)` где `AuthorID *int` → one-to-one с nil-check\nВсе `FillXxx` возвращают `ll` для чейнинга: `news.FillTags(tags).FillAuthor(authors)`\n\n## Map \u002F MapP — конвертеры между слоями\n\n```go\n\u002F\u002Fgo:generate colgen -imports=newsportal\u002Fpkg\u002Fdb\n\u002F\u002Fcolgen:News,Tag\n\u002F\u002Fcolgen:News:UniqueTagIDs,Map(db)\n```\n\nТребования:\n- Проект должен содержать дженерики `Map[T,M]` \u002F `MapP[T,M]` (pointer-версия)\n- `MapP(db)` — если `NewNews` принимает `*db.News`\n- `map`\u002F`mapp` (lowercase) — приватные конструкторы\n- Разное имя в `db`-слое: `Map(db.News)` (полный путь)\n- Структура не в базовой директиве → конструктор вернёт `[]News` вместо `NewsList`\n- Другой пакет для `Map\u002FMapP`: `-funcpkg=\u003Cpkg>` + имя пакета в `-imports` через запятую. Дженерики `Map`\u002F`MapP` живут в пакете домена, API-пакеты берут их оттуда, а не заводят свои:\n  ```go\n  \u002F\u002F pkg\u002Frpc\u002Fcollection.go (vmkteam-reviewer)\n  \u002F\u002Fgo:generate colgen -funcpkg=reviewer -imports=reviewsrv\u002Fpkg\u002Freviewer\n  \u002F\u002Fcolgen:Review:mapp(reviewer)\n  ```\n\n### Порядок первой генерации (gotcha)\n\n1. Базовые директивы + методы (без Map\u002FMapP)\n2. Inline-сниппеты конструкторов (`\u002F\u002Fcolgen@NewNews(db)`)\n3. Добавить дженерики `Map\u002FMapP` в проект\n4. **Только теперь** добавить `Map(db)` в colgen\n\nЕсли добавить Map(db) сразу — не скомпилируется (нет `NewNews`), AST-парсинг упадёт.\n\n### Восстановление\n\nЕсли всё сломалось — удалить `*_colgen.go` и перегенерировать. Но: если сгенерированные функции уже используются в коде — удаление даст нерабочий код, и генератор не запустится. Временно удалить использования, перегенерировать, вернуть.\n\nРекомендация: один `colgen` на пакет, директивы в `collection.go`.\n\n### Ручные сборки — сигнал применить colgen\n\nЕсли в коде собирается вручную то, что генерирует colgen, — замени на метод коллекции, а не пиши ещё один цикл:\n\n| Ручная сборка | Метод colgen |\n|---|---|\n| цикл с `map[int]bool` для уникальных id поля | `Unique\u003CField>s()` |\n| `map[id]entity` из списка | `Index()` \u002F `IndexBy\u003CField>()` |\n| `[]int` id из поля элементов списка | `\u003CField>s()` \u002F `IDs()` |\n| `map[key][]entity` | `Group\u003CField>()` |\n| `mcp.Map(list, func(x dom.X) Y {…})` | именованный `newY(dom.X) Y` + `\u002F\u002Fcolgen:Y:map(dom.X)` с `-funcpkg=mcp` |\n| второй `Map`\u002F`MapP` в пакете API | `-funcpkg=\u003Cdomain>` |\n| цикл по `[]db.X` в домене | из репозитория — сразу `NewXs` (`MapP(db)`), коллекция и её методы — в `collection.go` домена |\n\nНужного метода нет — добавь директиву в `collection.go` и `make generate`.\n\nКоллекции — на моделях домена и API. В `pkg\u002Fdb` colgen не кладём, если есть domain-слой: db тонкий (\u002Fgold-arch).\n\n## Inline-сниппеты\n\n`\u002F\u002Fcolgen@\u003CName>(\u003Cpkg>)` заменяется прямо в файле на тип + конструктор.\n\n```go\n\u002F\u002Fcolgen@NewNews(db)                       \u002F\u002F embed-стиль (домен-слой)\n\u002F\u002Fcolgen@newNewsSummary(db.News,full,json) \u002F\u002F full + json-теги (API-слой)\n```\n\nEmbed-вариант:\n```go\ntype News struct { db.News }\nfunc NewNews(in *db.News) *News { ... }\n```\n\nFull-вариант — явные поля с тегами `json:\"...\"` (поле `ID` получает тег `json:\"\u003CentityName>Id\"`).\n\nНа сложных объектах сниппет может быть невалиден — редактировать вручную.\n\n## LLM-режимы\n\nНужен API-ключ. Отправляется содержимое файла (+ тест) + промт.\n\n- `\u002F\u002Fcolgen@ai:review` → `.md` с ревью\n- `\u002F\u002Fcolgen@ai:readme` → `README.md` по файлу\n- `\u002F\u002Fcolgen@ai:tests` → `_test.go`\n\nСуффикс `(deepseek)` или `(claude)`. DeepSeek по умолчанию.\n\n## Маркеры\n\n- Generated: `*_colgen.go` с `\u002F\u002F Code generated by colgen; DO NOT EDIT.`\n- Редактируемые: `collection.go` (директивы), файлы inline-сниппетов после первой генерации\n","# Colgen\n\nUpstream: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fcolgen\nDocs: https:\u002F\u002Fvmkteam.dev\u002Fcolgen\u002F\n\nГенерирует коллекции (`XxxList []Xxx`) с утилитарными методами из директив в `collection.go`. Также: inline-сниппеты, LLM-режимы.\n\n## Директивы\n\n- `\u002F\u002Fgo:generate colgen` — запуск генератора в файле\n- `\u002F\u002Fcolgen:News,Tag` — базовая генерация типов + `IDs()` + `Index()` (если есть поле `ID`)\n- `\u002F\u002Fcolgen:News:\u003CMethod>[,\u003CMethod>...]` — дополнительные методы\n- Код **должен компилироваться** перед запуском — парсинг через AST\n\n### Методы\n\n| Директива | Эффект |\n|-----------|--------|\n| `NewsID` | `NewsIDs() []int` (если поле ID нестандартное) |\n| `Index(Field)` | `IndexByField() map[T]News` |\n| `UniqueField` | уникальные значения (поддерживает `*T` c nil-check) |\n| `Count(Field)` | `CountByField(v) int` |\n| `Group(Field)` | `GroupByField() map[T]NewsList`; для `[]T` — fan-out |\n| `Fill(Target,Junction)` | заполняет связи; режим определяется типом junction |\n| `Cast(Interface)` | `Interfaces() []Interface` через pointer receiver |\n| `Map(pkg)` \u002F `MapP(pkg)` | конструктор `NewNewsList(in []pkg.News) NewsList` |\n| `map`\u002F`mapp` | то же в lowercase (приватный конструктор) |\n\n### Поведение `\u003CField>` по типу\n\n- Скаляр `StatusID int` → `StatusIDs() []int`\n- Слайс `TagIDs []int` → **flatten** в `[]int` (не `[][]int`)\n- Указатель `Author *Author` → `[]Author` с nil-check и разыменованием\n\n### Fill — определение режима\n\n`Fill(Tags,TagIDs)` где `TagIDs []int` → many-to-many через `related.Index()` + append\n`Fill(Author,AuthorID)` где `AuthorID *int` → one-to-one с nil-check\nВсе `FillXxx` возвращают `ll` для чейнинга: `news.FillTags(tags).FillAuthor(authors)`\n\n## Map \u002F MapP — конвертеры между слоями\n\n```go\n\u002F\u002Fgo:generate colgen -imports=newsportal\u002Fpkg\u002Fdb\n\u002F\u002Fcolgen:News,Tag\n\u002F\u002Fcolgen:News:UniqueTagIDs,Map(db)\n```\n\nТребования:\n- Проект должен содержать дженерики `Map[T,M]` \u002F `MapP[T,M]` (pointer-версия)\n- `MapP(db)` — если `NewNews` принимает `*db.News`\n- `map`\u002F`mapp` (lowercase) — приватные конструкторы\n- Разное имя в `db`-слое: `Map(db.News)` (полный путь)\n- Структура не в базовой директиве → конструктор вернёт `[]News` вместо `NewsList`\n- Другой пакет для `Map\u002FMapP`: `-funcpkg=\u003Cpkg>` + имя пакета в `-imports` через запятую. Дженерики `Map`\u002F`MapP` живут в пакете домена, API-пакеты берут их оттуда, а не заводят свои:\n  ```go\n  \u002F\u002F pkg\u002Frpc\u002Fcollection.go (vmkteam-reviewer)\n  \u002F\u002Fgo:generate colgen -funcpkg=reviewer -imports=reviewsrv\u002Fpkg\u002Freviewer\n  \u002F\u002Fcolgen:Review:mapp(reviewer)\n  ```\n\n### Порядок первой генерации (gotcha)\n\n1. Базовые директивы + методы (без Map\u002FMapP)\n2. Inline-сниппеты конструкторов (`\u002F\u002Fcolgen@NewNews(db)`)\n3. Добавить дженерики `Map\u002FMapP` в проект\n4. **Только теперь** добавить `Map(db)` в colgen\n\nЕсли добавить Map(db) сразу — не скомпилируется (нет `NewNews`), AST-парсинг упадёт.\n\n### Восстановление\n\nЕсли всё сломалось — удалить `*_colgen.go` и перегенерировать. Но: если сгенерированные функции уже используются в коде — удаление даст нерабочий код, и генератор не запустится. Временно удалить использования, перегенерировать, вернуть.\n\nРекомендация: один `colgen` на пакет, директивы в `collection.go`.\n\n### Ручные сборки — сигнал применить colgen\n\nЕсли в коде собирается вручную то, что генерирует colgen, — замени на метод коллекции, а не пиши ещё один цикл:\n\n| Ручная сборка | Метод colgen |\n|---|---|\n| цикл с `map[int]bool` для уникальных id поля | `Unique\u003CField>s()` |\n| `map[id]entity` из списка | `Index()` \u002F `IndexBy\u003CField>()` |\n| `[]int` id из поля элементов списка | `\u003CField>s()` \u002F `IDs()` |\n| `map[key][]entity` | `Group\u003CField>()` |\n| `mcp.Map(list, func(x dom.X) Y {…})` | именованный `newY(dom.X) Y` + `\u002F\u002Fcolgen:Y:map(dom.X)` с `-funcpkg=mcp` |\n| второй `Map`\u002F`MapP` в пакете API | `-funcpkg=\u003Cdomain>` |\n| цикл по `[]db.X` в домене | из репозитория — сразу `NewXs` (`MapP(db)`), коллекция и её методы — в `collection.go` домена |\n\nНужного метода нет — добавь директиву в `collection.go` и `make generate`.\n\nКоллекции — на моделях домена и API. В `pkg\u002Fdb` colgen не кладём, если есть domain-слой: db тонкий (\u002Fgold-arch).\n\n## Inline-сниппеты\n\n`\u002F\u002Fcolgen@\u003CName>(\u003Cpkg>)` заменяется прямо в файле на тип + конструктор.\n\n```go\n\u002F\u002Fcolgen@NewNews(db)                       \u002F\u002F embed-стиль (домен-слой)\n\u002F\u002Fcolgen@newNewsSummary(db.News,full,json) \u002F\u002F full + json-теги (API-слой)\n```\n\nEmbed-вариант:\n```go\ntype News struct { db.News }\nfunc NewNews(in *db.News) *News { ... }\n```\n\nFull-вариант — явные поля с тегами `json:\"...\"` (поле `ID` получает тег `json:\"\u003CentityName>Id\"`).\n\nНа сложных объектах сниппет может быть невалиден — редактировать вручную.\n\n## LLM-режимы\n\nНужен API-ключ. Отправляется содержимое файла (+ тест) + промт.\n\n- `\u002F\u002Fcolgen@ai:review` → `.md` с ревью\n- `\u002F\u002Fcolgen@ai:readme` → `README.md` по файлу\n- `\u002F\u002Fcolgen@ai:tests` → `_test.go`\n\nСуффикс `(deepseek)` или `(claude)`. DeepSeek по умолчанию.\n\n## Маркеры\n\n- Generated: `*_colgen.go` с `\u002F\u002F Code generated by colgen; DO NOT EDIT.`\n- Редактируемые: `collection.go` (директивы), файлы inline-сниппетов после первой генерации\n",{"name":5,"description":7},"master","8f3147ce24a1a470d9aaa02aa775d7797d621d95","plugins\u002Fdeveloper\u002Fskills\u002Fcolgen",1,"https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Fvmkteam","2026-11-05 00:26:25",{"source":8,"skillName":5,"commands":41,"prompt":51,"zipAvailable":52},[42,45,48],{"tool":43,"command":44},"npx","npx skills add vmkteam\u002Fclaude-plugins --skill colgen",{"tool":46,"command":47},"bunx","bunx skills add vmkteam\u002Fclaude-plugins --skill colgen",{"tool":49,"command":50},"pnpm","pnpm dlx skills add vmkteam\u002Fclaude-plugins --skill colgen","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fcolgen\u002FSKILL.md",true,[],[55,65,77,93,108,119],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":61,"publishedAt":28},"01M6MX3A8MZJBTMMK6WMY35FYH","zenrpc","Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fzenrpc\u002FSKILL.md",[],[57,24,62,63,64],"json-rpc","json","rpc",{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":28},"01M6MX36PEA0NSHCCRF5GGVVTZ","youtrack","YouTrack — задачи через REST API и pcurl. Используй для поиска issues, создания, обновления описаний, смены assignee\u002Fstage\u002Fприоритета, логирования времени и работы с комментариями.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fyoutrack\u002FSKILL.md",[],[67,72,73,74,75,76],"issues","REST","api","stage","rest api",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":28},"01M6MX322TD9HQPCYSNTFB4HBA","topsrv","topsrv — метрики, алерты, CVE и HTTP-логи серверов проекта через публичный JSON-RPC API app.topsrv.io. Используй, когда нужна загрузка CPU, памяти или диска хоста, метрики PostgreSQL\u002Fnginx\u002Fangie агента topsrv (`topsrv_*`), какие алерты горят, уязвимые пакеты на серверах или кто (боты, сети, IP) нагружает сайт.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Ftopsrv\u002FSKILL.md",[],[79,84,85,64,86,87,74,88,63,89,90,91,62,92],"CPU","postgresql","cve","nginx","Bash","ip","app","io","http",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":102,"publishedAt":28},"01M6MX2XFXCHNRPPW6WYZ15BXN","testing","Testing — используй всегда, когда пишешь или правишь Go-тесты (*_test.go), в том числе по сценариям Given\u002FWhen\u002FThen из spec: фреймворк как в соседних файлах, префикс TestDB, фабрики pkg\u002Fdb\u002Ftest, реальная БД без моков. Также при настройке TestMain\u002Ftest-short и когда тесты падают в gate, но проходят локально.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Ftesting\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",[95,103,104,24,105,106,107],"gate","spec","test","short","db",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":28},"01M6MX2P8RFYPV4EXRMVW6KAN7","solve","Solve — полный цикл решения задачи из YouTrack: preflight → анализ → план → реализация → ревью → коммит. Используй при любой YouTrack-задаче (`\u002Fsolve PLF-819`); флаг `--fast` сокращает HITL для тривиальных багфиксов.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fsolve\u002FSKILL.md",[],[110,115,116,117,118,27,67],"fast","preflight","task","hitl",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":28},"01M6MX2H6TF2VW75PCPGWR2SKZ","skills-check","Skills Check — smoke-тесты интеграций из project-index.md. Используй для проверки что pcurl-профили и URL всех data-source скиллов ещё живы.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fskills-check\u002FSKILL.md",[],[126,127,128,88,129,130,131,132,133,134,135,136,137,138],"skills check","check","data","smoke","probe","project","false","URL","data-source","true","source","fork","index"]