dataview

GitHub

通过 Dataview JS API 查询和分析笔记数据,支持 DQL 查询、表格生成及编程式聚合统计。

src/skills/integrations/dataview/SKILL.md s2b-dev/smart-second-brain

Trigger Scenarios

需要查询笔记元数据或 frontmatter 请求生成基于标签/文件夹的数据表 执行复杂的数据聚合或统计分析

Install

npx skills add s2b-dev/smart-second-brain --skill dataview -g -y
More Options

Non-standard path

npx skills add https://github.com/s2b-dev/smart-second-brain/tree/main/src/skills/integrations/dataview -g -y

Use without installing

npx skills use s2b-dev/smart-second-brain@dataview

指定 Agent (Claude Code)

npx skills add s2b-dev/smart-second-brain --skill dataview -a claude-code -g -y

安装 repo 全部 skill

npx skills add s2b-dev/smart-second-brain --all -g -y

预览 repo 内 skill

npx skills add s2b-dev/smart-second-brain --list

SKILL.md

Frontmatter
{
    "name": "dataview",
    "license": "MIT",
    "metadata": {
        "author": "S2B",
        "version": "1.1",
        "linkedPlugin": "dataview"
    },
    "description": "Script the Dataview plugin via its public JavaScript API to query and analyze notes — tables, lists, aggregation, and DQL run through the API. Use when the user needs data from vault metadata\/frontmatter and you have an exec_dataview tool. Requires Dataview plugin.",
    "compatibility": "Requires Dataview plugin to be installed and enabled in Obsidian"
}

Dataview Integration

You script Dataview through its public JavaScript api object. When the Dataview integration is enabled you have an exec_dataview tool (check your available tools) that runs JavaScript against that api on the main thread — the same API dataviewjs blocks use.

Two ways to get results:

  • Run DQL through the API — pass a DQL string to api.tryQueryMarkdown(query) for the classic LIST / TABLE output as Markdown. Best for straightforward tables and lists.
  • Programmatic queries — call api.pages(...) and friends directly for aggregation, custom filtering, or statistics DQL can't express.

To show the user a live, auto-updating view (rather than compute over results), write a

below. That renders natively and does not need the `exec_dataview` tool.

## Default Result Size

Always include `LIMIT 10` in Dataview DQL (queries you show or run) unless the user asks for more or specifies a different limit.
If you need pagination or offsets, slice the pages array (e.g., `api.pages(...).slice(offset, offset + limit)`).

## Dataview DQL Cheat Sheet

