Skills
安装 Dinox CLI Skills,让 AI 助手通过自然语言或斜杠命令直接操作你的 Dinox 知识库。
Skills
想把 GitHub 或 ZIP 技能包保存到 Dinox?请阅读 技能库:导入与管理;需要从自己的程序下载技能,请阅读 Skills API。本页介绍让 AI 助手操作 Dinox 的 CLI 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
推荐安装与当前 CLI 版本严格匹配的 Skills。先读取 CLI 给出的固定安装命令:
dino info --format json然后执行 data.skills_install_command。该命令固定安装器版本,固定到与 CLI 相同的 v<version> tag,并显式列出四个 Agent:
npx --yes skills@1.5.16 add ryzencool/dinox-cli-skills#v<version> -g -a codex -a claude-code -a hermes-agent -a openclaw --skill '*' -y不要省略 -a Agent 列表。安装器的自动检测可能沿用上一次的选择、跳过部分客户端,却仍然返回成功。
只给单个客户端安装时,保留固定 tag 并只写一个 -a:
| Agent | 全局安装命令 |
|---|---|
| Codex | npx --yes skills@1.5.16 add ryzencool/dinox-cli-skills#v<version> -g -a codex --skill '*' -y |
| Claude Code | npx --yes skills@1.5.16 add ryzencool/dinox-cli-skills#v<version> -g -a claude-code --skill '*' -y |
| Hermes Agent | npx --yes skills@1.5.16 add ryzencool/dinox-cli-skills#v<version> -g -a hermes-agent --skill '*' -y |
| OpenClaw | npx --yes skills@1.5.16 add ryzencool/dinox-cli-skills#v<version> -g -a openclaw --skill '*' -y |
全局安装后,各客户端读取的目录分别是 ~/.agents/skills/(Codex)、~/.claude/skills/(Claude Code)、~/.hermes/skills/(Hermes Agent)和 ~/.openclaw/skills/(OpenClaw)。装好后重启对应的 AI 助手。项目级安装(去掉 -g)需要先创建 .hermes/ 和 skills/ 目录,且 Hermes 默认不会发现项目内的 .hermes/skills,因此推荐全局安装。
检查与清理已安装的 Skills
升级 CLI 后,或者 AI 助手的行为和文档对不上时,运行:
dino skills doctor --format jsondata.current会把每个当前 skill 与 CLI 版本对比,状态包括current、outdated、missing、foreign(同名但来源不是官方仓库)和unknown-version。data.current.inSync为false时,执行data.current.installCommand即可装上匹配版本。data.skills列出已退役的旧 skill(例如dinox、manage-tags、search-notes、dino-shared)。这些旧 skill 会和新 skill 争抢触发,并教 AI 使用过时的命令。
清理旧 skill 时先预览,确认无误后再执行:
dino skills migrate --dry-run --format json
dino skills migrate --confirm --format jsonmigrate 只会移除名称、来源和 skillFolderHash 三者都与官方退役清单完全一致的 skill;标记为 conflict 的同名 skill 会被保留,需要你自己判断。
成功结果的结构如下;_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 --yes skills@1.5.16 add ryzencool/dinox-cli-skills#v<version> -g -a codex -a claude-code -a hermes-agent -a openclaw --skill '*' -y"
}
}每个 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-manage-properties 把这条笔记的状态设为进行中、评分设为 4
/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-manage-properties | /dino-manage-properties | 定义属性字段、给笔记填写属性值、管理笔记模板 |
| 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 版本匹配。 - 失败结果在 stderr 输出结构化错误,包含
code、recoverable、exit_code和suggested_action。运行dino schema errors --format json可以查看全部错误码及其退出码(1 一般失败、2 用法错误、3 认证、4 同步新鲜度、5 前置条件不满足或资源不存在)。错误码和退出码属于公开契约,只会在大版本中做不兼容变更。 - 读类命令默认使用本地 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 表。- 保存视图、属性和笔记模板直接复用 Dinox 桌面端的领域代码(schema 校验、filter / sort 编译、属性值转换),因此 CLI 能读写桌面端和 App 创建的所有视图与属性。
dino view list/get/fields/query/count/analytics/note-detail/create/update/delete覆盖完整生命周期:filter 支持 version 1–3(version 2 用于withinLastDays、isToday、isThisWeek、isThisMonth动态日期,按--time-zone或本机时区计算;version 3 用于valueRef指向宿主笔记的$self条件),config 支持table、list、card三种布局以及computedColumns、stats、charts、summary和noteDetail。--layout可以只切换布局而不重传 config;sys.title必须是第一列。 - 创建或更新包含
prop.*的视图前应先运行dino view fields --format json:select / status / multi-select filter 必须写稳定 option ID,不能写显示 label;返回的filterOperators和sortable是每个字段可用的运算符与排序能力。sys.tags没有 option catalog,带具体 tag 值的 filter 会被拒绝,一次性 tag 查询继续使用dino note search --tags。 - CLI 无法完整解析的视图(例如更新版本客户端写入的新配置)不会让命令失败:
view list标为valid: false,view get返回原始filterJson/configJson和错误详情;只改名称、emoji、置顶、排序这类元数据时会原样保留它的 filter 和 config。 dino view query按保存的 filter 和 sort 在本地 PowerSync 缓存执行,自动排除软删除和其他账号的笔记。结果在data.rows[].values保留原始 property / option ID 与calc.<id>计算列,在data.rows[].displayValues提供 select / status 标签和卡片盒路径;只有沿data.nextOffset翻页直到data.hasMore: false后才能声称结果完整。dino view analytics <id>在整个视图范围(不是当前页)上计算配置好的统计、图表和汇总行;dino view note-detail <noteId>列出嵌入在该笔记详情里的视图(带noteDetail规则、$self绑定到这条笔记)。- 视图、属性和模板的写命令都支持
--dry-run和--durability <local|uploaded>。dry-run 会在一个最终回滚的事务里真实执行写入,所以预览展示的就是将要保存的内容,同时不会写库,也不会进入上传队列。 dino prop list/get/create/update/delete管理属性定义,支持 14 种类型:text、number、date、select、multi_select、status、url、email、phone、checkbox、files、relation、unique_id、place。属性 key 是写入c_note.properties的稳定名称,创建后不可修改,改名只改显示名。prop create是幂等的:同 key 已存在时复用并合并新选项,类型不同则返回PROPERTY_DEF_TYPE_CONFLICT。选项只能归档不能删除(--archive-option),可按 id 或 label 重命名、改色;类型配置(日期 / 日期时间、数字格式、select 开放或封闭等)通过--config写入桌面端使用的配置记录。删除属性定义不会清除笔记中的值,这些值之后显示为未定义类型。dino prop show/set/fill/slots <noteId>读写笔记属性值。prop set --set key=value会按属性定义转换并校验:select / status 可以传 label,保存为 option id;数字字符串转为数字;unique_id 自动编号并显示为PREFIX-n;--unset或--patch中的null删除该属性。prop fill只填写已声明但仍为空的槽位,prop slots用来声明、清空、删除或重排属性槽位。存储的属性 JSON 损坏时,prop show返回valid: false,写入会被拒绝(NOTE_PROPERTIES_CORRUPT),不会被覆盖。旧客户端写入的纯 label 数组选项需要先执行dino prop migrate-options(先--dry-run,再用--confirm --expected-count <n>执行),它会在同一个事务里为选项分配 id,并改写相关笔记和视图 filter。dino template list/get/create/update/delete管理笔记模板:模板保存正文(Markdown 或 Tiptap JSON)和一组有序的属性 key,不包含默认值。dino note create --template <id>会把模板正文中的{{date}}、{{time}}、{{datetime}}替换为实际值,并把模板的属性 key 声明为空槽位;--properties写入初始属性值,并和笔记创建放在同一个事务里,任何值不合法都会整体回滚。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 update <id> --title "新标题"(建议先加--dry-run预览)。它只改标题,不读取也不改动正文,因此不需要note content-read+note patch;每次调用只能针对一条笔记。 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 的对象做猜测性删除。