Zenstack V3

SKILL运维和基础设施
运维和基础设施 未标注权限 许可证不明确

ZenStack v3 schema-first ORM for TypeScript. Use when working with ZModel schemas, ZenStack ORM CRUD operations, access control policies (@@allow/@@deny), database migrations, server adapters (Next.js, Express), runtime plugins, computed fields, polymorphism, typed JSON, or migrating from Prisma/ZenStack v2. Triggers on: ZModel, ZenStack, zenstack, .zmodel files, @@allow, @@deny, auth(), PolicyPlugin, ZenStackClient, @zenstackhq/orm, zen generate, zen migrate.

一句话选型结论

按资料字段整理

Zenstack V3是运维和基础设施类的 Agent Skill,安装方式:GitHub 仓库,权限级别未标注,许可证不明确,没有现成安装命令,需按说明手动放置 SKILL.md。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类运维和基础设施 安装方式GitHub 仓库 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 agent-skills
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

GitHub 仓库
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    按安装说明或仓库 README,把 SKILL.md 放到客户端的 skills 目录(一般一个技能一个文件夹)。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

运维和基础设施
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方edhahn仓库 agent-skills · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式GitHub 仓库安装包 edhahn/agent-skills
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 2026-03-19
正文体量8.8 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
查服务与日志

按现象定位服务状态与日志线索。

写部署与巡检脚本

把重复的部署、巡检写成脚本。

故障排查

按步骤排查网络、依赖与配置。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 基础信息齐全,可以先按说明装一个试试。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有现成安装命令,要按安装说明或仓库 README 手动放置。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在运维和基础设施场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
Zenstack V3当前 未标注权限 GitHub 仓库 未标注 未标注 无
Azure 部署 调用外部服务 GitHub 仓库 664.2 万 Codex、Claude、Cursor 有
Azure diagnostics 问题管理 调用外部服务 GitHub 仓库 657.6 万 Codex、Claude、Cursor 有
Azure aigateway 部署 调用外部服务 GitHub 仓库 655.3 万 Codex、Claude、Cursor 有
Azure AI 搜索 调用外部服务 GitHub 仓库 651.4 万 Codex、Claude、Cursor 有
Azure Cloud migrate 部署 调用外部服务 GitHub 仓库 650.7 万 Codex、Claude、Cursor 有

SKILL.md 全文

8.8 KB
模型实际读到的说明书原文,来自技能仓库

ZenStack v3 — AI Coding Agent Skill

Critical Context

ZenStack v3 is a COMPLETE REWRITE. It removed Prisma as a runtime dependency and built
its own ORM on Kysely. The schema language remains a "Prisma superset"
but the runtime is entirely different.

Do NOT confuse with v2:
- v2 used @zenstackhq/runtime → v3 uses @zenstackhq/orm
- v2 CLI was zenstack package → v3 is @zenstackhq/cli
- v2 had abstract model → v3 uses type + with (mixins)
- v2 used enhance(prisma, ...) → v3 uses db.$use(new PolicyPlugin())
- v2 generated into node_modules → v3 generates to zenstack/ folder

Supported databases: PostgreSQL, MySQL, SQLite only.

Quick Start

Installation

npm install @zenstackhq/schema @zenstackhq/orm
npm install --save-dev @zenstackhq/cli
# Plus a database driver:
npm install better-sqlite3  # or pg, mysql2

Minimal Schema

// zenstack/schema.zmodel
datasource db {
  provider = 'sqlite'
  url      = 'file:./dev.db'
}

