关于 deepspace
DeepSpace 是用于在 Cloudflare Workers 上构建和运维实时协作应用的技能。它引导 Agent 查阅文档、使用 CLI、管理源码、部署应用并配置共享 Agent 工具。
主要功能
- 01指导应用脚手架与部署
- 02说明源码权威来源的选择
- 03引导查阅产品文档
- 04涵盖身份验证与应用运维
- 05介绍共享 Agent 工具配置
适用场景
- 01启动协作应用
- 02选择应用的源码权威来源
- 03部署并检查 Worker 应用
- 04为网站和本地 Agent 注册工具
MCP 相关
该技能介绍通过 DeepSpace 文档 MCP 服务进行查询,包括 `documentation_search` 和 `documentation_read`。开发应用无需注册 MCP。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ deepdotspace/ deepspace-skill --skill deepspace安装后在 Claude Code 中输入/deepspace确认已加载。
附带文件references/README.md
详细介绍
DeepSpace
DeepSpace 是一个用于在 Cloudflare Workers 上构建实时协作应用的单一软件包。它提供身份验证、RBAC、同步记录、消息传递、集成、支付,并部署到 <name>.app.space。
本技能是入门指南:介绍如何开始、如何操作,以及如何查阅文档。https://docs.deep.space 上的文档是其他所有内容的权威来源——文档带有明确倾向性,因此当它推荐某种方法时,应将其视为默认做法,而不是众多选项之一。
唯一的源代码权威
每个应用都恰好有一个 Git 权威来源——DeepSpace 源代码(打包、优先提交),或 GitHub 源代码(手动;部署会打包本地工作树,包括未提交的更改)。新应用的源代码尚未认领,其首次会生成源代码的操作会永久锁定一个权威来源,且只能锁定一次:从已选择 GitHub 远程仓库的检出目录进行部署,会认领该仓库;首次运行 deepspace push,或在没有 GitHub 远程仓库时部署,则会认领 DeepSpace。无法手动声明,也无法之后转移。除非用户已选择 DeepSpace 源代码,否则在首次 GitHub 部署前,切勿运行 deepspace push;认领 GitHub 后,所有 DeepSpace 源代码相关命令都会以 source_managed_by_github 拒绝执行。deepspace app source 是只读命令(旧的设置命令会以 source_inferred 拒绝执行)。切勿维护两个事实来源;执行任何源代码、推送、拉取或克隆操作前,都要先阅读源代码管理和工作区文档——每个命令在不同权威来源下的具体行为,以文档为准,而非本技能。
分享应用和移交应用
协作者和所有权转移(deepspace app collaborators …、deepspace app transfer …)会改变谁能部署、读取密钥,以及拥有该应用。执行任一操作前,都要先阅读应用身份指南——其中会准确说明每种授权赋予什么权限,以及转移会失去什么权限——并将两者都视为需要向用户说明的决定,而不是顺手执行的步骤。
如何阅读文档
在某个领域开始构建之前先查阅文档,而不是等出问题后再看。阅读步骤:
- 每个任务领域获取一次索引: https://docs.deep.space/llms.txt — 该索引在每次部署时根据文档生成,因此不会过时 — 列出了每个页面及其一句话摘要。
- 从中挑选 1–2 个页面,并以 Markdown 格式获取,方法是在页面 URL 后添加
.md(https://docs.deep.space/guides/authentication.md)。 如果所选页面没有答案,不要去浏览相邻页面 — 请转到第 3 步。 - 要确认某个主题是否存在,获取一次
https://docs.deep.space/llms-full.txt(整个文档集位于一个文件中;每个页面末尾都有
Source: /route.md),并使用 grep 搜索。确认文档中没有相关内容,就意味着文档落后于构建版本 — 请改查已安装的.d.ts或 CLI 自带的--help。 - 如果 MCP 工具已可用,请使用 MCP 进行定点查询:
https://docs.deep.space/mcp提供documentation_search和documentation_read。如果这些工具不可用或调用失败,请使用上述 Markdown URL,配合 harness 现有的 fetch 工具或有时限的 HTTP 请求(例如,curl -fsSL --max-time 20 <url>)。构建应用不需要注册 MCP:只有在用户要求进行相关设置时才配置文档服务,并将其与依赖安装恢复流程分开。搜索无法证明某个主题不存在 — 请通过第 3 步确认。 - 要查看准确的类型签名,请阅读已安装的包 —
ls node_modules/deepspace/dist/*.d.ts(在 SDK monorepo 本身中:packages/deepspace/dist/)— 当文档与已安装版本不一致时,以此为准。
文档的结构如下,可帮助你快速选择页面:/get-started/* 介绍设置和项目布局;/concepts/* 介绍运行时模型 — 在修改 worker.ts、schemas 或 sync 行为之前先阅读;/guides/* 每页介绍一个功能或生命周期领域;/design/* 介绍视觉设计;/sdk-reference/* 介绍每个模块的准确导出项;/cli-reference/* 介绍 CLI,包括其退出代码和可供机器执行的 action 契约。目录是实时 CLI 调用结果,并非页面:npx deepspace integrations list / integrations info <integration>/<endpoint> 和 npx deepspace add --list。
操作流程
-
运行应用命令前先进行身份验证。
npx deepspace auth whoami --json npx deepspace auth login # only when signed out登录会打开浏览器 OAuth,并轮询最多十分钟。请让它保持在前台,等待用户完成操作;绝不要索要、编造或处理密码。容器或 CI shell 没有浏览器:运行
auth login --help,并使用其中列出的、由操作员提供的环境凭据——帮助信息是确定变量名称的依据;绝不要在命令行中输入密码。 -
使用脚手架,不要手动组装运行时。
使用安装文档支持的 Node 版本;基于 npm 的脚手架需要 npm 11.6+。先检查
node --version和npm --version:即使 Node 受支持,npm 10 的对等依赖解析器也可能因模板的 Vitest 依赖而崩溃。如果安装失败,请保留实际错误和运行时版本,再进行诊断或选择恢复方案;确保应用所选的包管理器与锁文件保持一致。npm create deepspace@latest <app-name> cd <app-name> npx deepspace dev start应用 ID 在注册时由服务端生成,应用会在首次使用时注册:第一个需要 ID 的动词(
deploy、dev start、test run、push、写入secrets)会在 shell 当前登录的账号和环境下生成 ID,并在 stderr 中显示账号邮箱。执行第一个此类动词前,先检查auth whoami,确保注册到目标账号;如果 shell 当前登录的账号不是预期所有者,请先以所有者身份登录(或以其身份运行npx deepspace app init),不要先生成一个之后还得丢弃的 ID。退出登录时创建脚手架没有问题——有人登录后,它仍会以相同方式注册。任何app_not_registered或app_not_initialized拒绝都只表示其字面含义,不代表其他问题。 -
**自行构建功能前先检查目录。**仅凭名称不足以判断是否适用。
npx deepspace add --list npx deepspace add --info <feature> npx deepspace integrations list npx deepspace integrations info <integration>/<endpoint> -
**扩展脚手架。**将 schema 放在
src/schemas.ts和src/schemas/中,将路由放在src/pages/中,将应用 Provider 放在src/pages/(app)/_layout.tsx中,并将 Durable Object 接线放在worker.ts中。src/constants.ts提供显示名称APP_NAME、不可变的APP_ID,以及主SCOPE_ID = app:${APP_ID}。 -
测试运行时变更,然后部署。
npx deepspace test run # the quick default; it names what it skipped npx deepspace test run all # every spec, including ones you added npx deepspace deploy多用户行为需要进行双用户测试。并行运行多个应用或工作树时,请使用不同的端口。绝不要终止其他会话的服务器。
共享 Agent 工具
将 buildTools 保留在 src/ai/tools.ts 中,作为唯一的工具定义,并在 worker.ts 中使用 registerAgent(app, { tools: buildTools }) 注册一次;不要重复定义工具,也不要自行挂载 REST 路由。网站和本地 Agent 默认都已启用;若只需启用其中一个界面,请使用 local: false 或 inApp: false。
当访问权限取决于应用策略时,请向 registerAgent 传入由开发者控制的 authorize({ userId, claims, request, env }) 回调。它会返回布尔值(或 Promise),用于检查订阅、团队、角色或应用数据;在完成身份和成员身份验证后,该回调会应用于两个界面,且只能收紧应用现有的 RBAC 权限。
本地 Agent 会先发现工具,再调用工具:
npx deepspace agent tools <app> --json
npx deepspace agent invoke <app> <tool> --input-file tool-input.json --json
仅使用返回的工具,并遵循其描述和输入 schema。这些无状态命令会复用选定的 CLI 会话——无需连接或单独的授权步骤——但 CLI 登录只能证明身份,不能证明应用成员身份。请使用 CLI,而非原始 REST,并按照下文所述处理拒绝。
命令拒绝执行时
每次拒绝都会给出一个稳定的 code、一个退出码,以及至多一个可执行的
action。根据这些信息分支处理,绝不要根据文字说明来判断:
- 退出码 1 表示应修复所述原因;保持原样重试无济于事。 退出码 2 表示命令已尽其所能,仍需完成一个本地步骤或作出判断。
- 如果提供了
action,就运行它——使用它给出的 argv,并在它给出的cwd中运行。**如果没有提供,就不要猜测补救方法。**没有提供是有意为之: 拒绝信息会列出供用户选择的选项(分叉或恢复、完成或中止、释放槽位或升级), 或指出需要检查的事实。阅读消息,然后说明需要作出什么选择。 - 拒绝信息现在会明确指出 Agent 过去常误判的两种状态:错误的平面
(
not_authenticated会说明命令选择了哪个平面、会话位于哪个平面,以及应取消 设置哪个变量——不要“重新登录”)和格式错误的应用 ID(invalid_app_id表示 wrangler.toml 中的DEEPSPACE_APP_ID不是有效的应用 ID——不要运行app init --new-id,否则会使应用成为孤立应用;如果 ID 格式错误,普通的app init会拒绝执行)。通过--app传入时,代码有所不同:格式错误的app_…值会返回invalid_app;非app_字符串会被视为子域名 NAME——不合法的 名称(大写字母、句点或长度不符)会在查找前返回invalid_app;合法名称若未匹配 到任何应用,则会返回app_not_found,这意味着应通过app list检查拼写, 而不是说明 ID 格式错误。(transfer accept是唯一例外:它只接受原始的app_…ID,任何名称都会返回invalid_app。)
CLI 概览(/cli-reference/overview)是执行约定——其中列出了退出码、
action 规则,以及按命令分类的代码表。不要通过单独的探测命令预先检查前置条件;
直接运行操作,并阅读拒绝信息。
操作已部署的应用
报告 serving: confirmed 的部署意味着应用生命周期的开始,而非任务的结束。
在宣布完成之前,先检查它是否正在运行:
npx deepspace logs --follow --json # what the worker actually did
npx deepspace activity # pushes, workspaces, releases
npx deepspace releases # the ledger, and what is rollback-able
npx deepspace app usage # credits, quota, per-integration spend
文档解释了两件不应自行推断的事:计划任务会在应用首次收到请求时启用
(部署会发送一次请求;未启用时该检查什么,请参阅计划任务指南),以及
被捕获的错误会记录为 log 行,而不是 exception——请参阅 logs 参考文档,
了解如何读取 outcome 和 eventType,再判断某项操作是失败还是成功。
首次部署之后
上面的流程并不会在 deploy 时结束——应用此后仍会持续运行,而每个环节都有文档说明其规范,你应该在操作前阅读:
- 升级到较新的 SDK 应使用
deepspace app update,而不是手动编辑package.json。先运行最新版本的 CLI——npx deepspace@latest app update --json——然后按其steps操作;它是只读指南,不会替你重写应用。升级指南 (/guides/updating)介绍了整个流程,CLI 参考说明了各字段的含义。对于使用服务端生成 ID 之前的脚手架,每一步都会因app_not_registered而失败;唯一的解决办法是npx deepspace@latest app init --new-id,指南对此有说明。 - 活跃应用会占用你所在套餐的配额名额。 部署或重新注册可能仅因此被拒绝,而解决办法需要你做选择(释放名额或升级套餐)——因此,该拒绝不会附带可执行操作。请将此情况告知用户,不要替他们做决定。
- 连接你已拥有的域名与购买域名不同。两种操作前都应先阅读自定义域名指南。将外部注册的域名保留在其注册商处,使用受支持的外部域名绑定/验证流程,并遵循返回的 DNS 记录。先证明所有权,再认领路由;切勿改用临时反向代理或内部注册表写入。保留续期所需的证书验证记录,并先通过自定义主机名的 HTTPS 验证应用,再将连接标记为完成。
- 原生客户端(iPhone、iPad、Mac) 使用
npx deepspace add mobile,它会在mobile/中的deepspace/native上创建一个 Expo 应用。构建前请阅读 Expo 指南 (/guides/mobile-apps):SDK 已提供键盘快捷键、上下文菜单、可在 Web 上运行的同一应用(expoWeb)、重新连接后仍能保留的写入、每个账户一个私有存储区 (accountStores),以及用于 TestFlight 的npx deepspace testflight <signed.ipa>。请使用这些功能,不要另行编写应用本地版本。 - 下线应用使用
deepspace app undeploy。这是破坏性最强的应用命令,文档明确说明了它会移除什么、保留什么。运行前请阅读应用身份指南;未经用户要求,切勿用它来“清理”。
避免昂贵错误的规则
- 将记录视为封装对象:字段位于
record.data下;put(id, patch)会在服务端合并部分值。 - 在
useMutations().ready之前禁用写入控件。当导航、访问权限变更或成功消息取决于操作是否被接受时,请使用已确认的变更。 - 数据和身份验证 Hook 需要
(app)/提供程序边界。顶层页面是静态的,不得调用它们。 - 保留脚手架所需的
users架构。可以扩展,但不要重命名。 - 应用密钥应放在
deepspace secrets中,切勿手动编辑.dev.vars,也不要放在 Shell 环境变量前缀、日志、提交记录或截图中。 - 调用者身份只能来自经过验证的 JWT。切勿通过 WebSocket URL 或客户端可控的内部标头发送身份信息。
- 读取
users集合的工具或服务端操作,不等同于客户端名册,而且二者向不同用户展示的字段也不相同。在向模型、客户端或日志公开其中任一项之前,请查看权限文档,确认该路径会向谁返回什么内容——“它读取users”并不能回答这个问题。 - 本地的
ToastProvider和 UI 原语来自src/components/ui,不来自 SDK。 - 将脚手架主题和起始主页视为占位内容。发布的应用应采用自己的设计。
- 请在受支持的 Node 版本线上运行应用——安装指南
(
/get-started/installation)列出了受支持的版本线。