Agent Skills
Vovk.ts has 15 topic skills that teach a coding agent the framework as you describe what to build. A skill loads only when needed: “scaffold a new tenant” loads the multitenant skill, “stream chat tokens” the JSON Lines one, and so on. They work in Claude Code, Cursor, Windsurf, GitHub Copilot, Cline and the other agents that read skills.
Install
Run this in your project:
npx skills add finom/vovkThe skills CLI asks which skills to install (select all 15), picks up the agents on your machine (or asks which ones), and asks whether to install in the project or for your user (-g). To name the agent and skip the questions:
| Agent | Install |
|---|---|
| Claude Code | npx skills add finom/vovk -a claude-code -s "*" -y |
| Cursor | npx skills add finom/vovk -a cursor -s "*" -y |
| Windsurf | npx skills add finom/vovk -a windsurf -s "*" -y |
| GitHub Copilot | npx skills add finom/vovk -a github-copilot -s "*" -y |
| Cline | npx skills add finom/vovk -a cline -s "*" -y |
The skill files land in .claude/skills/ (Claude Code), .windsurf/skills/ (Windsurf) or .agents/skills/ (Cursor, Copilot, Cline). With -g, they go to your home folder instead. npx skills update brings them up to date.
Claude Code plugin
In Claude Code you can also install the skills as a plugin. Its skill names start with vovk:.
| Install | |
|---|---|
| Terminal | claude plugin marketplace add finom/vovk && claude plugin install vovk@vovk |
| In a session | /plugin marketplace add finom/vovk, then /plugin install vovk@vovk |
finom/vovk points to .claude-plugin/marketplace.json in the GitHub repo. The plugin and the marketplace are both named vovk: vovk@vovk is <plugin-name>@<marketplace-name>. For a local checkout (development), use its path: claude plugin marketplace add /path/to/vovk (the repo root).
Run /plugin to check: the Installed tab lists vovk, and typing /vovk: (with the colon) lists all 15 skills.
The plugin installs from the repo’s main branch. It has its own version in .claude-plugin/plugin.json, separate from the npm packages. A new plugin version brings the skill updates: run claude plugin update vovk@vovk, or turn on auto-update for the vovk marketplace in /plugin → Marketplaces (it’s off by default for third-party marketplaces). The new version loads in your next session, or after /reload-plugins.
Skills
The fifteen skills cover every part of Vovk.ts. With npx skills, they carry the names below without the vovk: prefix.
vovk:init— set up Vovk.ts in a Next.js App Router project, or create a new Next.js app and runvovk initin it.vovk:base— the essentials: whatvovkexports, the project layout, a complete endpoint, how requests, validation and errors behave, status codes, a custom error format, CORS, and how to get the schema, the typed client and the OpenAPI document.vovk:config— thevovk.config.{mjs,cjs,js}shape, every config key and default (rootEntry,schemaOutDir,composedClient,segmentedClient,clientTemplateDefs,outputConfig,bundle, …), and thetsconfig.jsonsetup.vovk:segment— segments (root, named, static),initSegment, segment priority,generateStaticParams.vovk:multitenant— routing tenants by subdomain: themultitenant()proxy, theoverridesshape, per-tenant segments and front-end pages, wildcard DNS.vovk:procedure— procedures, validation (Zod / Valibot / ArkType), controllers, HTTP decorators,req.vovk, error handling, content types,.fn()for SSR / server components / server actions.vovk:decorators— built-in and custom decorators (createDecorator), authorization patterns,req.vovk.meta(), stacking order.vovk:rpc— the generated RPC client (@/client), composed vs segmented clients, call shape,createFetcher, error rethrow, type inference from client methods.vovk:jsonlines— JSON Lines streaming: generator handlers,JSONLinesResponder,progressive(), client async iteration,using,asPromise, abort.vovk:openapi— OpenAPI 3.x generation:@operationmetadata,outputConfig.openAPIObject, per-segment overrides, serving the spec, Scalar docs.vovk:mixins— import third-party OpenAPI 3.x schemas as typed client modules, called like your own RPC modules.vovk:tools— procedures as LLM tools withderiveTools(), MCP-compatible output,@operation, controllers vs RPC modules, OpenAI / Anthropic / MCP wiring.vovk:bundle— thevovk bundlecommand for publishable TypeScript SDKs.vovk:python— generate a typed Python client (vovk-python),py/pySrctemplates,TypedDictshapes, JSON Lines via Python generators, PyPI publishing.vovk:rust— generate a typed Rust crate (vovk-rust),rs/rsSrctemplates, asyncreqwestcall shape, reading afutures::Stream, crates.io publishing.
First prompts to try
The skills load on their own when you describe what to build. Pick your kind of project:
- Greenfield — “Set up Vovk.ts in a new Next.js project. I want a
/api/tasksCRUD endpoint with Zod validation, and a Next.js page that consumes it through the typed client.” - Existing Next.js project — “Add Vovk.ts to my existing Next.js app and scaffold a UserController with
getUser/createUser.” - Stream-heavy work — “Add a
/api/chatJSON Lines streaming endpoint that proxies OpenAI completions, plus a Python script that consumes the stream.”
Short prompts such as “create a backend for Next.js” don’t always load a skill: the agent finds them too general. Mention “Vovk” or “vovk-cli” once, and the right skill loads.
What the agent gets from Vovk.ts
Vovk.ts sets where code goes, so the agent can predict it:
- Code by feature in
src/modules/<name>/: a controller and a service per feature, not files spread acrosslib/. - Controller and service apart: controllers define the decorated procedures; services, plain classes, hold the business logic. What the endpoint is stays apart from what it does.
- Service methods, not loose helpers: fewer files and a predictable layout.
- One source of truth: the same
procedure().handle()serves the HTTP endpoint, the SSR call (.fn()) and the AI tool (deriveTools). Nothing is duplicated, so the model has less to reconcile. - Plain REST:
curlandfetchwork. Types go end to end without a custom protocol. - Multitenancy: the
multitenant()proxy and a segment per tenant host many tenants on subdomains in one Next.js app. - OpenAPI and AI tools: the schema comes from the procedures, Scalar shows the generated code samples, and one line makes a procedure an LLM tool.
Why skills
Without them, asking an agent to “scaffold a Vovk procedure with Zod validation” goes one of two ways. The model makes up an API from months-old training data, though the Vovk.ts API has changed. Or it fetches vovk.dev mid-task, which is slow, hits rate limits and often loads the wrong page first.
With the skills, the agent loads the framework’s patterns by topic:
- One topic at a time. Only the needed skills load, so the agent doesn’t read thousands of lines of docs for one question.
- Self-contained. The base skill holds the facts a typical API build needs, checked against vovk 4’s code. Its description asks the agent to load it first for any Vovk.ts task; the agent decides, and on a change to an existing project it may load another skill first. It tells the agent not to fetch vovk.dev mid-task and not to read vovk’s source in
node_modules: the skills are the source of truth. They work offline, with a predictable cost and no rate limits. - Handoffs between skills. A skill points to the one that owns a topic: mixins to tools for LLM tools, procedure to jsonlines for streaming. The agent loads the context it needs, not the context next to it.
- Compressed text. The topic skills use terse “caveman” prose, with the same content: articles and filler dropped, code blocks unchanged.
Reporting bugs
A skill that writes wrong code or contradicts itself is a bug. Open an issue at github.com/finom/vovk/issues with your prompt and the skill that loaded.
More info: