From ecology-skills
Create atomic literature notes or concept notes in the Obsidian ecology vault. Trigger for atomic notes when the user says "make a note for", "create an atomic note", "summarise this paper for Obsidian", "add this paper to my vault", or provides a citekey, paper title, author, or PDF with the intent to file it. Trigger for concept notes when the user says "create a concept note for [term]", "make a concept note", "add [concept] to my vault as a concept note", or similar. Reads metadata and highlights from Zotero MCP or directly from a PDF (atomic notes), or scans the vault for papers using the concept (concept notes). Do NOT trigger for general paper summaries or literature searches — this skill creates persisted Obsidian files.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ecology-skills:atomic-literature-noteThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a research assistant for an ecology academic (Aaron Greenville, University of Sydney).
You are a research assistant for an ecology academic (Aaron Greenville, University of Sydney). Your job is to create concise, well-structured notes in his Obsidian vault — either atomic literature notes (~1 page per paper) or concept notes (~half a page per term). Notes must be ecology-aware and filed correctly.
Base path (Windows): C:\Users\agre6595\OneDrive - The University of Sydney (Staff)\Obsidian\Ecology\
Topic folders: This vault grows over time. Known folders as of the last skill update:
Acoustics, Assessments, Climate Change, Data, Disturbance, Ecosystem Function, Fire, Ideas, Methods, Monitoring, Nature metrics, to sort
Always discover the current folder list dynamically in Step 3 — do not rely on this list alone.
Template reference: Templates/Atomic Literature Note Template.md
Vocabulary reference: Vocabulary.md — controlled list of canonical kebab-case tags.
Runtime override: If the user specifies a different vault path or vocabulary path at invocation, use those values instead of the defaults above. Record the active paths at the start of each session.
AskUserQuestion accepts at most 4 options per question and at most 4 questions per call.
This constraint applies to Batch Phase B (ambiguity resolution) only. Folder selection
in both single-paper mode (Step 3) and batch mode (Phase C) uses chat-text — do not
use AskUserQuestion for any folder question.
Before doing any other work, determine which mode applies:
Count the number of distinct papers in the user's request (citekeys, titles, PDFs, staged .md files, or author references).
Staging folder: If the user provides a folder path (or the phrase "atomic-staging folder"), use the Glob tool (pattern
*.md, path = staging folder) to list all.mdfiles. Read the frontmatter of each to confirmecology_review_source: true. Count confirmed files as the paper count and proceed directly to batch mode (Phase A–D). In Batch Phase A (silent metadata pass), use the Staged file path instead of the Zotero or PDF path for any file withecology_review_source: true.
For each paper in the list, run Steps 1 and 2 silently (no user interaction):
Zotero path:
mcp__zotero-mcp__search_library for each paper.mcp__zotero-mcp__get_item_details (mode: complete) to retrieve metadata. Then resolve the BBT citekey silently using the three-tier method from Step 2 step 3b (Tier 1 = Grep Zotero_import/ by DOI; Tier 2 = construct auth.lower+shorttitle(3)+year and verify via search_library; Tier 3 = provisional with # ⚠ citekey unverified flag). Record the citekey, title, authors, year, journal, DOI.mcp__zotero-mcp__get_item_abstract and mcp__zotero-mcp__get_annotations for confirmed items only.mcp__zotero-mcp__get_content (itemKey, mode: complete, contentControl: {allowExtended: true}). Do not use the Read tool on the attachment path — Zotero storage is outside connected session paths and will error. If output exceeds context limits, use a subagent with bash slicing (see Step 2, Zotero path step 6 for the full procedure). Record content_source for each paper (full-text, full-text+annotations, or abstract-only). If get_content fails, proceed with abstract only and set content_source: abstract-only.PDF path:
GreenvilleWildfire2024 format).Staged file path (for files with ecology_review_source: true):
Use the Staged file path as described in Step 2 below.
After completing Phase A for all papers, proceed to Batch Phase B.
If any papers were flagged [AMBIGUOUS] in Phase A, present them all together in a single AskUserQuestion. Format each ambiguous item as:
Paper 3: searched for "Smith disturbance 2021" — found 3 results: A) Smith et al. 2021 — Disturbance ecology in arid systems (Ecology Letters) B) Smith & Jones 2021 — Post-fire recovery (AREES) C) Smithson et al. 2021 — Arid zone mammals (J. Ecology)
Use multiSelect: false per ambiguous paper. Present up to 4 ambiguous papers per AskUserQuestion call; if more than 4 are ambiguous, resolve in sequential groups of 4.
After resolution, call mcp__zotero-mcp__get_item_details, get_item_abstract, and get_annotations for the newly confirmed items.
If no papers are ambiguous, skip Phase B entirely and proceed to Phase C.
Apply the auto-folder heuristic below to suggest a folder for each paper based on its topic tags and abstract content:
| If paper's dominant topic tags include… | Suggest folder |
|---|---|
wildfire, megafire | Fire |
drought | Disturbance or Climate Change (pick by abstract) |
acoustic-monitoring | Acoustics |
monitoring, methods, multivariate-methods | Methods |
ecosystem-function | Ecosystem Function |
climate-change | Climate Change |
invasive-species | Disturbance |
mammals, birds, reptiles, frogs, invertebrates | Monitoring |
conservation, threatened-species | Nature metrics |
vegetation-structure, functional-traits, plants | Fire or Disturbance (pick by abstract) |
niche-ecology, reference-states | Disturbance or Methods (pick by abstract) |
| No clear match | to sort |
Note on to sort: Before using this folder, check whether it exists using the Glob tool (pattern: "to sort/", vault base path). If absent, flag in the Phase C output: "Note: folder to sort does not yet exist — create it in Obsidian before running the batch."
Print the full paper-to-folder mapping as chat text — a markdown table or numbered list. For example:
| # | Citekey | Suggested folder | Basis |
|---|---------|-----------------|-------|
| 1 | greenvilleWildfire2024 | Fire | tag: wildfire |
| 2 | smithAcoustics2022 | Acoustics | tag: acoustic-monitoring |
| 3 | jonesMammals2023 | Monitoring | tag: mammals |
| 4 | brownClimate2020 | to sort | no clear tag match |
Do NOT use AskUserQuestion to present this list.
After printing the table, add the following as chat text:
Reply
approveto accept all suggestions, or list overrides asPaper N → FolderName, Paper M → FolderName(comma-separated, any order).
Parse rules (apply in order):
approve or empty reply → use all suggestions as-is; proceed to Phase D.Paper N → FolderName); apply each to the folder map; then proceed to Phase D.After applying any overrides, record the final folder for each paper. No further folder questions are asked during the loop.
For each paper in the confirmed list, run the following silently in sequence:
Step 4 — Generate note content exactly as per the single-paper Step 4 instructions.
Step 5 — Scan vault for related content exactly as per the single-paper Step 5 instructions.
Step 6 (modified for batch) — Duplicate check: if a note with this citekey already exists, do NOT ask. Skip this paper and add it to the end-of-batch report as SKIPPED — duplicate exists at [path]. Never overwrite silently.
Step 7 — Patch the Zotero import note exactly as per the single-paper Step 7 instructions.
After each paper is written, print a one-line status:
✓ 1/4 — greenvilleWildfire2024 → Fire/greenvilleWildfire2024 — Savanna fire regimes.md
✓ 2/4 — smithAcoustics2022 → Acoustics/smithAcoustics2022 — Frog call detection.md
⚠ 3/4 — jonesMammals2023 → SKIPPED (duplicate at Monitoring/jonesMammals2023 — Arid mammals.md)
✓ 4/4 — brownClimate2020 → to sort/brownClimate2020 — Rainfall shifts arid zones.md
After all papers are processed, print a final summary:
Batch complete: 3 saved, 1 skipped (duplicate). Review skipped items manually if needed.
Check whether the user has provided:
ecology_review_source: true in its frontmatter, produced by the /ecology-literature-review skill) → follow the Staged file pathIf unclear, ask: "Are you working from a Zotero reference, a PDF file, or a staged .md file from the ecology-literature-review skill?"
mcp__zotero-mcp__search_library to find the item using the title, author, or citekey as the query.mcp__zotero-mcp__get_item_details on the confirmed item (mode: complete) to retrieve full bibliographic metadata (title, authors, year, journal, volume, issue, pages, DOI, attachments). Note: the MCP does not return the BBT citekey — resolve it in step 3b.
3b. Resolve the BBT citekey — try each tier in order, stop at the first success. The citekey must match the Zotero import note filename exactly, so getting this right is essential for two-way linking.
Zotero_import/*.md, output mode files_with_matches, on the vault base path. If a file is returned, its filename minus .md is the BBT citekey.auth.lower (first author last name, all lowercase) + shorttitle(3) (first 3 non-trivial title words — skip articles a, an, the — each kept as a full word with the first letter capitalised, NOT truncated) + 4-digit year. Examples from this vault: alquezarAirportNoiseWildlife2019, gearyOptimisingFirePredator2026, wartonManyVariablesJoint2015. For Greenville et al. 2024 'Drought intensity and duration of native rodents…' → greenvilleDroughtIntensityDuration2024. Then call mcp__zotero-mcp__search_library with that candidate string as the query — if the same item comes back (matched by Zotero key or DOI), the citekey is confirmed. BBT registers citekeys as searchable.# ⚠ citekey unverified — confirm in Zotero/BBT immediately after the citekey: line, and tell the user at the end of the session.mcp__zotero-mcp__get_item_abstract to retrieve the abstract.mcp__zotero-mcp__get_annotations to retrieve any highlights and notes added to the PDF in Zotero. Note the count of annotations found — these inform the note content but do not appear verbatim in the atomic note (they live in the Zotero import note).mcp__zotero-mcp__get_content with the parent itemKey (not the attachment key): mode complete, contentControl {allowExtended: true, prioritizeCompleteness: true}. Do not use the Read tool on the attachment path field — the Zotero storage folder is outside connected session paths and will return an error.
outputs/.claude/projects/.../tool-results/. Use a subagent (Agent tool) to read the file in ~80K-char bash slices (python3 -c "print(open('PATH').read()[A:B])"). Instruct the subagent to return: main findings, methods, author-stated limitations, key concepts, and 2–3 verbatim quotes. Keep full text out of main context.content_source based on what was available: full-text (get_content succeeded, no annotations), full-text+annotations (both), or abstract-only (get_content failed — fall back to abstract + annotations and note this in Gaps & limitations).pages: "1-20", then "21-40").mcp__zotero-mcp__search_library with the extracted DOI as the query. If a match is found, switch to the Zotero path: use mcp__zotero-mcp__get_item_details to retrieve the BBT citekey and full metadata, then continue from Zotero path step 4 above. This prevents a broken zotero_note link when the paper is already in the Zotero library.zotero_note to "[[Zotero_import/add when imported]]" as a placeholder.citekey → BBT citekey (filename without .md confirms this)full_citation, doi, year, journal, authors → frontmatter metadatamain_findings → Main findings bullets (up to 4; use as-is or lightly edit for sentence clarity)methods_design, methods_region, methods_ecosystem, methods_data, methods_analysis → Methods section fieldstransferability_note → Transferability to AU line in "What this changes for me"gaps_limitations → Gaps & limitations sectiontopic_tags_suggested → candidate tags; validate against Vocabulary.md in Step 4 (keep matches, discard non-matches; if VOCABULARY_PATH is none, use as-is)Zotero_import/*.md for the DOI — if a file is found, its filename is the confirmed citekey# ⚠ citekey unverified commentmcp__zotero-mcp__get_annotations to retrieve any highlights — if found, prepend the most important annotation as main_findings bullet 1 (shifting others down, max 4 total).content_source: ecology-review-staged in the note frontmatter.applicable_to_au heuristic from methods_region:
partial (default; user upgrades to yes if study is directly AU)nounclearFirst, use the Glob tool to discover the vault's current top-level topic folders:
*/C:\Users\agre6595\OneDrive - The University of Sydney (Staff)\Obsidian\Ecology\From the returned paths, extract the folder names. Exclude system/utility folders:
Templates, Zotero_import, Clippings, .obsidian
The remaining folders are the valid topic choices. This ensures the skill automatically
picks up any new folders (e.g. Mammals, Invasives, Climate) without needing a skill update.
Based on the paper's content and tags, identify the single most appropriate folder from the dynamically discovered list. This is the recommended folder.
Do NOT use AskUserQuestion. Instead, print the following as chat text:
Line 1 — Recommendation:
Suggested folder: [RecommendedFolder] — [one short basis phrase, e.g. "matches tags
wildfire,fire-regime" or "abstract is primarily about post-fire recovery"]
Line 2 — Full folder list (alphabetical, numbered, mark recommended):
List every discovered topic folder in alphabetical order, one per line, as:
1. Acoustics
2. Climate Change
3. **Disturbance** ← (Recommended)
4. Ecosystem Function
5. Fire
6. Methods
7. Monitoring
8. Nature metrics
9. to sort
(Numbering and folder names will vary; always regenerate from the Glob result.)
Line 3 — Reply prompt:
Reply with: a number, a folder name,
recommended/yes/ blank to accept the suggestion, orto sort.
Parse rules (apply in order):
yes, or recommended: use the recommended folder.Wait for AG's reply before proceeding to Step 4.
Construct the note using this exact structure. The whole note should fit on one screen (~1 page).
---
type: atomic-note
citekey: bbtCitekey
aliases:
- bbtCitekey
title: "Full paper title"
authors: "Author A, Author B"
year: YYYY
journal: "Journal Name"
doi: "10.xxxx/xxxxx"
zotero_note: "[[Zotero_import/bbtCitekey]]"
applicable_to_au: unclear
changed_my_thinking: no
content_source: full-text
tags:
- atomic-note
- topic-tag
---
# bbtCitekey — Short descriptive title
> **Zotero note:** [[Zotero_import/bbtCitekey]] · [DOI link](https://doi.org/xxxxx)
## Main findings
-
-
-
## Methods
- **Design:**
- **Country/Region:**
- **Ecosystem:**
- **Data:**
- **Analysis:**
## What this changes for me
-
- **Transferability to AU:**
## Gaps & limitations
-
-
## Connections
- **Related notes:**
- **Related papers:**
- **Key concepts:**
- **Counter-claims:**
## Follow-up
-
Content rules:
Short title (H1): 5–8 words capturing the key finding or topic. Not the full paper title.
Main findings: Maximum 4 bullets. One sentence each. Prioritise ecological significance. Use the following priority order for source material:
Methods: One line per field. Plain language — write so a non-specialist understands the study design at a glance.
What this changes for me: Your own reaction — did this paper shift your mental model, open a new question, or confirm something you suspected? One or two sentences; empty is fine. Forces a judgement at note-creation time even if you leave it blank. Populate based on the abstract, annotations, and how the paper fits with what you already know.
Transferability to AU (body line): Expand the applicable_to_au frontmatter value into one plain-English sentence explaining why it is or isn't applicable — e.g. "Findings from boreal forest; fire-return intervals unlikely to match Australian eucalypt systems." Leave as a single dash if truly unclear.
Gaps & limitations: Focus on what the study cannot tell us and what the next logical study would be. Include both author-stated limitations and any gaps apparent from the design.
Tags: Always include atomic-note. Add 1–3 topic tags chosen only from the controlled vocabulary in Vocabulary.md (vault root). Do not invent new tags — pick the closest match. Do not add the year (already in year frontmatter). Do not use author wikilinks anywhere in the note. The canonical topic tags are:
wildfire, megafire, droughtacoustic-monitoring, monitoringcommunity-ecology, multivariate-methods, methodsfunctional-traits, niche-ecology, vegetation-structure, reference-states, climate-change, ecosystem-functionconservation, threatened-species, invasive-speciesaustralia, marinemammals, birds, reptiles, frogs, invertebrates, plantsIf the user has set
VOCABULARY_PATH: none, skip Vocabulary.md validation and usetopic_tags_suggestedvalues as-is (still includeatomic-noteas a base tag).
DOI: Always wrap in quotes in the frontmatter (e.g. doi: "10.1111/geb.70241"). Omit the DOI frontmatter field and the DOI link in the callout if no DOI is found.
zotero_note: Use the paper's actual Better BibTeX (BBT) citekey — the one the user provided or visible in Zotero search results — not the author-year format. For PDF-only notes with no Zotero record, use [[Zotero_import/add when imported]].
No abstract available: Note "Abstract not available" and rely on annotations or PDF content.
Counter-claims (Connections section): If this paper contradicts or challenges another note already in the vault, record it as: Counter-claims: [[folder/citekey — title]] argues X; this paper argues Y. Surfaces intellectual tensions over time. Leave the - **Counter-claims:** bullet blank if no contradiction is identified — do not delete the bullet.
applicable_to_au: Your quick judgement on how well the paper's findings transfer to Australian ecosystems. Set at note-creation time. Values: yes (directly applicable), partial (some findings apply), no (different biome/context), unclear (can't tell yet). Default: unclear. Use abstract, country/region, and ecosystem type to inform the choice. Also write one explanatory sentence in the ## What this changes for me section's Transferability to AU line.
content_source: Record what source material was used to build the note. Set in frontmatter. Values: full-text (get_content succeeded, no annotations), full-text+annotations (get_content succeeded and Zotero annotations exist), abstract-only (get_content failed — also add a sentence in Gaps & limitations: "Note built from abstract only; full text not retrieved."), ecology-review-staged (note built from staged .md file produced by /ecology-literature-review skill). Default: full-text.
changed_my_thinking: Did this paper shift how you think about the topic? yes or no. Set at note-creation time — a one-shot judgement based on how novel the paper is relative to the other literature you know. If uncertain, leave as no. This field powers the "Changed my thinking" view in Base.base.
Author wikilinks: Never use [[Author Name]] wikilinks anywhere in the note. Authors belong in Zotero; use the plain authors: frontmatter field only.
This step builds the Connections section. Run all phases before writing anything.
Phase A — Tag scan (one pass)
Use the Grep tool with pattern ^tags: on C:\Users\agre6595\OneDrive - The University of Sydney (Staff)\Obsidian\Ecology\ (glob **/*.md, output mode content) to collect all frontmatter tag blocks. Extract the topic tags from each note (exclude system tags: atomic-note, concept-note, literature, idea). Record: filepath → [tags].
Phase B — Tag-overlap scoring
For the current paper, identify its 1–3 topic tags (chosen in Step 4). Score each existing atomic note by the number of tags it shares with the current paper. Keep the top 8 candidates.
Phase C — Key-concept term scan
From the abstract and main findings, extract 4–6 distinctive ecological terms (e.g. niche truncation, fire severity, occupancy model, functional diversity). For each term, use the Grep tool (pattern = term, glob **/*.md, output mode files_with_matches) on the vault path. Add the hit count to each candidate note's score. Re-rank: candidates with both tag overlap AND term hits rise to the top.
Phase D — Read top candidates and compose links
Use the Read tool (first 20 lines only) on the top 4 scored candidates to confirm their H1 title and citekey. Compose [[folder/citekey — Short title]] wikilinks.
Flag any term that appears in 3 or more vault notes as a potential future concept note (include as a "Key concepts" bullet without creating a note now).
If the vault has fewer than 5 atomic notes, note "Vault still growing — connections will strengthen over time" and skip to Step 6.
Duplicate check
Use the Glob tool (pattern **/*bbtCitekey*, path = vault base) to check whether a note with this citekey already exists. If found, show the existing file path and ask: "A note for this citekey already exists. Overwrite, rename, or cancel?"
Write the note
Use the Write tool to save the completed note to:
C:\Users\agre6595\OneDrive - The University of Sydney (Staff)\Obsidian\Ecology\[SelectedFolder]\[bbtCitekey] — [Short title].md
Confirm to the user: "Saved to [SelectedFolder]/[bbtCitekey] — [Short title].md"
If a Zotero import note exists (Zotero_import/[bbtCitekey].md), check its current content using the Read tool:
C:\Users\agre6595\OneDrive - The University of Sydney (Staff)\Obsidian\Ecology\Zotero_import\[bbtCitekey].mdIf the file exists and contains atomic_note: in its frontmatter with an empty or placeholder value, use the Edit tool to set:
atomic_note: "[[SelectedFolder/bbtCitekey — Short title]]"
This completes the two-way link between the atomic note and the Zotero import note.
If the Zotero import note does not exist, remind the user: "Run the Zotero Integration plugin in Obsidian to import highlights for this paper — the atomic_note field will need to be patched afterwards."
Triggered by: "create a concept note for [term]", "make a concept note", or "add [concept] as a concept note".
CN-1 — Identify the concept
Confirm the concept name with the user (e.g. "niche truncation"). If ambiguous, ask for a brief definition in their own words.
CN-2 — Scan vault for papers using this concept
Use the Grep tool (pattern = concept term, glob **/*.md, output mode content, context 2) on the vault to find all notes mentioning this concept. Read the first 20 lines of each matching note to confirm relevance. Collect citekeys.
CN-3 — Generate concept note content
---
type: concept-note
concept: "Concept name"
tags:
- concept-note
- topic-tag
---
# Concept name
> One-paragraph definition in AG's own words — not copied from a paper.
## Papers using this concept
- [[folder/citekey — Short title]] — one-sentence description of how this paper uses the concept
- [[folder/citekey — Short title]] — ...
## Open questions
-
## See also
- [[related concept note if exists]]
Replace topic-tag with the most relevant canonical tag from Vocabulary.md.
CN-4 — Write the concept note
Use the Write tool to save to:
C:\Users\agre6595\OneDrive - The University of Sydney (Staff)\Obsidian\Ecology\Ideas\[Concept name].md
Confirm to the user: "Concept note saved to Ideas/[Concept name].md"
npx claudepluginhub agreenville/claude-skills --plugin ecology-skillsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.