From research-workspace
Fills per-paper Key Findings, Methodology, and Relevance sections in both Obsidian and Zotero after research-hub ingests cited papers. Invokes an LLM on each abstract; keeps Obsidian and Zotero in sync.
How this skill is triggered — by the user, by Claude, or both
Slash command
/research-workspace:paper-summarizeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The `auto` pipeline ingests metadata + abstract only — Summary / Key Findings / Methodology / Relevance stay as `[TODO]` skeletons in both Obsidian and Zotero. Cluster-level summarization (NotebookLM brief, crystals) does NOT fill per-paper notes. So after `auto`, the user has nothing scannable per paper without opening the PDF.
The auto pipeline ingests metadata + abstract only — Summary / Key Findings / Methodology / Relevance stay as [TODO] skeletons in both Obsidian and Zotero. Cluster-level summarization (NotebookLM brief, crystals) does NOT fill per-paper notes. So after auto, the user has nothing scannable per paper without opening the PDF.
This skill fills that gap. One LLM call per paper, JSON-validated, written to both vault systems atomically (rollback the markdown change if Zotero write fails so the two stay in sync).
Trigger phrases:
auto X and the notes are empty — give me real summaries."Not for:
research-hub notebooklm generate (NotebookLM brief).research-hub crystal emit/apply.notebooklm-brief-verifier.raw/<slug>/)claude, codex, gemini, opencode, aichat, cursor, or configured custom adapter)--apply flag (default off, dry-run)The skill reads each paper's frontmatter (DOI, year, zotero-key) + the ## Abstract body block. Papers with empty abstract get a "PDF needed" marker rather than hallucinated findings.
For each paper, three sections are rewritten:
Obsidian markdown at raw/<cluster>/<paper-slug>.md:
## Key Findings callout block (3–5 bullets)## Methodology callout block (one sentence)## Relevance callout block (1–2 sentences linking to the cluster topic)^findings, ^methodology, ^relevance) preserved.Zotero child note for the paper's parent item (looked up via zotero-key frontmatter):
<h1>Summary + Abstract + Key Findings <ul> + Methodology + Relevance.Both writes must succeed for a paper to count as "applied". A Zotero write failure rolls back the markdown change so the two systems stay in sync.
<vault>/.research_hub/artifacts/<cluster>/summarize-prompt.md. The user pipes it through their LLM manually and re-runs with --apply, or calls the apply_cluster_summaries MCP tool with the parsed payload. Exit code 0; ok=True.ok=False with error="LLM response had no parseable JSON object". No writes.This skill's contract is exercised end-to-end by the test suite. The suites stub the LLM CLI but execute real Obsidian markdown writes against a fixture vault and real Zotero child-note writes against a mocked Zotero adapter. Rollback semantics (markdown rolls back if Zotero write fails) are explicitly tested.
# Run the full paper-summarize suite (23 tests)
python -m pytest -q \
tests/test_v069_summarize.py \
tests/test_v073_parallel_summarize.py \
tests/test_v080_resummarize.py
Coverage breakdown:
| Test file | Count | What it covers |
|---|---|---|
tests/test_v069_summarize.py | 17 | Prompt builder shape, validator (rejects unknown slugs / empty fields / wrong types), Obsidian + Zotero apply path, rollback when Zotero fails, no-LLM-on-PATH fallback |
tests/test_v073_parallel_summarize.py | 3 | Parallel summarize across multiple clusters, ordering, error isolation |
tests/test_v080_resummarize.py | 3 | Re-summarize behaviour: idempotent on same input, overwrite on different LLM output, --no-zotero path |
For a manual smoke check against a live vault:
# Dry-run (emit prompt + show LLM output, no writes)
research-hub summarize --cluster <slug>
# Live run (writes to Obsidian + Zotero)
research-hub summarize --cluster <slug> --apply
# Override LLM
research-hub summarize --cluster <slug> --llm-cli codex --apply
# Obsidian-only (skip Zotero — useful when Zotero is offline)
research-hub summarize --cluster <slug> --apply --no-zotero
After applying, scan raw/<cluster>/*.md — every paper's ## Key Findings callout should have real bullets instead of [TODO].
[likely].--no-zotero or --no-obsidian if you want to preview one side first..scratch/: one transactional unit per paper.npx claudepluginhub wenyuchiou/ai-research-skills --plugin research-workspaceOperate research-hub workflows for literature discovery, source ingest into Zotero/Obsidian/NotebookLM, dashboard inspection, and vault maintenance.
Generates structured AI summaries for Obsidian literature notes. Triggered by explicit requests or after Zotero import and MinerU parsing. Writes a standardized ## AI Summary section, preserving existing notes.
Bridges Zotero literature to a project knowledge base: canonical paper notes under Sources/Papers, synthesis in Knowledge, writing outputs in Writing, and a derived literature canvas. Requires evidence extraction with claim promotion gate.