model User {
  id    Int    @id @default(autoincrement())
  email String @unique
  posts Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

Generate & Create Client

npx zen generate
import { ZenStackClient } from '@zenstackhq/orm';
import { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';
import SQLite from 'better-sqlite3';
import { schema } from './zenstack/schema';

export const db = new ZenStackClient(schema, {
  dialect: new SqliteDialect({ database: new SQLite('./dev.db') }),
});

Basic CRUD

// Create
const user = await db.user.create({
  data: { email: 'alice@test.com', posts: { create: { title: 'Hello' } } },
  include: { posts: true },
});

// Read
const posts = await db.post.findMany({
  where: { published: true },
  orderBy: { createdAt: 'desc' },
  include: { author: true },
});

// Update
await db.post.update({
  where: { id: 1 },
  data: { published: true },
});

// Delete
await db.post.delete({ where: { id: 1 } });

// Transaction
const [u, p] = await db.$transaction(async (tx) => {
  const u = await tx.user.create({ data: { email: 'bob@test.com' } });
  const p = await tx.post.create({ data: { title: 'Hi', authorId: u.id } });
  return [u, p];
});

Access Control

Setup

npm install @zenstackhq/plugin-policy
plugin policy {
  provider = '@zenstackhq/plugin-policy'
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int

  @@deny('all', auth() == null)
  @@allow('read', published)
  @@allow('all', auth().id == authorId)
}

Runtime

import { PolicyPlugin } from '@zenstackhq/plugin-policy';

const authDb = db.$use(new PolicyPlugin());
const userDb = authDb.$setAuth({ id: currentUserId });
// All queries on userDb enforce access policies

Evaluation: deny wins → allow wins → denied by default.

Operations: create, read, update, post-update, delete, all (excludes post-update).

Key Functions

  • auth() — current user (type from @@auth model or User model)
  • check(relation, operation?) — delegate to relation's policies
  • now() — current datetime
  • Collection predicates: relation?[cond] (some), relation![cond] (every), relation^[cond] (none)

Schema Patterns

Mixins

type Timestamped {
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Post with Timestamped {
  id    Int    @id @default(autoincrement())
  title String
}

Polymorphism (MTI)

model Content {
  id   Int    @id @default(autoincrement())
  name String
  type String
  @@delegate(type)
}

model Post extends Content {
  body String
}

model Video extends Content {
  url String
}

Typed JSON

type Address {
  street String
  city   String
  zip    Int
}

model User {
  id      Int     @id
  address Address @json
}

Computed Fields

model User {
  id        Int @id
  postCount Int @computed
}
const db = new ZenStackClient(schema, {
  dialect: ...,
  computedFields: {
    User: {
      postCount: (eb) =>
        eb.selectFrom('Post')
          .whereRef('Post.authorId', '=', 'id')
          .select(({ fn }) => fn.countAll<number>().as('count')),
    },
  },
});

Query Builder ($qb)

Escape hatch to full Kysely when ORM API isn't enough:

const result = await db.$qb
  .selectFrom('User')
  .leftJoin('Post', 'Post.authorId', 'User.id')
  .select(['User.id', 'User.email', 'Post.title'])
  .execute();

Mix into ORM filters with $expr:

await db.user.findMany({
  where: {
    $expr: (eb) =>
      eb.selectFrom('Post')
        .whereRef('Post.authorId', '=', 'User.id')
        .select(({ fn }) => eb(fn.countAll(), '>=', 2).as('v'))
  }
});

Server Adapters

Next.js (App Router)

// app/api/model/[...path]/route.ts
import { NextRequestHandler } from '@zenstackhq/server/next';
import { RPCApiHandler } from '@zenstackhq/server/api';
import { schema } from '~/zenstack/schema';

const handler = NextRequestHandler({
  apiHandler: new RPCApiHandler({ schema }),
  getClient: (req) => authDb.$setAuth(getSessionUser(req)),
  useAppDir: true,
});

export { handler as GET, handler as POST, handler as PUT, handler as PATCH, handler as DELETE };

Express.js

import { ZenStackMiddleware } from '@zenstackhq/server/express';
import { RPCApiHandler } from '@zenstackhq/server/api';

app.use('/api/model', ZenStackMiddleware({
  apiHandler: new RPCApiHandler({ schema }),
  getClient: (req) => authDb.$setAuth(getUser(req)),
}));

CLI Commands

Command Purpose
zen generate Compile ZModel → TypeScript
zen db push Push schema to DB (dev only)
zen db pull Introspect DB → ZModel
zen migrate dev Create + apply migration (dev)
zen migrate deploy Apply pending migrations (prod)
zen migrate reset Drop + reapply all (dev only)
zen migrate status Check migration status

Plugins

Schema Plugins

plugin policy {
  provider = '@zenstackhq/plugin-policy'
}

plugin prisma {
  provider = '@core/prisma'
  output   = '../prisma/schema.prisma'
}

Runtime Plugins

const enhanced = db.$use({
  id: 'my-plugin',
  onQuery: {
    $allModels: {
      async $allOperations({ args, proceed }) {
        console.log('query intercepted');
        return proceed(args);
      },
    },
  },
});

Hook types: Query API hooks, Entity mutation hooks, Kysely query hooks.

Reference Files

For detailed documentation, see:
- references/schema-language.md — models, relations, enums, attributes, mixins, polymorphism, typed JSON
- references/access-control.md — policies, auth(), field-level policies, runtime behavior
- references/orm-api.md — CRUD, filters, transactions, computed fields, query builder
- references/plugins-and-cli.md — plugin system, CLI commands, code generation
- references/server-adapters.md — Next.js, Express, REST API, client-side hooks
- references/migration.md — migrating from Prisma and from v2

Common Gotchas

  1. No Prisma at runtime — don't import from @prisma/client
  2. Install DB driver yourself — ZenStack doesn't bundle drivers
  3. $use() and $setAuth() return new clients — they're immutable
  4. Raw SQL bypasses access control — $executeRaw, $queryRaw, sql tag
  5. Cascade deletes/triggers bypass access control — DB-internal operations
  6. select and include are mutually exclusive — can't use both
  7. post-update must be explicit — all doesn't include it
  8. v3 generates to zenstack/ folder — not into node_modules
  9. Computed fields are DB-side — not client-side like Prisma extensions
  10. Only PostgreSQL, MySQL, SQLite — no MongoDB, CockroachDB, etc.
  11. Use multiple schema files — use a zmodel file per model/enum/type in a ./schema folder
  12. Zmodel files allow circular imports - don't worry about circular imports in zmodel

常见问题

5 问
答案由本站依据条目字段整理
Zenstack V3怎么安装?

没有现成安装命令:按安装说明或仓库 README,把 SKILL.md 放进客户端的 skills 目录(一般一个技能一个文件夹)。

Zenstack V3支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

Zenstack V3权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

Zenstack V3收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

Zenstack V3用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。