[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MX1Q5ANH3P44MA4S8VVBXG":3,"skill-same:01M6MX1Q5ANH3P44MA4S8VVBXG":46},{"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":20,"linkOnly":21,"markdownContent":22,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":31,"install":32,"resources":45},"01M6MX1Q5ANH3P44MA4S8VVBXG","philosophy",null,"Philosophy — манифест разработки vmkteam: Go idioms, принципы, архитектурная культура. Используй как справку при спорных решениях по коду\u002Fархитектуре и при обосновании стиля проекту.","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\u002Fphilosophy\u002FSKILL.md",[],[5,18,19],"go","idioms","2026-11-10 10:12:30",false,"---\nname: philosophy\ndescription: \"Philosophy — манифест разработки vmkteam: Go idioms, принципы, архитектурная культура. Используй как справку при спорных решениях по коду\u002Fархитектуре и при обосновании стиля проекту.\"\n---\n\n# Philosophy — манифест vmkteam\n\nПринципы разработки vmkteam. Источник: https:\u002F\u002Fvmkteam.dev\n\n## Код\n\n- Пиши простой код. Думай о том, кто будет его читать через год\n- Кодогенерация лучше ручного кода. Меньше ручного кода — меньше багов\n- Не используй интерфейсы без необходимости. Конкретные типы понятнее\n- Каждый слой имеет свои модели. Конвертеры между слоями обязательны\n- Три строки простого кода лучше одной умной абстракции\n- Комментарий объясняет, почему (неочевидное решение, ограничение), а не пересказывает, что делает код\n\n## Go idioms we follow\n\nКонкретные правила, которых придерживаемся на всех слоях. Большинство — mainstream Go, часть — vmkteam-специфика (явно помечено).\n\n### Базовые\n- `context.Context` — всегда первый аргумент (после receiver), никогда не в структурах\n- `error` — последний возврат. Ошибки не теряются\n- Обёртывание: `fmt.Errorf(\"context: %w\", err)`. Проверка — только `errors.Is` \u002F `errors.As`, никогда не сравнивай `err.Error()` со строкой. Ошибка-значение — sentinel-переменная (`var ErrNotFound = ...`), ошибка с данными — тип с методом `Error()`\n- `defer` для ресурсов сразу после захвата. `defer rows.Close()`, `defer mu.Unlock()`\n- Zero-value ready типы — структура должна быть валидна без конструктора, когда это возможно\n\n### Типы и пакеты\n- \"Accept interfaces, return structs\" — принимающие функции\u002Fметоды работают с интерфейсами, фабрики возвращают конкретные типы\n- Интерфейсы объявляются на стороне потребителя, не провайдера\n- Короткие имена пакетов, одно слово. Никаких `util`, `common`, `helpers`\n- Экспорт по необходимости — начинай с lowercase, поднимай регистр когда появляется реальный внешний потребитель\n\n### Конкурентность\n- Не запускай горутины без способа их остановить. `ctx` + `errgroup` — базовый паттерн\n- Каналы для сигналинга, мьютексы для разделяемого состояния — не наоборот\n- Background-процессоры — метод `Run(ctx) error`, возврат при `ctx.Done()` (см. \u002Fgold-arch)\n\n### Именование\n- Getters без префикса `Get`: `user.Name()`, не `user.GetName()`\n- Аббревиатуры в одном регистре: `userID`, `HTTPServer`, `URL`\n- Переменная цикла — `i`, `u` (короткое), параметр функции — длиннее и содержательнее\n\n### Производительность\n- Не оптимизируй без бенчмарка. `testing.B` + `go test -bench`\n- `pprof` через \u002Fappkit когда нужно искать узкие места на живом сервисе\n\n### vmkteam-специфика (явный выбор, не универсальный идиом)\n- Слоистая архитектура db → domain → rpc (\u002Fgold-arch) — выбрана осознанно для типичного CRUD + фоновые процессоры + несколько API\n- Кодогенерация как default (mfd, colgen, zenrpc, rpcgen) — заменяет ручной boilerplate, вне vmkteam-стека этого может быть слишком\n- Без моков в тестах — интеграционные тесты против реальной БД (\u002Ftesting)\n- Embed вместо композиции для логгера: `type Service struct { embedlog.Logger }` (\u002Fembedlog)\n\n### Что не-идиоматично и избегаем\n- Глобальные переменные, init-функции с побочными эффектами\n- Пакет `domain`, `service`, `utils` как зонтик для всего подряд\n- Интерфейсы «на вырост» (с одной реализацией, «вдруг понадобится»)\n- `interface{}` \u002F `any` без причины — лучше generic или конкретный тип\n- Panics в библиотечном коде (только в main для фатальных init-ошибок)\n\n## Архитектура\n\n- Simple Architecture: DB → Domain → API, JSON-RPC 2.0 (\u002Fgold-arch)\n- Не делай domain-слой для простого CRUD\n- DI через конструкторы. Никакого global state\n- Документация в git, не в Confluence. ADR для решений\n- C4-диаграммы из метрик Prometheus (genc4)\n\n## Процесс\n\n- Планируй перед кодом. Spec перед реализацией (\u002Fsolve)\n- Тесты перед кодом — TDD (\u002Ftesting)\n- Ревью обязателен, даже собственного кода (\u002Fgo-review)\n- Коммиты с номером задачи (\u002Fcommit-msg)\n- Любой workflow стартует с актуальной базовой ветки (обычно `devel`). Устаревшая база = устаревший анализ и ревью\n- Не деплой в пятницу\n\n## Безопасность\n\n- Валидируй на границе системы (\u002Fsecurity)\n- Секреты в OS keychain (pcurl) или env vars. Никогда в коде\n- gosec, govulncheck, gitleaks в CI (\u002Fci-cd)\n\n## LLM и автоматизация\n\n- LLM — инструмент, не автор. Код должен быть понятен без AI\n- Кодогенерация с AI допустима когда: есть спецификация, результат проверяем тестами, код следует паттернам проекта\n- Артефакты LLM сохраняются в `docs\u002Fllm\u002Ftasks\u002F` (задачи) и `docs\u002Fllm\u002Fincidents\u002F` (инциденты) — прозрачность процесса\n- Не создавай зависимость от LLM\n\n## Стадии проекта\n\n| Стадия | БД | Миграции | Мониторинг |\n|--------|-----|----------|-----------|\n| Идея | sql файл актуальный, `make db` с нуля | Нет | Нет |\n| Dev | + pgmigrator, sql всё ещё актуальный | Да | Sentry, возможно Prometheus |\n| Production | + полный мониторинг | Да | Sentry, Prometheus, Loki, Grafana, Nomad |\n\n## Ссылки\n\n- https:\u002F\u002Fvmkteam.dev\u002Fsimple-architecture\u002F — Simple Architecture\n- https:\u002F\u002Fvmkteam.dev\u002Fdevelopment\u002Fphilosophy\u002F — принципы\n- https:\u002F\u002Fvmkteam.dev\u002Fdevelopment\u002Fmastering-api\u002F — работа с API\n- https:\u002F\u002Fgithub.com\u002Fvmkteam — инструменты\n","# Philosophy — манифест vmkteam\n\nПринципы разработки vmkteam. Источник: https:\u002F\u002Fvmkteam.dev\n\n## Код\n\n- Пиши простой код. Думай о том, кто будет его читать через год\n- Кодогенерация лучше ручного кода. Меньше ручного кода — меньше багов\n- Не используй интерфейсы без необходимости. Конкретные типы понятнее\n- Каждый слой имеет свои модели. Конвертеры между слоями обязательны\n- Три строки простого кода лучше одной умной абстракции\n- Комментарий объясняет, почему (неочевидное решение, ограничение), а не пересказывает, что делает код\n\n## Go idioms we follow\n\nКонкретные правила, которых придерживаемся на всех слоях. Большинство — mainstream Go, часть — vmkteam-специфика (явно помечено).\n\n### Базовые\n- `context.Context` — всегда первый аргумент (после receiver), никогда не в структурах\n- `error` — последний возврат. Ошибки не теряются\n- Обёртывание: `fmt.Errorf(\"context: %w\", err)`. Проверка — только `errors.Is` \u002F `errors.As`, никогда не сравнивай `err.Error()` со строкой. Ошибка-значение — sentinel-переменная (`var ErrNotFound = ...`), ошибка с данными — тип с методом `Error()`\n- `defer` для ресурсов сразу после захвата. `defer rows.Close()`, `defer mu.Unlock()`\n- Zero-value ready типы — структура должна быть валидна без конструктора, когда это возможно\n\n### Типы и пакеты\n- \"Accept interfaces, return structs\" — принимающие функции\u002Fметоды работают с интерфейсами, фабрики возвращают конкретные типы\n- Интерфейсы объявляются на стороне потребителя, не провайдера\n- Короткие имена пакетов, одно слово. Никаких `util`, `common`, `helpers`\n- Экспорт по необходимости — начинай с lowercase, поднимай регистр когда появляется реальный внешний потребитель\n\n### Конкурентность\n- Не запускай горутины без способа их остановить. `ctx` + `errgroup` — базовый паттерн\n- Каналы для сигналинга, мьютексы для разделяемого состояния — не наоборот\n- Background-процессоры — метод `Run(ctx) error`, возврат при `ctx.Done()` (см. \u002Fgold-arch)\n\n### Именование\n- Getters без префикса `Get`: `user.Name()`, не `user.GetName()`\n- Аббревиатуры в одном регистре: `userID`, `HTTPServer`, `URL`\n- Переменная цикла — `i`, `u` (короткое), параметр функции — длиннее и содержательнее\n\n### Производительность\n- Не оптимизируй без бенчмарка. `testing.B` + `go test -bench`\n- `pprof` через \u002Fappkit когда нужно искать узкие места на живом сервисе\n\n### vmkteam-специфика (явный выбор, не универсальный идиом)\n- Слоистая архитектура db → domain → rpc (\u002Fgold-arch) — выбрана осознанно для типичного CRUD + фоновые процессоры + несколько API\n- Кодогенерация как default (mfd, colgen, zenrpc, rpcgen) — заменяет ручной boilerplate, вне vmkteam-стека этого может быть слишком\n- Без моков в тестах — интеграционные тесты против реальной БД (\u002Ftesting)\n- Embed вместо композиции для логгера: `type Service struct { embedlog.Logger }` (\u002Fembedlog)\n\n### Что не-идиоматично и избегаем\n- Глобальные переменные, init-функции с побочными эффектами\n- Пакет `domain`, `service`, `utils` как зонтик для всего подряд\n- Интерфейсы «на вырост» (с одной реализацией, «вдруг понадобится»)\n- `interface{}` \u002F `any` без причины — лучше generic или конкретный тип\n- Panics в библиотечном коде (только в main для фатальных init-ошибок)\n\n## Архитектура\n\n- Simple Architecture: DB → Domain → API, JSON-RPC 2.0 (\u002Fgold-arch)\n- Не делай domain-слой для простого CRUD\n- DI через конструкторы. Никакого global state\n- Документация в git, не в Confluence. ADR для решений\n- C4-диаграммы из метрик Prometheus (genc4)\n\n## Процесс\n\n- Планируй перед кодом. Spec перед реализацией (\u002Fsolve)\n- Тесты перед кодом — TDD (\u002Ftesting)\n- Ревью обязателен, даже собственного кода (\u002Fgo-review)\n- Коммиты с номером задачи (\u002Fcommit-msg)\n- Любой workflow стартует с актуальной базовой ветки (обычно `devel`). Устаревшая база = устаревший анализ и ревью\n- Не деплой в пятницу\n\n## Безопасность\n\n- Валидируй на границе системы (\u002Fsecurity)\n- Секреты в OS keychain (pcurl) или env vars. Никогда в коде\n- gosec, govulncheck, gitleaks в CI (\u002Fci-cd)\n\n## LLM и автоматизация\n\n- LLM — инструмент, не автор. Код должен быть понятен без AI\n- Кодогенерация с AI допустима когда: есть спецификация, результат проверяем тестами, код следует паттернам проекта\n- Артефакты LLM сохраняются в `docs\u002Fllm\u002Ftasks\u002F` (задачи) и `docs\u002Fllm\u002Fincidents\u002F` (инциденты) — прозрачность процесса\n- Не создавай зависимость от LLM\n\n## Стадии проекта\n\n| Стадия | БД | Миграции | Мониторинг |\n|--------|-----|----------|-----------|\n| Идея | sql файл актуальный, `make db` с нуля | Нет | Нет |\n| Dev | + pgmigrator, sql всё ещё актуальный | Да | Sentry, возможно Prometheus |\n| Production | + полный мониторинг | Да | Sentry, Prometheus, Loki, Grafana, Nomad |\n\n## Ссылки\n\n- https:\u002F\u002Fvmkteam.dev\u002Fsimple-architecture\u002F — Simple Architecture\n- https:\u002F\u002Fvmkteam.dev\u002Fdevelopment\u002Fphilosophy\u002F — принципы\n- https:\u002F\u002Fvmkteam.dev\u002Fdevelopment\u002Fmastering-api\u002F — работа с API\n- https:\u002F\u002Fgithub.com\u002Fvmkteam — инструменты\n",{"name":5,"description":7},"master","8f3147ce24a1a470d9aaa02aa775d7797d621d95","plugins\u002Fdeveloper\u002Fskills\u002Fphilosophy",1,"https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Fvmkteam","2026-11-05 00:26:25",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add vmkteam\u002Fclaude-plugins --skill philosophy",{"tool":38,"command":39},"bunx","bunx skills add vmkteam\u002Fclaude-plugins --skill philosophy",{"tool":41,"command":42},"pnpm","pnpm dlx skills add vmkteam\u002Fclaude-plugins --skill philosophy","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fphilosophy\u002FSKILL.md",true,[],[47,57,69,85,102,114],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":20},"01M6MX3A8MZJBTMMK6WMY35FYH","zenrpc","Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.","https:\u002F\u002Fgithub.com\u002Fvmkteam\u002Fclaude-plugins\u002Fblob\u002Fmaster\u002Fplugins\u002Fdeveloper\u002Fskills\u002Fzenrpc\u002FSKILL.md",[],[49,18,54,55,56],"json-rpc","json","rpc",{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":20},"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",[],[59,64,65,66,67,68],"issues","REST","api","stage","rest api",{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":20},"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",[],[71,76,77,56,78,79,66,80,55,81,82,83,54,84],"CPU","postgresql","cve","nginx","Bash","ip","app","io","http",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":96,"publishedAt":20},"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",[91],{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[87,97,98,18,99,100,101],"gate","spec","test","short","db",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":20},"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",[],[104,109,110,111,112,113,59],"fast","preflight","task","hitl","id",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":20},"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",[],[121,122,123,80,124,125,126,127,128,129,130,131,132,133],"skills check","check","data","smoke","probe","project","false","URL","data-source","true","source","fork","index"]