[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MX3A8MZJBTMMK6WMY35FYH":3,"skill-same:01M6MX3A8MZJBTMMK6WMY35FYH":48},{"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":17,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":33,"install":34,"resources":47},"01M6MX3A8MZJBTMMK6WMY35FYH","zenrpc",null,"Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.","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\u002Fzenrpc\u002FSKILL.md",[],[5,18,19,20,21],"go","rpc","json","json-rpc","2026-11-10 10:12:30",false,"---\nname: zenrpc\ndescription: \"Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.\"\n---\n\n# Zenrpc\n\n- Upstream: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fzenrpc (v2)\n- Middleware: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fzenrpc-middleware (импорт `zm`)\n- Clients: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Frpcgen (v2, см. \u002Frpcgen)\n- JSON-RPC 2.0, codegen через `go generate` (не reflection), SMD + OpenRPC\n- Транспорты: HTTP (`echo.WrapHandler(rpc)`), WebSocket, NATS (brokersrv)\n- Экосистема: SMDBox (браузер API), rpcdiff (diff OpenRPC)\n\n## Codegen\n\n```go\n\u002F\u002Fgo:generate go tool zenrpc\n```\n\n`go.mod` содержит `tool github.com\u002Fvmkteam\u002Fzenrpc\u002Fv2\u002Fzenrpc`. `make generate` — обязательно после любых изменений в API\u002Fмоделях\u002Fаннотациях. Файлы `*_zenrpc.go` не редактировать.\n\n## Сервис\n\nВстраивание `zenrpc.Service`; VT-сервисы дополнительно встраивают `embedlog.Logger`:\n\n```go\ntype ReviewService struct {\n    rm *reviewer.ReviewManager\n    zenrpc.Service\n}\n\ntype ProjectService struct {\n    zenrpc.Service\n    embedlog.Logger\n    projectRepo db.ProjectRepo\n}\n```\n\nСигнатура метода: `func (Service) Method([ctx,] [args]) (\u003Cvalue>, \u003Cerror>)` — любой return опционален, value может быть pointer, error = `error | *zenrpc.Error`.\n\n## Аннотации (magic comments)\n\n```go\n\u002F\u002F GetByID returns review details.\n\u002F\u002F\n\u002F\u002Fzenrpc:reviewId Review ID\n\u002F\u002Fzenrpc:return Review\n\u002F\u002Fzenrpc:500 Internal Error\n\u002F\u002Fzenrpc:404 Not Found\nfunc (s ReviewService) GetByID(ctx context.Context, reviewId int) (*Review, error) {\n```\n\n- `\u002F\u002Fzenrpc:\u003Cparam> Description` — описание параметра\n- `\u002F\u002Fzenrpc:\u003Cparam>=\u003Cdefault> Description` — default value\n- `\u002F\u002Fzenrpc:\u003ChttpCode> Description` — код ошибки\n- `\u002F\u002Fzenrpc:return Description` — описание возврата\n\n**Без обратных кавычек в документации.** Doc-комментарии метода, описания `\u002F\u002Fzenrpc:\u003Cparam>` и `\u002F\u002Fzenrpc:return`, комментарии полей RPC-моделей zenrpc переносит в SMD как raw-строку `` `…` ``: обратная кавычка в тексте (`` `id` ``, markdown-код) обрывает строку, и `*_zenrpc.go` не компилируется. Имена в документации — без оформления или в одинарных кавычках. Текст ошибки `\u002F\u002Fzenrpc:\u003Cкод>` попадает в строку `\"…\"` — без `\"` и `\\`.\n\n## Ошибки\n\nRPC-слой использует `zenrpc.NewStringError`, для wrap — `zenrpc.NewError`:\n\n```go\nvar (\n    ErrInternal   = zenrpc.NewStringError(http.StatusInternalServerError, \"internal error\")\n    ErrNotFound   = zenrpc.NewStringError(http.StatusNotFound, \"not found\")\n    ErrBadRequest = zenrpc.NewStringError(http.StatusBadRequest, \"bad request\")\n)\nfunc newInternalError(err error) *zenrpc.Error {\n    return zenrpc.NewError(http.StatusInternalServerError, err)\n}\n```\n\nVT-слой: хелпер `httpAsRPCError(code int) *zenrpc.Error` → `ErrUnauthorized\u002FForbidden\u002FNotFound\u002FInternal`.\n\n«Не найдено» — не ошибка репозитория: сгенерированный `EntityByID` возвращает `(nil, nil)` на `pg.ErrNoRows`. Метод сервиса обязан проверить `nil` и вернуть `ErrNotFound`, иначе конвертер `NewEntity(nil)` упадёт с nil pointer dereference.\n\n`newInternalError(err)` безопасен для клиента только при `zm.WithErrorSLog` в цепочке middleware: он отправляет причину в Sentry и заменяет message на «Internal error» (подробнее — \u002Fsecurity).\n\n## Server (канонический шаблон)\n\nВ существующем сервисе сервер и middleware уже настроены в `server.go` — новый сервис регистрируется в `RegisterAll`, второй сервер не заводится.\n\n```go\n\u002F\u002Fgo:generate go tool zenrpc\n\nfunc New(dbo db.DB, logger embedlog.Logger, isDevel bool) *zenrpc.Server {\n    rpc := zenrpc.NewServer(zenrpc.Options{ExposeSMD: true, AllowCORS: true})\n    rpc.Use(\n        zm.WithDevel(isDevel),\n        zm.WithHeaders(),\n        zm.WithSentry(zm.DefaultServerName),\n        zm.WithNoCancelContext(),\n        zm.WithMetrics(zm.DefaultServerName),\n        zm.WithTiming(isDevel, allowDebugFn()),\n        zm.WithSQLLogger(dbo.DB, isDevel, allowDebugFn(), allowDebugFn()),\n        zm.WithSLog(logger.Print, zm.DefaultServerName, nil),\n        zm.WithErrorSLog(logger.Error, zm.DefaultServerName, nil),\n    )\n    rpc.RegisterAll(map[string]zenrpc.Invoker{\n        \"review\": NewReviewService(dbo),\n    })\n    return rpc\n}\n```\n\n## Middleware (`zm`)\n\n| MW | Назначение \u002F gotcha |\n|----|---------------------|\n| `WithDevel(isDevel)` | dev-флаг в ctx |\n| `WithHeaders()` | UA(2048)\u002FPlatform(64)\u002FVersion(64)\u002FX-Country(16) в ctx |\n| `WithSentry(serverName)` | scope: params, duration, IP, platform, version, method |\n| `WithNoCancelContext()` | **обязателен для go-pg**: подавляет ctx.Cancel |\n| `WithMetrics(serverName)` | `app_rpc_error_requests_total`, `app_rpc_responses_duration_seconds` — labels: method, code, platform, version, server |\n| `WithTiming(isDevel, allowFn)` | `DurationLocal` в response extensions (ms) |\n| `WithSQLLogger(db, isDevel, allow1, allow2)` | SQL\u002FDurationSQL в extensions |\n| `WithSLog(logger.Print, name, nil)` | slog.InfoContext |\n| `WithErrorSLog(logger.Error, name, nil)` | code==500 или \u003C0 → лог + Sentry |\n| `WithAPILogger(printFn, name)` | legacy Printf-style |\n\n### Кастомный auth-middleware\n\n```go\nfunc authMiddleware(commonRepo *db.CommonRepo, logger embedlog.Logger) zenrpc.MiddlewareFunc {\n    return func(h zenrpc.InvokeFunc) zenrpc.InvokeFunc {\n        return func(ctx context.Context, method string, params json.RawMessage) zenrpc.Response {\n            ns := zenrpc.NamespaceFromContext(ctx)\n            if ns == NSAuth && method == RPC.AuthService.Login {\n                return h(ctx, method, params)\n            }\n            \u002F\u002F проверка auth header...\n            return h(context.WithValue(ctx, userKey, dbu), method, params)\n        }\n    }\n}\n```\n\n### Context accessors\n\n```go\nreq, ok := zenrpc.RequestFromContext(ctx)  \u002F\u002F *http.Request\nns := zenrpc.NamespaceFromContext(ctx)     \u002F\u002F namespace\nid := zenrpc.IDFromContext(ctx)            \u002F\u002F request id\n```\n\n## Сгенерированные файлы\n\n`*_zenrpc.go`: `Invoke()` (роутинг), SMD, константы `RPC.ServiceName.MethodName`, парсинг params. **Не редактировать вручную**.\n\n## VT-конвенции (CRUD)\n\nСтандартный набор на сущность: Count, Get, GetByID, Add, Update, Delete, Validate. Приватные хелперы: `byID`, `dbSort`, `isValid`.\n\nТри типа моделей: **Entity** (полная), **EntitySearch** (фильтры + `ToDB()`), **EntitySummary** (для списков).\n\n`ViewOps{Page, PageSize (max 500), SortColumn, SortDesc}` — пагинация\u002Fсортировка.\n\nВалидация (только VT): `Validator{fields []FieldError; err error}`; теги `validate:\"required,max=255,status,alias\"`.\n\n## Чеклисты\n\n**Новый метод:** аннотации → модели → `make generate`.\n\n**Новый CRUD VT-сервис:** namespace-константа → модели (Entity\u002FSearch\u002FSummary) → конвертеры (`NewEntity`, `NewEntitySummary`) → сервис (Count\u002FGet\u002FGetByID\u002FAdd\u002FUpdate\u002FDelete\u002FValidate) → регистрация в `server.go` → `make generate`.\n","# Zenrpc\n\n- Upstream: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fzenrpc (v2)\n- Middleware: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fzenrpc-middleware (импорт `zm`)\n- Clients: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Frpcgen (v2, см. \u002Frpcgen)\n- JSON-RPC 2.0, codegen через `go generate` (не reflection), SMD + OpenRPC\n- Транспорты: HTTP (`echo.WrapHandler(rpc)`), WebSocket, NATS (brokersrv)\n- Экосистема: SMDBox (браузер API), rpcdiff (diff OpenRPC)\n\n## Codegen\n\n```go\n\u002F\u002Fgo:generate go tool zenrpc\n```\n\n`go.mod` содержит `tool github.com\u002Fvmkteam\u002Fzenrpc\u002Fv2\u002Fzenrpc`. `make generate` — обязательно после любых изменений в API\u002Fмоделях\u002Fаннотациях. Файлы `*_zenrpc.go` не редактировать.\n\n## Сервис\n\nВстраивание `zenrpc.Service`; VT-сервисы дополнительно встраивают `embedlog.Logger`:\n\n```go\ntype ReviewService struct {\n    rm *reviewer.ReviewManager\n    zenrpc.Service\n}\n\ntype ProjectService struct {\n    zenrpc.Service\n    embedlog.Logger\n    projectRepo db.ProjectRepo\n}\n```\n\nСигнатура метода: `func (Service) Method([ctx,] [args]) (\u003Cvalue>, \u003Cerror>)` — любой return опционален, value может быть pointer, error = `error | *zenrpc.Error`.\n\n## Аннотации (magic comments)\n\n```go\n\u002F\u002F GetByID returns review details.\n\u002F\u002F\n\u002F\u002Fzenrpc:reviewId Review ID\n\u002F\u002Fzenrpc:return Review\n\u002F\u002Fzenrpc:500 Internal Error\n\u002F\u002Fzenrpc:404 Not Found\nfunc (s ReviewService) GetByID(ctx context.Context, reviewId int) (*Review, error) {\n```\n\n- `\u002F\u002Fzenrpc:\u003Cparam> Description` — описание параметра\n- `\u002F\u002Fzenrpc:\u003Cparam>=\u003Cdefault> Description` — default value\n- `\u002F\u002Fzenrpc:\u003ChttpCode> Description` — код ошибки\n- `\u002F\u002Fzenrpc:return Description` — описание возврата\n\n**Без обратных кавычек в документации.** Doc-комментарии метода, описания `\u002F\u002Fzenrpc:\u003Cparam>` и `\u002F\u002Fzenrpc:return`, комментарии полей RPC-моделей zenrpc переносит в SMD как raw-строку `` `…` ``: обратная кавычка в тексте (`` `id` ``, markdown-код) обрывает строку, и `*_zenrpc.go` не компилируется. Имена в документации — без оформления или в одинарных кавычках. Текст ошибки `\u002F\u002Fzenrpc:\u003Cкод>` попадает в строку `\"…\"` — без `\"` и `\\`.\n\n## Ошибки\n\nRPC-слой использует `zenrpc.NewStringError`, для wrap — `zenrpc.NewError`:\n\n```go\nvar (\n    ErrInternal   = zenrpc.NewStringError(http.StatusInternalServerError, \"internal error\")\n    ErrNotFound   = zenrpc.NewStringError(http.StatusNotFound, \"not found\")\n    ErrBadRequest = zenrpc.NewStringError(http.StatusBadRequest, \"bad request\")\n)\nfunc newInternalError(err error) *zenrpc.Error {\n    return zenrpc.NewError(http.StatusInternalServerError, err)\n}\n```\n\nVT-слой: хелпер `httpAsRPCError(code int) *zenrpc.Error` → `ErrUnauthorized\u002FForbidden\u002FNotFound\u002FInternal`.\n\n«Не найдено» — не ошибка репозитория: сгенерированный `EntityByID` возвращает `(nil, nil)` на `pg.ErrNoRows`. Метод сервиса обязан проверить `nil` и вернуть `ErrNotFound`, иначе конвертер `NewEntity(nil)` упадёт с nil pointer dereference.\n\n`newInternalError(err)` безопасен для клиента только при `zm.WithErrorSLog` в цепочке middleware: он отправляет причину в Sentry и заменяет message на «Internal error» (подробнее — \u002Fsecurity).\n\n## Server (канонический шаблон)\n\nВ существующем сервисе сервер и middleware уже настроены в `server.go` — новый сервис регистрируется в `RegisterAll`, второй сервер не заводится.\n\n```go\n\u002F\u002Fgo:generate go tool zenrpc\n\nfunc New(dbo db.DB, logger embedlog.Logger, isDevel bool) *zenrpc.Server {\n    rpc := zenrpc.NewServer(zenrpc.Options{ExposeSMD: true, AllowCORS: true})\n    rpc.Use(\n        zm.WithDevel(isDevel),\n        zm.WithHeaders(),\n        zm.WithSentry(zm.DefaultServerName),\n        zm.WithNoCancelContext(),\n        zm.WithMetrics(zm.DefaultServerName),\n        zm.WithTiming(isDevel, allowDebugFn()),\n        zm.WithSQLLogger(dbo.DB, isDevel, allowDebugFn(), allowDebugFn()),\n        zm.WithSLog(logger.Print, zm.DefaultServerName, nil),\n        zm.WithErrorSLog(logger.Error, zm.DefaultServerName, nil),\n    )\n    rpc.RegisterAll(map[string]zenrpc.Invoker{\n        \"review\": NewReviewService(dbo),\n    })\n    return rpc\n}\n```\n\n## Middleware (`zm`)\n\n| MW | Назначение \u002F gotcha |\n|----|---------------------|\n| `WithDevel(isDevel)` | dev-флаг в ctx |\n| `WithHeaders()` | UA(2048)\u002FPlatform(64)\u002FVersion(64)\u002FX-Country(16) в ctx |\n| `WithSentry(serverName)` | scope: params, duration, IP, platform, version, method |\n| `WithNoCancelContext()` | **обязателен для go-pg**: подавляет ctx.Cancel |\n| `WithMetrics(serverName)` | `app_rpc_error_requests_total`, `app_rpc_responses_duration_seconds` — labels: method, code, platform, version, server |\n| `WithTiming(isDevel, allowFn)` | `DurationLocal` в response extensions (ms) |\n| `WithSQLLogger(db, isDevel, allow1, allow2)` | SQL\u002FDurationSQL в extensions |\n| `WithSLog(logger.Print, name, nil)` | slog.InfoContext |\n| `WithErrorSLog(logger.Error, name, nil)` | code==500 или \u003C0 → лог + Sentry |\n| `WithAPILogger(printFn, name)` | legacy Printf-style |\n\n### Кастомный auth-middleware\n\n```go\nfunc authMiddleware(commonRepo *db.CommonRepo, logger embedlog.Logger) zenrpc.MiddlewareFunc {\n    return func(h zenrpc.InvokeFunc) zenrpc.InvokeFunc {\n        return func(ctx context.Context, method string, params json.RawMessage) zenrpc.Response {\n            ns := zenrpc.NamespaceFromContext(ctx)\n            if ns == NSAuth && method == RPC.AuthService.Login {\n                return h(ctx, method, params)\n            }\n            \u002F\u002F проверка auth header...\n            return h(context.WithValue(ctx, userKey, dbu), method, params)\n        }\n    }\n}\n```\n\n### Context accessors\n\n```go\nreq, ok := zenrpc.RequestFromContext(ctx)  \u002F\u002F *http.Request\nns := zenrpc.NamespaceFromContext(ctx)     \u002F\u002F namespace\nid := zenrpc.IDFromContext(ctx)            \u002F\u002F request id\n```\n\n## Сгенерированные файлы\n\n`*_zenrpc.go`: `Invoke()` (роутинг), SMD, константы `RPC.ServiceName.MethodName`, парсинг params. **Не редактировать вручную**.\n\n## VT-конвенции (CRUD)\n\nСтандартный набор на сущность: Count, Get, GetByID, Add, Update, Delete, Validate. Приватные хелперы: `byID`, `dbSort`, `isValid`.\n\nТри типа моделей: **Entity** (полная), **EntitySearch** (фильтры + `ToDB()`), **EntitySummary** (для списков).\n\n`ViewOps{Page, PageSize (max 500), SortColumn, SortDesc}` — пагинация\u002Fсортировка.\n\nВалидация (только VT): `Validator{fields []FieldError; err error}`; теги `validate:\"required,max=255,status,alias\"`.\n\n## Чеклисты\n\n**Новый метод:** аннотации → модели → `make generate`.\n\n**Новый CRUD VT-сервис:** namespace-константа → модели (Entity\u002FSearch\u002FSummary) → конвертеры (`NewEntity`, `NewEntitySummary`) → сервис (Count\u002FGet\u002FGetByID\u002FAdd\u002FUpdate\u002FDelete\u002FValidate) → регистрация в `server.go` → `make generate`.\n",{"name":5,"description":7},"master","8f3147ce24a1a470d9aaa02aa775d7797d621d95","plugins\u002Fdeveloper\u002Fskills\u002Fzenrpc",1,"https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Fvmkteam","2026-11-05 00:26:25",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add vmkteam\u002Fclaude-plugins --skill zenrpc",{"tool":40,"command":41},"bunx","bunx skills add vmkteam\u002Fclaude-plugins --skill zenrpc",{"tool":43,"command":44},"pnpm","pnpm dlx skills add vmkteam\u002Fclaude-plugins --skill zenrpc","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fzenrpc\u002FSKILL.md",true,[],[49,61,77,94,106,126],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":22},"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",[],[51,56,57,58,59,60],"issues","REST","api","stage","rest api",{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":22},"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",[],[63,20,68,69,19,70,71,58,72,73,74,75,76,21],"http","postgresql","cve","nginx","Bash","ip","app","io","CPU",{"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":88,"publishedAt":22},"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",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[79,18,89,90,91,92,93],"test","short","gate","db","spec",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":22},"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",[],[96,101,102,103,104,105,51],"fast","preflight","task","hitl","id",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":22},"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",[],[113,114,115,116,117,72,118,119,120,121,122,123,124,125],"skills check","check","true","index","data","smoke","probe","project","false","URL","data-source","source","fork",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":22},"01M6MX2E5FRMD4NGJGS6CWCP1H","sentry","Sentry — мониторинг ошибок (issues, events, releases) через REST API. Используй когда нужно найти ошибку по ключевым словам, разобрать stack trace, проверить что релиз поднялся или сопоставить ошибку с коммитом.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fsentry\u002FSKILL.md",[],[128,57,56,60,133,134,135,136,72,58],"events","trace","releases","stack"]