diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index fd57b28..f58ce0d 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "1Project/租房讨回押金/租新房注意事项.md", + "file": "skills/obsidian-auto-cards/SKILL.md", "mode": "source", "source": false, "backlinks": true, @@ -24,11 +24,11 @@ "showSearch": false, "searchQuery": "", "backlinkCollapsed": false, - "unlinkedCollapsed": false + "unlinkedCollapsed": true } }, "icon": "lucide-file", - "title": "租新房注意事项" + "title": "SKILL" } } ] @@ -80,8 +80,8 @@ "state": { "type": "starred", "state": {}, - "icon": "lucide-file", - "title": "插件不再活动" + "icon": "lucide-ghost", + "title": "starred" } }, { @@ -215,7 +215,7 @@ }, "left-ribbon": { "hiddenItems": { - "daily-notes:打开/创建今天的日记": true, + "bases:新建数据库": false, "templates:插入模板": false, "canvas:新建白板": false, "switcher:打开快速切换": true, @@ -226,6 +226,20 @@ }, "active": "c3a1fa114f02064b", "lastOpenFiles": [ + "1Project/图文合批/图文使用不同的Tex2DArr.md", + "skills/obsidian-auto-cards/SKILL.md", + "skills/obsidian-auto-cards", + "1Project/图文合批/图文合批-目录.md", + "1Project/海量渲染战斗/GPU动画.md", + "1Project/海量渲染战斗/批量渲染gpu动画.md", + "1Project/海量渲染战斗/基于GPU蒙皮动画的Spine实现.md", + "1Project/海量渲染战斗/基于GPU动画和ComputeShader的大批量动画渲染Demo(一)之GPU顶点动画.md", + "1Project/海量渲染战斗/海量渲染战斗-目录.md", + "1Project/构建新框架/MVVM/MVVM-目录.md", + "1Project/构建新框架/MVVM/欠缺内容.md", + "1Project/项目-目录.md", + "InBox/InBox-目录.md", + "00-Home.md", "wallhaven-rq75r7.jpg", "1Project/租房讨回押金/租新房注意事项.md", "1Project/租房讨回押金/处理流程.md", @@ -240,20 +254,8 @@ "4Archives/宠物宇宙/用户卡及游戏信息处理过程设计文档.md", "1Project/宠物宇宙/皮肤导入.md", "1Project/框架搭建.md", - "1Project/构建新框架/管道模式/依赖环节的流程管线.md", - "2Areas/开发感悟/接口与抽象类区别.md", "1Project/构建新框架/管道模式/未命名.canvas", "4Archives/宠物宇宙", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/项目复盘会议.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/项目A计划.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/财务季度报告.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/简易待办事项.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/用户反馈分析.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/每周例会记录.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/技术架构设计.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/市场调研报告.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/团队建设活动.md", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第五个用法|成为插件助手/Dataview 插件/测试用文档/产品功能需求.md", "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点9.md.edtz", "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点8.md.edtz", "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点7.md.edtz", @@ -262,7 +264,6 @@ "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点4.md.edtz", "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点3.md.edtz", "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点2.md.edtz", - "4Archives/AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点10.md.edtz", "2Areas/如何记录笔记/P.A.R.A/Pasted image 20250614192838.png", "1Project/战斗编辑器/随想/动作时间轴 随想.canvas", "2Areas/开发感悟/管道模式/未命名.canvas", diff --git a/00-Home.md b/00-Home.md new file mode 100644 index 0000000..435c94d --- /dev/null +++ b/00-Home.md @@ -0,0 +1,11 @@ +# Home + +## 入口 +- [[InBox/InBox-目录]] +- [[1Project/项目-目录]] +- [[2Areas/领域-目录]] +- [[3Resources/资源-目录]] +- [[4Archives/归档-目录]] + +## 常用目录 +- [[3Resources/游戏开发/性能优化/性能优化-目录]] diff --git a/1Project/GPU地形/GPU地形-目录.md b/1Project/GPU地形/GPU地形-目录.md new file mode 100644 index 0000000..506868d --- /dev/null +++ b/1Project/GPU地形/GPU地形-目录.md @@ -0,0 +1,11 @@ +--- +tags: + - GPU地形 + - 目录 + - MOC +--- + +- [[GPU Driven Terrain 跟学与实现]] +- [[Houdini PCG]] +- [[地形优化]] + diff --git a/1Project/图文合批/图文合批-目录.md b/1Project/图文合批/图文合批-目录.md new file mode 100644 index 0000000..2094695 --- /dev/null +++ b/1Project/图文合批/图文合批-目录.md @@ -0,0 +1,10 @@ +--- +tags: + - 图文合批 + - 目录 + - MOC +--- + +- [[图文使用不同的Tex2DArr]] +- [[字体字形图片申请]] + diff --git a/1Project/外包/Project_城堡/城堡-目录.md b/1Project/外包/Project_城堡/城堡-目录.md new file mode 100644 index 0000000..96593f5 --- /dev/null +++ b/1Project/外包/Project_城堡/城堡-目录.md @@ -0,0 +1,20 @@ +--- +tags: + - 城堡 + - 外包 + - 目录 + - MOC +--- + +- [[_城堡]] +- [[QA]] +- [[事件系统]] +- [[兵种系统]] +- [[地图系统]] +- [[城堡政务系统]] +- [[家园界面]] +- [[属性系统]] +- [[战斗系统]] +- [[抽卡系统]] +- [[背包系统]] + diff --git a/1Project/构建新框架/MVVM/MVVM-目录.md b/1Project/构建新框架/MVVM/MVVM-目录.md new file mode 100644 index 0000000..6a4cbce --- /dev/null +++ b/1Project/构建新框架/MVVM/MVVM-目录.md @@ -0,0 +1,9 @@ +--- +tags: + - MVVM + - 目录 + - MOC +--- + +- [[欠缺内容]] + diff --git a/1Project/海量渲染战斗/海量渲染战斗-目录.md b/1Project/海量渲染战斗/海量渲染战斗-目录.md new file mode 100644 index 0000000..9b6a12c --- /dev/null +++ b/1Project/海量渲染战斗/海量渲染战斗-目录.md @@ -0,0 +1,12 @@ +--- +tags: + - 海量渲染战斗 + - 目录 + - MOC +--- + +- [[GPU动画]] +- [[批量渲染gpu动画]] +- [[基于GPU蒙皮动画的Spine实现]] +- [[基于GPU动画和ComputeShader的大批量动画渲染Demo(一)之GPU顶点动画]] + diff --git a/1Project/项目-目录.md b/1Project/项目-目录.md new file mode 100644 index 0000000..f10ac51 --- /dev/null +++ b/1Project/项目-目录.md @@ -0,0 +1,17 @@ +--- +tags: + - 项目 + - 目录 + - MOC +--- + +## 入口 +- [[GPU地形/GPU地形-目录]] +- [[图文合批/图文合批-目录]] +- [[海量渲染战斗/海量渲染战斗-目录]] +- [[构建新框架/MVVM/MVVM-目录]] +- [[外包/Project_城堡/城堡-目录]] + +## 单页 +- [[理财]] + diff --git a/2Areas/习惯养成/习惯养成-目录.md b/2Areas/习惯养成/习惯养成-目录.md new file mode 100644 index 0000000..5801eb3 --- /dev/null +++ b/2Areas/习惯养成/习惯养成-目录.md @@ -0,0 +1,12 @@ +--- +tags: + - 习惯养成 + - 目录 + - MOC +--- + +- [[抗压能力]] +- [[拖延症]] +- [[规范日常行为]] +- [[高功能控制欲]] + diff --git a/2Areas/健康/健康-目录.md b/2Areas/健康/健康-目录.md new file mode 100644 index 0000000..353794d --- /dev/null +++ b/2Areas/健康/健康-目录.md @@ -0,0 +1,9 @@ +--- +tags: + - 健康 + - 目录 + - MOC +--- + +- [[运动-拉伸/八段锦/八段锦]] + diff --git a/2Areas/哲学与心理/哲学与心理-目录.md b/2Areas/哲学与心理/哲学与心理-目录.md new file mode 100644 index 0000000..2f9a8e9 --- /dev/null +++ b/2Areas/哲学与心理/哲学与心理-目录.md @@ -0,0 +1,11 @@ +--- +tags: + - 哲学与心理 + - 目录 + - MOC +--- + +- [[他者贡献]] +- [[目的论与原因论]] +- [[打球不敢往里突的人,球技很难增长,人生亦如此]] + diff --git a/2Areas/如何记录笔记/如何记录笔记-目录.md b/2Areas/如何记录笔记/如何记录笔记-目录.md new file mode 100644 index 0000000..bf0a160 --- /dev/null +++ b/2Areas/如何记录笔记/如何记录笔记-目录.md @@ -0,0 +1,14 @@ +--- +tags: + - 笔记方法 + - 目录 + - MOC +--- + +- [[抓捕生活中的灵感]] +- [[段落标记]] +- [[P.A.R.A/笔记如何组织]] +- [[P.A.R.A/操作手册]] +- [[P.A.R.A/如何开启一个项目]] +- [[P.A.R.A/如何结束一个项目]] + diff --git a/2Areas/年度复盘/年度复盘-目录.md b/2Areas/年度复盘/年度复盘-目录.md new file mode 100644 index 0000000..86bf996 --- /dev/null +++ b/2Areas/年度复盘/年度复盘-目录.md @@ -0,0 +1,9 @@ +--- +tags: + - 年度复盘 + - 目录 + - MOC +--- + +- [[2025]] + diff --git a/2Areas/提高效率/提高效率-目录.md b/2Areas/提高效率/提高效率-目录.md new file mode 100644 index 0000000..72984ba --- /dev/null +++ b/2Areas/提高效率/提高效率-目录.md @@ -0,0 +1,10 @@ +--- +tags: + - 效率 + - 目录 + - MOC +--- + +- [[90分钟随机事件法]] +- [[时间体验管理表]] + diff --git a/2Areas/游戏开发/游戏开发-目录.md b/2Areas/游戏开发/游戏开发-目录.md new file mode 100644 index 0000000..37c08b9 --- /dev/null +++ b/2Areas/游戏开发/游戏开发-目录.md @@ -0,0 +1,35 @@ +--- +tags: + - 游戏开发 + - 目录 + - MOC +--- + +## 笔记 +- [[Dispose的一些用法]] +- [[fgui&ugui合批记录]] +- [[pcei速度预估]] +- [[Texture、Texture2D与RenderTexture]] +- [[职业规划]] + +## 开发感悟 +- [[开发感悟/IOC]] +- [[开发感悟/UI框架应该需要些什么]] +- [[开发感悟/接口与抽象类区别]] + +## 战斗编辑器 +- [[战斗编辑器/随想/各个动作组件优劣]] +- [[战斗编辑器/参考文章/3C需要处理事项]] +- [[战斗编辑器/参考文章/EGP框架]] +- [[战斗编辑器/参考文章/游戏知识学习——【战斗系统】]] +- [[战斗编辑器/参考文章/战斗系统 - 3C相关]] +- [[战斗编辑器/参考文章/独立游戏-万字解析游戏战斗系统开发]] +- [[战斗编辑器/参考文章/基于timeline的动作框架]] +- [[战斗编辑器/参考文章/动作游戏拆解/动作游戏拆解]] +- [[战斗编辑器/参考文章/输入框架/游戏输入框架的设计(基于Unity)]] +- [[战斗编辑器/参考文章/写代码的诗人/战斗系统:什么是数据驱动?]] +- [[战斗编辑器/参考文章/写代码的诗人/战斗系统:属性管理]] +- [[战斗编辑器/参考文章/写代码的诗人/战斗系统:技能实现架构]] +- [[战斗编辑器/参考文章/写代码的诗人/战斗系统:状态配置管理(技能配置管理)]] +- [[战斗编辑器/参考文章/写代码的诗人/战斗系统:框架设计—战斗视角的GameObject]] + diff --git a/2Areas/面经/面经-目录.md b/2Areas/面经/面经-目录.md new file mode 100644 index 0000000..3fc1a22 --- /dev/null +++ b/2Areas/面经/面经-目录.md @@ -0,0 +1,9 @@ +--- +tags: + - 面经 + - 目录 + - MOC +--- + +- [[腾讯 网易 完美 字节 游戏客户端 游戏引擎(2020暑期实习岗) 综合笔 面经]] + diff --git a/2Areas/领域-目录.md b/2Areas/领域-目录.md new file mode 100644 index 0000000..81ab93e --- /dev/null +++ b/2Areas/领域-目录.md @@ -0,0 +1,18 @@ +--- +tags: + - Areas + - 目录 + - MOC +--- + +## 入口 +- [[学习]] +- [[健康/健康-目录]] +- [[面经/面经-目录]] +- [[年度复盘/年度复盘-目录]] +- [[如何记录笔记/如何记录笔记-目录]] +- [[提高效率/提高效率-目录]] +- [[习惯养成/习惯养成-目录]] +- [[游戏开发/游戏开发-目录]] +- [[哲学与心理/哲学与心理-目录]] + diff --git a/3Resources/书本/书本-目录.md b/3Resources/书本/书本-目录.md new file mode 100644 index 0000000..3407dda --- /dev/null +++ b/3Resources/书本/书本-目录.md @@ -0,0 +1,9 @@ +--- +tags: + - 书本 + - 目录 + - MOC +--- + +- [[毛选/第一章]] + diff --git a/3Resources/游戏开发/游戏开发-目录.md b/3Resources/游戏开发/游戏开发-目录.md new file mode 100644 index 0000000..3fe4e26 --- /dev/null +++ b/3Resources/游戏开发/游戏开发-目录.md @@ -0,0 +1,38 @@ +--- +tags: + - 游戏开发 + - Resources + - 目录 + - MOC +--- + +## 入口 +- [[性能优化/性能优化-目录]] + +## 渲染/管线 +- [[渲染管线/渲染流程]] +- [[渲染管线/MVP矩阵]] +- [[渲染管线/齐次裁剪空间 NDC坐标]] +- [[渲染管线/UGUI渲染流程]] + +## 渲染效果 +- [[渲染效果/Unity 技术美术Trick —— dither妙用]] +- [[渲染效果/Unity可交互雪地渲染Part5-雪地闪光及SSS]] + +## 资源/打包 +- [[资源/资源导入]] +- [[资源/打包/导航]] +- [[音效资源]] + +## 其他 +- [[CBUFFER]] +- [[Expression]] +- [[Timeline结构及其源码浅析]] +- [[帧同步总结]] +- [[游戏工具包汇总]] +- [[Log插件/Log插件]] + +## 算法 +- [[算法/TopK 问题]] +- [[算法/前中后序遍历]] + diff --git a/3Resources/资源-目录.md b/3Resources/资源-目录.md new file mode 100644 index 0000000..b66d8f5 --- /dev/null +++ b/3Resources/资源-目录.md @@ -0,0 +1,11 @@ +--- +tags: + - Resources + - 目录 + - MOC +--- + +## 入口 +- [[书本/书本-目录]] +- [[游戏开发/游戏开发-目录]] + diff --git a/4Archives/动态图集/动态图集-目录.md b/4Archives/动态图集/动态图集-目录.md new file mode 100644 index 0000000..019fb26 --- /dev/null +++ b/4Archives/动态图集/动态图集-目录.md @@ -0,0 +1,9 @@ +--- +tags: + - 动态图集 + - 目录 + - MOC +--- + +- [[动态图集]] + diff --git a/4Archives/宠物宇宙/宠物宇宙-目录.md b/4Archives/宠物宇宙/宠物宇宙-目录.md new file mode 100644 index 0000000..32100d8 --- /dev/null +++ b/4Archives/宠物宇宙/宠物宇宙-目录.md @@ -0,0 +1,10 @@ +--- +tags: + - 宠物宇宙 + - 目录 + - MOC +--- + +- [[用户卡及游戏信息处理过程设计文档]] +- [[地图编辑器/已经做完的优化]] + diff --git a/4Archives/归档-目录.md b/4Archives/归档-目录.md new file mode 100644 index 0000000..662a7d9 --- /dev/null +++ b/4Archives/归档-目录.md @@ -0,0 +1,12 @@ +--- +tags: + - Archives + - 目录 + - MOC +--- + +## 入口 +- [[宠物宇宙/宠物宇宙-目录]] +- [[动态图集/动态图集-目录]] +- [[租房相关/租房相关-目录]] + diff --git a/4Archives/租房相关/租房相关-目录.md b/4Archives/租房相关/租房相关-目录.md new file mode 100644 index 0000000..7f7cfaf --- /dev/null +++ b/4Archives/租房相关/租房相关-目录.md @@ -0,0 +1,10 @@ +--- +tags: + - 租房 + - 目录 + - MOC +--- + +- [[租新房注意事项]] +- [[讨回押金处理流程]] + diff --git a/InBox/InBox-目录.md b/InBox/InBox-目录.md new file mode 100644 index 0000000..97f28f5 --- /dev/null +++ b/InBox/InBox-目录.md @@ -0,0 +1,17 @@ +--- +tags: + - InBox + - 目录 + - MOC +--- + +## 待处理 +- [[unity-csharp-patch]] +- [[介绍状态同步战斗玩法的设计和实现]] + +## 处理规则(建议) +- 能落地到项目:移动到 `1Project/` +- 属于长期关注领域:移动到 `2Areas/` +- 纯资料/文章/摘录:移动到 `3Resources/` +- 过期资料:移动到 `4Archives/` + diff --git a/InBox/unity-csharp-patch.md b/InBox/unity-csharp-patch.md index 7369a10..b1c47d1 100644 --- a/InBox/unity-csharp-patch.md +++ b/InBox/unity-csharp-patch.md @@ -1 +1,11 @@ -[kandreyc/unity-csharp-patch:该项目的目标是解锁 Unity 中最新的 C# 功能](https://github.com/kandreyc/unity-csharp-patch) \ No newline at end of file +--- +type: clip +created: 2025-08-05 +source: https://github.com/kandreyc/unity-csharp-patch +tags: + - Unity + - CSharp + - InBox +--- + +- [kandreyc/unity-csharp-patch:该项目的目标是解锁 Unity 中最新的 C# 功能](https://github.com/kandreyc/unity-csharp-patch) diff --git a/InBox/介绍状态同步战斗玩法的设计和实现.md b/InBox/介绍状态同步战斗玩法的设计和实现.md index 805b0d8..b5dae83 100644 --- a/InBox/介绍状态同步战斗玩法的设计和实现.md +++ b/InBox/介绍状态同步战斗玩法的设计和实现.md @@ -1 +1,11 @@ -[介绍状态同步战斗玩法的设计和实现(以移动举例)](https://mp.weixin.qq.com/s/cNWUHBjR8GJvtGKIME9ZBg) \ No newline at end of file +--- +type: clip +created: 2025-08-05 +source: https://mp.weixin.qq.com/s/cNWUHBjR8GJvtGKIME9ZBg +tags: + - 战斗 + - 状态同步 + - InBox +--- + +- [介绍状态同步战斗玩法的设计和实现(以移动举例)](https://mp.weixin.qq.com/s/cNWUHBjR8GJvtGKIME9ZBg) diff --git a/copilot-custom-prompts/Emojify.md b/copilot-custom-prompts/Emojify.md new file mode 100644 index 0000000..ff69cb7 --- /dev/null +++ b/copilot-custom-prompts/Emojify.md @@ -0,0 +1,15 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 40 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Add relevant emojis to enhance the text below. Follow these rules: + 1. Insert emojis at natural breaks in the text + 2. Never place two emojis next to each other + 3. Keep all original text unchanged + 4. Choose emojis that match the context and tone + Return only the emojified text. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Explain like I am 5.md b/copilot-custom-prompts/Explain like I am 5.md new file mode 100644 index 0000000..41f1c6c --- /dev/null +++ b/copilot-custom-prompts/Explain like I am 5.md @@ -0,0 +1,14 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 120 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Explain the text below in simple terms that a 5-year-old would understand: + 1. Use basic vocabulary + 2. Include simple analogies + 3. Break down complex concepts + Return only the simplified explanation. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Fix grammar and spelling.md b/copilot-custom-prompts/Fix grammar and spelling.md new file mode 100644 index 0000000..0e547d0 --- /dev/null +++ b/copilot-custom-prompts/Fix grammar and spelling.md @@ -0,0 +1,10 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 0 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Fix the grammar and spelling of the text below. Preserve all formatting, line breaks, and special characters. Do not add or remove any content. Return only the corrected text. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Generate glossary.md b/copilot-custom-prompts/Generate glossary.md new file mode 100644 index 0000000..de3d414 --- /dev/null +++ b/copilot-custom-prompts/Generate glossary.md @@ -0,0 +1,10 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 80 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Create a glossary of important terms, concepts, and phrases from the text below. Format each entry as "Term: Definition". Sort entries alphabetically. Return only the glossary. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Generate table of contents.md b/copilot-custom-prompts/Generate table of contents.md new file mode 100644 index 0000000..2c35602 --- /dev/null +++ b/copilot-custom-prompts/Generate table of contents.md @@ -0,0 +1,10 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 70 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Generate a hierarchical table of contents for the text below. Use appropriate heading levels (H1, H2, H3, etc.). Include page numbers if present. Return only the table of contents. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Make longer.md b/copilot-custom-prompts/Make longer.md new file mode 100644 index 0000000..79b2304 --- /dev/null +++ b/copilot-custom-prompts/Make longer.md @@ -0,0 +1,14 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 60 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Expand the text below to twice its length by: + 1. Adding relevant details and examples + 2. Elaborating on key points + 3. Maintaining the original tone and style + Return only the expanded text. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Make shorter.md b/copilot-custom-prompts/Make shorter.md new file mode 100644 index 0000000..05bbea7 --- /dev/null +++ b/copilot-custom-prompts/Make shorter.md @@ -0,0 +1,14 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 50 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Reduce the text below to half its length while preserving these elements: + 1. Main ideas and key points + 2. Essential details + 3. Original tone and style + Return only the shortened text. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Remove URLs.md b/copilot-custom-prompts/Remove URLs.md new file mode 100644 index 0000000..451de6b --- /dev/null +++ b/copilot-custom-prompts/Remove URLs.md @@ -0,0 +1,10 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 90 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Remove all URLs from the text below. Preserve all other content and formatting. URLs may be in various formats (http, https, www). Return only the text with URLs removed. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Rewrite as press release.md b/copilot-custom-prompts/Rewrite as press release.md new file mode 100644 index 0000000..7c85292 --- /dev/null +++ b/copilot-custom-prompts/Rewrite as press release.md @@ -0,0 +1,14 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 130 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Transform the text below into a professional press release: + 1. Use formal, journalistic style + 2. Include headline and dateline + 3. Follow inverted pyramid structure + Return only the press release format. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Rewrite as tweet thread.md b/copilot-custom-prompts/Rewrite as tweet thread.md new file mode 100644 index 0000000..95f7e5b --- /dev/null +++ b/copilot-custom-prompts/Rewrite as tweet thread.md @@ -0,0 +1,20 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 110 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Convert the text below into a Twitter thread following these rules: + 1. Each tweet must be under 240 characters + 2. Start with "THREAD START" on its own line + 3. Separate tweets with " + +--- + +" + 4. End with "THREAD END" on its own line + 5. Make content engaging and clear + Return only the formatted thread. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Rewrite as tweet.md b/copilot-custom-prompts/Rewrite as tweet.md new file mode 100644 index 0000000..f235c01 --- /dev/null +++ b/copilot-custom-prompts/Rewrite as tweet.md @@ -0,0 +1,14 @@ +--- +copilot-command-context-menu-enabled: false +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 100 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Rewrite the text below as a single tweet with these requirements: + 1. Maximum 280 characters + 2. Use concise, impactful language + 3. Maintain the core message + Return only the tweet text. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Simplify.md b/copilot-custom-prompts/Simplify.md new file mode 100644 index 0000000..dd7a0ef --- /dev/null +++ b/copilot-custom-prompts/Simplify.md @@ -0,0 +1,10 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 30 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Simplify the text below to a 6th-grade reading level (ages 11-12). Use simple sentences, common words, and clear explanations. Maintain the original key concepts. Return only the simplified text. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Summarize.md b/copilot-custom-prompts/Summarize.md new file mode 100644 index 0000000..9511146 --- /dev/null +++ b/copilot-custom-prompts/Summarize.md @@ -0,0 +1,10 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 20 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Create a bullet-point summary of the text below. Each bullet point should capture a key point. Return only the bullet-point summary. + +{copilot-selection} \ No newline at end of file diff --git a/copilot-custom-prompts/Translate to Chinese.md b/copilot-custom-prompts/Translate to Chinese.md new file mode 100644 index 0000000..38259de --- /dev/null +++ b/copilot-custom-prompts/Translate to Chinese.md @@ -0,0 +1,14 @@ +--- +copilot-command-context-menu-enabled: true +copilot-command-slash-enabled: false +copilot-command-context-menu-order: 10 +copilot-command-model-key: "" +copilot-command-last-used: 0 +--- +Translate the text below into Chinese: + 1. Preserve the meaning and tone + 2. Maintain appropriate cultural context + 3. Keep formatting and structure + Return only the translated text. + +{copilot-selection} \ No newline at end of file diff --git a/skills/json-canvas/SKILL.md b/skills/json-canvas/SKILL.md new file mode 100644 index 0000000..0ddd0e4 --- /dev/null +++ b/skills/json-canvas/SKILL.md @@ -0,0 +1,656 @@ +--- +name: json-canvas +description: Create and edit JSON Canvas files (.canvas) with nodes, edges, groups, and connections. Use when working with .canvas files, creating visual canvases, mind maps, flowcharts, or when the user mentions Canvas files in Obsidian. +--- + +# JSON Canvas Skill + +This skill enables skills-compatible agents to create and edit valid JSON Canvas files (`.canvas`) used in Obsidian and other applications. + +## Overview + +JSON Canvas is an open file format for infinite canvas data. Canvas files use the `.canvas` extension and contain valid JSON following the [JSON Canvas Spec 1.0](https://jsoncanvas.org/spec/1.0/). + +## File Structure + +A canvas file contains two top-level arrays: + +```json +{ + "nodes": [], + "edges": [] +} +``` + +- `nodes` (optional): Array of node objects +- `edges` (optional): Array of edge objects connecting nodes + +## Nodes + +Nodes are objects placed on the canvas. There are four node types: +- `text` - Text content with Markdown +- `file` - Reference to files/attachments +- `link` - External URL +- `group` - Visual container for other nodes + +### Z-Index Ordering + +Nodes are ordered by z-index in the array: +- First node = bottom layer (displayed below others) +- Last node = top layer (displayed above others) + +### Generic Node Attributes + +All nodes share these attributes: + +| Attribute | Required | Type | Description | +|-----------|----------|------|-------------| +| `id` | Yes | string | Unique identifier for the node | +| `type` | Yes | string | Node type: `text`, `file`, `link`, or `group` | +| `x` | Yes | integer | X position in pixels | +| `y` | Yes | integer | Y position in pixels | +| `width` | Yes | integer | Width in pixels | +| `height` | Yes | integer | Height in pixels | +| `color` | No | canvasColor | Node color (see Color section) | + +### Text Nodes + +Text nodes contain Markdown content. + +```json +{ + "id": "6f0ad84f44ce9c17", + "type": "text", + "x": 0, + "y": 0, + "width": 400, + "height": 200, + "text": "# Hello World\n\nThis is **Markdown** content." +} +``` + +#### Newline Escaping (Common Pitfall) + +In JSON, newline characters inside strings **must** be represented as `\n`. Do **not** use the literal sequence `\\n` in a `.canvas` file—Obsidian will render it as the characters `\` and `n` instead of a line break. + +Examples: + +```json +{ "type": "text", "text": "Line 1\nLine 2" } +``` + +```json +{ "type": "text", "text": "Line 1\\nLine 2" } +``` + +| Attribute | Required | Type | Description | +|-----------|----------|------|-------------| +| `text` | Yes | string | Plain text with Markdown syntax | + +### File Nodes + +File nodes reference files or attachments (images, videos, PDFs, notes, etc.). + +```json +{ + "id": "a1b2c3d4e5f67890", + "type": "file", + "x": 500, + "y": 0, + "width": 400, + "height": 300, + "file": "Attachments/diagram.png" +} +``` + +```json +{ + "id": "b2c3d4e5f6789012", + "type": "file", + "x": 500, + "y": 400, + "width": 400, + "height": 300, + "file": "Notes/Project Overview.md", + "subpath": "#Implementation" +} +``` + +| Attribute | Required | Type | Description | +|-----------|----------|------|-------------| +| `file` | Yes | string | Path to file within the system | +| `subpath` | No | string | Link to heading or block (starts with `#`) | + +### Link Nodes + +Link nodes display external URLs. + +```json +{ + "id": "c3d4e5f678901234", + "type": "link", + "x": 1000, + "y": 0, + "width": 400, + "height": 200, + "url": "https://obsidian.md" +} +``` + +| Attribute | Required | Type | Description | +|-----------|----------|------|-------------| +| `url` | Yes | string | External URL | + +### Group Nodes + +Group nodes are visual containers for organizing other nodes. + +```json +{ + "id": "d4e5f6789012345a", + "type": "group", + "x": -50, + "y": -50, + "width": 1000, + "height": 600, + "label": "Project Overview", + "color": "4" +} +``` + +```json +{ + "id": "e5f67890123456ab", + "type": "group", + "x": 0, + "y": 700, + "width": 800, + "height": 500, + "label": "Resources", + "background": "Attachments/background.png", + "backgroundStyle": "cover" +} +``` + +| Attribute | Required | Type | Description | +|-----------|----------|------|-------------| +| `label` | No | string | Text label for the group | +| `background` | No | string | Path to background image | +| `backgroundStyle` | No | string | Background rendering style | + +#### Background Styles + +| Value | Description | +|-------|-------------| +| `cover` | Fills entire width and height of node | +| `ratio` | Maintains aspect ratio of background image | +| `repeat` | Repeats image as pattern in both directions | + +## Edges + +Edges are lines connecting nodes. + +```json +{ + "id": "f67890123456789a", + "fromNode": "6f0ad84f44ce9c17", + "toNode": "a1b2c3d4e5f67890" +} +``` + +```json +{ + "id": "0123456789abcdef", + "fromNode": "6f0ad84f44ce9c17", + "fromSide": "right", + "fromEnd": "none", + "toNode": "b2c3d4e5f6789012", + "toSide": "left", + "toEnd": "arrow", + "color": "1", + "label": "leads to" +} +``` + +| Attribute | Required | Type | Default | Description | +|-----------|----------|------|---------|-------------| +| `id` | Yes | string | - | Unique identifier for the edge | +| `fromNode` | Yes | string | - | Node ID where connection starts | +| `fromSide` | No | string | - | Side where edge starts | +| `fromEnd` | No | string | `none` | Shape at edge start | +| `toNode` | Yes | string | - | Node ID where connection ends | +| `toSide` | No | string | - | Side where edge ends | +| `toEnd` | No | string | `arrow` | Shape at edge end | +| `color` | No | canvasColor | - | Line color | +| `label` | No | string | - | Text label for the edge | + +### Side Values + +| Value | Description | +|-------|-------------| +| `top` | Top edge of node | +| `right` | Right edge of node | +| `bottom` | Bottom edge of node | +| `left` | Left edge of node | + +### End Shapes + +| Value | Description | +|-------|-------------| +| `none` | No endpoint shape | +| `arrow` | Arrow endpoint | + +## Colors + +The `canvasColor` type can be specified in two ways: + +### Hex Colors + +```json +{ + "color": "#FF0000" +} +``` + +### Preset Colors + +```json +{ + "color": "1" +} +``` + +| Preset | Color | +|--------|-------| +| `"1"` | Red | +| `"2"` | Orange | +| `"3"` | Yellow | +| `"4"` | Green | +| `"5"` | Cyan | +| `"6"` | Purple | + +Note: Specific color values for presets are intentionally undefined, allowing applications to use their own brand colors. + +## Complete Examples + +### Simple Canvas with Text and Connections + +```json +{ + "nodes": [ + { + "id": "8a9b0c1d2e3f4a5b", + "type": "text", + "x": 0, + "y": 0, + "width": 300, + "height": 150, + "text": "# Main Idea\n\nThis is the central concept." + }, + { + "id": "1a2b3c4d5e6f7a8b", + "type": "text", + "x": 400, + "y": -100, + "width": 250, + "height": 100, + "text": "## Supporting Point A\n\nDetails here." + }, + { + "id": "2b3c4d5e6f7a8b9c", + "type": "text", + "x": 400, + "y": 100, + "width": 250, + "height": 100, + "text": "## Supporting Point B\n\nMore details." + } + ], + "edges": [ + { + "id": "3c4d5e6f7a8b9c0d", + "fromNode": "8a9b0c1d2e3f4a5b", + "fromSide": "right", + "toNode": "1a2b3c4d5e6f7a8b", + "toSide": "left" + }, + { + "id": "4d5e6f7a8b9c0d1e", + "fromNode": "8a9b0c1d2e3f4a5b", + "fromSide": "right", + "toNode": "2b3c4d5e6f7a8b9c", + "toSide": "left" + } + ] +} +``` + +### Project Board with Groups + +```json +{ + "nodes": [ + { + "id": "5e6f7a8b9c0d1e2f", + "type": "group", + "x": 0, + "y": 0, + "width": 300, + "height": 500, + "label": "To Do", + "color": "1" + }, + { + "id": "6f7a8b9c0d1e2f3a", + "type": "group", + "x": 350, + "y": 0, + "width": 300, + "height": 500, + "label": "In Progress", + "color": "3" + }, + { + "id": "7a8b9c0d1e2f3a4b", + "type": "group", + "x": 700, + "y": 0, + "width": 300, + "height": 500, + "label": "Done", + "color": "4" + }, + { + "id": "8b9c0d1e2f3a4b5c", + "type": "text", + "x": 20, + "y": 50, + "width": 260, + "height": 80, + "text": "## Task 1\n\nImplement feature X" + }, + { + "id": "9c0d1e2f3a4b5c6d", + "type": "text", + "x": 370, + "y": 50, + "width": 260, + "height": 80, + "text": "## Task 2\n\nReview PR #123", + "color": "2" + }, + { + "id": "0d1e2f3a4b5c6d7e", + "type": "text", + "x": 720, + "y": 50, + "width": 260, + "height": 80, + "text": "## Task 3\n\n~~Setup CI/CD~~" + } + ], + "edges": [] +} +``` + +### Research Canvas with Files and Links + +```json +{ + "nodes": [ + { + "id": "1e2f3a4b5c6d7e8f", + "type": "text", + "x": 300, + "y": 200, + "width": 400, + "height": 200, + "text": "# Research Topic\n\n## Key Questions\n\n- How does X affect Y?\n- What are the implications?", + "color": "5" + }, + { + "id": "2f3a4b5c6d7e8f9a", + "type": "file", + "x": 0, + "y": 0, + "width": 250, + "height": 150, + "file": "Literature/Paper A.pdf" + }, + { + "id": "3a4b5c6d7e8f9a0b", + "type": "file", + "x": 0, + "y": 200, + "width": 250, + "height": 150, + "file": "Notes/Meeting Notes.md", + "subpath": "#Key Insights" + }, + { + "id": "4b5c6d7e8f9a0b1c", + "type": "link", + "x": 0, + "y": 400, + "width": 250, + "height": 100, + "url": "https://example.com/research" + }, + { + "id": "5c6d7e8f9a0b1c2d", + "type": "file", + "x": 750, + "y": 150, + "width": 300, + "height": 250, + "file": "Attachments/diagram.png" + } + ], + "edges": [ + { + "id": "6d7e8f9a0b1c2d3e", + "fromNode": "2f3a4b5c6d7e8f9a", + "fromSide": "right", + "toNode": "1e2f3a4b5c6d7e8f", + "toSide": "left", + "label": "supports" + }, + { + "id": "7e8f9a0b1c2d3e4f", + "fromNode": "3a4b5c6d7e8f9a0b", + "fromSide": "right", + "toNode": "1e2f3a4b5c6d7e8f", + "toSide": "left", + "label": "informs" + }, + { + "id": "8f9a0b1c2d3e4f5a", + "fromNode": "4b5c6d7e8f9a0b1c", + "fromSide": "right", + "toNode": "1e2f3a4b5c6d7e8f", + "toSide": "left", + "toEnd": "arrow", + "color": "6" + }, + { + "id": "9a0b1c2d3e4f5a6b", + "fromNode": "1e2f3a4b5c6d7e8f", + "fromSide": "right", + "toNode": "5c6d7e8f9a0b1c2d", + "toSide": "left", + "label": "visualized by" + } + ] +} +``` + +### Flowchart + +```json +{ + "nodes": [ + { + "id": "a0b1c2d3e4f5a6b7", + "type": "text", + "x": 200, + "y": 0, + "width": 150, + "height": 60, + "text": "**Start**", + "color": "4" + }, + { + "id": "b1c2d3e4f5a6b7c8", + "type": "text", + "x": 200, + "y": 100, + "width": 150, + "height": 60, + "text": "Step 1:\nGather data" + }, + { + "id": "c2d3e4f5a6b7c8d9", + "type": "text", + "x": 200, + "y": 200, + "width": 150, + "height": 80, + "text": "**Decision**\n\nIs data valid?", + "color": "3" + }, + { + "id": "d3e4f5a6b7c8d9e0", + "type": "text", + "x": 400, + "y": 200, + "width": 150, + "height": 60, + "text": "Process data" + }, + { + "id": "e4f5a6b7c8d9e0f1", + "type": "text", + "x": 0, + "y": 200, + "width": 150, + "height": 60, + "text": "Request new data", + "color": "1" + }, + { + "id": "f5a6b7c8d9e0f1a2", + "type": "text", + "x": 400, + "y": 320, + "width": 150, + "height": 60, + "text": "**End**", + "color": "4" + } + ], + "edges": [ + { + "id": "a6b7c8d9e0f1a2b3", + "fromNode": "a0b1c2d3e4f5a6b7", + "fromSide": "bottom", + "toNode": "b1c2d3e4f5a6b7c8", + "toSide": "top" + }, + { + "id": "b7c8d9e0f1a2b3c4", + "fromNode": "b1c2d3e4f5a6b7c8", + "fromSide": "bottom", + "toNode": "c2d3e4f5a6b7c8d9", + "toSide": "top" + }, + { + "id": "c8d9e0f1a2b3c4d5", + "fromNode": "c2d3e4f5a6b7c8d9", + "fromSide": "right", + "toNode": "d3e4f5a6b7c8d9e0", + "toSide": "left", + "label": "Yes", + "color": "4" + }, + { + "id": "d9e0f1a2b3c4d5e6", + "fromNode": "c2d3e4f5a6b7c8d9", + "fromSide": "left", + "toNode": "e4f5a6b7c8d9e0f1", + "toSide": "right", + "label": "No", + "color": "1" + }, + { + "id": "e0f1a2b3c4d5e6f7", + "fromNode": "e4f5a6b7c8d9e0f1", + "fromSide": "top", + "fromEnd": "none", + "toNode": "b1c2d3e4f5a6b7c8", + "toSide": "left", + "toEnd": "arrow" + }, + { + "id": "f1a2b3c4d5e6f7a8", + "fromNode": "d3e4f5a6b7c8d9e0", + "fromSide": "bottom", + "toNode": "f5a6b7c8d9e0f1a2", + "toSide": "top" + } + ] +} +``` + +## ID Generation + +Node and edge IDs must be unique strings. Obsidian generates 16-character hexadecimal IDs: + +```json +"id": "6f0ad84f44ce9c17" +"id": "a3b2c1d0e9f8g7h6" +"id": "1234567890abcdef" +``` + +This format is a 16-character lowercase hex string (64-bit random value). + +## Layout Guidelines + +### Positioning + +- Coordinates can be negative (canvas extends infinitely) +- `x` increases to the right +- `y` increases downward +- Position refers to top-left corner of node + +### Recommended Sizes + +| Node Type | Suggested Width | Suggested Height | +|-----------|-----------------|------------------| +| Small text | 200-300 | 80-150 | +| Medium text | 300-450 | 150-300 | +| Large text | 400-600 | 300-500 | +| File preview | 300-500 | 200-400 | +| Link preview | 250-400 | 100-200 | +| Group | Varies | Varies | + +### Spacing + +- Leave 20-50px padding inside groups +- Space nodes 50-100px apart for readability +- Align nodes to grid (multiples of 10 or 20) for cleaner layouts + +## Validation Rules + +1. All `id` values must be unique across nodes and edges +2. `fromNode` and `toNode` must reference existing node IDs +3. Required fields must be present for each node type +4. `type` must be one of: `text`, `file`, `link`, `group` +5. `backgroundStyle` must be one of: `cover`, `ratio`, `repeat` +6. `fromSide`, `toSide` must be one of: `top`, `right`, `bottom`, `left` +7. `fromEnd`, `toEnd` must be one of: `none`, `arrow` +8. Color presets must be `"1"` through `"6"` or valid hex color + +## References + +- [JSON Canvas Spec 1.0](https://jsoncanvas.org/spec/1.0/) +- [JSON Canvas GitHub](https://github.com/obsidianmd/jsoncanvas) diff --git a/skills/obsidian-auto-cards/SKILL.md b/skills/obsidian-auto-cards/SKILL.md new file mode 100644 index 0000000..96c5814 --- /dev/null +++ b/skills/obsidian-auto-cards/SKILL.md @@ -0,0 +1,136 @@ +--- +name: obsidian-auto-cards +description: 从当前笔记/文件夹自动提取知识点,在同级创建“卡片/”并生成原子卡片(可选生成卡片目录)。适用于整理 Obsidian 笔记、把长文拆成可复用知识卡。 +--- + +# Obsidian 自动卡片生成 Skill(提示词) + +你是一个 Obsidian 笔记整理助手。你的目标是在**不破坏原笔记**的前提下,把笔记中的“知识点”抽取为可复用的**原子卡片**。 + +## 作用范围与安全边界 + +- 只在用户指定的目录下工作。 +- 只创建/更新该目录下的 `卡片/` 子文件夹内容,以及可选的 `卡片/卡片-目录.md`。 +- **不要**改动 `.obsidian/`、插件配置、工作区布局、已有 `.base` 文件(除非用户明确要求)。 +- 默认不移动/重命名原始笔记文件。 + +## 触发方式 + +当用户说以下任意一句时启用本技能: +- “生成卡片” +- “从这篇笔记生成卡片” +- “整理这个文件夹,自动生成卡片” + +## 需要的输入(尽量少问) + +优先从上下文推断;推断失败时只问 1 个问题: + +1) 目标:单文件还是整个文件夹? +- 单文件:给出 `note_path` +- 文件夹:给出 `folder_path`(递归处理其下所有 `.md`,但排除 `卡片/`) + +可选参数(用户没说就用默认): +- `cards_folder_name`:默认 `卡片` +- `max_cards_per_note`:默认 `12` +- `overwrite`:默认 `false`(若卡片已存在则跳过或仅补充“来源”) +- `create_index`:默认 `true` + +## 输出要求(卡片质量) + +每张卡片必须满足: +- **一个卡片只讲一个知识点**(原子性)。 +- **可读 + 可检索**:标题清晰;包含关键词/标签;有来源回链。 +- **可复用**:优先写成“定义 + 要点 + 示例/坑点”结构。 +- 不要把整篇文章复制进卡片;保持短小精悍。 + +## 知识点自动检索规则(从强到弱) + +从笔记中按优先级提取候选知识点: +1) “术语/概念定义”:形如 `X 是…`、`X:…`、`定义/概念/原理` 小节。 +2) “对比与结论”:形如 `区别/优缺点/适用场景/结论` 小节。 +3) “方法/步骤/流程”:步骤列表、流程图说明、伪代码。 +4) “坑点/注意事项”:包含 `注意/坑/陷阱/误区/常见问题` 的段落或列表项。 +5) “关键公式/参数/阈值”:数学块、关键配置项列表。 + +抽取时保留最少必要上下文(最多 5~10 行等价信息),并把原文细节留在来源笔记中。 + +## 目录与文件组织规则 + +### 卡片文件夹 + +- 对于单文件 `X/笔记.md`:在同目录 `X/卡片/` 创建卡片。 +- 对于文件夹 `X/`:在 `X/卡片/` 创建卡片;扫描 `X/` 下所有 `.md`(递归),但: + - 排除 `X/卡片/` 下的文件 + - 排除 `*-目录.md`、`00-Home.md`(除非用户要求) + +### 卡片命名 + +文件名优先用知识点标题: +- `卡片/<知识点标题>.md` +- 若同名冲突:追加来源笔记名或编号:`<标题>(<来源笔记>)` 或 `<标题>-2` +- 过滤非法文件名字符:`\\ / : * ? \" < > |` + +## 卡片模板(必须用这个) + +```markdown +--- +type: card +created: {{yyyy-MM-dd}} +source: [[<来源笔记相对路径或文件名>]] +source_section: "<可选:标题/小节>" +tags: + - 卡片 + - <可选:从来源 frontmatter 继承的 tag> +--- + +## 定义 +一句话说清楚它是什么/解决什么问题。 + +## 要点 +- 关键点 1 +- 关键点 2 + +## 示例 / 用法(可选) +最小例子、伪代码或使用场景。 + +## 注意 / 坑(可选) +- 常见误区或边界条件。 +``` + +## 去重与更新策略(默认保守) + +- 若 `卡片/<标题>.md` 已存在: + - `overwrite=false`:不覆盖正文;只在末尾追加一条 `source` 或补充缺失的 frontmatter 字段(尽量不打扰用户写的内容)。 + - 用户明确说“覆盖/重生成”才允许重写。 + +## 生成卡片目录(可选,默认开) + +在 `卡片/卡片-目录.md` 生成/更新目录: + +```markdown +--- +tags: + - 目录 + - 卡片 +--- + +# 卡片目录 + +```dataview +LIST +FROM "(这里放卡片文件夹路径)" +WHERE contains(tags, "卡片") +SORT file.name ASC +``` +``` + +如果用户不使用 Dataview,就改成纯 wikilink 列表。 + +## 执行步骤(你必须按这个流程做) + +1) 确定目标(单文件 or 文件夹)与 `卡片/` 路径;必要时创建文件夹。 +2) 扫描来源笔记,按“知识点检索规则”提取候选列表,并做去重。 +3) 逐个生成卡片文件(应用模板、写入来源回链与标签)。 +4) 可选:生成/更新 `卡片-目录.md`。 +5) 最终汇报:生成了多少张卡片、写到了哪些路径;若有跳过/冲突也要列出原因。 + diff --git a/skills/obsidian-bases/SKILL.md b/skills/obsidian-bases/SKILL.md new file mode 100644 index 0000000..4b27f7e --- /dev/null +++ b/skills/obsidian-bases/SKILL.md @@ -0,0 +1,651 @@ +--- +name: obsidian-bases +description: Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian. +--- + +# Obsidian Bases Skill + +This skill enables skills-compatible agents to create and edit valid Obsidian Bases (`.base` files) including views, filters, formulas, and all related configurations. + +## Overview + +Obsidian Bases are YAML-based files that define dynamic views of notes in an Obsidian vault. A Base file can contain multiple views, global filters, formulas, property configurations, and custom summaries. + +## File Format + +Base files use the `.base` extension and contain valid YAML. They can also be embedded in Markdown code blocks. + +## Complete Schema + +```yaml +# Global filters apply to ALL views in the base +filters: + # Can be a single filter string + # OR a recursive filter object with and/or/not + and: [] + or: [] + not: [] + +# Define formula properties that can be used across all views +formulas: + formula_name: 'expression' + +# Configure display names and settings for properties +properties: + property_name: + displayName: "Display Name" + formula.formula_name: + displayName: "Formula Display Name" + file.ext: + displayName: "Extension" + +# Define custom summary formulas +summaries: + custom_summary_name: 'values.mean().round(3)' + +# Define one or more views +views: + - type: table | cards | list | map + name: "View Name" + limit: 10 # Optional: limit results + groupBy: # Optional: group results + property: property_name + direction: ASC | DESC + filters: # View-specific filters + and: [] + order: # Properties to display in order + - file.name + - property_name + - formula.formula_name + summaries: # Map properties to summary formulas + property_name: Average +``` + +## Filter Syntax + +Filters narrow down results. They can be applied globally or per-view. + +### Filter Structure + +```yaml +# Single filter +filters: 'status == "done"' + +# AND - all conditions must be true +filters: + and: + - 'status == "done"' + - 'priority > 3' + +# OR - any condition can be true +filters: + or: + - 'file.hasTag("book")' + - 'file.hasTag("article")' + +# NOT - exclude matching items +filters: + not: + - 'file.hasTag("archived")' + +# Nested filters +filters: + or: + - file.hasTag("tag") + - and: + - file.hasTag("book") + - file.hasLink("Textbook") + - not: + - file.hasTag("book") + - file.inFolder("Required Reading") +``` + +### Filter Operators + +| Operator | Description | +|----------|-------------| +| `==` | equals | +| `!=` | not equal | +| `>` | greater than | +| `<` | less than | +| `>=` | greater than or equal | +| `<=` | less than or equal | +| `&&` | logical and | +| `\|\|` | logical or | +| ! | logical not | + +## Properties + +### Three Types of Properties + +1. **Note properties** - From frontmatter: `note.author` or just `author` +2. **File properties** - File metadata: `file.name`, `file.mtime`, etc. +3. **Formula properties** - Computed values: `formula.my_formula` + +### File Properties Reference + +| Property | Type | Description | +|----------|------|-------------| +| `file.name` | String | File name | +| `file.basename` | String | File name without extension | +| `file.path` | String | Full path to file | +| `file.folder` | String | Parent folder path | +| `file.ext` | String | File extension | +| `file.size` | Number | File size in bytes | +| `file.ctime` | Date | Created time | +| `file.mtime` | Date | Modified time | +| `file.tags` | List | All tags in file | +| `file.links` | List | Internal links in file | +| `file.backlinks` | List | Files linking to this file | +| `file.embeds` | List | Embeds in the note | +| `file.properties` | Object | All frontmatter properties | + +### The `this` Keyword + +- In main content area: refers to the base file itself +- When embedded: refers to the embedding file +- In sidebar: refers to the active file in main content + +## Formula Syntax + +Formulas compute values from properties. Defined in the `formulas` section. + +```yaml +formulas: + # Simple arithmetic + total: "price * quantity" + + # Conditional logic + status_icon: 'if(done, "✅", "⏳")' + + # String formatting + formatted_price: 'if(price, price.toFixed(2) + " dollars")' + + # Date formatting + created: 'file.ctime.format("YYYY-MM-DD")' + + # Calculate days since created (use .days for Duration) + days_old: '(now() - file.ctime).days' + + # Calculate days until due date + days_until_due: 'if(due_date, (date(due_date) - today()).days, "")' +``` + +## Functions Reference + +### Global Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `date()` | `date(string): date` | Parse string to date. Format: `YYYY-MM-DD HH:mm:ss` | +| `duration()` | `duration(string): duration` | Parse duration string | +| `now()` | `now(): date` | Current date and time | +| `today()` | `today(): date` | Current date (time = 00:00:00) | +| `if()` | `if(condition, trueResult, falseResult?)` | Conditional | +| `min()` | `min(n1, n2, ...): number` | Smallest number | +| `max()` | `max(n1, n2, ...): number` | Largest number | +| `number()` | `number(any): number` | Convert to number | +| `link()` | `link(path, display?): Link` | Create a link | +| `list()` | `list(element): List` | Wrap in list if not already | +| `file()` | `file(path): file` | Get file object | +| `image()` | `image(path): image` | Create image for rendering | +| `icon()` | `icon(name): icon` | Lucide icon by name | +| `html()` | `html(string): html` | Render as HTML | +| `escapeHTML()` | `escapeHTML(string): string` | Escape HTML characters | + +### Any Type Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `isTruthy()` | `any.isTruthy(): boolean` | Coerce to boolean | +| `isType()` | `any.isType(type): boolean` | Check type | +| `toString()` | `any.toString(): string` | Convert to string | + +### Date Functions & Fields + +**Fields:** `date.year`, `date.month`, `date.day`, `date.hour`, `date.minute`, `date.second`, `date.millisecond` + +| Function | Signature | Description | +|----------|-----------|-------------| +| `date()` | `date.date(): date` | Remove time portion | +| `format()` | `date.format(string): string` | Format with Moment.js pattern | +| `time()` | `date.time(): string` | Get time as string | +| `relative()` | `date.relative(): string` | Human-readable relative time | +| `isEmpty()` | `date.isEmpty(): boolean` | Always false for dates | + +### Duration Type + +When subtracting two dates, the result is a **Duration** type (not a number). Duration has its own properties and methods. + +**Duration Fields:** +| Field | Type | Description | +|-------|------|-------------| +| `duration.days` | Number | Total days in duration | +| `duration.hours` | Number | Total hours in duration | +| `duration.minutes` | Number | Total minutes in duration | +| `duration.seconds` | Number | Total seconds in duration | +| `duration.milliseconds` | Number | Total milliseconds in duration | + +**IMPORTANT:** Duration does NOT support `.round()`, `.floor()`, `.ceil()` directly. You must access a numeric field first (like `.days`), then apply number functions. + +```yaml +# CORRECT: Calculate days between dates +"(date(due_date) - today()).days" # Returns number of days +"(now() - file.ctime).days" # Days since created + +# CORRECT: Round the numeric result if needed +"(date(due_date) - today()).days.round(0)" # Rounded days +"(now() - file.ctime).hours.round(0)" # Rounded hours + +# WRONG - will cause error: +# "((date(due) - today()) / 86400000).round(0)" # Duration doesn't support division then round +``` + +### Date Arithmetic + +```yaml +# Duration units: y/year/years, M/month/months, d/day/days, +# w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds + +# Add/subtract durations +"date + \"1M\"" # Add 1 month +"date - \"2h\"" # Subtract 2 hours +"now() + \"1 day\"" # Tomorrow +"today() + \"7d\"" # A week from today + +# Subtract dates returns Duration type +"now() - file.ctime" # Returns Duration +"(now() - file.ctime).days" # Get days as number +"(now() - file.ctime).hours" # Get hours as number + +# Complex duration arithmetic +"now() + (duration('1d') * 2)" +``` + +### String Functions + +**Field:** `string.length` + +| Function | Signature | Description | +|----------|-----------|-------------| +| `contains()` | `string.contains(value): boolean` | Check substring | +| `containsAll()` | `string.containsAll(...values): boolean` | All substrings present | +| `containsAny()` | `string.containsAny(...values): boolean` | Any substring present | +| `startsWith()` | `string.startsWith(query): boolean` | Starts with query | +| `endsWith()` | `string.endsWith(query): boolean` | Ends with query | +| `isEmpty()` | `string.isEmpty(): boolean` | Empty or not present | +| `lower()` | `string.lower(): string` | To lowercase | +| `title()` | `string.title(): string` | To Title Case | +| `trim()` | `string.trim(): string` | Remove whitespace | +| `replace()` | `string.replace(pattern, replacement): string` | Replace pattern | +| `repeat()` | `string.repeat(count): string` | Repeat string | +| `reverse()` | `string.reverse(): string` | Reverse string | +| `slice()` | `string.slice(start, end?): string` | Substring | +| `split()` | `string.split(separator, n?): list` | Split to list | + +### Number Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `abs()` | `number.abs(): number` | Absolute value | +| `ceil()` | `number.ceil(): number` | Round up | +| `floor()` | `number.floor(): number` | Round down | +| `round()` | `number.round(digits?): number` | Round to digits | +| `toFixed()` | `number.toFixed(precision): string` | Fixed-point notation | +| `isEmpty()` | `number.isEmpty(): boolean` | Not present | + +### List Functions + +**Field:** `list.length` + +| Function | Signature | Description | +|----------|-----------|-------------| +| `contains()` | `list.contains(value): boolean` | Element exists | +| `containsAll()` | `list.containsAll(...values): boolean` | All elements exist | +| `containsAny()` | `list.containsAny(...values): boolean` | Any element exists | +| `filter()` | `list.filter(expression): list` | Filter by condition (uses `value`, `index`) | +| `map()` | `list.map(expression): list` | Transform elements (uses `value`, `index`) | +| `reduce()` | `list.reduce(expression, initial): any` | Reduce to single value (uses `value`, `index`, `acc`) | +| `flat()` | `list.flat(): list` | Flatten nested lists | +| `join()` | `list.join(separator): string` | Join to string | +| `reverse()` | `list.reverse(): list` | Reverse order | +| `slice()` | `list.slice(start, end?): list` | Sublist | +| `sort()` | `list.sort(): list` | Sort ascending | +| `unique()` | `list.unique(): list` | Remove duplicates | +| `isEmpty()` | `list.isEmpty(): boolean` | No elements | + +### File Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `asLink()` | `file.asLink(display?): Link` | Convert to link | +| `hasLink()` | `file.hasLink(otherFile): boolean` | Has link to file | +| `hasTag()` | `file.hasTag(...tags): boolean` | Has any of the tags | +| `hasProperty()` | `file.hasProperty(name): boolean` | Has property | +| `inFolder()` | `file.inFolder(folder): boolean` | In folder or subfolder | + +### Link Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `asFile()` | `link.asFile(): file` | Get file object | +| `linksTo()` | `link.linksTo(file): boolean` | Links to file | + +### Object Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `isEmpty()` | `object.isEmpty(): boolean` | No properties | +| `keys()` | `object.keys(): list` | List of keys | +| `values()` | `object.values(): list` | List of values | + +### Regular Expression Functions + +| Function | Signature | Description | +|----------|-----------|-------------| +| `matches()` | `regexp.matches(string): boolean` | Test if matches | + +## View Types + +### Table View + +```yaml +views: + - type: table + name: "My Table" + order: + - file.name + - status + - due_date + summaries: + price: Sum + count: Average +``` + +### Cards View + +```yaml +views: + - type: cards + name: "Gallery" + order: + - file.name + - cover_image + - description +``` + +### List View + +```yaml +views: + - type: list + name: "Simple List" + order: + - file.name + - status +``` + +### Map View + +Requires latitude/longitude properties and the Maps community plugin. + +```yaml +views: + - type: map + name: "Locations" + # Map-specific settings for lat/lng properties +``` + +## Default Summary Formulas + +| Name | Input Type | Description | +|------|------------|-------------| +| `Average` | Number | Mathematical mean | +| `Min` | Number | Smallest number | +| `Max` | Number | Largest number | +| `Sum` | Number | Sum of all numbers | +| `Range` | Number | Max - Min | +| `Median` | Number | Mathematical median | +| `Stddev` | Number | Standard deviation | +| `Earliest` | Date | Earliest date | +| `Latest` | Date | Latest date | +| `Range` | Date | Latest - Earliest | +| `Checked` | Boolean | Count of true values | +| `Unchecked` | Boolean | Count of false values | +| `Empty` | Any | Count of empty values | +| `Filled` | Any | Count of non-empty values | +| `Unique` | Any | Count of unique values | + +## Complete Examples + +### Task Tracker Base + +```yaml +filters: + and: + - file.hasTag("task") + - 'file.ext == "md"' + +formulas: + days_until_due: 'if(due, (date(due) - today()).days, "")' + is_overdue: 'if(due, date(due) < today() && status != "done", false)' + priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))' + +properties: + status: + displayName: Status + formula.days_until_due: + displayName: "Days Until Due" + formula.priority_label: + displayName: Priority + +views: + - type: table + name: "Active Tasks" + filters: + and: + - 'status != "done"' + order: + - file.name + - status + - formula.priority_label + - due + - formula.days_until_due + groupBy: + property: status + direction: ASC + summaries: + formula.days_until_due: Average + + - type: table + name: "Completed" + filters: + and: + - 'status == "done"' + order: + - file.name + - completed_date +``` + +### Reading List Base + +```yaml +filters: + or: + - file.hasTag("book") + - file.hasTag("article") + +formulas: + reading_time: 'if(pages, (pages * 2).toString() + " min", "")' + status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))' + year_read: 'if(finished_date, date(finished_date).year, "")' + +properties: + author: + displayName: Author + formula.status_icon: + displayName: "" + formula.reading_time: + displayName: "Est. Time" + +views: + - type: cards + name: "Library" + order: + - cover + - file.name + - author + - formula.status_icon + filters: + not: + - 'status == "dropped"' + + - type: table + name: "Reading List" + filters: + and: + - 'status == "to-read"' + order: + - file.name + - author + - pages + - formula.reading_time +``` + +### Project Notes Base + +```yaml +filters: + and: + - file.inFolder("Projects") + - 'file.ext == "md"' + +formulas: + last_updated: 'file.mtime.relative()' + link_count: 'file.links.length' + +summaries: + avgLinks: 'values.filter(value.isType("number")).mean().round(1)' + +properties: + formula.last_updated: + displayName: "Updated" + formula.link_count: + displayName: "Links" + +views: + - type: table + name: "All Projects" + order: + - file.name + - status + - formula.last_updated + - formula.link_count + summaries: + formula.link_count: avgLinks + groupBy: + property: status + direction: ASC + + - type: list + name: "Quick List" + order: + - file.name + - status +``` + +### Daily Notes Index + +```yaml +filters: + and: + - file.inFolder("Daily Notes") + - '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)' + +formulas: + word_estimate: '(file.size / 5).round(0)' + day_of_week: 'date(file.basename).format("dddd")' + +properties: + formula.day_of_week: + displayName: "Day" + formula.word_estimate: + displayName: "~Words" + +views: + - type: table + name: "Recent Notes" + limit: 30 + order: + - file.name + - formula.day_of_week + - formula.word_estimate + - file.mtime +``` + +## Embedding Bases + +Embed in Markdown files: + +```markdown +![[MyBase.base]] + + +![[MyBase.base#View Name]] +``` + +## YAML Quoting Rules + +- Use single quotes for formulas containing double quotes: `'if(done, "Yes", "No")'` +- Use double quotes for simple strings: `"My View Name"` +- Escape nested quotes properly in complex expressions + +## Common Patterns + +### Filter by Tag +```yaml +filters: + and: + - file.hasTag("project") +``` + +### Filter by Folder +```yaml +filters: + and: + - file.inFolder("Notes") +``` + +### Filter by Date Range +```yaml +filters: + and: + - 'file.mtime > now() - "7d"' +``` + +### Filter by Property Value +```yaml +filters: + and: + - 'status == "active"' + - 'priority >= 3' +``` + +### Combine Multiple Conditions +```yaml +filters: + or: + - and: + - file.hasTag("important") + - 'status != "done"' + - and: + - 'priority == 1' + - 'due != ""' +``` + +## References + +- [Bases Syntax](https://help.obsidian.md/bases/syntax) +- [Functions](https://help.obsidian.md/bases/functions) +- [Views](https://help.obsidian.md/bases/views) +- [Formulas](https://help.obsidian.md/formulas) diff --git a/skills/obsidian-markdown/SKILL.md b/skills/obsidian-markdown/SKILL.md new file mode 100644 index 0000000..2fb45c5 --- /dev/null +++ b/skills/obsidian-markdown/SKILL.md @@ -0,0 +1,620 @@ +--- +name: obsidian-markdown +description: Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes. +--- + +# Obsidian Flavored Markdown Skill + +This skill enables skills-compatible agents to create and edit valid Obsidian Flavored Markdown, including all Obsidian-specific syntax extensions. + +## Overview + +Obsidian uses a combination of Markdown flavors: +- [CommonMark](https://commonmark.org/) +- [GitHub Flavored Markdown](https://github.github.com/gfm/) +- [LaTeX](https://www.latex-project.org/) for math +- Obsidian-specific extensions (wikilinks, callouts, embeds, etc.) + +## Basic Formatting + +### Paragraphs and Line Breaks + +```markdown +This is a paragraph. + +This is another paragraph (blank line between creates separate paragraphs). + +For a line break within a paragraph, add two spaces at the end +or use Shift+Enter. +``` + +### Headings + +```markdown +# Heading 1 +## Heading 2 +### Heading 3 +#### Heading 4 +##### Heading 5 +###### Heading 6 +``` + +### Text Formatting + +| Style | Syntax | Example | Output | +|-------|--------|---------|--------| +| Bold | `**text**` or `__text__` | `**Bold**` | **Bold** | +| Italic | `*text*` or `_text_` | `*Italic*` | *Italic* | +| Bold + Italic | `***text***` | `***Both***` | ***Both*** | +| Strikethrough | `~~text~~` | `~~Striked~~` | ~~Striked~~ | +| Highlight | `==text==` | `==Highlighted==` | ==Highlighted== | +| Inline code | `` `code` `` | `` `code` `` | `code` | + +### Escaping Formatting + +Use backslash to escape special characters: +```markdown +\*This won't be italic\* +\#This won't be a heading +1\. This won't be a list item +``` + +Common characters to escape: `\*`, `\_`, `\#`, `` \` ``, `\|`, `\~` + +## Internal Links (Wikilinks) + +### Basic Links + +```markdown +[[Note Name]] +[[Note Name.md]] +[[Note Name|Display Text]] +``` + +### Link to Headings + +```markdown +[[Note Name#Heading]] +[[Note Name#Heading|Custom Text]] +[[#Heading in same note]] +[[##Search all headings in vault]] +``` + +### Link to Blocks + +```markdown +[[Note Name#^block-id]] +[[Note Name#^block-id|Custom Text]] +``` + +Define a block ID by adding `^block-id` at the end of a paragraph: +```markdown +This is a paragraph that can be linked to. ^my-block-id +``` + +For lists and quotes, add the block ID on a separate line: +```markdown +> This is a quote +> With multiple lines + +^quote-id +``` + +### Search Links + +```markdown +[[##heading]] Search for headings containing "heading" +[[^^block]] Search for blocks containing "block" +``` + +## Markdown-Style Links + +```markdown +[Display Text](Note%20Name.md) +[Display Text](Note%20Name.md#Heading) +[Display Text](https://example.com) +[Note](obsidian://open?vault=VaultName&file=Note.md) +``` + +Note: Spaces must be URL-encoded as `%20` in Markdown links. + +## Embeds + +### Embed Notes + +```markdown +![[Note Name]] +![[Note Name#Heading]] +![[Note Name#^block-id]] +``` + +### Embed Images + +```markdown +![[image.png]] +![[image.png|640x480]] Width x Height +![[image.png|300]] Width only (maintains aspect ratio) +``` + +### External Images + +```markdown +![Alt text](https://example.com/image.png) +![Alt text|300](https://example.com/image.png) +``` + +### Embed Audio + +```markdown +![[audio.mp3]] +![[audio.ogg]] +``` + +### Embed PDF + +```markdown +![[document.pdf]] +![[document.pdf#page=3]] +![[document.pdf#height=400]] +``` + +### Embed Lists + +```markdown +![[Note#^list-id]] +``` + +Where the list has been defined with a block ID: +```markdown +- Item 1 +- Item 2 +- Item 3 + +^list-id +``` + +### Embed Search Results + +````markdown +```query +tag:#project status:done +``` +```` + +## Callouts + +### Basic Callout + +```markdown +> [!note] +> This is a note callout. + +> [!info] Custom Title +> This callout has a custom title. + +> [!tip] Title Only +``` + +### Foldable Callouts + +```markdown +> [!faq]- Collapsed by default +> This content is hidden until expanded. + +> [!faq]+ Expanded by default +> This content is visible but can be collapsed. +``` + +### Nested Callouts + +```markdown +> [!question] Outer callout +> > [!note] Inner callout +> > Nested content +``` + +### Supported Callout Types + +| Type | Aliases | Description | +|------|---------|-------------| +| `note` | - | Blue, pencil icon | +| `abstract` | `summary`, `tldr` | Teal, clipboard icon | +| `info` | - | Blue, info icon | +| `todo` | - | Blue, checkbox icon | +| `tip` | `hint`, `important` | Cyan, flame icon | +| `success` | `check`, `done` | Green, checkmark icon | +| `question` | `help`, `faq` | Yellow, question mark | +| `warning` | `caution`, `attention` | Orange, warning icon | +| `failure` | `fail`, `missing` | Red, X icon | +| `danger` | `error` | Red, zap icon | +| `bug` | - | Red, bug icon | +| `example` | - | Purple, list icon | +| `quote` | `cite` | Gray, quote icon | + +### Custom Callouts (CSS) + +```css +.callout[data-callout="custom-type"] { + --callout-color: 255, 0, 0; + --callout-icon: lucide-alert-circle; +} +``` + +## Lists + +### Unordered Lists + +```markdown +- Item 1 +- Item 2 + - Nested item + - Another nested +- Item 3 + +* Also works with asterisks ++ Or plus signs +``` + +### Ordered Lists + +```markdown +1. First item +2. Second item + 1. Nested numbered + 2. Another nested +3. Third item + +1) Alternative syntax +2) With parentheses +``` + +### Task Lists + +```markdown +- [ ] Incomplete task +- [x] Completed task +- [ ] Task with sub-tasks + - [ ] Subtask 1 + - [x] Subtask 2 +``` + +## Quotes + +```markdown +> This is a blockquote. +> It can span multiple lines. +> +> And include multiple paragraphs. +> +> > Nested quotes work too. +``` + +## Code + +### Inline Code + +```markdown +Use `backticks` for inline code. +Use double backticks for ``code with a ` backtick inside``. +``` + +### Code Blocks + +````markdown +``` +Plain code block +``` + +```javascript +// Syntax highlighted code block +function hello() { + console.log("Hello, world!"); +} +``` + +```python +# Python example +def greet(name): + print(f"Hello, {name}!") +``` +```` + +### Nesting Code Blocks + +Use more backticks or tildes for the outer block: + +`````markdown +````markdown +Here's how to create a code block: +```js +console.log("Hello") +``` +```` +````` + +## Tables + +```markdown +| Header 1 | Header 2 | Header 3 | +|----------|----------|----------| +| Cell 1 | Cell 2 | Cell 3 | +| Cell 4 | Cell 5 | Cell 6 | +``` + +### Alignment + +```markdown +| Left | Center | Right | +|:---------|:--------:|---------:| +| Left | Center | Right | +``` + +### Using Pipes in Tables + +Escape pipes with backslash: +```markdown +| Column 1 | Column 2 | +|----------|----------| +| [[Link\|Display]] | ![[Image\|100]] | +``` + +## Math (LaTeX) + +### Inline Math + +```markdown +This is inline math: $e^{i\pi} + 1 = 0$ +``` + +### Block Math + +```markdown +$$ +\begin{vmatrix} +a & b \\ +c & d +\end{vmatrix} = ad - bc +$$ +``` + +### Common Math Syntax + +```markdown +$x^2$ Superscript +$x_i$ Subscript +$\frac{a}{b}$ Fraction +$\sqrt{x}$ Square root +$\sum_{i=1}^{n}$ Summation +$\int_a^b$ Integral +$\alpha, \beta$ Greek letters +``` + +## Diagrams (Mermaid) + +````markdown +```mermaid +graph TD + A[Start] --> B{Decision} + B -->|Yes| C[Do this] + B -->|No| D[Do that] + C --> E[End] + D --> E +``` +```` + +### Sequence Diagrams + +````markdown +```mermaid +sequenceDiagram + Alice->>Bob: Hello Bob + Bob-->>Alice: Hi Alice +``` +```` + +### Linking in Diagrams + +````markdown +```mermaid +graph TD + A[Biology] + B[Chemistry] + A --> B + class A,B internal-link; +``` +```` + +## Footnotes + +```markdown +This sentence has a footnote[^1]. + +[^1]: This is the footnote content. + +You can also use named footnotes[^note]. + +[^note]: Named footnotes still appear as numbers. + +Inline footnotes are also supported.^[This is an inline footnote.] +``` + +## Comments + +```markdown +This is visible %%but this is hidden%% text. + +%% +This entire block is hidden. +It won't appear in reading view. +%% +``` + +## Horizontal Rules + +```markdown +--- +*** +___ +- - - +* * * +``` + +## Properties (Frontmatter) + +Properties use YAML frontmatter at the start of a note: + +```yaml +--- +title: My Note Title +date: 2024-01-15 +tags: + - project + - important +aliases: + - My Note + - Alternative Name +cssclasses: + - custom-class +status: in-progress +rating: 4.5 +completed: false +due: 2024-02-01T14:30:00 +--- +``` + +### Property Types + +| Type | Example | +|------|---------| +| Text | `title: My Title` | +| Number | `rating: 4.5` | +| Checkbox | `completed: true` | +| Date | `date: 2024-01-15` | +| Date & Time | `due: 2024-01-15T14:30:00` | +| List | `tags: [one, two]` or YAML list | +| Links | `related: "[[Other Note]]"` | + +### Default Properties + +- `tags` - Note tags +- `aliases` - Alternative names for the note +- `cssclasses` - CSS classes applied to the note + +## Tags + +```markdown +#tag +#nested/tag +#tag-with-dashes +#tag_with_underscores + +In frontmatter: +--- +tags: + - tag1 + - nested/tag2 +--- +``` + +Tags can contain: +- Letters (any language) +- Numbers (not as first character) +- Underscores `_` +- Hyphens `-` +- Forward slashes `/` (for nesting) + +## HTML Content + +Obsidian supports HTML within Markdown: + +```markdown +
+ Colored text +
+ +
+ Click to expand + Hidden content here. +
+ +Ctrl + C +``` + +## Complete Example + +````markdown +--- +title: Project Alpha +date: 2024-01-15 +tags: + - project + - active +status: in-progress +priority: high +--- + +# Project Alpha + +## Overview + +This project aims to [[improve workflow]] using modern techniques. + +> [!important] Key Deadline +> The first milestone is due on ==January 30th==. + +## Tasks + +- [x] Initial planning +- [x] Resource allocation +- [ ] Development phase + - [ ] Backend implementation + - [ ] Frontend design +- [ ] Testing +- [ ] Deployment + +## Technical Notes + +The main algorithm uses the formula $O(n \log n)$ for sorting. + +```python +def process_data(items): + return sorted(items, key=lambda x: x.priority) +``` + +## Architecture + +```mermaid +graph LR + A[Input] --> B[Process] + B --> C[Output] + B --> D[Cache] +``` + +## Related Documents + +- ![[Meeting Notes 2024-01-10#Decisions]] +- [[Budget Allocation|Budget]] +- [[Team Members]] + +## References + +For more details, see the official documentation[^1]. + +[^1]: https://example.com/docs + +%% +Internal notes: +- Review with team on Friday +- Consider alternative approaches +%% +```` + +## References + +- [Basic formatting syntax](https://help.obsidian.md/syntax) +- [Advanced formatting syntax](https://help.obsidian.md/advanced-syntax) +- [Obsidian Flavored Markdown](https://help.obsidian.md/obsidian-flavored-markdown) +- [Internal links](https://help.obsidian.md/links) +- [Embed files](https://help.obsidian.md/embeds) +- [Callouts](https://help.obsidian.md/callouts) +- [Properties](https://help.obsidian.md/properties) diff --git a/卡片盒skill.md b/卡片盒skill.md new file mode 100644 index 0000000..e69de29 diff --git a/查询数据skill.md b/查询数据skill.md new file mode 100644 index 0000000..e69de29