DQL is the query language you pass to `api.tryQueryMarkdown(...)` (and the language of ```dataview fences):

- Query types: `LIST` or `TABLE field1, field2`
- FROM sources: `#tag`, `"Folder"`, `"path/to/file"`
- Exclusions: `AND !#tag`, `AND !"Folder"`
- Note: Tag/folder exclusions belong in `FROM`, not `WHERE`. For `WHERE`, use expressions like `!contains(file.tags, "#Template")`.
- Combine: `A AND B`, `A OR B`
- WHERE: `WHERE prop` (exists), `WHERE prop = "value"`, `WHERE numProp > 3`
- SORT: `SORT field asc|desc`
- GROUP BY: `GROUP BY prop` then use `rows` (e.g., `rows.file.name`)
- FLATTEN: `FLATTEN multiProp`
- LIMIT: `LIMIT 10` (default) or user-specified
- Display helper: `choice(boolProp, "Yes", "No") as "Label"`

## Minimal Example

```dataview
TABLE Title, Author
FROM #library AND !"Templates"
WHERE Rating > 3
SORT file.mtime desc
LIMIT 10

Data Analysis

If you need to SEE the results to answer a question or perform analysis, run the query with the exec_dataview tool: return await api.tryQueryMarkdown('LIST FROM "Projects" LIMIT 10') for DQL, or use api.pages(...) for programmatic aggregation.

Scripting the Dataview API (advanced)

Because this skill is enabled and the Dataview plugin exposes a public API, you likely also have an exec_dataview tool (check your available tools) that runs JavaScript against Dataview's api object (the same API dataviewjs blocks use) on the main thread. Use it for anything DQL can't express — aggregation, custom filtering, computing statistics across pages.

What's in scope

  • api — the Dataview API object (app.plugins.plugins["dataview"].api).
  • app — the Obsidian App instance.
  • input — optional JSON you pass to the tool.
  • return the final value you want back (objects/arrays are stringified for you).

Introspect first

Prefer the documented helpers below (api.pages(...), api.page(...)), but when you reach past them, confirm a member exists before you rely on it — the API surface varies across plugin versions.

// What top-level members does the API expose?
return Object.keys(api);

Once you know the shape, call the real methods. If a call throws, the error is returned to you as a string — read it, adjust, and retry with a corrected call.

// Count pages per status under a folder
const pages = api.pages('"Projects"');
const byStatus = {};
for (const p of pages) byStatus[p.status ?? "none"] = (byStatus[p.status ?? "none"] ?? 0) + 1;
return byStatus;

Rules & constraints

  • Use api.tryQueryMarkdown(dql) for simple tables/lists; reach for api.pages(...) and raw JavaScript only when you need programmatic logic DQL can't express.
  • Read-only by default. Only perform mutations when the user explicitly asked to change data.
  • Not sandboxed. This runs on the main thread with full app access — a call can do anything the plugin can. Keep snippets small and focused.
  • Awaited work times out. Long-running or hanging promises are cut off; a runaway synchronous loop cannot be preempted, so avoid unbounded loops.
  • Prefer read_content / manage_notes / search_notes for plain note reads and writes. Those tools respect the user's privacy rules — they skip or redact notes marked private for the current provider. api and app do not. Reach for exec_dataview only for query/aggregation logic Dataview's API uniquely provides.
  • Report honestly. If the API can't do what the user asked, say so rather than fabricating a method.

Displaying Lists/Tables

If you want to SHOW the user a list or table (e.g. 'List all my books'), simply output the Dataview DQL query in a markdown code block. The chat interface will render the result automatically.

  • Do NOT repeat the rendered results in plain text.
  • Do NOT tell the user to run the query in a note; it has already been run and rendered here.
  • When generating a view, introduce it as "Here is the list:" or "I have generated the view below:".

Version History

  • 2.0.5 Current 2026-09-08 21:10

Same Skill Collection

.claude/skills/dispatch/SKILL.md
.github/skills/obsidian-integration-test/SKILL.md
integration/S2B Test Vault/.obsidian/skills/bases/SKILL.md
integration/S2B Test Vault/.obsidian/skills/canvas/SKILL.md
integration/S2B Test Vault/.obsidian/skills/dataview/SKILL.md
integration/S2B Test Vault/.obsidian/skills/notebook-navigator/SKILL.md
integration/S2B Test Vault/.obsidian/skills/obsidian-charts/SKILL.md
integration/S2B Test Vault/.obsidian/skills/tasknotes/SKILL.md
integration/S2B Test Vault/.obsidian/skills/tasks/SKILL.md
integration/S2B Test Vault/Agents/Skills/bases/SKILL.md
integration/S2B Test Vault/Agents/Skills/canvas/SKILL.md
integration/S2B Test Vault/Agents/Skills/dataview/SKILL.md
integration/S2B Test Vault/Agents/Skills/explore-vault/SKILL.md
integration/S2B Test Vault/Agents/Skills/manage-notes/SKILL.md
integration/S2B Test Vault/Agents/Skills/manage-skills/SKILL.md
integration/S2B Test Vault/Agents/Skills/notebook-navigator/SKILL.md
integration/S2B Test Vault/Agents/Skills/obsidian-charts/SKILL.md
integration/S2B Test Vault/Agents/Skills/tasknotes/SKILL.md
integration/S2B Test Vault/Agents/Skills/tasks/SKILL.md
integration/S2B Test Vault/Agents/Skills/web/SKILL.md
src/skills/defaults/explore-vault/SKILL.md
src/skills/defaults/manage-notes/SKILL.md
src/skills/defaults/manage-skills/SKILL.md
src/skills/defaults/web/SKILL.md
src/skills/integrations/bases/SKILL.md
src/skills/integrations/canvas/SKILL.md
src/skills/integrations/obsidian-charts/SKILL.md
src/skills/integrations/tasknotes/SKILL.md
src/skills/integrations/tasks/SKILL.md

Metadata

Files
0
Version
2.0.5
Hash
147640f1
Indexed
2026-09-08 21:10

trang chủ - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-09-10 04:47
浙ICP备14020137号-1 $bản đồ khách truy cập$