一键导入
cache-notes
Fetch & embed AI transcripts as Obsidian callouts. Args: <path>, all, refresh <path>. Prompts for URLs if empty.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Fetch & embed AI transcripts as Obsidian callouts. Args: <path>, all, refresh <path>. Prompts for URLs if empty.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | cache-notes |
| description | Fetch & embed AI transcripts as Obsidian callouts. Args: <path>, all, refresh <path>. Prompts for URLs if empty. |
| license | MIT |
| compatibility | Requires Obsidian CLI (property:read/set, outline, base:query) with Obsidian running, gws CLI for Google Docs/Drive (read-only), and Meetings.base (CachePending view). QMD optional fallback. See [google-workspace-cli](../_shared/google-workspace-cli.md). |
/cache-notes all — Scan all meetings with Notes: links that haven't been cached yet, fetch and embed them./cache-notes <path> — Cache notes for a specific meeting file./cache-notes refresh <path> — Re-fetch and overwrite existing cached content for a file.If the target file has an empty Notes: property (no URLs yet), run /mail-transcripts first when doing a full wrap (see meeting Mode C) — it may populate Notes: from the Gemini inbox mail. If still empty, prompt the user to paste the external resource URLs (Google Docs, Otter.ai, etc.). Add them to the Notes: frontmatter, then proceed with fetching and caching as normal.
Supported external transcript providers are Google Docs (Gemini notes) and Otter.ai. When a URL from either provider appears in frontmatter Notes:, the agent fetches the transcript using that provider's instructions and embeds it as collapsible Obsidian callouts in the meeting note. A NotesCached: frontmatter timestamp marks the file as cached.
Before caching:
Notes:
- https://docs.google.com/document/d/{id}/edit?tab=t.{tab}
- https://otter.ai/u/{id}
After caching:
Notes:
- https://docs.google.com/document/d/{id}/edit?tab=t.{tab}
- https://otter.ai/u/{id}
NotesCached: 2026-02-25T15:00:00+00:00
Notes:.gws in the terminal to fetch the document (read-only). See google-workspace-cli for exact commands.gws docs documents get with includeTabsContent: true and parse the JSON into text (optionally inserting --- TAB: … --- separators from tab titles), or gws drive files export with mimeType: text/plain for a simpler single stream. Parsed content should mirror the old tab layout where needed: --- TAB: Notes ---, --- TAB: Transcript ---.Gemini notes have a consistent structure. Parse into three sections:
| Section | Starts after | Ends before | Callout |
|---|---|---|---|
| Summary + Details | Summary heading | Suggested next steps heading | [!gemini_notes] |
| Suggested next steps | Suggested next steps heading | Gemini disclaimer footer | [!gemini_todos] |
| Transcript | --- TAB: Transcript --- | End of content | [!gemini_transcript] |
Strip the Gemini disclaimer footer — lines starting with "You should review Gemini's" or "Please provide feedback" are noise. Do not include them.
All cached content goes under a top-level ## 🤖 AI Notes section appended after frontmatter. Each provider gets its own ### {Provider} subsection. Callouts are nested under the provider heading.
## 🤖 AI Notes
### Gemini
> [!gemini_notes]- Summary & Details
> ### Summary
> {summary text}
>
> ### Details
> {details as bullet points}
> [!gemini_todos]- Suggested Next Steps
> - {next step 1}
> - {next step 2}
> [!gemini_transcript]- Transcript
> {transcript content, if available}
### Otter
> [!otter_notes]- Summary & Details
> ...
Formatting rules for callout content:
> .- after the callout type (e.g. [!gemini_notes]-) — this makes it collapsed by default in Obsidian.> prefix) to separate them.[!gemini_transcript] callout entirely.## 🤖 AI Notes heading is created once. Provider subsections are added beneath it.--- and ## 🤖 AI Notes, preserve it. Always append ## 🤖 AI Notes at the end of the file.Otter.ai is a supported external transcript provider (same as Google Docs). Whenever an Otter.ai URL is present in Notes:, follow this provider's instructions to fetch the transcript and embed it. The cached output uses the same structure as other providers: a subsection under ## 🤖 AI Notes with collapsible callouts. Expected callout types:
[!otter_notes]- — Summary and details[!otter_todos]- — Suggested next steps / key topics[!otter_transcript]- — Full transcript (if available)Implementation: Use the otter-fetch skill — ask the user to paste the JSON from GET .../speech?otid=..., then run parse_otter.js (or parse inline) to produce the callouts above and append them.
/cache-notes <path>)Notes: and NotesCached: via obsidian property:read (see frontmatter-mutations). To check whether the body already has an ## 🤖 AI Notes section without reading the whole file, run obsidian outline path="<file>" format=json and look for that heading — much cheaper than a full Read on large transcript files.Notes: is empty or absent, prompt the user to paste the external resource URL(s). Set them via obsidian property:set name=Notes value='["<url1>","<url2>"]' type=list path="<file>", then continue.NotesCached: exists and this is not a refresh, inform the user and stop.Notes:, fetch and parse by provider:
gws (see google-workspace-cli), parse into sections per Provider: Gemini.GET .../speech?otid=...; run otter-fetch/parse_otter.js or parse inline), then append the resulting callout block.## 🤖 AI Notes after frontmatter --- (see Output Format).NotesCached: timestamp: obsidian property:set name=NotesCached value="$(date +%FT%T%z)" type=datetime path="<file>". See frontmatter-mutations./cache-notes all)obsidian base:query path=Meetings.base view=CachePending format=paths. Returns only files with Notes populated but no NotesCached: — exactly the work queue. (The /note-status pending --step=cache delegation in Detecting Uncached Files is the fallback when Meetings.base is unavailable.)Before caching, verify that each external resource actually corresponds to the meeting note. This prevents accidentally caching the wrong document when a user pastes an incorrect URL.
created: frontmatter timestampgws drive files get (name field), e.g. "Daily Standup - 2026/02/24 09:43 EST - Notes by Gemini" — same string you would have seen in older MCP File: lines.YYYY-MM-DD and check equality.
⚠️ Date mismatch for Meetings/Engineering/Scrum/2026-02-24.md:
Note date: 2026-02-24
Doc title: "Daily Standup - 2026/02/26 09:41 EST - Notes by Gemini"
Doc date: 2026-02-26
Wrong document? [Continue anyway / Skip this URL / Replace URL]
/cache-notes all or /meeting wrap pending), collect all mismatches and present them together before proceeding, rather than interrupting one by one.See date-filter § "Date Parsing" for the full list of recognized formats and ambiguity rules.
Verification is skipped for:
refresh mode (the URL was already verified on first cache)Delegate to /note-status pending --step=cache. That skill handles discovery, frontmatter checks, and the dependency chain (only notes with Notes: containing a supported provider URL are considered actionable for caching). See /note-status § Dependency Chain for the full rules.
/cache-notes refresh <path>:
## 🤖 AI Notes section and everything below it.NotesCached: timestamp.See /commit. Skip when called as part of a sequence (e.g. /meeting wrap).
obsidian property:set for frontmatter writes (Notes:, NotesCached:) — see frontmatter-mutations; never hand-roll StrReplace against frontmatter anchors. Body content (the callout blocks) is still appended/replaced with Edit/Write.Notes: URLs should NOT be modified — they remain as the canonical source links.NotesCached: is the single indicator that caching was done. No other markers.all mode, process in batches and report progress to the user./fill-participants handles name resolution separately.Stage and commit with flexible intent parsing. Accepts file/folder scope, free-text description, amend, or any combination.
Resolve and fill Participants frontmatter + link unlinked names in body. Args: <path>, all.
Extract action items as plain markdown bullets (with confirmation). Args: <path>. No args = run [/note-status pending --step=todos](../note-status/SKILL.md#pending-mode).
Show when you last had a 1:1 with each direct report / peer, sorted by recency. Flags people who haven't had one in N weeks. Powered by the OneOnOnes view on Meetings.base.
Gmail AI transcript notifications → meeting Notes: URLs + mark read. Args: (none). Invoked standalone or as step 1 of /meeting wrap.
Create or wrap meeting notes. Args: {title} [folder=X], wrap <path>, wrap pending [today|this week|dates]. No args = pick from Google Calendar.