Skills
安装 Dinox CLI Skills,让 AI 助手通过自然语言或斜杠命令直接操作你的 Dinox 知识库。
Skills
Skills 是一套遵循开放 Agent Skills 规范 的技能包,可用于 Codex、Claude Code、Hermes Agent、OpenClaw 等兼容客户端。装好之后,你可以用一句话让 AI 帮你搜索笔记、新建笔记、整理标签、管理待办——它会在背后调用 Dinox CLI(dino)替你完成。
准备工作
使用 Skills 前,先装好并登录 Dinox CLI。推荐使用 Node.js 24 LTS;CLI 支持 Node.js 20.18.1+、22、23、24、25,不支持 Node.js 21 或 26+。
第一步,全局安装 CLI:
npm install -g @dinoxx/dinox-cli第二步,登录你的账号(在自己的终端里运行):
read -rs DINOX_TOKEN
printf '%s' "$DINOX_TOKEN" | dino auth login --token-stdin
unset DINOX_TOKEN不要把 token 贴进聊天框、命令参数或公开日志里。read -rs 会隐藏终端输入,--token-stdin 会从管道读取凭证。token 可在 Dinox 移动端 App → 设置 → 同步设置 → API Token 中获取。
安装 Skills
一行命令全局安装;安装器会检测本机支持的 Agent:
npx skills add ryzencool/dinox-cli-skills -g需要固定安装目标时,使用对应的 Agent 标识:
| Agent | 全局安装命令 |
|---|---|
| Codex | npx skills add ryzencool/dinox-cli-skills -g -a codex -y |
| Claude Code | npx skills add ryzencool/dinox-cli-skills -g -a claude-code -y |
| Hermes Agent | npx skills add ryzencool/dinox-cli-skills -g -a hermes-agent -y |
| OpenClaw | npx skills add ryzencool/dinox-cli-skills -g -a openclaw -y |
去掉 -g 就是当前项目安装。安装器会写入各客户端支持的目录:Codex 使用 .agents/skills/,Claude Code 使用 .claude/skills/,Hermes Agent 使用 .hermes/skills/,OpenClaw 使用 skills/。装好后重启对应的 AI 助手。
需要让 Skills 与当前 CLI 版本严格匹配时,先运行:
dino info --format json然后执行 data.skills_install_command。该命令会固定到与 CLI 相同的 v<version> tag,而不是跟随仓库默认分支。
成功结果的结构如下;_notice 只有存在通知时才会出现在顶层:
{
"ok": true,
"data": {
"version": "<version>",
"skills_repo": "https://github.com/ryzencool/dinox-cli-skills",
"skills_version": "<version>",
"skills_tag": "v<version>",
"skills_release": "https://github.com/ryzencool/dinox-cli-skills/tree/v<version>",
"skills_install_command": "npx skills add ryzencool/dinox-cli-skills#v<version> -g"
}
}每个 SKILL.md 都是跨 Agent 的标准核心。skill 内的 agents/ 等文件只是可选的展示与打包适配;客户端不理解这些扩展时,核心工作流仍然可以独立使用。发布 tag 中的适配器也必须来自 CLI 仓库的 canonical skills/ 源码,不能在分发仓库单独维护。
运行中的 Agent 进程不会自动继承你在另一个终端后来执行的 export DINOX_TOKEN=...。需要临时环境认证时,应从已设置变量的终端启动或重启 Agent;否则在自己的终端使用 dino auth login --token-stdin 持久登录。只检查本地登录状态时使用 dino auth status --offline --format json,不要在 dino sync 前额外执行一次在线状态检查。
Skills 的唯一维护源码位于 dinox-cli/skills。安装使用的 dinox-cli-skills 是 CLI tag 发布后自动生成并带相同版本 tag 的分发镜像,不在两个仓库双向维护。镜像发布只保留目标仓库的 .git,正式 tag 中的其余文件全部来自 canonical 源码。collection.json 记录版本、源码 tag、分发 tag、固定安装命令、许可证和公开 skill 清单;分发仓库的 commit 与 annotated tag 还会记录 CLI 原始 source SHA。
开始使用
有两种方式,挑顺手的用。
方式一:直接说人话
把它当成懂你笔记的助手,自然提问就行:
帮我搜索最近一周的 AI 笔记
创建一条笔记,标题是「今日复盘」
把这条笔记加到 Inbox 并打星
列出我所有的标签
帮我建一个待办:补交报销单、整理发票方式二:指定 skill 名称
想更精确地指定操作,可以直接提到 skill 名称。支持 slash command 的客户端也可以使用 / 形式:
/dino-note 搜索最近 7 天的 AI 笔记
/dino-note 创建一条标题为「今日笔记」的笔记
/dino-manage-todo 创建待办:联系供应商
/dino-manage-tags reading/tech
/dino-manage-views 创建一个只显示进行中项目的视图
/dino-sync
dino doctor --format json能做什么
| 技能 | 命令 | 用途 |
|---|---|---|
| dino-note | /dino-note | 搜索、阅读、新建、更新、打星、删除笔记 |
| dino-manage-todo | /dino-manage-todo | 搜索 / 创建 / 追加 / 更新待办任务 |
| dino-manage-tags | /dino-manage-tags | 查看、新建、重命名、移动、合并或清理标签层级 |
| dino-manage-boxes | /dino-manage-boxes | 查看、新建、重命名、移动、合并或清理卡片盒层级 |
| dino-manage-prompts | /dino-manage-prompts | 查看或新建可复用的提示词模板 |
| dino-manage-views | /dino-manage-views | 查看、新建、更新、查询、计数或删除保存的表格视图 |
| dino-storage | /dino-storage | 管理自定义存储、上传文件、查看用量 |
| dino-sync | /dino-sync | 同步本地缓存与云端 |
| dino-auth | /dino-auth | 查看登录状态、登录、登出 |
| dino-config | /dino-config | 读取或修改 CLI 配置 |
| dino-update-cli | /dino-update-cli | 升级 Dinox CLI 到最新版 |
做「最近笔记、月度汇总、统计、导出」这类需要完整数据的分析时,建议先让 AI 执行一次 /dino-sync,确保本地数据是最新的。遇到搜索漏结果、同步异常、daemon 异常、上传积压或本地索引 / 数据库疑问时,先运行 dino doctor --format json 查看健康报告。
CLI 行为说明
- 所有
--format json成功结果都使用{ "ok": true, "data": ... }envelope。命令业务字段必须从data.*读取;可选通知位于顶层_notice,不能把_notice当作业务 payload。dino info的data.skills_version、data.skills_tag、data.skills_release和data.skills_install_command会与当前 CLI 版本匹配。 - 读类命令默认使用本地 PowerSync 缓存。凡命令 schema 支持
--sync-timeout,Skills 在 Agent 中会默认使用类似--sync-timeout 20000的有界预算,并把宿主执行超时设为高 5–10 秒;--offline或不含同步阶段的命令除外。需要强一致新鲜度时,Skills 会先执行dino sync --strict --sync-timeout 20000 --format json,或在读命令上添加--require-sync。严格模式按 PowerSync 的整秒 checkpoint 精度判断本次同步,要求连接有效、下载停止且没有下载错误,并完成本地 token 索引;仍在上传不会阻塞下载新鲜度,因此应看data.stale、data.downloadIdle、data.tokenIndex.complete和data.gate,不能只看兼容字段data.idle。结构化成功结果会在数据库关闭、owner lease 释放和 daemon 恢复之后输出;宿主先超时时结果是未知,不应直接判定失败或不断放大 CLI timeout,必须先验证新鲜度或写入后置条件。 - 笔记和待办写命令会在
data中返回 Write Receipt:durability、upload_queue_remaining、version、content_hash、changed和stale。默认可以把data.durability: "local"视为本地数据库已写入;如果必须等云端上传队列清空,Skills 会加--durability uploaded,失败时按顶层code: "UPLOAD_PENDING"与suggested_action处理。 dino note patch的readToken是短期、单次使用的命令能力(当前有效期为 30 分钟,以readTokenExpiresAt为准),并绑定生成它时当前账号对应的本地 PowerSync 数据库作用域,不能在切换账号或本地数据库后复用。任何真实 patch 尝试都会先原子消费 token;失败后必须重新执行dino note content-read <id>。默认读取只返回 block 类型、范围、hash 和字符数,并标记readTokenScope: "structural-metadata";只有用户授权全文读取并添加--include-content时,才返回完整 Markdown、详细 blocks 和readTokenScope: "full-content"。媒体、表格、容器或未知 block 的--allow-protected-replace只接受已审阅全文后取得的full-contenttoken。Agent 必须把 token 放进唯一、mode0600的临时文件,通过--read-token @<file>传入,并在单次真实尝试后立即删除,不能写入 argv、日志、笔记或可复用文件。- CLI 2.0 的结构化读取契约统一使用 freshness envelope:
dino note get只返回轻量data.note,dino note detail始终返回data.stale、data.count、data.notes,dino prompt list返回data.prompts,dino box list返回data.boxes。从 1.x 升级的脚本需要按这些字段迁移,不能继续把 detail/list 的data当作裸对象或裸数组。 - 笔记星标的 canonical 字段是
starred_at:打星会写入当前 UTC 时间,取消星标会写入null。is_starred仍作为便于 Agent 和脚本判断的派生布尔值返回;dino note search --fields可同时选择starred_at和is_starred,SQL-like 的is_starred条件也会转换为对starred_at的判断。 dino note detail和 JSON 导出会返回与桌面端一致的properties、is_pub、starred_at和派生is_starred。CLI 的 PowerSync schema 与 Electron 的 48 张 canonical 表保持字段、类型、local-only 标记和索引一致;CLI 只额外维护两张用于本地全文索引游标的 local-only 表。- 保存视图使用与 Electron 一致的严格 version 1 契约。
dino view list/get/fields/query/count/create/update/delete覆盖 catalog、定义、字段发现、分页查询、计数和完整生命周期;--filter与--config支持 inline JSON 或@file,只接受layout: "table",并要求sys.title是第一列。创建或更新包含prop.*的视图前应先运行dino view fields --format json:select / multi-select filter 必须写稳定 option ID,不能写显示 label;multi-select、relation、sys.tags和sys.zettel_boxes不能排序。日期条件会在 JavaScript 日期归一化前按 Electron 规则校验真实日历日期,使用大写T或小写t的 ISO 时间都不会接受不存在的日期。当前 Electron 语义无法为sys.tags提供 option catalog,因此 CLI 会拒绝带具体 tag 值的保存视图 filter,避免写入桌面端无法执行的定义;一次性 tag 查询继续使用dino note search --tags。 dino view query按保存的 filter 和 sort 在本地 PowerSync 缓存执行,自动排除软删除和其他账号的笔记。结果在data.rows[].values保留原始 property / option ID,在data.rows[].displayValues提供 select 标签元数据;只有沿data.nextOffset翻页直到data.hasMore: false后才能声称结果完整。视图 create/update/delete 都支持--dry-run和--durability <local|uploaded>,软删除不会永久移除数据。dino doctor --format json会在data中返回认证、同步、上传队列、笔记 FTS 索引对账、daemon 版本 / 账号 / token 指纹 / runtime config 匹配和本地数据库完整性状态;dino doctor --fix --format json会尝试清空上传队列、重建本地笔记索引并重启 stale daemon。CLI 会先释放数据库 owner lease 再重启 daemon;失败的修复会保持data.healthy: false,不会被标记为已修复。- 结构化错误写入 stderr,并在顶层返回
code、recoverable、exit_code和suggested_action;详细错误对象位于error。脚本可以按退出码分支:2参数错误、3未登录、4数据过期 / 上传未完成、5前置条件或资源缺失。 dino note search、dino todo search、dino graph backlinks/outlinks/related/stats在默认在线模式下会使用 daemon-owned DB runtime。daemon 通过用户私有 Unix domain socket 通信(Windows 使用命名管道),并会在 CLI 版本、登录账号、token 指纹或非秘密 runtime config(PowerSync endpoint、上传路径、sync.timeoutMs)变化后自动重启;不可用时 CLI 会返回带suggested_action的结构化错误,不会静默回退到另一个进程打开本地 DB。需要明确接受本地缓存语义时,可加--offline。- 需要在前台进程打开 PowerSync 的命令(写命令、
sync、在线auth status、--offline和--require-sync)会持有跨进程生命周期锁。同一用户数据库上的健康 daemon 会被暂时停止,并且只在前台数据库关闭、owner lease 成功释放后按原端口恢复;使用其他用户数据库的 daemon 不受影响。若关闭或释放失败,CLI 会把 daemon 保持在停止状态并向 stderr 输出清洗后的警告,避免两个运行时同时持有同一 SQLite 数据库。 dino auth logout会优先清除保存的凭据;如果当前 shell 仍设置了DINOX_TOKEN,结果会明确返回environmentTokenActive: true,该环境仍保持登录。--clear-local-db只有在 daemon 停止、取得数据库独占所有权并删除主库、WAL、SHM 和 rollback journal 后才会报告成功。任何 owner lease 获取/释放或缓存清理错误都应检查persistedCredentialsCleared、cleanupPhase和cachePaths/cachePath:凭据可能已经清除,但不能据此声称本地清理已安全完成。CLI 会逐个尝试释放所有已取得的 lease;某个 release 失败不会跳过后续 release,也不会覆盖更早的主错误。sync.timeoutMs和--sync-timeout只接受1..2147483647的十进制整数,避免超过 Node 定时器上限后意外变成约 1ms 超时。- 更新待办时,建议把
dino todo search返回的note_id作为dino todo update <taskId> --note-id <noteId> --status completed的精确定位参数,尤其是legacy-task-*。legacy id 会绑定搜索时的任务位置和内容;如果笔记结构或任务内容随后变化,CLI 会拒绝旧 id,必须重新搜索,避免改错任务。未传--note-id的跨笔记查找最多检查 500 个候选笔记;一旦触顶会返回TODO_TASK_LOOKUP_TRUNCATED并拒绝写入,因为此时无法证明 task ID 唯一。遇到该错误时,先运行dino todo search <task-text> --scan-limit 5000 --format json找到目标note_id,再带--note-id重试。 - 笔记标签校验、正文 hashtag 解析和标签管理都按当前已解析账号的
user_id隔离。切换账号后应重新列出或同步标签;只存在于其他账号的同名标签会被视为不存在,不会被当前笔记写入误用。 dino note detail的结构化输出包含完整 markdown、纯文本、解析后的content_json、标签数组和updated_at,适合在明确需要全文时使用。dino storage upload会把文件写入自定义 S3 并记录资源;图片上传会额外生成400pxwebp 缩略图,缩略图 URL 只在命令结果中返回,不写入资源checksum字段。显式--key默认拒绝覆盖已有主对象或缩略图,只有确认精确替换目标后才使用--overwrite;key 与存储路径前缀不能包含纯./..路径段,否则标准 URL 客户端会把地址归一化到错误对象。- 使用
--overwrite时,一旦远端对象写入成功,后续缩略图或资源 metadata 记录失败不会自动删除已写入对象。不要把命令失败当作远端已回滚;检查结构化错误详情中的remoteObjectChanged、affectedKeys和主对象storageKey,再核查或重试这些 key。若 S3 PUT 在客户端看来失败但无法确认远端是否已经提交,CLI 会返回STORAGE_UPLOAD_OUTCOME_UNKNOWN、remoteOutcome: "unknown"、remoteObjectChanged: null和possiblyAffectedKeys,并避免对这些可能已写入但没有确认 ETag 的对象做猜测性删除。