随心写

anywrite
分类编程
作者Agentic Awesome Skills 社区
许可MIT
评分4.50/5
使用4.1K

anywrite

概述

anywrite 是一个针对 Anytype 桌面端本地 HTTP API 编译的 Bun/TypeScript CLI。它将涵盖空间、对象、属性、标签、类型、模板、列表、聊天、文件、成员、搜索和认证的 全部 52 个端点 集成在一个无需运行时依赖的二进制文件中。它是 Anytype 官方 MCP 服务器的一种低上下文替代方案:anywrite 作为一个技能(skill)被调用,而不是在每个 Agent 会话中加载 52 个工具,因此在实际调用前不占用任何上下文,且同样适用于终端或任何脚本。

何时使用此技能

  • 当用户提到 Anytype,或要求创建、更新、搜索、组织笔记、任务或 PKM 对象时。
  • 当涉及 Anytype 空间、属性、标签、类型、模板或列表(集合和收藏)的操作时。
  • 当用户要求向空间上传文件、在空间内聊天,或通过编程方式读写结构化对象时。

工作原理

第一步:确保 Anytype 桌面端已运行并完成认证

本仓库不提供 anywrite 可执行文件。用户必须在当前工作区之外安装或构建经过审核的上游版本,并提供其明确的绝对路径。在使用前,请验证该路径是一个可执行的常规文件,而非符号链接,且不是工作区相对路径下的 dist/ 产物。严禁自动发现或执行当前工作仓库中的 ./dist/anywrite

Anytype 桌面应用必须在本地运行(默认 http://localhost:31009)。认证一次即可:

bash
"/absolute/path/to/anywrite" auth --status        # 显示配置状态(yes/no)及密钥来源
"/absolute/path/to/anywrite" auth                 # 挑战流程 —— 应用中会出现一个 4 位验证码
"/absolute/path/to/anywrite" auth --code 1234     # 上述流程的非交互式形式

密钥被写入 ~/.anywrite/config.json,且不会被任何命令打印出来。

第二步:调用 资源 + 动作

code
anywrite <resource> <action> [positionals] [--flag value]

资源(Resources):spaces, objects, properties, tags, types, templates, lists, files, members, search, chat, auth。默认输出为 JSON;添加 --pretty 可进行人类可读视图,添加 --json 作为类型标志尚未覆盖时的兜底方案。space/type/property 的位置参数接受名称或 ID —— 名称会自动解析为 ID。

示例

示例 1:创建并更新对象

bash
"/absolute/path/to/anywrite" objects create <space> --type task --name "Buy milk"
"/absolute/path/to/anywrite" objects update <space> <object_id> --status "Done"

示例 2:搜索并上传文件

bash
bash
"/absolute/path/to/anywrite" search global --query "task" --types task
"/absolute/path/to/anywrite" files upload <space> --file ./image.png

示例 3:读取聊天消息

bash
"/absolute/path/to/anywrite" chat messages <space> <chat_id> --all

最佳实践

  • ✅ 为 space/type/property 传递名称,由 CLI 自动解析为 ID。
  • ✅ 脚本编写建议使用默认的 JSON 输出,人工查看建议使用 --pretty
  • ✅ 当新的 API 字段尚未由类型化标志(typed flag)覆盖时,请使用 --json
  • ❌ 不要将 --icon 设置为空字符串;直接省略该标志即可。
  • ❌ 不要期望 lists add/remove 能在 Set(集合)上运行 —— 它们仅适用于 Collection(收藏集)。

局限性

  • 本技能不能替代特定环境的验证、测试或专家评审。
  • 如果缺少必要的输入、权限或安全边界,请停止操作并请求澄清。
  • 受限于 Anytype 本地 API:不支持块级编辑(正文仅支持全量 Markdown 替换)、不支持成员邀请/角色管理、不支持模板的创建/更新/删除、不支持空间删除。
  • 对象正文字段在创建时名为 --body,在更新时名为 --markdown

安全与防护注意事项

  • API 密钥本地存储在 ~/.anywrite/config.json 中,任何命令(包括 auth --status)都不会打印该密钥。
  • 运行时配置优先级:ANYTYPE_API_KEY 环境变量 $\rightarrow$ ~/.anywrite/config.json $\rightarrow$ 只读回退至现有的 ~/.anytype-cli/config.yaml
  • 所有操作均针对本地运行的 Anytype 桌面实例;数据不会发送到第三方服务器。
  • 删除操作在所有场景下均为软归档且具有幂等性 —— 重复删除仍返回 200,不会返回 410

常见陷阱

  • 问题: lists add/remove 在 Set 上运行且没有任何提示,但没有效果。
解决方案: 这些操作仅适用于 Collection,不适用于 Set。
  • 问题: 重新上传相同文件时,返回的是现有对象 ID 而非新 ID。
解决方案: 这是预期行为 —— 文件上传通过内容哈希进行去重。
  • 问题: 聊天消息的分页方式与其他资源不同。
解决方案: 聊天消息通过游标(cursor)分页;其他所有资源通过偏移量(offset)分页。

相关技能

  • @docx - 当交付物是 Word 文档而非 Anytype 对象时使用。