by 917Dhj
DeepPaperNote is an agent skill for deep-reading a single paper and generating high-quality Obsidian-style research notes. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.
# Add to your Claude Code skills
git clone https://github.com/917Dhj/DeepPaperNoteGuides for using ai agents skills like DeepPaperNote.
Last scanned: 6/5/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-06-05T08:07:53.196Z",
"npmAuditRan": true,
"pipAuditRan": true
}No comments yet. Be the first to share your thoughts!
30 days in the Featured rail
Use this skill when the user wants one outcome:
Chinese trigger examples:
给这篇论文生成深度笔记写一篇高质量论文精读笔记把这篇文章整理成 obsidian 笔记读这篇论文并生成 md 笔记This skill is intentionally narrow:
The finished note must be more than a summary. It should reconstruct the paper's argument:
Default writer persona:
The note must adapt to the paper type. Use the same base structure, but shift emphasis for AI methods, benchmarks, clinical studies, and humanities or social-science papers.
Follow this order:
*_raw_sections.jsonl, *_source_manifest.json, and optional derived *_full_text.mdpasses_style_gate: false, apply the Style Gate Enforcement rule before advancing to step 13, 14, or 15final_quality_review after lint passesfinal_readability_review after the quality review passesThis is the required workflow for a normal single-paper note request, not a loose suggestion. Unless this skill explicitly marks a stage as optional, required stages must not be silently skipped, reordered into a shortcut, or treated as complete just because a partial artifact already exists.
Global no-short-circuit rule:
Completion-language rule:
笔记已完成 only when the required workflow is actually complete已生成草稿 when drafting is done but lint, final readability review, or save is still pending已通过校验 only when lint has actually been run and passed已保存到 Obsidian only when the write step has actually succeededlint 已通过 as equivalent to 整篇笔记已经润色完成SKILL.md plus the generated synthesis_bundle.json must be enough to complete a normal note-generation run.
Files under references/ are optional stage-specific deep dives, not a default reading checklist.
Non-negotiable rules:
source_manifest, raw sections, coverage metadata, explicit note_plan, and inspected paper evidence; never finish from title/abstract/headings alone*_raw_sections.jsonl and *_source_manifest.json are the canonical reading material; old top-N evidence buckets, truncated section_texts, and candidate_chunks are not model-facing writing inputsnote_plan such as <note>.plan.json or *_note_plan.json; pass it to scripts/lint_note.py --plan-file ...note_plan exists, run scripts/lint_grounding.py --note-plan ... --source-manifest ... --bundle-json ... --figure-decisions ...; each substantive section must cite valid section_id values or valid page ranges原文摘要翻译 before 一句话总结 and a dedicated 创新点 section immediately after 原文摘要翻译原文摘要翻译 is a faithful Chinese translation of the original abstract, not a bilingual block and not the model's own summary### 机制流程 under 方法主线, normally as a 3 to 4 step numbered flow with input, operation, and output destinationfinal_quality_review for analytical depth, then run final_readability_review for language polish, and rerun lint if either review edits the noteimages/ directory, and never present a fallback/workspace write as a successful vault saveReference usage policy:
references/workflow.md only for detailed data contracts or pipeline debuggingreferences/evidence-first.md, references/deep-analysis.md, or references/final-writing.md only when the paper is complex or the draft is too shallowreferences/figure-placement.md only for ambiguous figure/table placement or image replacement decisionsreferences/obsidian-format.md only for Markdown, vault, frontmatter, or reference-link formatting detailsreferences/note-quality.md or references/paper-types.md only for final review or domain adaptationreferences/metadata-sources.md only when metadata is incomplete, and references/architecture.md only for repository maintenance decisionsPrefer the strongest available source in this order:
Before resolving the paper, actively check Zotero integration: attempt to call the Zotero MCP tool (for example, search for the paper title or list libraries). If the tool responds without error, Zotero is available and the local-library-first rule below applies. If the call fails or the tool is not present, record "Zotero not available" and proceed without it. Do not skip this check — the check itself determines whether local-library-first applies.
Local-library-first rule (applies only when the Zotero check above succeeds):
scripts/locate_zotero_attachment.py with the attachment key and filename to find the local PDF under the user's Zotero storage.Research/Papers root. Choose a domain folder first.images/ folder during final save, even if no high-confidence images were materialized.images/ folder is part of the required save protocol, not an optional cleanup step. If permission is missing, request it; do not skip the directory.#, ##, and ###.# title heading. Include at least a tags field with a papers/<domain> value and useful aliases; include date, doi, or arxiv_id when known, and omit unavailable fields rather than inventing placeholders.## 核心信息 must be a fixed metadata block only. Use only these fields, in this order, as - 字段名: 值 bullets: 标题, 标题翻译, 作者, 机构, 发表时间, 发表渠道, DOI, arXiv, 论文链接, 代码 / 项目, 数据 / 资源, 论文类型. Omit unavailable fields; put any guide sentence, takeaway, or analysis in 一句话总结 or a later section instead.原文摘要翻译 near the beginning when abstract metadata is available, before 一句话总结.原文摘要翻译 should directly translate the original paper abstract into Chinese rather than restating it as your own summary.原文摘要翻译 section itself should be Chinese-only; do not place English abstract sentences or English paragraph excerpts in that section.原文摘要翻译; keep it as the original abstract translated into Chinese.创新点 section immediately after 原文摘要翻译 and before 一句话总结.创新点 section should not be empty praise. It should enumerate the paper's actual innovations and briefly explain why each one matters.### subheadings in the technical sections when the paper is non-trivial.建议位置; do not collect unresolved placeholders in catch-all sections such as 剩余图表占位 or Remaining figures.> [!figure] callout format with 建议位置, 放置原因, and 当前状态; do not use ordinary paragraph markers such as [图表占位 | Fig. 1], 图表占位:Table 2, or Figure Placeholder | Fig. 3.relative_markdown_embed from figure_table_decisions.json; final save with scripts/write_obsidian_note.py --figure-decisions ... copies the image into the paper-local images/ directory.> [!figure] placeholder callout for the same inserted real figure.Fig. 1 or Table 2.usable_candidate or needs_visual_quality_check / review candidates, make the visual decision only after inspecting the actual candidate image file exposed by the pipeline. Record the concrete visual observation behind the decision. Do not claim manual visual review, visual inspection, or "no reliable insertable candidate" unless the candidate image was actually opened and inspected.reject_visual_quality and asset_candidate_missing are fail-closed script states. They do not require manual visual review before keeping a placeholder or skipping insertion; treat them as automatic extraction outcomes unless you explicitly inspect or re-extract the source asset.asset_candidate_missing, empty source_image_path, or no independent crop means the placeholder status should say no high-confidence image candidate was extracted. Use materialization/copy/write failure language only after a real chosen image asset failed to copy or write.figure_table_decisions.json contains insert rows, pass it to scripts/write_obsidian_note.py --figure-decisions ...; the writer must copy those images into the paper-local images/ directory and refuse a note that does not reference the selected image path.当前状态 for a usable candidate.KV缓存 of, 批量ing, In相关 Researcher, or Single 序列 generation; rewrite the sentence naturally instead of preserving a partially translated phrase.lint_note.py output contains passes_style_gate: false, fix the reported issues and re-run lint. Keep fixing and re-running until lint passes — multiple rounds are normal and expected. Do not decide that any failure is an acceptable exception — proper nouns, math formulas, and citation metadata are not automatic exemptions. Only escalate to the user if the same failures appear unchanged across multiple rounds with no reduction, indicating the model is unable to make further progress independently.Model-first rule:
note_plan artifact rather than relying on hidden planning onlynote_plan as the canonical short JSON file outside the final note body, such as <note>.plan.json or a run-scoped *_note_plan.jsonnote_plan.paper_type from the synthesis bundle's allowed paper types before drafting; the bundle must not bind writing behavior to a script-selected summary paper typecontracts_by_paper_type[note_plan.paper_type].section_semantics to interpret the typed meaning of those fixed sections and contracts_by_paper_type[note_plan.paper_type].recommended_subsections to draft note_plan.section_plancentral_claims, claim_boundaries, negative_or_limiting_results, mechanism_result_map, comparative_positioning, reuse_takeaways, and followup_questionscentral_claims item must state the claim, source-grounded supporting evidence, what the evidence actually proves, and what it does not provemechanism_result_map must connect paper-specific mechanisms, design choices, protocols, constructs, or data decisions to the exact result pattern or diagnostic evidence they explaincomparative_positioning must explain how the paper differs from strong baselines, prior routes, human/clinical references, or obvious alternatives, and why that difference changes interpretationfollowup_questions must be concrete replication, engineering, research, or validity checks that a reader could reuse laterscripts/lint_note.py --plan-file ... when linting the final note; if omitted, lint looks for sibling <note>.plan.jsonscripts/lint_grounding.py before using it for final drafting; broad references such as synthesis_bundle.evidence.method_evidence are invalid<note_plan>...</note_plan> block as display-only context, but it does not replace the JSON file<thinking> block$...$ or $$...$$, not as inline code or fenced code blocksfinal_quality_review, check the full note against seven questions: whether the central evidence chain is complete, whether key settings and numbers are present, whether mechanisms or protocols are mapped to the result pattern they explain, whether the paper is positioned against strong baselines or alternative routes, whether Discussion/Limitations conclusions are explained mechanistically, whether proven claims are separated from unproven claims, and whether the research, engineering, replication, or validity takeaways are specific enough to reusefinal_quality_review passes, reread the full note once more for readability; do not stop at formal compliance onlyfinal_readability_review, ordinary English phrase leftovers should usually be rewritten into natural Chinese, while stable proper nouns may remain in Englishfinal_readability_review to invent new facts, empty filler text, or shallower but safer wording just to satisfy lintThe topic references above can improve difficult runs, but the normal execution path should not depend on reading all of them.
Use these bundled scripts rather than rebuilding the workflow from scratch:
scripts/check_environment.pyscripts/create_input_record.pyscripts/locate_zotero_attachment.pyscripts/resolve_paper.pyscripts/run_pipeline.pyscripts/collect_metadata.pyscripts/fetch_pdf.pyscripts/extract_source_text.pyscripts/extract_evidence.pyscripts/extract_pdf_assets.pyscripts/plan_figures.pyscripts/plan_figure_table_decisions.pyscripts/build_synthesis_bundle.pyscripts/lint_grounding.pyscripts/lint_note.pyscripts/materialize_figure_asset.pyscripts/write_obsidian_note.pyPreferred usage pattern:
scripts/locate_zotero_attachment.py to find the local PDFscripts/create_input_record.py to materialize a trusted JSON input recordscripts/run_pipeline.py on the JSON record or original exact source to produce the bundlePython interpreter rule:
>=3.10.python3 is below 3.10, automatically look for another available interpreter that satisfies the requirement, such as python3.12, python3.11, python3.10, /opt/anaconda3/bin/python3, /opt/homebrew/bin/python3, or /usr/local/bin/python3.>=3.10.Troubleshooting rule:
scripts/check_environment.py only when a concrete dependency or integration question is blocking executionCurrent status:
scripts/run_pipeline.py now defaults to building a model-facing synthesis bundlescripts/write_obsidian_note.py can write the final note into a target vaultpdf_url, direct PDF URL, arXiv/open-access sources, publisher PDF if accessible, DOI enrichment, and any other current fetch path implemented by the workflow.Turn a complex paper into an Obsidian note you will actually want to keep.
Do you often run into this situation: you want to study a classic paper carefully, but the hardest part is no longer reading it — it is turning that reading into usable notes? The real time sink usually looks like this:
DeepPaperNote is built for exactly that layer of repetitive, mechanical, but very expensive work. It takes over the gathering, structuring, figure placement, and note production work so you can keep your attention on actual thinking.
DeepPaperNote is a skill for deep paper reading. The same core skill can be used from Claude Code and Codex. It cares about a harder set of questions:
[!tip] If you already have an Obsidian or Zotero workflow, DeepPaperNote automates the most tedious parts of evidence gathering, structuring, and note production.

