一键导入
obsidian-bases
创建和编辑 Obsidian Bases(.base 文件),支持视图、过滤器、公式和汇总。当处理 .base 文件、创建类似数据库的笔记视图,或用户提到 Obsidian 中的 Bases、表格视图、卡片视图、过滤器或公式时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
创建和编辑 Obsidian Bases(.base 文件),支持视图、过滤器、公式和汇总。当处理 .base 文件、创建类似数据库的笔记视图,或用户提到 Obsidian 中的 Bases、表格视图、卡片视图、过滤器或公式时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
在当前会话里按已写好的实现计划顺序执行任务时使用
在已有规格或多步骤任务需求、且在动代码之前使用。若上游 ddev-pc-test 已产出测试用例,自动走 TDD 流程:先实现测试 demo 代码(红灯),再实现被测代码(绿灯),测试覆盖不到的部分直接开发。
文档审查技能。将文档审查任务派发给独立子代理,重点审查文档基于代码改动的合理性、说明正确性、前后一致性、错漏和逻辑谬误,以及 AI 实现过程中产生的决策记录(implementation-notes.md)。当用户需要审查技术文档、spec文档、设计文档、计划文档、API文档、README 或任何与代码改动相关的文档时使用。
代码修改场景下,spec 文档确认后,需要继续以图优先方式梳理结构体定义、数据流和流程时使用
在代码修改前需要编写 spec 文档且应优先用图表达边界、入口、流程和改动关系时使用(仅限代码改动场景,非项目级架构文档初始化)
在代码实现完成后、准备结束任务或进入发布前使用,用来核对代码实现是否与 spec 文档以及 detail 文档一致,并通过代码质量审查、清理、编码规范和注释审查后给出最终验收结论
| name | obsidian-bases |
| description | 创建和编辑 Obsidian Bases(.base 文件),支持视图、过滤器、公式和汇总。当处理 .base 文件、创建类似数据库的笔记视图,或用户提到 Obsidian 中的 Bases、表格视图、卡片视图、过滤器或公式时使用。 |
.base 文件,包含合法的 YAML 内容filters 来筛选显示哪些笔记(按标签、文件夹、属性或日期)formulas 部分定义计算属性table、cards、list 或 map),通过 order 指定要显示的属性order 或 properties 中引用 formula.X 但未在 formulas 中定义 X.base 文件确认视图正确渲染。如果显示 YAML 错误,检查下方的引号规则Base 文件使用 .base 扩展名,包含合法的 YAML。
# 全局过滤器应用于 Base 中的所有视图
filters:
# 可以是单个过滤器字符串
# 或者是递归过滤器对象,仅包含一个键:and、or 或 not
and:
- 'status == "active"'
- not:
- 'file.hasTag("archived")'
# 定义可在所有视图中使用的公式属性
formulas:
formula_name: 'expression'
# 配置属性的显示名称和设置
properties:
property_name:
displayName: "显示名称"
formula.formula_name:
displayName: "公式显示名称"
file.ext:
displayName: "扩展名"
# 定义自定义汇总公式
summaries:
custom_summary_name: 'values.mean().round(3)'
# 定义一个或多个视图
views:
- type: table | cards | list | map
name: "视图名称"
limit: 10 # 可选:限制结果数量
groupBy: # 可选:分组结果
property: property_name
direction: ASC | DESC
filters: # 视图级过滤器,遵循相同规则
and:
- 'status == "active"'
order: # 要显示的属性,按顺序排列
- file.name
- property_name
- formula.formula_name
summaries: # 将属性映射到汇总公式
property_name: Average
过滤器用于缩小结果范围,可以全局应用或按视图应用。
# 单个过滤器
filters: 'status == "done"'
# AND - 所有条件必须为 true
filters:
and:
- 'status == "done"'
- 'priority > 3'
# OR - 任一条件为 true
filters:
or:
- 'file.hasTag("book")'
- 'file.hasTag("article")'
# NOT - 排除匹配项
filters:
not:
- 'file.hasTag("archived")'
# 嵌套过滤器
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
| 运算符 | 描述 |
|---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非 |
note.author 或直接 authorfile.name、file.mtime 等formula.my_formula| 属性 | 类型 | 描述 |
|---|---|---|
file.name | String | 文件名 |
file.basename | String | 不含扩展名的文件名 |
file.path | String | 文件完整路径 |
file.folder | String | 父文件夹路径 |
file.ext | String | 文件扩展名 |
file.size | Number | 文件大小(字节) |
file.ctime | Date | 创建时间 |
file.mtime | Date | 修改时间 |
file.tags | List | 文件中的所有标签 |
file.links | List | 文件中的内部链接 |
file.backlinks | List | 链接到本文件的文件 |
file.embeds | List | 笔记中的嵌入内容 |
file.properties | Object | 所有 frontmatter 属性 |
this 关键字公式从属性计算值,在 formulas 部分定义。
formulas:
# 简单算术
total: "price * quantity"
# 条件逻辑
status_icon: 'if(done, "✅", "⏳")'
# 字符串格式化
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
# 日期格式化
created: 'file.ctime.format("YYYY-MM-DD")'
# 计算自创建以来的天数(使用 .days 获取 Duration)
days_old: '(now() - file.ctime).days'
# 计算距离截止日期的天数
days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'
最常用的函数。所有类型(Date、String、Number、List、File、Link、Object、RegExp)的完整参考见 FUNCTIONS_REFERENCE.md。
| 函数 | 签名 | 描述 |
|---|---|---|
date() | date(string): date | 将字符串解析为日期(YYYY-MM-DD HH:mm:ss) |
now() | now(): date | 当前日期和时间 |
today() | today(): date | 当前日期(时间 = 00:00:00) |
if() | if(condition, trueResult, falseResult?) | 条件判断 |
duration() | duration(string): duration | 解析时长字符串 |
file() | file(path): file | 获取文件对象 |
link() | link(path, display?): Link | 创建链接 |
两个日期相减时,结果是 Duration 类型(不是 number)。
Duration 字段: duration.days、duration.hours、duration.minutes、duration.seconds、duration.milliseconds
重要: Duration 不直接支持 .round()、.floor()、.ceil()。需要先访问数值字段(如 .days),然后再应用数值函数。
# 正确:计算两个日期之间的天数
"(date(due_date) - today()).days" # 返回天数
"(now() - file.ctime).days" # 自创建以来的天数
"(date(due_date) - today()).days.round(0)" # 四舍五入天数
# 错误 - 会导致报错:
# "((date(due) - today()) / 86400000).round(0)" # Duration 不支持除法后再 round
# 时长单位:y/year/years、M/month/months、d/day/days、
# w/week/weeks、h/hour/hours、m/minute/minutes、s/second/seconds
"now() + \"1 day\"" # 明天
"today() + \"7d\"" # 一周后
"now() - file.ctime" # 返回 Duration
"(now() - file.ctime).days" # 以天数形式获取
views:
- type: table
name: "我的表格"
order:
- file.name
- status
- due_date
summaries:
price: Sum
count: Average
views:
- type: cards
name: "图库"
order:
- file.name
- cover_image
- description
views:
- type: list
name: "简单列表"
order:
- file.name
- status
需要纬度/经度属性和 Maps 社区插件。
views:
- type: map
name: "位置"
# 经纬度属性的地图特定设置
| 名称 | 输入类型 | 描述 |
|---|---|---|
Average | Number | 算术平均值 |
Min | Number | 最小值 |
Max | Number | 最大值 |
Sum | Number | 所有数值之和 |
Range | Number | 最大值 - 最小值 |
Median | Number | 中位数 |
Stddev | Number | 标准差 |
Earliest | Date | 最早日期 |
Latest | Date | 最晚日期 |
Range | Date | 最晚 - 最早 |
Checked | Boolean | true 值的数量 |
Unchecked | Boolean | false 值的数量 |
Empty | Any | 空值的数量 |
Filled | Any | 非空值的数量 |
Unique | Any | 唯一值的数量 |
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, "🔴 高", if(priority == 2, "🟡 中", "🟢 低"))'
properties:
status:
displayName: 状态
formula.days_until_due:
displayName: "距离截止天数"
formula.priority_label:
displayName: 优先级
views:
- type: table
name: "活跃任务"
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: "已完成"
filters:
and:
- 'status == "done"'
order:
- file.name
- completed_date
filters:
or:
- file.hasTag("book")
- file.hasTag("article")
formulas:
reading_time: 'if(pages, (pages * 2).toString() + " 分钟", "")'
status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'
year_read: 'if(finished_date, date(finished_date).year, "")'
properties:
author:
displayName: 作者
formula.status_icon:
displayName: ""
formula.reading_time:
displayName: "预计时间"
views:
- type: cards
name: "图书馆"
order:
- cover
- file.name
- author
- formula.status_icon
filters:
not:
- 'status == "dropped"'
- type: table
name: "阅读清单"
filters:
and:
- 'status == "to-read"'
order:
- file.name
- author
- pages
- formula.reading_time
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: "星期"
formula.word_estimate:
displayName: "~字数"
views:
- type: table
name: "最近笔记"
limit: 30
order:
- file.name
- formula.day_of_week
- formula.word_estimate
- file.mtime
在 Markdown 文件中嵌入:
![[MyBase.base]]
<!-- 指定视图 -->
![[MyBase.base#View Name]]
'if(done, "Yes", "No")'"My View Name"未加引号的特特殊字符:包含 :、{、}、[、]、,、&、*、#、?、|、-、<、>、=、!、%、@、` 的字符串必须加引号。
# 错误 - 未加引号的字符串中含有冒号
displayName: Status: Active
# 正确
displayName: "Status: Active"
公式中引号不匹配:当公式包含双引号时,用单引号包裹整个公式。
# 错误 - 双引号内嵌套双引号
formulas:
label: "if(done, "Yes", "No")"
# 正确 - 单引号包裹双引号
formulas:
label: 'if(done, "Yes", "No")'
Duration 运算未访问字段:日期相减返回 Duration,不是 number。始终要访问 .days、.hours 等。
# 错误 - Duration 不是 number
"(now() - file.ctime).round(0)"
# 正确 - 先访问 .days,再 round
"(now() - file.ctime).days.round(0)"
缺少空值检查:属性可能并非在所有笔记中都存在。使用 if() 做守卫。
# 错误 - 如果 due_date 为空会崩溃
"(date(due_date) - today()).days"
# 正确 - 用 if() 守卫
'if(due_date, (date(due_date) - today()).days, "")'
引用未定义的公式:确保 order 或 properties 中每个 formula.X 在 formulas 中都有对应定义。
# 如果 'total' 未在 formulas 中定义,会静默失败
order:
- formula.total
# 修复:定义它
formulas:
total: "price * quantity"