@rotifer/playground 0.5.0-alpha.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +159 -15
- package/LICENSE +1 -1
- package/README.md +51 -23
- package/README.zh.md +54 -25
- package/dist/cloud/auth.d.ts +7 -1
- package/dist/cloud/auth.d.ts.map +1 -1
- package/dist/cloud/auth.js +65 -1
- package/dist/cloud/auth.js.map +1 -1
- package/dist/cloud/client.d.ts +4 -1
- package/dist/cloud/client.d.ts.map +1 -1
- package/dist/cloud/client.js +9 -2
- package/dist/cloud/client.js.map +1 -1
- package/dist/cloud/types.d.ts +3 -1
- package/dist/cloud/types.d.ts.map +1 -1
- package/dist/cloud/types.js.map +1 -1
- package/dist/commands/agent-create.d.ts.map +1 -1
- package/dist/commands/agent-create.js +66 -3
- package/dist/commands/agent-create.js.map +1 -1
- package/dist/commands/agent-run.d.ts.map +1 -1
- package/dist/commands/agent-run.js +296 -32
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/arena-submit.d.ts.map +1 -1
- package/dist/commands/arena-submit.js +45 -17
- package/dist/commands/arena-submit.js.map +1 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +9 -3
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +13 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +23 -16
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/network.js +4 -4
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +162 -44
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +209 -23
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +17 -1
- package/dist/commands/wrap.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/runtime/network-gateway.d.ts +53 -0
- package/dist/runtime/network-gateway.d.ts.map +1 -0
- package/dist/runtime/network-gateway.js +147 -0
- package/dist/runtime/network-gateway.js.map +1 -0
- package/dist/utils/binding.d.ts +25 -0
- package/dist/utils/binding.d.ts.map +1 -1
- package/dist/utils/binding.js.map +1 -1
- package/dist/utils/open-browser.d.ts +10 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +23 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/genes/academic-writer/.cloud-manifest.json +6 -0
- package/genes/academic-writer/.gene-manifest.json +8 -0
- package/genes/academic-writer/SKILL.md +274 -0
- package/genes/academic-writer/phenotype.json +28 -0
- package/genes/ai-components/.cloud-manifest.json +6 -0
- package/genes/ai-components/.gene-manifest.json +8 -0
- package/genes/ai-components/SKILL.md +381 -0
- package/genes/ai-components/phenotype.json +28 -0
- package/genes/algorithmic-art/.cloud-manifest.json +6 -0
- package/genes/algorithmic-art/.gene-manifest.json +8 -0
- package/genes/algorithmic-art/SKILL.md +405 -0
- package/genes/algorithmic-art/phenotype.json +28 -0
- package/genes/answer-synthesizer/.cloud-manifest.json +6 -0
- package/genes/answer-synthesizer/index.ts +194 -0
- package/genes/answer-synthesizer/phenotype.json +61 -0
- package/genes/api-designer/.cloud-manifest.json +6 -0
- package/genes/api-designer/.gene-manifest.json +8 -0
- package/genes/api-designer/SKILL.md +456 -0
- package/genes/api-designer/phenotype.json +28 -0
- package/genes/auto-coder/.cloud-manifest.json +6 -0
- package/genes/auto-coder/.gene-manifest.json +8 -0
- package/genes/auto-coder/SKILL.md +400 -0
- package/genes/auto-coder/phenotype.json +28 -0
- package/genes/auto-writer/.cloud-manifest.json +6 -0
- package/genes/auto-writer/.gene-manifest.json +8 -0
- package/genes/auto-writer/SKILL.md +361 -0
- package/genes/auto-writer/phenotype.json +28 -0
- package/genes/brand-personality/.cloud-manifest.json +6 -0
- package/genes/brand-personality/.gene-manifest.json +8 -0
- package/genes/brand-personality/SKILL.md +549 -0
- package/genes/brand-personality/phenotype.json +28 -0
- package/genes/business-writer/.cloud-manifest.json +6 -0
- package/genes/business-writer/.gene-manifest.json +8 -0
- package/genes/business-writer/SKILL.md +448 -0
- package/genes/business-writer/phenotype.json +28 -0
- package/genes/citation-manager/.cloud-manifest.json +6 -0
- package/genes/citation-manager/.gene-manifest.json +8 -0
- package/genes/citation-manager/SKILL.md +279 -0
- package/genes/citation-manager/index.ts +162 -0
- package/genes/citation-manager/package.json +1 -0
- package/genes/citation-manager/phenotype.json +50 -0
- package/genes/code-complexity/.cloud-manifest.json +6 -0
- package/genes/code-complexity/README.md +35 -0
- package/genes/code-complexity/index.ts +101 -0
- package/genes/code-complexity/phenotype.json +34 -0
- package/genes/copywriter/.cloud-manifest.json +6 -0
- package/genes/copywriter/.gene-manifest.json +8 -0
- package/genes/copywriter/SKILL.md +329 -0
- package/genes/copywriter/phenotype.json +28 -0
- package/genes/creative-writer/.cloud-manifest.json +6 -0
- package/genes/creative-writer/.gene-manifest.json +8 -0
- package/genes/creative-writer/SKILL.md +356 -0
- package/genes/creative-writer/phenotype.json +28 -0
- package/genes/data-modeler/.cloud-manifest.json +6 -0
- package/genes/data-modeler/.gene-manifest.json +8 -0
- package/genes/data-modeler/SKILL.md +486 -0
- package/genes/data-modeler/phenotype.json +28 -0
- package/genes/debugger/.cloud-manifest.json +6 -0
- package/genes/debugger/.gene-manifest.json +8 -0
- package/genes/debugger/SKILL.md +416 -0
- package/genes/debugger/phenotype.json +28 -0
- package/genes/design-tokens/.cloud-manifest.json +6 -0
- package/genes/design-tokens/.gene-manifest.json +8 -0
- package/genes/design-tokens/SKILL.md +222 -0
- package/genes/design-tokens/index.ts +128 -0
- package/genes/design-tokens/package.json +1 -0
- package/genes/design-tokens/phenotype.json +1 -0
- package/genes/devops-automator/.cloud-manifest.json +6 -0
- package/genes/devops-automator/.gene-manifest.json +8 -0
- package/genes/devops-automator/SKILL.md +490 -0
- package/genes/devops-automator/phenotype.json +28 -0
- package/genes/doc-coauthoring/.cloud-manifest.json +6 -0
- package/genes/doc-coauthoring/.gene-manifest.json +8 -0
- package/genes/doc-coauthoring/SKILL.md +375 -0
- package/genes/doc-coauthoring/phenotype.json +28 -0
- package/genes/doc-retrieval/.cloud-manifest.json +6 -0
- package/genes/doc-retrieval/index.ts +134 -0
- package/genes/doc-retrieval/phenotype.json +54 -0
- package/genes/docs-writer/.cloud-manifest.json +6 -0
- package/genes/docs-writer/.gene-manifest.json +8 -0
- package/genes/docs-writer/SKILL.md +492 -0
- package/genes/docs-writer/phenotype.json +28 -0
- package/genes/evolve-life/.cloud-manifest.json +6 -0
- package/genes/evolve-life/.compile-result.json +12 -0
- package/genes/evolve-life/README.md +52 -0
- package/genes/evolve-life/gene.ir.wasm +0 -0
- package/genes/evolve-life/gene.wasm +0 -0
- package/genes/evolve-life/index.ts +255 -0
- package/genes/evolve-life/phenotype.json +129 -0
- package/genes/evolve-life-bitwise/.cloud-manifest.json +6 -0
- package/genes/evolve-life-bitwise/.compile-result.json +12 -0
- package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
- package/genes/evolve-life-bitwise/gene.wasm +0 -0
- package/genes/evolve-life-bitwise/index.ts +273 -0
- package/genes/evolve-life-bitwise/phenotype.json +129 -0
- package/genes/evolve-life-sparse/.cloud-manifest.json +6 -0
- package/genes/evolve-life-sparse/.compile-result.json +12 -0
- package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
- package/genes/evolve-life-sparse/gene.wasm +0 -0
- package/genes/evolve-life-sparse/index.ts +236 -0
- package/genes/evolve-life-sparse/phenotype.json +129 -0
- package/genes/fact-checker/.cloud-manifest.json +6 -0
- package/genes/fact-checker/.gene-manifest.json +8 -0
- package/genes/fact-checker/SKILL.md +373 -0
- package/genes/fact-checker/phenotype.json +28 -0
- package/genes/genesis-code-format/.cloud-manifest.json +6 -0
- package/genes/genesis-code-format/package.json +1 -0
- package/genes/genesis-code-format/phenotype.json +1 -0
- package/genes/genesis-file-read/.cloud-manifest.json +6 -0
- package/genes/genesis-file-read/index.ts +11 -1
- package/genes/genesis-file-read/package.json +1 -0
- package/genes/genesis-file-read/phenotype.json +1 -0
- package/genes/genesis-l0-constraint/.cloud-manifest.json +6 -0
- package/genes/genesis-l0-constraint/package.json +1 -0
- package/genes/genesis-l0-constraint/phenotype.json +1 -0
- package/genes/genesis-web-search/.cloud-manifest.json +2 -2
- package/genes/genesis-web-search/package.json +1 -0
- package/genes/genesis-web-search/phenotype.json +1 -0
- package/genes/genesis-web-search-lite/.cloud-manifest.json +6 -0
- package/genes/genesis-web-search-lite/package.json +1 -0
- package/genes/genesis-web-search-lite/phenotype.json +1 -0
- package/genes/git-workflow/.cloud-manifest.json +6 -0
- package/genes/git-workflow/.gene-manifest.json +8 -0
- package/genes/git-workflow/SKILL.md +407 -0
- package/genes/git-workflow/phenotype.json +28 -0
- package/genes/grammar-checker/.cloud-manifest.json +6 -0
- package/genes/grammar-checker/.gene-manifest.json +8 -0
- package/genes/grammar-checker/SKILL.md +194 -0
- package/genes/grammar-checker/index.ts +168 -0
- package/genes/grammar-checker/package.json +1 -0
- package/genes/grammar-checker/phenotype.json +52 -0
- package/genes/json-validator/.cloud-manifest.json +6 -0
- package/genes/json-validator/README.md +42 -0
- package/genes/json-validator/index.ts +112 -0
- package/genes/json-validator/phenotype.json +42 -0
- package/genes/license-advisor/.cloud-manifest.json +6 -0
- package/genes/license-advisor/.gene-manifest.json +8 -0
- package/genes/license-advisor/SKILL.md +117 -0
- package/genes/license-advisor/phenotype.json +28 -0
- package/genes/logic-architect/.cloud-manifest.json +6 -0
- package/genes/logic-architect/.gene-manifest.json +8 -0
- package/genes/logic-architect/SKILL.md +451 -0
- package/genes/logic-architect/phenotype.json +28 -0
- package/genes/markdown-formatter/.cloud-manifest.json +6 -0
- package/genes/markdown-formatter/README.md +34 -0
- package/genes/markdown-formatter/index.ts +86 -0
- package/genes/markdown-formatter/phenotype.json +32 -0
- package/genes/orch/.cloud-manifest.json +6 -0
- package/genes/orch/.gene-manifest.json +8 -0
- package/genes/orch/SKILL.md +504 -0
- package/genes/orch/phenotype.json +28 -0
- package/genes/particle-barneshut/.cloud-manifest.json +6 -0
- package/genes/particle-barneshut/.compile-result.json +12 -0
- package/genes/particle-barneshut/README.md +55 -0
- package/genes/particle-barneshut/gene.ir.wasm +0 -0
- package/genes/particle-barneshut/gene.wasm +0 -0
- package/genes/particle-barneshut/index.ts +486 -0
- package/genes/particle-barneshut/phenotype.json +137 -0
- package/genes/particle-brute/.cloud-manifest.json +6 -0
- package/genes/particle-brute/.compile-result.json +12 -0
- package/genes/particle-brute/README.md +55 -0
- package/genes/particle-brute/gene.ir.wasm +0 -0
- package/genes/particle-brute/gene.wasm +0 -0
- package/genes/particle-brute/index.ts +277 -0
- package/genes/particle-brute/phenotype.json +137 -0
- package/genes/particle-spatial/.cloud-manifest.json +6 -0
- package/genes/particle-spatial/.compile-result.json +12 -0
- package/genes/particle-spatial/README.md +53 -0
- package/genes/particle-spatial/gene.ir.wasm +0 -0
- package/genes/particle-spatial/gene.wasm +0 -0
- package/genes/particle-spatial/index.ts +352 -0
- package/genes/particle-spatial/phenotype.json +137 -0
- package/genes/performance-optimizer/.cloud-manifest.json +6 -0
- package/genes/performance-optimizer/.gene-manifest.json +8 -0
- package/genes/performance-optimizer/SKILL.md +480 -0
- package/genes/performance-optimizer/phenotype.json +28 -0
- package/genes/plagiarism-checker/.cloud-manifest.json +6 -0
- package/genes/plagiarism-checker/.gene-manifest.json +8 -0
- package/genes/plagiarism-checker/SKILL.md +342 -0
- package/genes/plagiarism-checker/phenotype.json +28 -0
- package/genes/product-manager/.cloud-manifest.json +6 -0
- package/genes/product-manager/.gene-manifest.json +8 -0
- package/genes/product-manager/SKILL.md +249 -0
- package/genes/product-manager/phenotype.json +28 -0
- package/genes/project-reviewer/.cloud-manifest.json +6 -0
- package/genes/project-reviewer/.gene-manifest.json +8 -0
- package/genes/project-reviewer/SKILL.md +312 -0
- package/genes/project-reviewer/phenotype.json +28 -0
- package/genes/prompt-engineer/.cloud-manifest.json +6 -0
- package/genes/prompt-engineer/.gene-manifest.json +8 -0
- package/genes/prompt-engineer/SKILL.md +411 -0
- package/genes/prompt-engineer/phenotype.json +28 -0
- package/genes/readability-analyzer/.cloud-manifest.json +6 -0
- package/genes/readability-analyzer/.gene-manifest.json +8 -0
- package/genes/readability-analyzer/SKILL.md +357 -0
- package/genes/readability-analyzer/index.ts +123 -0
- package/genes/readability-analyzer/package.json +1 -0
- package/genes/readability-analyzer/phenotype.json +35 -0
- package/genes/rotifer-protocol/SKILL.md +121 -0
- package/genes/security-auditor/.cloud-manifest.json +6 -0
- package/genes/security-auditor/.gene-manifest.json +8 -0
- package/genes/security-auditor/SKILL.md +494 -0
- package/genes/security-auditor/phenotype.json +28 -0
- package/genes/seo-optimizer/.cloud-manifest.json +6 -0
- package/genes/seo-optimizer/.gene-manifest.json +8 -0
- package/genes/seo-optimizer/SKILL.md +327 -0
- package/genes/seo-optimizer/index.ts +206 -0
- package/genes/seo-optimizer/package.json +1 -0
- package/genes/seo-optimizer/phenotype.json +1 -0
- package/genes/source-linker/.cloud-manifest.json +6 -0
- package/genes/source-linker/index.ts +88 -0
- package/genes/source-linker/phenotype.json +45 -0
- package/genes/style-optimizer/.cloud-manifest.json +6 -0
- package/genes/style-optimizer/.gene-manifest.json +8 -0
- package/genes/style-optimizer/SKILL.md +285 -0
- package/genes/style-optimizer/phenotype.json +28 -0
- package/genes/tech-lead/.cloud-manifest.json +6 -0
- package/genes/tech-lead/.gene-manifest.json +8 -0
- package/genes/tech-lead/SKILL.md +451 -0
- package/genes/tech-lead/phenotype.json +28 -0
- package/genes/test-wrap/.cloud-manifest.json +6 -0
- package/genes/test-wrap/.gene-manifest.json +8 -0
- package/genes/test-wrap/phenotype.json +28 -0
- package/genes/testing-strategist/.cloud-manifest.json +6 -0
- package/genes/testing-strategist/.gene-manifest.json +8 -0
- package/genes/testing-strategist/SKILL.md +500 -0
- package/genes/testing-strategist/phenotype.json +28 -0
- package/genes/text-summarizer/.cloud-manifest.json +6 -0
- package/genes/text-summarizer/README.md +34 -0
- package/genes/text-summarizer/index.ts +122 -0
- package/genes/text-summarizer/phenotype.json +32 -0
- package/genes/tone-analyzer/.cloud-manifest.json +6 -0
- package/genes/tone-analyzer/.gene-manifest.json +8 -0
- package/genes/tone-analyzer/SKILL.md +410 -0
- package/genes/tone-analyzer/phenotype.json +28 -0
- package/genes/translator/.cloud-manifest.json +6 -0
- package/genes/translator/.gene-manifest.json +8 -0
- package/genes/translator/SKILL.md +355 -0
- package/genes/translator/phenotype.json +28 -0
- package/genes/ui-components/.cloud-manifest.json +6 -0
- package/genes/ui-components/.gene-manifest.json +8 -0
- package/genes/ui-components/SKILL.md +467 -0
- package/genes/ui-components/phenotype.json +28 -0
- package/genes/uiux-designer/.cloud-manifest.json +6 -0
- package/genes/uiux-designer/.gene-manifest.json +8 -0
- package/genes/uiux-designer/SKILL.md +353 -0
- package/genes/uiux-designer/phenotype.json +28 -0
- package/genes/url-extractor/.cloud-manifest.json +6 -0
- package/genes/url-extractor/README.md +37 -0
- package/genes/url-extractor/index.ts +86 -0
- package/genes/url-extractor/phenotype.json +48 -0
- package/genes/ux-patterns/.cloud-manifest.json +6 -0
- package/genes/ux-patterns/.gene-manifest.json +8 -0
- package/genes/ux-patterns/SKILL.md +872 -0
- package/genes/ux-patterns/phenotype.json +28 -0
- package/genes/web3-components/.cloud-manifest.json +6 -0
- package/genes/web3-components/.gene-manifest.json +8 -0
- package/genes/web3-components/SKILL.md +390 -0
- package/genes/web3-components/phenotype.json +28 -0
- package/package.json +6 -5
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "content.creative",
|
|
3
|
+
"description": "Write creative content including stories, scripts, and narrative works. Master storytelling techniques, character development, and emotional expression. Use when creating fiction, screenplays, or any narrative-driven content.",
|
|
4
|
+
"inputSchema": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"prompt": {
|
|
8
|
+
"type": "string"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": []
|
|
12
|
+
},
|
|
13
|
+
"outputSchema": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"result": {
|
|
17
|
+
"type": "string"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"dependencies": [],
|
|
22
|
+
"version": "0.1.0",
|
|
23
|
+
"author": "rotifer-team",
|
|
24
|
+
"createdAt": 1771939393535,
|
|
25
|
+
"fidelity": "Wrapped",
|
|
26
|
+
"transparency": "Open",
|
|
27
|
+
"source": "skill"
|
|
28
|
+
}
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: data-modeler
|
|
3
|
+
description: Design database schemas with Prisma for AI and Web3 applications. Define models, relations, indexes, and migrations. Use when designing databases, creating Prisma schemas, or when the user mentions database, schema, model, prisma, or migration.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Data Modeler (数据建模师)
|
|
7
|
+
|
|
8
|
+
**Goal**: 设计清晰、高效、可扩展的数据库结构。
|
|
9
|
+
|
|
10
|
+
**技术栈**: Prisma + PostgreSQL (主要) / SQLite (开发)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. Schema Design Principles
|
|
15
|
+
|
|
16
|
+
### 命名规范
|
|
17
|
+
|
|
18
|
+
```prisma
|
|
19
|
+
// 模型: PascalCase (单数)
|
|
20
|
+
model User {}
|
|
21
|
+
model ChatMessage {}
|
|
22
|
+
|
|
23
|
+
// 字段: camelCase
|
|
24
|
+
model User {
|
|
25
|
+
id String
|
|
26
|
+
createdAt DateTime
|
|
27
|
+
firstName String
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 关系字段: 描述关系
|
|
31
|
+
model Post {
|
|
32
|
+
author User @relation(...)
|
|
33
|
+
authorId String
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 必备字段
|
|
38
|
+
|
|
39
|
+
```prisma
|
|
40
|
+
model BaseModel {
|
|
41
|
+
id String @id @default(cuid())
|
|
42
|
+
createdAt DateTime @default(now())
|
|
43
|
+
updatedAt DateTime @updatedAt
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// 所有模型都应包含这三个字段
|
|
47
|
+
model User {
|
|
48
|
+
id String @id @default(cuid())
|
|
49
|
+
createdAt DateTime @default(now())
|
|
50
|
+
updatedAt DateTime @updatedAt
|
|
51
|
+
|
|
52
|
+
// 业务字段...
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 软删除 (推荐)
|
|
57
|
+
|
|
58
|
+
```prisma
|
|
59
|
+
model User {
|
|
60
|
+
// ...
|
|
61
|
+
deletedAt DateTime? // null = 未删除
|
|
62
|
+
|
|
63
|
+
@@index([deletedAt])
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 查询时过滤
|
|
67
|
+
const users = await prisma.user.findMany({
|
|
68
|
+
where: { deletedAt: null }
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 2. Common Patterns
|
|
75
|
+
|
|
76
|
+
### 用户认证
|
|
77
|
+
|
|
78
|
+
```prisma
|
|
79
|
+
model User {
|
|
80
|
+
id String @id @default(cuid())
|
|
81
|
+
createdAt DateTime @default(now())
|
|
82
|
+
updatedAt DateTime @updatedAt
|
|
83
|
+
|
|
84
|
+
// 认证
|
|
85
|
+
email String @unique
|
|
86
|
+
emailVerified DateTime?
|
|
87
|
+
passwordHash String? // null if OAuth only
|
|
88
|
+
|
|
89
|
+
// 资料
|
|
90
|
+
name String?
|
|
91
|
+
image String?
|
|
92
|
+
|
|
93
|
+
// 关系
|
|
94
|
+
accounts Account[]
|
|
95
|
+
sessions Session[]
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
model Account {
|
|
99
|
+
id String @id @default(cuid())
|
|
100
|
+
userId String
|
|
101
|
+
type String
|
|
102
|
+
provider String
|
|
103
|
+
providerAccountId String
|
|
104
|
+
|
|
105
|
+
// OAuth tokens
|
|
106
|
+
accessToken String?
|
|
107
|
+
refreshToken String?
|
|
108
|
+
expiresAt Int?
|
|
109
|
+
|
|
110
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
111
|
+
|
|
112
|
+
@@unique([provider, providerAccountId])
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
model Session {
|
|
116
|
+
id String @id @default(cuid())
|
|
117
|
+
sessionToken String @unique
|
|
118
|
+
userId String
|
|
119
|
+
expires DateTime
|
|
120
|
+
|
|
121
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### AI 对话
|
|
126
|
+
|
|
127
|
+
```prisma
|
|
128
|
+
model Conversation {
|
|
129
|
+
id String @id @default(cuid())
|
|
130
|
+
createdAt DateTime @default(now())
|
|
131
|
+
updatedAt DateTime @updatedAt
|
|
132
|
+
|
|
133
|
+
title String?
|
|
134
|
+
userId String
|
|
135
|
+
|
|
136
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
137
|
+
messages Message[]
|
|
138
|
+
|
|
139
|
+
@@index([userId])
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
model Message {
|
|
143
|
+
id String @id @default(cuid())
|
|
144
|
+
createdAt DateTime @default(now())
|
|
145
|
+
|
|
146
|
+
role String // 'user' | 'assistant' | 'system'
|
|
147
|
+
content String @db.Text
|
|
148
|
+
conversationId String
|
|
149
|
+
|
|
150
|
+
// Token 统计
|
|
151
|
+
promptTokens Int?
|
|
152
|
+
completionTokens Int?
|
|
153
|
+
|
|
154
|
+
// AI 元数据
|
|
155
|
+
model String?
|
|
156
|
+
finishReason String?
|
|
157
|
+
|
|
158
|
+
conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
|
|
159
|
+
|
|
160
|
+
@@index([conversationId])
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Web3 用户
|
|
165
|
+
|
|
166
|
+
```prisma
|
|
167
|
+
model User {
|
|
168
|
+
id String @id @default(cuid())
|
|
169
|
+
createdAt DateTime @default(now())
|
|
170
|
+
updatedAt DateTime @updatedAt
|
|
171
|
+
|
|
172
|
+
// Web3
|
|
173
|
+
address String @unique // 0x...
|
|
174
|
+
chainId Int @default(1)
|
|
175
|
+
|
|
176
|
+
// ENS (缓存)
|
|
177
|
+
ensName String?
|
|
178
|
+
ensAvatar String?
|
|
179
|
+
ensUpdatedAt DateTime?
|
|
180
|
+
|
|
181
|
+
// 关系
|
|
182
|
+
wallets Wallet[]
|
|
183
|
+
|
|
184
|
+
@@index([address])
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
model Wallet {
|
|
188
|
+
id String @id @default(cuid())
|
|
189
|
+
createdAt DateTime @default(now())
|
|
190
|
+
|
|
191
|
+
address String
|
|
192
|
+
chainId Int
|
|
193
|
+
label String? // "Main", "Trading", etc.
|
|
194
|
+
|
|
195
|
+
userId String
|
|
196
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
197
|
+
|
|
198
|
+
@@unique([userId, address, chainId])
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 交易记录
|
|
203
|
+
|
|
204
|
+
```prisma
|
|
205
|
+
model Transaction {
|
|
206
|
+
id String @id @default(cuid())
|
|
207
|
+
createdAt DateTime @default(now())
|
|
208
|
+
|
|
209
|
+
hash String @unique
|
|
210
|
+
chainId Int
|
|
211
|
+
|
|
212
|
+
from String
|
|
213
|
+
to String?
|
|
214
|
+
value Decimal @db.Decimal(78, 0) // BigInt as Decimal
|
|
215
|
+
|
|
216
|
+
status TransactionStatus @default(PENDING)
|
|
217
|
+
|
|
218
|
+
// Gas
|
|
219
|
+
gasLimit Decimal? @db.Decimal(78, 0)
|
|
220
|
+
gasUsed Decimal? @db.Decimal(78, 0)
|
|
221
|
+
gasPrice Decimal? @db.Decimal(78, 0)
|
|
222
|
+
|
|
223
|
+
// 关系
|
|
224
|
+
userId String
|
|
225
|
+
user User @relation(fields: [userId], references: [id])
|
|
226
|
+
|
|
227
|
+
@@index([userId])
|
|
228
|
+
@@index([hash])
|
|
229
|
+
@@index([status])
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
enum TransactionStatus {
|
|
233
|
+
PENDING
|
|
234
|
+
CONFIRMED
|
|
235
|
+
FAILED
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 3. Relations
|
|
242
|
+
|
|
243
|
+
### 一对多
|
|
244
|
+
|
|
245
|
+
```prisma
|
|
246
|
+
model User {
|
|
247
|
+
id String @id
|
|
248
|
+
posts Post[]
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
model Post {
|
|
252
|
+
id String @id
|
|
253
|
+
author User @relation(fields: [authorId], references: [id])
|
|
254
|
+
authorId String
|
|
255
|
+
|
|
256
|
+
@@index([authorId])
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 多对多 (显式)
|
|
261
|
+
|
|
262
|
+
```prisma
|
|
263
|
+
model User {
|
|
264
|
+
id String @id
|
|
265
|
+
memberships Membership[]
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
model Team {
|
|
269
|
+
id String @id
|
|
270
|
+
memberships Membership[]
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
model Membership {
|
|
274
|
+
id String @id @default(cuid())
|
|
275
|
+
role String @default("member") // "owner" | "admin" | "member"
|
|
276
|
+
|
|
277
|
+
userId String
|
|
278
|
+
teamId String
|
|
279
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
280
|
+
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
281
|
+
|
|
282
|
+
@@unique([userId, teamId])
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 自引用
|
|
287
|
+
|
|
288
|
+
```prisma
|
|
289
|
+
model Category {
|
|
290
|
+
id String @id
|
|
291
|
+
name String
|
|
292
|
+
|
|
293
|
+
parentId String?
|
|
294
|
+
parent Category? @relation("CategoryHierarchy", fields: [parentId], references: [id])
|
|
295
|
+
children Category[] @relation("CategoryHierarchy")
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 4. Indexes & Performance
|
|
302
|
+
|
|
303
|
+
### 索引策略
|
|
304
|
+
|
|
305
|
+
```prisma
|
|
306
|
+
model User {
|
|
307
|
+
id String @id
|
|
308
|
+
email String @unique // 自动索引
|
|
309
|
+
createdAt DateTime
|
|
310
|
+
status String
|
|
311
|
+
|
|
312
|
+
// 复合索引 (常用查询)
|
|
313
|
+
@@index([status, createdAt])
|
|
314
|
+
|
|
315
|
+
// 单字段索引
|
|
316
|
+
@@index([createdAt])
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 何时添加索引
|
|
321
|
+
|
|
322
|
+
| 场景 | 需要索引 |
|
|
323
|
+
|------|----------|
|
|
324
|
+
| WHERE 条件字段 | ✅ |
|
|
325
|
+
| ORDER BY 字段 | ✅ |
|
|
326
|
+
| 外键字段 | ✅ (手动添加) |
|
|
327
|
+
| JOIN 条件 | ✅ |
|
|
328
|
+
| 唯一约束字段 | 自动 |
|
|
329
|
+
|
|
330
|
+
### BigInt 处理
|
|
331
|
+
|
|
332
|
+
```prisma
|
|
333
|
+
// 方式 1: Decimal (推荐)
|
|
334
|
+
model Token {
|
|
335
|
+
balance Decimal @db.Decimal(78, 0) // 最大 uint256
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// 方式 2: BigInt (Prisma 4.x+)
|
|
339
|
+
model Token {
|
|
340
|
+
balance BigInt
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 5. Migrations
|
|
347
|
+
|
|
348
|
+
### 开发流程
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
# 1. 修改 schema.prisma
|
|
352
|
+
|
|
353
|
+
# 2. 创建迁移
|
|
354
|
+
pnpm prisma migrate dev --name add_user_avatar
|
|
355
|
+
|
|
356
|
+
# 3. 应用到开发库 (自动)
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### 生产部署
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
# CI/CD 中运行
|
|
363
|
+
pnpm prisma migrate deploy
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### 迁移最佳实践
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
# ✅ 小步迁移
|
|
370
|
+
add_user_table
|
|
371
|
+
add_user_email_index
|
|
372
|
+
add_user_avatar_field
|
|
373
|
+
|
|
374
|
+
# ❌ 大爆炸迁移
|
|
375
|
+
initial_schema_with_everything
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### 数据迁移
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
// prisma/migrations/xxx/data-migration.ts
|
|
382
|
+
import { PrismaClient } from '@prisma/client'
|
|
383
|
+
|
|
384
|
+
const prisma = new PrismaClient()
|
|
385
|
+
|
|
386
|
+
async function main() {
|
|
387
|
+
// 填充默认值
|
|
388
|
+
await prisma.user.updateMany({
|
|
389
|
+
where: { role: null },
|
|
390
|
+
data: { role: 'user' }
|
|
391
|
+
})
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
main()
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## 6. Query Patterns
|
|
400
|
+
|
|
401
|
+
### 常用查询
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
// 分页
|
|
405
|
+
const users = await prisma.user.findMany({
|
|
406
|
+
skip: (page - 1) * pageSize,
|
|
407
|
+
take: pageSize,
|
|
408
|
+
orderBy: { createdAt: 'desc' },
|
|
409
|
+
})
|
|
410
|
+
|
|
411
|
+
// 包含关系
|
|
412
|
+
const user = await prisma.user.findUnique({
|
|
413
|
+
where: { id },
|
|
414
|
+
include: { posts: true },
|
|
415
|
+
})
|
|
416
|
+
|
|
417
|
+
// 选择字段
|
|
418
|
+
const user = await prisma.user.findUnique({
|
|
419
|
+
where: { id },
|
|
420
|
+
select: { id: true, name: true, email: true },
|
|
421
|
+
})
|
|
422
|
+
|
|
423
|
+
// 统计
|
|
424
|
+
const count = await prisma.user.count({
|
|
425
|
+
where: { status: 'active' },
|
|
426
|
+
})
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### 事务
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
// 隐式事务
|
|
433
|
+
const [user, post] = await prisma.$transaction([
|
|
434
|
+
prisma.user.create({ data: userData }),
|
|
435
|
+
prisma.post.create({ data: postData }),
|
|
436
|
+
])
|
|
437
|
+
|
|
438
|
+
// 交互式事务
|
|
439
|
+
await prisma.$transaction(async (tx) => {
|
|
440
|
+
const user = await tx.user.create({ data: userData })
|
|
441
|
+
await tx.post.create({
|
|
442
|
+
data: { ...postData, authorId: user.id }
|
|
443
|
+
})
|
|
444
|
+
})
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## 7. Schema Checklist
|
|
450
|
+
|
|
451
|
+
```markdown
|
|
452
|
+
## 数据模型检查清单
|
|
453
|
+
|
|
454
|
+
### 基础
|
|
455
|
+
- [ ] 所有模型有 id, createdAt, updatedAt
|
|
456
|
+
- [ ] 使用正确的命名规范
|
|
457
|
+
- [ ] 外键字段有索引
|
|
458
|
+
|
|
459
|
+
### 关系
|
|
460
|
+
- [ ] onDelete 策略明确 (Cascade/SetNull/Restrict)
|
|
461
|
+
- [ ] 多对多使用显式中间表
|
|
462
|
+
- [ ] 自引用关系正确
|
|
463
|
+
|
|
464
|
+
### 性能
|
|
465
|
+
- [ ] 常用查询字段有索引
|
|
466
|
+
- [ ] 复合索引顺序正确
|
|
467
|
+
- [ ] BigInt 使用 Decimal
|
|
468
|
+
|
|
469
|
+
### 安全
|
|
470
|
+
- [ ] 敏感字段不直接暴露
|
|
471
|
+
- [ ] 软删除用于重要数据
|
|
472
|
+
- [ ] 审计字段 (createdBy, updatedBy)
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Quick Reference
|
|
478
|
+
|
|
479
|
+
### Prisma CLI
|
|
480
|
+
|
|
481
|
+
```bash
|
|
482
|
+
prisma generate # 生成客户端
|
|
483
|
+
prisma migrate dev # 创建迁移
|
|
484
|
+
prisma migrate deploy # 部署迁移
|
|
485
|
+
prisma studio # 可视化界面
|
|
486
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "code.database",
|
|
3
|
+
"description": "Design database schemas with Prisma for AI and Web3 applications. Define models, relations, indexes, and migrations. Use when designing databases, creating Prisma schemas, or when the user mentions database, schema, model, prisma, or migration.",
|
|
4
|
+
"inputSchema": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"prompt": {
|
|
8
|
+
"type": "string"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": []
|
|
12
|
+
},
|
|
13
|
+
"outputSchema": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"result": {
|
|
17
|
+
"type": "string"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"dependencies": [],
|
|
22
|
+
"version": "0.1.0",
|
|
23
|
+
"author": "rotifer-team",
|
|
24
|
+
"createdAt": 1771939408834,
|
|
25
|
+
"fidelity": "Wrapped",
|
|
26
|
+
"transparency": "Open",
|
|
27
|
+
"source": "skill"
|
|
28
|
+
}
|