| 🎯 Your need / pain point | ✅ What DeepPaperNote does |
| --- | --- |
| You want to understand a complex paper faster | It organizes the method backbone, key results, figure context, and limitations into a note you can actually read through |
| You want to study a classic paper without handwriting a pile of mechanical notes | It handles metadata collection, structure building, figure placeholders, and full note generation so you can spend your energy on understanding |
| You want the paper to live inside Obsidian as a long-term asset | It files the paper into a domain-appropriate place inside your Obsidian knowledge base, then creates a paper-specific folder, Markdown note, and local images/ directory |
| You already manage papers in Zotero and do not want to redo the work | It can prefer local records and attachments, reducing mismatches and often speeding the workflow up |
| You do not want another polished-looking summary | It leans toward mechanism breakdown, key numbers, formulas, edge cases, and honest limitations |
In one sentence:
DeepPaperNote is a paper-reading-note workflow, not a paper-summary generator.
DeepPaperNote does not achieve higher note quality by simply rewriting the abstract in smoother prose. It raises note quality through a few workflow rules:
| 🧭 Core principle | 📝 What it means in practice |
| --- | --- |
| 🤖 Model-led understanding | The model is responsible for mechanism breakdown, method structure, key comparisons, and limitations instead of template-like summary writing. |
| 🗂️ Evidence first | It gathers evidence from PDFs, metadata sources, and optional Zotero workflows before writing. The note captures the full evidence chain: what the paper proves, what remains unproven, which experiments matter, where negative or limiting results appear, and how conclusions are bounded. |
| 🧪 Technical detail first | For technical papers, it tries to preserve key numbers, formulas, implementation logic, and real boundary conditions rather than stopping at high-level paraphrase. |
| 📄 Paper-type-aware writing | Different paper types receive different reading strategies. Method papers, benchmark and dataset papers, survey papers, and empirical papers each receive focused treatment of the aspects that matter most for that type. |
| 📊 Clear result tables | When a paper compares multiple models, datasets, tasks, settings, or metrics, DeepPaperNote turns the central comparison into compact Markdown tables and follows them with interpretation of what the numbers actually mean. |
| 🖼️ Image-first figures | When a figure candidate is usable and has a valid image path, it is inserted as a real image. Placeholders are reserved for real failures: missing candidates, visual defects, contamination, truncation, or identity mismatch. |
| 🔗 Native knowledge-base output | It first routes the paper into a domain-appropriate place in your existing knowledge-base structure, then creates a paper folder with YAML properties, a fixed core metadata block, a stable images/ directory, and clean figure/table embeds. |
| 📚 Local-library-first resolution | If the paper already exists in Zotero, it can reuse local items and attachments, which is often both more reliable and faster. |
DeepPaperNote supports both Claude Code and Codex.
For most users, install directly with npx. Run in your terminal:
npx skills add 917Dhj/DeepPaperNote
This command installs to the shared .agents/skills directory by default. Skills in that directory can be recognized and used by Codex and most other agents. If you also want to use DeepPaperNote in Claude Code, choose Claude Code in the Additional agents prompt.
You can also install for a specific agent directly:
npx skills add 917Dhj/DeepPaperNote -a codex
npx skills add 917Dhj/DeepPaperNote -a claude-code
To update an existing DeepPaperNote installation, rerun the same command; it will replace the copy in the target skill directory.
If you prefer the manual path, download the latest release zip and extract it.
For Codex, place the extracted DeepPaperNote folder into:
~/.codex/skills/DeepPaperNote
For Claude Code, place the extracted DeepPaperNote folder into:
~/.claude/skills/DeepPaperNote
You can also clone the source repository directly:
git clone https://github.com/917Dhj/DeepPaperNote.git ~/.codex/skills/DeepPaperNote
git clone https://github.com/917Dhj/DeepPaperNote.git ~/.claude/skills/DeepPaperNote
After installation, restart your agent so the skill is loaded.
Before your first real paper run, install the most important Python dependency:
python3 -m pip install PyMuPDF
Why this step matters:
PyMuPDFPyMuPDF is missing, the core PDF extraction pipeline will not workAfter that, just hand a paper to the agent. A title, DOI, URL, arXiv ID, or local PDF all work. Prompts like these are enough:
Typical prompts:
Generate a deep-reading note for this paper: Attention Is All You NeedTurn this paper into an Obsidian note: https://arxiv.org/abs/1706.03762Read this PDF and produce a Markdown note with figure contextUse DeepPaperNote on this paper: 10.48550/arXiv.1706.03762By default, DeepPaperNote writes the note in Chinese. At the moment, Chinese is the only note language that can fully benefit from the skill's current writing and linting rules. If you need English notes, please stay tuned for a future update.
By default, DeepPaperNote will: