[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MX208DPDFXBSGEZ52CW4G3":3,"skill-same:01M6MX208DPDFXBSGEZ52CW4G3":51},{"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":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6MX208DPDFXBSGEZ52CW4G3","rpcgen",null,"Rpcgen — генерация клиентов из SMD\u002FOpenRPC для Go, TypeScript, PHP, Swift, Kotlin, Dart. Используй при подключении клиента к чужому RPC-сервису или публикации собственного SMD\u002FOpenRPC-контракта.","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\u002Frpcgen\u002FSKILL.md",[],[5,18,19,20,21,22,23,24],"swift","typescript","go","rpc","php","kotlin","dart","2026-11-10 10:12:30",false,"---\nname: rpcgen\ndescription: \"Rpcgen — генерация клиентов из SMD\u002FOpenRPC для Go, TypeScript, PHP, Swift, Kotlin, Dart. Используй при подключении клиента к чужому RPC-сервису или публикации собственного SMD\u002FOpenRPC-контракта.\"\n---\n\n# Rpcgen\n\nUpstream: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Frpcgen\n\nГенерирует типизированные клиенты из SMD (Service Mapping Description) zenrpc-сервера. Связанный инструмент — **rpcdiff** (diff OpenRPC schema для breaking-changes в CI).\n\nTool-зависимость:\n```go\ntool github.com\u002Fvmkteam\u002Frpcgen\u002Fv2\u002Fcmd\u002Frpcgen\n```\n\n## Языки и API\n\n`gen.GoClient`, `gen.TSClient`, `gen.PHPClient`, `gen.SwiftClient`, `gen.KotlinClient`, `gen.DartClient`, `gen.OpenRPC(name, url)`.\n\nCLI — через `-lang \u003Cgo|typescript|php|swift|kotlin|dart>`, источник `-url` (SMD endpoint) или `-file smd.json`, вывод `-o`. Полный список флагов — `rpcgen --help`.\n\n## vmkteam-паттерн: on-the-fly handler\n\nСервер раздаёт клиенты с собственных endpoint'ов через `rpcgen.Handler`:\n\n```go\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.ts\",   appkit.EchoHandlerFunc(rpcgen.Handler(gen.TSClient(typeMapper))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.go\",   appkit.EchoHandlerFunc(rpcgen.Handler(gen.GoClient(golang.Settings{Package: appName}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.swift\",     appkit.EchoHandlerFunc(rpcgen.Handler(gen.SwiftClient(swift.Settings{Class: \"API\", TypeMapper: swiftTypeMapper}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fnetworking.swift\", appkit.EchoHandlerFunc(rpcgen.Handler(gen.SwiftClient(swift.Settings{IsProtocol: true, TypeMapper: swiftTypeMapper}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.kt\",        appkit.EchoHandlerFunc(rpcgen.Handler(gen.KotlinClient(kotlin.Settings{Class: \"Api\", PackageAPI: \"com.example.api\", TypeMapper: kotlinTypeMapper}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fnetworking.kt\", appkit.EchoHandlerFunc(rpcgen.Handler(gen.KotlinClient(kotlin.Settings{Class: \"Api\", PackageAPI: \"com.example.api\", IsProtocol: true}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fopenrpc.json\",  appkit.EchoHandlerFunc(rpcgen.Handler(gen.OpenRPC(\"service\", rpcUrl))))\n```\n\n- `IsProtocol: true` для Swift\u002FKotlin → protocol\u002Finterface вместо class\u002Fdata class\n- `TypeMapper func(schema, current) string` — переопределение типов per-язык\n\n## Makefile-цели (vmkteam-конвенция)\n\n```makefile\ngo-client:\n\trpcgen -lang go -url http:\u002F\u002Flocalhost:$(PORT)\u002Frpc\u002F -o .\u002Fpkg\u002Fclient\u002F$(NAME)\u002F\n\ntype-script-client: generate\n\trpcgen -lang typescript -url http:\u002F\u002Flocalhost:$(PORT)\u002Frpc\u002F -o ..\u002Ffrontend\u002Fsrc\u002Fapi\u002Ffactory.generated.ts\n\trpcgen -lang typescript -url http:\u002F\u002Flocalhost:$(PORT)\u002Fvt\u002F -o ..\u002Ffrontend\u002Fsrc\u002Fapi\u002Fvt.generated.ts\n```\n\n## Gotchas\n\n- **TS:** после генерации добавить `\u002F\u002F @ts-nocheck` на 3-ю строку (после `\u002F* eslint-disable *\u002F`), иначе frontend не собирается\n- Go-клиенты импортируются как `project\u002Fpkg\u002Fclient\u002F\u003Cservice>`, инициализация `svc.New(\"http:\u002F\u002Fhost\u002Frpc\u002F\")`\n- `rpcdiff old.json new.json` — сравнение OpenRPC schema, полезно перед деплоем\n- Клиент сервиса из того же модуля (CLI, SDK) — тоже `pkg\u002Fclient\u002F\u003Cservice>\u002F`, не рядом с потребителем\n\n## Известные баги (rpcgen ≤ v2.5.7)\n\nУбрать раздел, когда исправят upstream: [#42](https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Frpcgen\u002Fissues\u002F42).\n\n- **Go-клиент теряет ошибку сервера.** Для кодов, описанных в `\u002F\u002Fzenrpc:\u003Cкод>`, сгенерированный метод заменяет `*zenrpc.Error` пакетной переменной `ErrSvcMethodNNN` с текстом из комментария: `message` и `data` ответа теряются, `errors.As` их не достанет. Сравнение `errors.Is(err, client.ErrSvcMethodNNN)` работает. Нужна подсказка из `data` (причина, hint) — `http.RoundTripper` клиента читает тело ответа с ошибкой, сохраняет `error.data` и возвращает тело дальше (образец — hubsrv `pkg\u002Fcli\u002Fclient.go`).\n\n## Маркер\n\n`\u002F\u002F Code generated by rpcgen; DO NOT EDIT.`\n","# Rpcgen\n\nUpstream: https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Frpcgen\n\nГенерирует типизированные клиенты из SMD (Service Mapping Description) zenrpc-сервера. Связанный инструмент — **rpcdiff** (diff OpenRPC schema для breaking-changes в CI).\n\nTool-зависимость:\n```go\ntool github.com\u002Fvmkteam\u002Frpcgen\u002Fv2\u002Fcmd\u002Frpcgen\n```\n\n## Языки и API\n\n`gen.GoClient`, `gen.TSClient`, `gen.PHPClient`, `gen.SwiftClient`, `gen.KotlinClient`, `gen.DartClient`, `gen.OpenRPC(name, url)`.\n\nCLI — через `-lang \u003Cgo|typescript|php|swift|kotlin|dart>`, источник `-url` (SMD endpoint) или `-file smd.json`, вывод `-o`. Полный список флагов — `rpcgen --help`.\n\n## vmkteam-паттерн: on-the-fly handler\n\nСервер раздаёт клиенты с собственных endpoint'ов через `rpcgen.Handler`:\n\n```go\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.ts\",   appkit.EchoHandlerFunc(rpcgen.Handler(gen.TSClient(typeMapper))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.go\",   appkit.EchoHandlerFunc(rpcgen.Handler(gen.GoClient(golang.Settings{Package: appName}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.swift\",     appkit.EchoHandlerFunc(rpcgen.Handler(gen.SwiftClient(swift.Settings{Class: \"API\", TypeMapper: swiftTypeMapper}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fnetworking.swift\", appkit.EchoHandlerFunc(rpcgen.Handler(gen.SwiftClient(swift.Settings{IsProtocol: true, TypeMapper: swiftTypeMapper}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fapi.kt\",        appkit.EchoHandlerFunc(rpcgen.Handler(gen.KotlinClient(kotlin.Settings{Class: \"Api\", PackageAPI: \"com.example.api\", TypeMapper: kotlinTypeMapper}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fnetworking.kt\", appkit.EchoHandlerFunc(rpcgen.Handler(gen.KotlinClient(kotlin.Settings{Class: \"Api\", PackageAPI: \"com.example.api\", IsProtocol: true}))))\na.echo.Any(\"\u002Fv1\u002Frpc\u002Fopenrpc.json\",  appkit.EchoHandlerFunc(rpcgen.Handler(gen.OpenRPC(\"service\", rpcUrl))))\n```\n\n- `IsProtocol: true` для Swift\u002FKotlin → protocol\u002Finterface вместо class\u002Fdata class\n- `TypeMapper func(schema, current) string` — переопределение типов per-язык\n\n## Makefile-цели (vmkteam-конвенция)\n\n```makefile\ngo-client:\n\trpcgen -lang go -url http:\u002F\u002Flocalhost:$(PORT)\u002Frpc\u002F -o .\u002Fpkg\u002Fclient\u002F$(NAME)\u002F\n\ntype-script-client: generate\n\trpcgen -lang typescript -url http:\u002F\u002Flocalhost:$(PORT)\u002Frpc\u002F -o ..\u002Ffrontend\u002Fsrc\u002Fapi\u002Ffactory.generated.ts\n\trpcgen -lang typescript -url http:\u002F\u002Flocalhost:$(PORT)\u002Fvt\u002F -o ..\u002Ffrontend\u002Fsrc\u002Fapi\u002Fvt.generated.ts\n```\n\n## Gotchas\n\n- **TS:** после генерации добавить `\u002F\u002F @ts-nocheck` на 3-ю строку (после `\u002F* eslint-disable *\u002F`), иначе frontend не собирается\n- Go-клиенты импортируются как `project\u002Fpkg\u002Fclient\u002F\u003Cservice>`, инициализация `svc.New(\"http:\u002F\u002Fhost\u002Frpc\u002F\")`\n- `rpcdiff old.json new.json` — сравнение OpenRPC schema, полезно перед деплоем\n- Клиент сервиса из того же модуля (CLI, SDK) — тоже `pkg\u002Fclient\u002F\u003Cservice>\u002F`, не рядом с потребителем\n\n## Известные баги (rpcgen ≤ v2.5.7)\n\nУбрать раздел, когда исправят upstream: [#42](https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Frpcgen\u002Fissues\u002F42).\n\n- **Go-клиент теряет ошибку сервера.** Для кодов, описанных в `\u002F\u002Fzenrpc:\u003Cкод>`, сгенерированный метод заменяет `*zenrpc.Error` пакетной переменной `ErrSvcMethodNNN` с текстом из комментария: `message` и `data` ответа теряются, `errors.As` их не достанет. Сравнение `errors.Is(err, client.ErrSvcMethodNNN)` работает. Нужна подсказка из `data` (причина, hint) — `http.RoundTripper` клиента читает тело ответа с ошибкой, сохраняет `error.data` и возвращает тело дальше (образец — hubsrv `pkg\u002Fcli\u002Fclient.go`).\n\n## Маркер\n\n`\u002F\u002F Code generated by rpcgen; DO NOT EDIT.`\n",{"name":5,"description":7},"master","8f3147ce24a1a470d9aaa02aa775d7797d621d95","plugins\u002Fdeveloper\u002Fskills\u002Frpcgen",1,"https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Fvmkteam","2026-11-05 00:26:25",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add vmkteam\u002Fclaude-plugins --skill rpcgen",{"tool":43,"command":44},"bunx","bunx skills add vmkteam\u002Fclaude-plugins --skill rpcgen",{"tool":46,"command":47},"pnpm","pnpm dlx skills add vmkteam\u002Fclaude-plugins --skill rpcgen","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Frpcgen\u002FSKILL.md",true,[],[52,61,73,89,106,118],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":25},"01M6MX3A8MZJBTMMK6WMY35FYH","zenrpc","Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fzenrpc\u002FSKILL.md",[],[54,20,59,60,21],"json-rpc","json",{"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":25},"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",[],[63,68,69,70,71,72],"issues","REST","api","stage","rest api",{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":25},"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",[],[75,80,81,21,82,83,70,84,60,85,86,87,59,88],"CPU","postgresql","cve","nginx","Bash","ip","app","io","http",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":100,"publishedAt":25},"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",[95],{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[91,101,102,20,103,104,105],"gate","spec","test","short","db",{"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":25},"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",[],[108,113,114,115,116,117,63],"fast","preflight","task","hitl","id",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":25},"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",[],[125,126,127,84,128,129,130,131,132,133,134,135,136,137],"skills check","check","data","smoke","probe","project","false","URL","data-source","true","source","fork","index"]