用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill yjs-getting-started命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | yjs-getting-started |
| description | > Use when this capability is needed. |
Sync Yjs documents over HTTP durable streams. No WebSocket infrastructure needed — uses standard HTTP with SSE or long-poll transport.
npm install @durable-streams/y-durable-streams yjs y-protocols lib0
yjs, y-protocols, and lib0 are peer dependencies — missing them causes
runtime import errors.
For the dev server (not needed if using Electric Cloud):
npm install -D @durable-streams/server
Two servers are needed: a Durable Streams storage server and a Yjs protocol server that sits in front of it.
import { DurableStreamTestServer } from "@durable-streams/server"
import { YjsServer } from "@durable-streams/y-durable-streams/server"
// 1. Storage server
const dsServer = new DurableStreamTestServer({ port: 4437 })
await dsServer.start()
// 2. Yjs protocol server (proxies to storage server)
const yjsServer = new YjsServer({
port: 4438,
dsServerUrl: `http://localhost:4437`,
})
await yjsServer.start()
console.log(`Yjs server ready at http://localhost:4438`)
import { YjsProvider } from "@durable-streams/y-durable-streams"
import * as Y from "yjs"
const doc = new Y.Doc()
const provider = new YjsProvider({
doc,
baseUrl: "http://localhost:4438/v1/yjs/my-service",
docId: "my-doc",
})
provider.on("synced", (synced) => {
if (synced) {
console.log("Document synced with server")
// Edit the document — changes sync automatically
doc.getText("content").insert(0, "Hello from Yjs!")
}
})
baseUrl is the service root. The provider builds URLs as
{baseUrl}/docs/{docId} internally — do not include /docs/ in baseUrl.
import { Awareness } from "y-protocols/awareness"
const awareness = new Awareness(doc)
awareness.setLocalStateField("user", {
name: "Alice",
color: "#ff0000",
})
const provider = new YjsProvider({
doc,
baseUrl: "http://localhost:4438/v1/yjs/my-service",
docId: "my-doc",
awareness,
})
// Listen for remote users
awareness.on("change", () => {
const users = Array.from(awareness.getStates().values())
.filter((s) => s?.user)
.map((s) => s.user.name)
console.log("Online:", users)
})
Use setLocalStateField("user", ...) (merges) not setLocalState(...) (replaces).
setLocalState overwrites all awareness fields, breaking cursor tracking or
other awareness data set by editor bindings.
Wrong:
npm install @durable-streams/y-durable-streams
Correct:
npm install @durable-streams/y-durable-streams yjs y-protocols lib0
Source: packages/y-durable-streams/package.json peerDependencies
/docs/ in baseUrlWrong:
new YjsProvider({
doc,
baseUrl: "http://localhost:4438/v1/yjs/my-service/docs/my-doc",
docId: "my-doc",
})
Correct:
new YjsProvider({
doc,
baseUrl: "http://localhost:4438/v1/yjs/my-service",
docId: "my-doc",
})
The provider appends /docs/{docId} internally. Doubling /docs/ produces 404s.
Source: packages/y-durable-streams/src/yjs-provider.ts docUrl()
// This will fail — YjsServer needs a running DS server
const yjsServer = new YjsServer({
port: 4438,
dsServerUrl: "http://localhost:4437", // Must be running first
})
YjsServer proxies all storage operations to the DS server. Start
DurableStreamTestServer (or Caddy) before starting YjsServer.
Source: durable-streams/durable-streams — distributed by TomeVault.