mcpField
J
json-canvas

json-canvas

github.com/galaxy-dawn生产力5.9k41 次安装1 周前更新
代码仓库

关于 json-canvas

这是用于创建和编辑 Obsidian `.canvas` 文件的技能,遵循 JSON Canvas Spec 1.0,涵盖节点、边、布局以及 ID 和引用验证。

主要功能

  1. 01创建和编辑画布节点与边
  2. 02支持文本、文件、链接和分组节点
  3. 03设置位置、颜色、标签和连接
  4. 04验证 JSON 结构及 ID 唯一性
  5. 05检查边引用和必需字段

适用场景

  1. 01在 Obsidian 画布中构建思维导图
  2. 02在现有画布中添加并连接节点
  3. 03编辑节点内容和布局
  4. 04检查画布文件中的无效引用

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/galaxy-dawn/claude-scholar --skill json-canvas

安装后在 Claude Code 中输入/json-canvas确认已加载。

附带文件references/EXAMPLES.md

详细介绍

JSON Canvas 技能

文件结构

一个 canvas 文件(.canvas)包含两个顶层数组,遵循 JSON Canvas Spec 1.0:

{
  "nodes": [],
  "edges": []
}
  • nodes(可选):节点对象数组
  • edges(可选):连接节点的边对象数组

常见工作流

1. 创建新 Canvas
  1. 创建一个 .canvas 文件,基础结构为 {"nodes": [], "edges": []}
  2. 为每个节点生成唯一的 16 字符十六进制 ID(例如 "6f0ad84f44ce9c17")
  3. 添加节点,并包含必需字段:id、type、x、y、width、height
  4. 添加边,通过 fromNode 和 toNode 引用有效的节点 ID
  5. 验证:解析 JSON 以确认其有效。验证所有 fromNode/toNode 值都存在于 nodes 数组中
2. 向现有 Canvas 添加节点
  1. 读取并解析现有的 .canvas 文件
  2. 生成一个不会与现有节点或边 ID 冲突的唯一 ID
  3. 选择不会与现有节点重叠的位置(x、y)(留出 50-100px 间距)
  4. 将新的节点对象追加到 nodes 数组
  5. 可选:添加连接新节点与现有节点的边
  6. 验证:确认所有 ID 均唯一,且所有边引用都能解析到现有节点
3. 连接两个节点
  1. 确定源节点和目标节点 ID
  2. 生成一个唯一的边 ID
  3. 将 fromNode 和 toNode 设置为源和目标 ID
  4. 可选:设置 fromSide/toSide(top、right、bottom、left)作为锚点
  5. 可选:设置 label 作为边上的描述文本
  6. 将该边追加到 edges 数组
  7. 验证:确认 fromNode 和 toNode 都引用了现有节点 ID
4. 编辑现有 Canvas
  1. 以 JSON 读取并解析 .canvas 文件
  2. 通过 id 定位目标节点或边
  3. 修改所需属性(文本、位置、颜色等)
  4. 将更新后的 JSON 写回文件
  5. 验证:编辑后重新检查所有 ID 唯一性和边引用完整性

节点

节点是放置在 canvas 上的对象。数组顺序决定 z-index:第一个节点 = 最底层,最后一个节点 = 最顶层。

通用节点属性
属性必需类型描述
id是string唯一的 16 字符十六进制标识符
type是stringtext、file、link 或 group
x是integerX 位置(像素)
y是integerY 位置(像素)
width是integer宽度(像素)
height是integer高度(像素)
color否canvasColor预设 "1"-"6" 或十六进制(例如 "#FF0000")
文本节点
属性必需类型描述
text是string使用 Markdown 语法的纯文本
{
  "id": "6f0ad84f44ce9c17",
  "type": "text",
  "x": 0,
  "y": 0,
  "width": 400,
  "height": 200,
  "text": "# Hello World\n\nThis is **Markdown** content."
}

换行陷阱:在 JSON 字符串中使用 \n 表示换行。不要使用字面量 \\n -- Obsidian 会将其渲染为字符 \ 和 n。

文件节点
属性必需类型描述
file是string系统内文件的路径
subpath否string指向标题或块的链接(以 # 开头)
{
  "id": "a1b2c3d4e5f67890",
  "type": "file",
  "x": 500,
  "y": 0,
  "width": 400,
  "height": 300,
  "file": "Attachments/diagram.png"
}
链接节点
属性必需类型描述
url是string外部 URL
{
  "id": "c3d4e5f678901234",
  "type": "link",
  "x": 1000,
  "y": 0,
  "width": 400,
  "height": 200,
  "url": "https://obsidian.md"
}
分组节点

分组是用于组织其他节点的可视化容器。将子节点放置在分组边界内。

属性必需类型描述
label否string分组的文本标签
background否string背景图片的路径
backgroundStyle否stringcover、ratio 或 repeat
{
  "id": "d4e5f6789012345a",
  "type": "group",
  "x": -50,
  "y": -50,
  "width": 1000,
  "height": 600,
  "label": "Project Overview",
  "color": "4"
}

边

边通过 fromNode 和 toNode ID 连接节点。

属性必填类型默认值描述
id是string-唯一标识符
fromNode是string-源节点 ID
fromSide否string-top、right、bottom 或 left
fromEnd否stringnonenone 或 arrow
toNode是string-目标节点 ID
toSide否string-top、right、bottom 或 left
toEnd否stringarrownone 或 arrow
color否canvasColor-线条颜色
label否string-文本标签
{
  "id": "0123456789abcdef",
  "fromNode": "6f0ad84f44ce9c17",
  "fromSide": "right",
  "toNode": "a1b2c3d4e5f67890",
  "toSide": "left",
  "toEnd": "arrow",
  "label": "leads to"
}

颜色

canvasColor 类型接受十六进制字符串或预设编号:

预设颜色
"1"红色
"2"橙色
"3"黄色
"4"绿色
"5"青色
"6"紫色

预设颜色值故意未定义——应用使用自己的品牌颜色。

ID 生成

生成 16 个小写十六进制字符的字符串(64 位随机值):

"6f0ad84f44ce9c17"
"a3b2c1d0e9f8a7b6"

布局指南

  • 坐标可以为负(画布无限延伸)
  • x 向右递增,y 向下递增;位置是左上角
  • 节点之间间隔 50-100px;分组内部留 20-50px 内边距
  • 对齐到网格(10 或 20 的倍数)以获得更整洁的布局
节点类型建议宽度建议高度
小文本200-30080-150
中文本300-450150-300
大文本400-600300-500
文件预览300-500200-400
链接预览250-400100-200

验证清单

创建或编辑画布文件后,请验证:

  1. 所有 id 值在节点和边中均唯一
  2. 每个 fromNode 和 toNode 都引用了现有的节点 ID
  3. 每种节点类型的必填字段均已存在(文本节点为 text,文件节点为 file,链接节点为 url)
  4. type 是以下之一:text、file、link、group
  5. fromSide/toSide 值是以下之一:top、right、bottom、left
  6. fromEnd/toEnd 值是以下之一:none、arrow
  7. 颜色预设是 "1" 到 "6" 或有效的十六进制(例如 "#FF0000")
  8. JSON 有效且可解析

如果验证失败,请检查重复的 ID、悬空的边引用或格式错误的 JSON 字符串(尤其是文本内容中未转义的换行符)。

完整示例

有关完整的画布示例(包括思维导图、项目看板、研究画布和流程图),请参阅 references/EXAMPLES.md。

参考资料

评论

支持 Markdown