#40 by GitHub stars
Yuan1z0825/nature-skills
符合nature论文学术表达和科研绘图的Skill
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
skills/nature-academic-search/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-citation/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-data/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-downloader/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-experiment-log/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-figure/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-image2ppt/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-literature-pipeline/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-paper-card/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-paper-to-patent/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-paper-trans/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-paper-xray/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-paper2ppt/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-paper2word/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-polishing/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-proposal-writer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-reader/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-ref-verifier/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-response/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-reviewer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-shared/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-social-science/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-statistics/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
skills/nature-writing/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
c1637a89c709 → c1cee246a489
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → c1637a89c709
No earlier version was observed for comparison.
Heat
7.7- Star growth, last 7 daysAhead of 91% of tracked repositories
- Star growth, last 24 hoursAhead of 91% of tracked repositories
- Rank movement, last 7 daysAhead of 77% of tracked repositories
- Commits, last 30 daysAhead of 93% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- nature-academic-search
skills/nature-academic-search - nature-citation
skills/nature-citation - nature-data
skills/nature-data - nature-downloader
skills/nature-downloader - nature-experiment-log
skills/nature-experiment-log - nature-figure
skills/nature-figure - nature-image2ppt
skills/nature-image2ppt - nature-literature-pipeline
skills/nature-literature-pipeline - nature-paper-card
skills/nature-paper-card - nature-paper-to-patent
skills/nature-paper-to-patent - nature-paper-trans
skills/nature-paper-trans - nature-paper-xray
skills/nature-paper-xray - nature-paper2ppt
skills/nature-paper2ppt - nature-paper2word
skills/nature-paper2word - nature-polishing
skills/nature-polishing - researchwrite
skills/nature-proposal-writer - nature-reader
skills/nature-reader - nature-ref-verifier
skills/nature-ref-verifier - nature-response
skills/nature-response - nature-reviewer
skills/nature-reviewer - nature-shared
skills/nature-shared - nature-social-science
skills/nature-social-science - nature-statistics
skills/nature-statistics - nature-writing
skills/nature-writing
How it works
nature-academic-search
When your agent uses it
Search literature across sources, verify or manage citations, and build MeSH strategies or citation-impact audits. Use for 文献检索、引文核对、参考文献管理、严格他引 and evidence-backed citer profiles; not for translating a paper or drafting manuscript prose.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
801 tokensWhen the skill is activated
Reference documents
10,182 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Scripts executed separately
install.shmcp-server/academic_search_server.pymcp-server/sources/__init__.pymcp-server/sources/arxiv.pymcp-server/sources/crossref.pymcp-server/sources/elsevier_common.pymcp-server/sources/pubmed.pymcp-server/sources/sciencedirect.pymcp-server/sources/scopus.pymcp-server/tests/__init__.pymcp-server/tests/test_arxiv_error_entries.pymcp-server/tests/test_citation_errors.pymcp-server/tests/test_elsevier_live.pymcp-server/tests/test_format_converter_hardening.pymcp-server/tests/test_mcp_tools.pymcp-server/tests/test_pubmed_parsing.pymcp-server/tests/test_scopus_empty_result.pymcp-server/tests/test_script_converters.pymcp-server/tests/test_sources.pymcp-server/utils/__init__.pymcp-server/utils/config.pymcp-server/utils/errors.pymcp-server/utils/logging.pyreferences/pubmed-28344011.bibreferences/pubmed-28344011.nbibreferences/pubmed-28344011.risreferences/ris-bibtex-format.mdreferences/search-strategy.mdscripts/academic_search.pyscripts/converters.pyscripts/format-converter.pyscripts/preflight.py
Files
README.mddoc2,435 bytesREADME_EN.mddoc2,762 bytesSKILL.mdcore3,610 bytesSKILL.mdcore3,610 bytesSKILL.mdcore3,610 bytesagents/openai.yamlasset265 bytesconfig/mcp-snippet.jsonasset502 bytesconfig/settings-snippet.jsonasset59 bytesconfig/triggers-academic-search.tomlasset978 bytesinstall.shruns4,442 bytesmanifest.yamlasset3,154 bytesmcp-server/README.mddoc1,959 bytesmcp-server/academic_search_server.pyruns21,382 bytesmcp-server/config.tomlasset249 bytesmcp-server/requirements.txtdoc134 bytesmcp-server/sources/__init__.pyruns352 bytesmcp-server/sources/arxiv.pyruns11,659 bytesmcp-server/sources/crossref.pyruns7,080 bytesmcp-server/sources/elsevier_common.pyruns2,498 bytesmcp-server/sources/pubmed.pyruns13,440 bytesmcp-server/sources/sciencedirect.pyruns7,057 bytesmcp-server/sources/scopus.pyruns19,499 bytesmcp-server/tests/__init__.pyruns40 bytesmcp-server/tests/test_arxiv_error_entries.pyruns1,462 bytesmcp-server/tests/test_citation_errors.pyruns1,669 bytesmcp-server/tests/test_elsevier_live.pyruns2,639 bytesmcp-server/tests/test_format_converter_hardening.pyruns4,263 bytesmcp-server/tests/test_mcp_tools.pyruns2,699 bytesmcp-server/tests/test_pubmed_parsing.pyruns894 bytesmcp-server/tests/test_scopus_empty_result.pyruns1,006 bytesmcp-server/tests/test_script_converters.pyruns2,938 bytesmcp-server/tests/test_sources.pyruns31,209 bytesmcp-server/utils/__init__.pyruns359 bytesmcp-server/utils/config.pyruns1,398 bytesmcp-server/utils/errors.pyruns620 bytesmcp-server/utils/logging.pyruns1,166 bytesreferences/citation-parser.mddoc2,715 bytesreferences/dedup-engine.mddoc1,947 bytesreferences/pubmed-28344011.bibruns3,410 bytesreferences/pubmed-28344011.nbibruns12,205 bytesreferences/pubmed-28344011.risruns3,513 bytesreferences/ris-bibtex-format.mdruns4,629 bytesreferences/search-strategy.mdruns2,067 bytesreferences/source-tiers.mddoc2,744 bytesreferences/workflows/wf1-multi-source-search.mddoc1,913 bytesreferences/workflows/wf2-citation-verification.mddoc1,650 bytesreferences/workflows/wf3-mesh-strategy.mddoc538 bytesreferences/workflows/wf4-citation-file-mgmt.mddoc1,921 bytesreferences/workflows/wf5-reference-mgmt.mddoc1,333 bytesreferences/workflows/wf6-strict-other-citation-impact-audit.mddoc11,315 bytesscripts/academic_search.pyruns21,383 bytesscripts/converters.pyruns18,981 bytesscripts/format-converter.pyruns19,995 bytesscripts/preflight.pyruns3,780 bytesstatic/core/routing-and-ops.mddoc5,280 bytesstatic/core/tools.mddoc3,041 bytes
Read SKILL.md
# Academic Search — Router
## Routing protocol
For local citation-file conversion with complete supplied records, load
`references/workflows/wf4-citation-file-mgmt.md` and its format reference directly.
Source lookup, API setup, and network preflight apply only when retrieval or verification is
needed; do not require them for a requested offline conversion.
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 1. Load the manifest and the core layer
Read [manifest.yaml](manifest.yaml). It declares the `workflow` axis, the allowed values, and the file paths each value maps to.View the complete source on GitHubnature-citation
When your agent uses it
Find and verify Nature/CNS-family literature supporting manuscript claims, with claim-to-source mapping and reference-manager export. Use for Nature系列引用、CNS支撑文献、分段补引用 when this journal scope is requested; use broader literature search for unrestricted sources.
What it loads into context
Frontmatter
81 tokensAlways available to the agent
SKILL.md
661 tokensWhen the skill is activated
Reference documents
6,384 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Scripts executed separately
scripts/nature_citation.pytests/test_author_exports.pytests/test_journal_scope.py
Files
README.mddoc2,121 bytesREADME_EN.mddoc2,266 bytesSKILL.mdcore3,096 bytesSKILL.mdcore3,096 bytesSKILL.mdcore3,096 bytesagents/openai.yamlasset230 bytesdata/npj-journals.jsonasset2,528 bytesevals/evals.jsonasset1,854 bytesmanifest.yamlasset1,726 bytesreferences/journal-scope.mddoc2,334 bytesreferences/ris-endnote.mddoc3,800 bytesreferences/script-usage.mddoc4,311 bytesreferences/search-strategy.mddoc2,952 bytesscripts/nature_citation.pyruns86,617 bytesstatic/core/chinese-mode.mddoc767 bytesstatic/core/principles.mddoc3,079 bytesstatic/core/workflow.mddoc6,474 bytestests/test_author_exports.pyruns8,283 bytestests/test_journal_scope.pyruns1,423 bytes
Read SKILL.md
# Nature Citation — Router
## Routing protocol
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 1. Load the manifest and the core layer
Read [manifest.yaml](manifest.yaml). Then read every file listed under `always_load`:
- `static/core/principles.md` — what the skill produces, the strict journal scope, the source hierarchy, and the search-quality rules.
- `static/core/workflow.md` — the seven-step workflow and the final report format.
### 2. No content axis — confirm scope and language inlineView the complete source on GitHubnature-data
When your agent uses it
Draft or audit manuscript Data/Code Availability statements, dataset access routes, repository plans, and FAIR metadata. Use for 数据可用性声明、数据共享、数据仓库选择 and dataset citations; not general data cleaning or statistical analysis.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
783 tokensWhen the skill is activated
Reference documents
13,656 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Files
README.mddoc2,273 bytesREADME_EN.mddoc2,506 bytesSKILL.mdcore3,888 bytesSKILL.mdcore3,888 bytesagents/openai.yamlasset236 bytesmanifest.yamlasset2,373 bytesreferences/chinese-author-alignment.mddoc5,010 bytesreferences/fair-metadata-checklist.mddoc4,649 bytesreferences/nature-article-requirements.mddoc5,103 bytesreferences/policy-principles.mddoc5,875 bytesreferences/repository-and-identifiers.mddoc4,390 bytesreferences/source-basis.mddoc5,391 bytesreferences/statement-patterns.mddoc8,088 bytesstatic/core/chinese-mode.mddoc1,193 bytesstatic/core/stance.mddoc1,910 bytesstatic/core/workflow.mddoc1,896 bytes../nature-shared/journal-formats/nature-machine-intelligence.mddoc18,975 bytes
Read SKILL.md
# Nature Data Availability — Router
## Routing protocol
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 1. Load the manifest and the core layer
Read [manifest.yaml](manifest.yaml). Then read every file listed under `always_load`:
- `static/core/stance.md` — what the data-availability package is, the default stance, and the source hierarchy.
- `static/core/workflow.md` — the eight-step workflow and the output format.
### 2. No content axis — confirm journal and language inlineView the complete source on GitHubnature-downloader
When your agent uses it
Use when a user needs lawful academic full text, CNKI institutional access, English OA retrieval, publisher API access, institutional browser fallback, or supporting information downloads.
What it loads into context
Frontmatter
91 tokensAlways available to the agent
SKILL.md
5,702 tokensWhen the skill is activated
Reference documents
15,198 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Download Intake and First-Run Configuration
- Resource URL Triage
- Institution-Specific Domains
- Boundaries
- Preconditions
- Batch Scope
- Status Categories
- Start Browser Control
- Fast Batch Path (default for 2+ papers — fast & token-efficient)
- Advanced Browser and Delivery Routes
Scripts executed separately
scripts/batch_download.mjsscripts/browser_pdf_downloader.mjsscripts/cdp_open_url.mjsscripts/configure_credentials.pyscripts/configure_school.pyscripts/extract_pdf_text.pyscripts/lib/anti-bot.mjsscripts/lib/cdp-utils.mjsscripts/lib/cnki.mjsscripts/lib/credentials.mjsscripts/lib/direct-download.mjsscripts/lib/manifest.mjsscripts/lib/metadata.mjsscripts/lib/open-access-provider.mjsscripts/lib/open-access.mjsscripts/lib/pdf-utils.mjsscripts/lib/provider-registry.mjsscripts/lib/provider-utils.mjsscripts/lib/publisher-providers.mjsscripts/lib/routing.mjsscripts/lib/school-config.mjsscripts/lib/settings.mjsscripts/lib/status-codes.mjsscripts/lib/wos-supporting-information.mjsscripts/retry_elsevier_api.mjssrc/config.pysrc/health_check.pysrc/schools_loader.pysrc/validators.pysrc/wizard.pytests/python/test_config_credentials.pytests/python/test_config_wizard.pytests/python/test_credential_validation.pytests/python/test_springer_services.pytests/unit/batch-cli.test.mjstests/unit/cnki.test.mjstests/unit/credentials.test.mjstests/unit/direct-download-collision.test.mjstests/unit/generic-package.test.mjstests/unit/manifest.test.mjstests/unit/metadata.test.mjstests/unit/open-access-provider.test.mjstests/unit/open-access.test.mjstests/unit/pdf-utils-atomic-write.test.mjstests/unit/provider-utils.test.mjstests/unit/publisher-providers.test.mjstests/unit/routing.test.mjstests/unit/school-config.test.mjstests/unit/springer-services.test.mjstests/unit/status-codes.test.mjstests/unit/wos-supporting-information.test.mjs
Files
.gitattributesasset139 bytes.gitignoreasset132 bytesLICENSEasset1,065 bytesREADME.mddoc7,311 bytesREADME_EN.mddoc7,040 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesSKILL.mdcore26,505 bytesagents/openai.yamlasset260 bytesassets/banner.jpgasset84,684 bytesdata/publishers.jsonasset947 bytesdata/school.schema.jsonasset3,334 bytesdata/schools.yamlasset271 bytesdocs/nature-downloader-reference-research-2026-07-15.mddoc21,863 bytesdocs/superpowers/plans/2026-06-21-nature-downloader-merge.mddoc2,964 bytesexamples/carsi-retry-template.tsvasset406 bytesexamples/manifest-template.tsvasset494 bytesexamples/publisher-verification-template.tsvasset425 bytesmanifest.yamlasset1,719 bytesreferences/delivery-verification-and-failures.mddoc7,529 bytesreferences/institutional-browser-workflow.mddoc12,486 bytesrequirements.txtdoc64 bytesscripts/batch_download.mjsruns36,282 bytesscripts/browser_pdf_downloader.mjsruns5,499 bytesscripts/cdp_open_url.mjsruns1,773 bytesscripts/configure_credentials.pyruns8,731 bytesscripts/configure_school.pyruns4,500 bytesscripts/extract_pdf_text.pyruns2,889 bytesscripts/lib/anti-bot.mjsruns34,116 bytesscripts/lib/cdp-utils.mjsruns5,277 bytesscripts/lib/cnki.mjsruns15,060 bytesscripts/lib/credentials.mjsruns2,753 bytesscripts/lib/direct-download.mjsruns2,170 bytesscripts/lib/manifest.mjsruns1,265 bytesscripts/lib/metadata.mjsruns2,148 bytesscripts/lib/open-access-provider.mjsruns4,999 bytesscripts/lib/open-access.mjsruns4,925 bytesscripts/lib/pdf-utils.mjsruns7,895 bytesscripts/lib/provider-registry.mjsruns365 bytesscripts/lib/provider-utils.mjsruns1,909 bytesscripts/lib/publisher-providers.mjsruns6,077 bytesscripts/lib/routing.mjsruns2,658 bytesscripts/lib/school-config.mjsruns1,016 bytesscripts/lib/settings.mjsruns501 bytesscripts/lib/status-codes.mjsruns7,057 bytesscripts/lib/wos-supporting-information.mjsruns9,156 bytesscripts/retry_elsevier_api.mjsruns801 bytessrc/config.pyruns5,334 bytessrc/health_check.pyruns4,383 bytessrc/schools_loader.pyruns3,703 bytessrc/validators.pyruns6,180 bytessrc/wizard.pyruns23,905 bytestests/python/test_config_credentials.pyruns1,285 bytestests/python/test_config_wizard.pyruns7,390 bytestests/python/test_credential_validation.pyruns3,290 bytestests/python/test_springer_services.pyruns5,164 bytestests/unit/batch-cli.test.mjsruns3,216 bytestests/unit/cnki.test.mjsruns2,656 bytestests/unit/credentials.test.mjsruns1,179 bytestests/unit/direct-download-collision.test.mjsruns1,990 bytestests/unit/generic-package.test.mjsruns1,799 bytestests/unit/manifest.test.mjsruns1,027 bytestests/unit/metadata.test.mjsruns1,032 bytestests/unit/open-access-provider.test.mjsruns4,707 bytestests/unit/open-access.test.mjsruns2,833 bytestests/unit/pdf-utils-atomic-write.test.mjsruns2,508 bytestests/unit/provider-utils.test.mjsruns1,426 bytestests/unit/publisher-providers.test.mjsruns5,390 bytestests/unit/routing.test.mjsruns3,995 bytestests/unit/school-config.test.mjsruns1,229 bytestests/unit/springer-services.test.mjsruns6,747 bytestests/unit/status-codes.test.mjsruns8,246 bytestests/unit/wos-supporting-information.test.mjsruns9,374 bytes
Read SKILL.md
# Nature Literature Downloader
This skill routes literature through lawful open-access, publisher-API, CNKI institutional, and browser-based institutional providers. `scripts/batch_download.mjs` is the orchestration entry point; school configuration, publisher credentials, metadata/OA resolution, provider downloads, content validation, and manifests are separate modules.
Verified routes are examples, not defaults. Every institution should start from the user's actual library resource URL, because resource portals, CAS callbacks, EZproxy, WebVPN, IP-authenticated database pages, and database detail pages reveal the live authorization path more reliably than a school name.
> **SI confirmation gate — do this first.** Before downloading any PDF, CAJ, HTML, XML, archive, or attachment, ask whether the user wants Supporting Information. An explicit request for SI counts as yes; an explicit request for正文 only counts as no. Otherwise ask once for the whole batch. Run the downloader with exactly one of `--si` or `--no-si`. Without either flag the script returns `si_confirmation_required` and does not create the output directory.
> **Main workflow.** Normalize the DOI/title and identify language and publisher before routing. Chinese literature always uses CNKI. For English Elsevier, Springer Nature, and IEEE articles with usable provider credentials, try the publisher API first and do not require an OA determination after a successful API download. If that API attempt fails, automatically check legitimate OA sources. Other English publishers check OA first, then use the institutional Web Access route when OA is unavailable.
```text
规范化 DOI/题名并识别语言、出版商
├─ 中文文献:直接走 CNKI
└─ 英文文献View the complete source on GitHubnature-experiment-log
When your agent uses it
标准化实验日志记录——直接上传或读取本地图片、语音和文字,产出带 YAML frontmatter 的 Markdown;可选集成飞书 CLI 与 Obsidian。
What it loads into context
Frontmatter
108 tokensAlways available to the agent
SKILL.md
1,804 tokensWhen the skill is activated
Reference documents
3,829 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 输入方式
- 输出方式
- 处理流程
- 目录结构
- 实验 ID 规则
- 样品批次 ID 规则
- 设备代码
- 可选的 Obsidian 集成
- 参考示例
- 可选的飞书 CLI 集成
- 自定义指南
- 相关文件
Files
README.mddoc2,212 bytesREADME_EN.mddoc2,345 bytesSKILL.mdcore6,416 bytesagents/openai.yamlasset238 bytesmanifest.yamlasset1,501 bytesreferences/example-electrochemical.mddoc1,874 bytesreferences/example-log.mddoc2,038 bytesreferences/example-thermal-stability.mddoc1,769 bytestemplates/anomaly-log.mddoc577 bytestemplates/equipment-tracking.mddoc870 bytestemplates/experiment-index.mddoc653 bytes
Read SKILL.md
# experiment-log — 实验日志标准化
## 输入方式
用户通过以下任一方式提交实验原始材料时自动加载:
- **直接上传** — 在当前会话提交图片、音频、语音转录或文字。
- **本地材料** — 提供本地文件或文件夹路径,由 agent 读取并整理。
- **飞书群** — 通过可选的 `feishu-cli-integration` 读取群消息和附件。
## 输出方式
- **本地 Markdown** — 将日志和原始附件保存到用户指定的普通本地文件夹;未指定目录时,先返回可保存的 Markdown,不擅自选择路径。
- **Obsidian vault** — 通过可选的 `obsidian` skill 写入 vault,并使用附带模板建立索引、异常记录和设备追踪。View the complete source on GitHubnature-figure
When your agent uses it
Create, revise, audit, and export manuscript scientific figures in Python or R. Use for 论文配图、科研绘图、多面板图 and submission-ready plots, or explicitly requested AI-generated graphical abstracts and mechanism schematics. Not for interactive dashboards, data cleaning, or statistics-only analysis.
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
2,605 tokensWhen the skill is activated
Reference documents
59,777 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Scripts executed separately
assets/figures4papers/figure_CellSpliceNet/plot_ablation.pyassets/figures4papers/figure_CellSpliceNet/plot_comparison.pyassets/figures4papers/figure_CellSpliceNet/plot_comparison_cross_species.pyassets/figures4papers/figure_Cflows/diffusion_swiss_roll.pyassets/figures4papers/figure_Cflows/plot_comparison_Ablation.pyassets/figures4papers/figure_Cflows/plot_comparison_GeneRegulatory.pyassets/figures4papers/figure_Cflows/plot_comparison_Trajectory.pyassets/figures4papers/figure_Dispersion/plot_idea.pyassets/figures4papers/figure_Dispersion/plot_illustration.pyassets/figures4papers/figure_FPGM/plot_freq_prior.pyassets/figures4papers/figure_ImmunoStruct/plot_bars.pyassets/figures4papers/figure_ImmunoStruct/raw_data.pyassets/figures4papers/figure_RNAGenScape/plot_comparison.pyassets/figures4papers/figure_RNAGenScape/plot_hole_manifold.pyassets/figures4papers/figure_RNAGenScape/plot_manifold.pyassets/figures4papers/figure_RNAGenScape/plot_sweep.pyassets/figures4papers/figure_VIGIL/plot_ablation.pyassets/figures4papers/figure_VIGIL/plot_comparison_radar.pyassets/figures4papers/figure_VIGIL/plot_concept.pyassets/figures4papers/figure_VIGIL/plot_posttraining.pyassets/figures4papers/figure_brainteaser/plot_brute_force.pyassets/figures4papers/figure_brainteaser/plot_correctness_by_category.pyassets/figures4papers/figure_brainteaser/plot_correctness_by_subcategory.pyassets/figures4papers/figure_brainteaser/plot_rewriting.pyassets/figures4papers/figure_brainteaser/plot_selfcorrection_math.pyassets/figures4papers/figure_ophthal_review/plot_composition.pyassets/figures4papers/figure_ophthal_review/plot_trend.pyscripts/audit_figure_collisions.pyscripts/audit_panel_alignment.pyscripts/audit_pdf_text.pyscripts/audit_svg_schematic.pyscripts/figure_safety.pyscripts/generate_openrouter_schematic.pyscripts/nature_figure_backend.pyscripts/plot_templates.pyscripts/validate_figure.pytests/test_figure_safety.pytests/test_schematic_url_safety.py
Files
.gitignoreasset10 bytesREADME.mddoc9,387 bytesREADME_EN.mddoc10,581 bytesSKILL.mdcore12,367 bytesSKILL.mdcore12,367 bytesSKILL.mdcore12,367 bytesagents/openai.yamlasset232 bytesassets/chart-atlas/atlas-01-bar-charts.pngasset125,370 bytesassets/chart-atlas/atlas-02-line-trends.pngasset423,651 bytesassets/chart-atlas/atlas-03-heatmaps.pngasset159,834 bytesassets/chart-atlas/atlas-04-scatter-bubble.pngasset485,091 bytesassets/chart-atlas/atlas-05-radar-polar.pngasset630,054 bytesassets/chart-atlas/atlas-06-distributions.pngasset233,827 bytesassets/chart-atlas/atlas-07-forest-interval.pngasset270,166 bytesassets/chart-atlas/atlas-08-area-stacked.pngasset334,735 bytesassets/chart-atlas/atlas-09-image-plates.pngasset359,027 bytesassets/chart-atlas/atlas-10-network-matrix.pngasset312,125 bytesassets/figures4papers/THIRD_PARTY_NOTICES.mddoc982 bytesassets/figures4papers/assets/Dispersion_motivation.pngasset837,657 bytesassets/figures4papers/assets/Dispersion_observation.pngasset808,992 bytesassets/figures4papers/assets/Dispersion_observation_distillation.pngasset616,612 bytesassets/figures4papers/assets/ImmunoStruct_contrastive.pngasset502,211 bytesassets/figures4papers/assets/ImmunoStruct_results_CEDAR.pngasset1,281,557 bytesassets/figures4papers/assets/ImmunoStruct_results_IEDB.pngasset956,273 bytesassets/figures4papers/assets/ImmunoStruct_schematic.pngasset972,870 bytesassets/figures4papers/assets/RNAGenScape_schematic.pngasset1,000,298 bytesassets/figures4papers/figure_CellSpliceNet/figures/ablation.pngasset355,284 bytesassets/figures4papers/figure_CellSpliceNet/figures/comparison.pngasset813,084 bytesassets/figures4papers/figure_CellSpliceNet/figures/comparison_human.pngasset880,800 bytesassets/figures4papers/figure_CellSpliceNet/figures/comparison_worm.pngasset925,266 bytesassets/figures4papers/figure_CellSpliceNet/plot_ablation.pyruns2,964 bytesassets/figures4papers/figure_CellSpliceNet/plot_comparison.pyruns3,909 bytesassets/figures4papers/figure_CellSpliceNet/plot_comparison_cross_species.pyruns6,532 bytesassets/figures4papers/figure_Cflows/diffusion_swiss_roll.pyruns3,545 bytesassets/figures4papers/figure_Cflows/figures/diffusion_swiss_roll.pngasset1,794,980 bytesassets/figures4papers/figure_Cflows/figures/fig2_comparison_GeneRegulatory.pdfasset24,757 bytesassets/figures4papers/figure_Cflows/figures/fig2_comparison_GeneRegulatory.pngasset287,419 bytesassets/figures4papers/figure_Cflows/figures/fig2_comparison_Trajectory.pdfasset19,791 bytesassets/figures4papers/figure_Cflows/figures/fig2_comparison_Trajectory.pngasset388,293 bytesassets/figures4papers/figure_Cflows/figures/figX_comparison_Ablation.pdfasset19,233 bytesassets/figures4papers/figure_Cflows/figures/figX_comparison_Ablation.pngasset328,952 bytesassets/figures4papers/figure_Cflows/plot_comparison_Ablation.pyruns2,506 bytesassets/figures4papers/figure_Cflows/plot_comparison_GeneRegulatory.pyruns3,022 bytesassets/figures4papers/figure_Cflows/plot_comparison_Trajectory.pyruns2,941 bytesassets/figures4papers/figure_Dispersion/figures/idea.pngasset384,839 bytesassets/figures4papers/figure_Dispersion/figures/illustration.pngasset762,950 bytesassets/figures4papers/figure_Dispersion/plot_idea.pyruns2,432 bytesassets/figures4papers/figure_Dispersion/plot_illustration.pyruns15,472 bytesassets/figures4papers/figure_FPGM/figures/freq_prior.pngasset641,033 bytesassets/figures4papers/figure_FPGM/plot_freq_prior.pyruns6,578 bytesassets/figures4papers/figure_ImmunoStruct/figures/bars_ablation_Cancer.pngasset816,715 bytesassets/figures4papers/figure_ImmunoStruct/figures/bars_ablation_IEDB.pngasset1,160,225 bytesassets/figures4papers/figure_ImmunoStruct/figures/bars_comparison_Cancer.pngasset799,770 bytesassets/figures4papers/figure_ImmunoStruct/figures/bars_comparison_IEDB.pngasset757,551 bytesassets/figures4papers/figure_ImmunoStruct/plot_bars.pyruns7,707 bytesassets/figures4papers/figure_ImmunoStruct/raw_data.pyruns4,459 bytesassets/figures4papers/figure_RNAGenScape/figures/manifold.pngasset108,276 bytesassets/figures4papers/figure_RNAGenScape/figures/manifold_holes.pngasset1,019,896 bytesassets/figures4papers/figure_RNAGenScape/figures/results_comparison_optimization.pngasset850,446 bytesassets/figures4papers/figure_RNAGenScape/figures/results_comparison_speed.pngasset92,362 bytesassets/figures4papers/figure_RNAGenScape/figures/results_sweep.pngasset142,120 bytesassets/figures4papers/figure_RNAGenScape/plot_comparison.pyruns11,236 bytesassets/figures4papers/figure_RNAGenScape/plot_hole_manifold.pyruns2,547 bytesassets/figures4papers/figure_RNAGenScape/plot_manifold.pyruns1,811 bytesassets/figures4papers/figure_RNAGenScape/plot_sweep.pyruns2,873 bytesassets/figures4papers/figure_VIGIL/figures/ablation_curves.pngasset600,708 bytesassets/figures4papers/figure_VIGIL/figures/comparison_posttraining.pngasset249,289 bytesassets/figures4papers/figure_VIGIL/figures/comparison_radar.pngasset809,841 bytesassets/figures4papers/figure_VIGIL/figures/concept.pngasset1,643,817 bytesassets/figures4papers/figure_VIGIL/plot_ablation.pyruns6,038 bytesassets/figures4papers/figure_VIGIL/plot_comparison_radar.pyruns7,397 bytesassets/figures4papers/figure_VIGIL/plot_concept.pyruns9,205 bytesassets/figures4papers/figure_VIGIL/plot_posttraining.pyruns2,948 bytesassets/figures4papers/figure_brainteaser/figures/brute_force.pngasset1,753,162 bytesassets/figures4papers/figure_brainteaser/figures/correctness_by_category.pngasset655,498 bytesassets/figures4papers/figure_brainteaser/figures/correctness_by_subcategory.pngasset1,100,554 bytesassets/figures4papers/figure_brainteaser/figures/rewriting.pngasset410,105 bytesassets/figures4papers/figure_brainteaser/figures/selfcorrection_math.pngasset611,488 bytesassets/figures4papers/figure_brainteaser/plot_brute_force.pyruns10,181 bytesassets/figures4papers/figure_brainteaser/plot_correctness_by_category.pyruns6,403 bytesassets/figures4papers/figure_brainteaser/plot_correctness_by_subcategory.pyruns6,505 bytesassets/figures4papers/figure_brainteaser/plot_rewriting.pyruns3,694 bytesassets/figures4papers/figure_brainteaser/plot_selfcorrection_math.pyruns4,015 bytesassets/figures4papers/figure_ophthal_review/figures/composition_heatmap.pngasset279,533 bytesassets/figures4papers/figure_ophthal_review/figures/trend_by_month.pngasset364,102 bytesassets/figures4papers/figure_ophthal_review/plot_composition.pyruns3,032 bytesassets/figures4papers/figure_ophthal_review/plot_trend.pyruns5,531 bytesassets/gallery/fig1-material-mechanism-rich.pngasset570,018 bytesassets/gallery/fig2-spatial-imaging-rich.pngasset643,666 bytesassets/gallery/fig3-in-vivo-efficacy-rich.pngasset371,419 bytesassets/gallery/fig4-single-cell-systems-rich.pngasset392,735 bytesassets/gallery/fig5-validation-perturbation-rich.pngasset408,275 bytesevals/evals.jsonasset22,195 bytesmanifest.yamlasset7,782 bytesreferences/ai-graphical-abstract-workflow.mddoc6,263 bytesreferences/api.mddoc20,759 bytesreferences/asset-adaptation.mddoc5,149 bytesreferences/backend-selection.mddoc5,937 bytesreferences/chart-types.mddoc11,883 bytesreferences/common-patterns.mddoc11,668 bytesreferences/demos.mddoc3,282 bytesreferences/design-theory.mddoc18,102 bytesreferences/figure-contract.mddoc5,703 bytesreferences/figure-legend-conventions.mddoc5,165 bytesreferences/multipanel-evidence-architecture.mddoc12,732 bytesreferences/nature-2026-observations.mddoc6,270 bytesreferences/nature-article-requirements.mddoc5,822 bytesreferences/openrouter-image-generation.mddoc5,928 bytesreferences/qa-contract.mddoc24,785 bytesreferences/r-template-index.mddoc3,903 bytesreferences/r-workflow.mddoc8,070 bytesreferences/template-catalog.mddoc2,227 bytesreferences/tutorials.mddoc8,728 bytesreferences/vector-schematic-style-rules.mddoc7,230 bytesreferences/vector-schematic-workflow.mddoc6,629 bytesrequirements.txtdoc23 bytesscripts/audit_figure_collisions.pyruns27,709 bytesscripts/audit_panel_alignment.pyruns39,469 bytesscripts/audit_pdf_text.pyruns8,586 bytesscripts/audit_svg_schematic.pyruns12,722 bytesscripts/figure_safety.pyruns2,216 bytesscripts/generate_openrouter_schematic.pyruns10,586 bytesscripts/nature_figure_backend.pyruns2,737 bytesscripts/panel_alignment.Rasset6,233 bytesscripts/plot_templates.pyruns29,761 bytesscripts/validate_figure.pyruns33,351 bytesstatic/core/contract.mddoc6,274 bytesstatic/core/stance.mddoc4,595 bytesstatic/fragments/backend/python.mddoc3,535 bytesstatic/fragments/backend/r.mddoc3,299 bytestests/test_figure_safety.pyruns7,544 bytestests/test_schematic_url_safety.pyruns2,439 bytes../nature-shared/core/nature-results-discussion.mddoc10,288 bytes../nature-shared/journal-formats/nature-machine-intelligence.mddoc18,975 bytes
Read SKILL.md
# Nature Figure Making — Router
## Routing protocol
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 0. Check for graphical-abstract and AI-schematic routes
For every graphical-abstract planning, generation, revision, or audit task that
uses AI, read
[references/ai-graphical-abstract-workflow.md](references/ai-graphical-abstract-workflow.md)
first. It owns the message/audience brief, composition and palette workflow,
policy gate, human scientific review, disclosure boundary, and provenance
requirements. A Nature Careers article is practitioner advice, not submissionView the complete source on GitHubnature-image2ppt
When your agent uses it
Reconstruct slide images, screenshots, scanned PDFs, or image-only PPTX files as object-level editable PowerPoint. Use for 图片转可编辑PPT、截图还原PPT and diagram reconstruction; not authoring a new deck from research notes.
What it loads into context
Frontmatter
61 tokensAlways available to the agent
SKILL.md
2,270 tokensWhen the skill is activated
Reference documents
25,796 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Read the local contracts progressively
- Preserve the single source of truth
- Keep every write inside its owner directory
- Preserve pre-migration behavior
- Run the workflow
- Deliver
Scripts executed separately
cli/image2ppt/__init__.pycli/image2ppt/cli.pycli/image2ppt/runtime/__init__.pycli/image2ppt/runtime/_input_normalization.pycli/image2ppt/runtime/_page_artifacts.pycli/image2ppt/runtime/build_pptx_from_manifest.pycli/image2ppt/runtime/configure_image_backend.pycli/image2ppt/runtime/deck_run_state.pycli/image2ppt/runtime/deck_text_hints.pycli/image2ppt/runtime/finalize_deck_run.pycli/image2ppt/runtime/formula_renderer.pycli/image2ppt/runtime/image_gen.pycli/image2ppt/runtime/main.pycli/image2ppt/runtime/make_page_contact_sheet.pycli/image2ppt/runtime/paddle_text_hints.pycli/image2ppt/runtime/page_job_status.pycli/image2ppt/runtime/page_text_metrics.pycli/image2ppt/runtime/prepare_deck_run.pycli/image2ppt/runtime/process_asset_sheet.pycli/image2ppt/runtime/record_imagegen_result.pycli/image2ppt/runtime/record_page_dispatch.pycli/image2ppt/runtime/record_page_result.pycli/image2ppt/runtime/remove_chroma_key.pycli/image2ppt/runtime/reset_page_job.pycli/image2ppt/runtime/runtime_env.pycli/image2ppt/runtime/split_alpha_components.pycli/image2ppt/runtime/text_hints.pycli/image2ppt/runtime/validate_pptx.pyscripts/build_page_worker_prompt.pyscripts/inspect_arrow_atomicity.pyscripts/inspect_region_decomposition.pyscripts/postprocess_manifest_arrows.pyscripts/render_image2ppt_qa.pyscripts/run_final_image2ppt_qa.pyscripts/run_image2ppt_qa.pyscripts/runtime_paths.pyscripts/visual_review_evidence.pytests/support.pytests/test_console_portability.pytests/test_deck_slide_size.pytests/test_dispatch_concurrency.pytests/test_formula_renderer.pytests/test_independence.pytests/test_input_normalization_alpha.pytests/test_input_normalization_opc_targets.pytests/test_isolated_lifecycle.pytests/test_manifest_arrows.pytests/test_migration_parity.pytests/test_multi_agent_backend.pytests/test_ocr_http.pytests/test_paddle_result_url_safety.pytests/test_page_hints.pytests/test_path_confinement.pytests/test_pdf_backend.pytests/test_project_metadata.pytests/test_quality_contracts.pytests/test_region_decomposition.pytests/test_render_guard.pytests/test_runtime_config.pytests/test_runtime_paths.pytests/test_script_inventory.pytests/test_slide_layout.pytests/test_state_e2e.pytests/test_structure_reconstruction.pytests/test_thin_profile.pytests/test_visual_review_evidence.pytests/test_visual_review_runtime.py
Files
.gitignoreasset573 bytesLICENSEasset1,107 bytesREADME.mddoc4,049 bytesREADME_EN.mddoc4,447 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesSKILL.mdcore10,064 bytesagents/openai.yamlasset272 bytescli/image2ppt/__init__.pyruns22 bytescli/image2ppt/cli.pyruns698 bytescli/image2ppt/runtime/__init__.pyruns69 bytescli/image2ppt/runtime/_input_normalization.pyruns16,262 bytescli/image2ppt/runtime/_page_artifacts.pyruns4,590 bytescli/image2ppt/runtime/build_pptx_from_manifest.pyruns55,253 bytescli/image2ppt/runtime/configure_image_backend.pyruns5,909 bytescli/image2ppt/runtime/deck_run_state.pyruns5,710 bytescli/image2ppt/runtime/deck_text_hints.pyruns6,844 bytescli/image2ppt/runtime/finalize_deck_run.pyruns3,024 bytescli/image2ppt/runtime/formula_renderer.pyruns9,871 bytescli/image2ppt/runtime/image_gen.pyruns37,829 bytescli/image2ppt/runtime/main.pyruns40,507 bytescli/image2ppt/runtime/make_page_contact_sheet.pyruns1,110 bytescli/image2ppt/runtime/paddle_text_hints.pyruns10,810 bytescli/image2ppt/runtime/page_job_status.pyruns2,147 bytescli/image2ppt/runtime/page_text_metrics.pyruns11,869 bytescli/image2ppt/runtime/prepare_deck_run.pyruns7,504 bytescli/image2ppt/runtime/process_asset_sheet.pyruns6,140 bytescli/image2ppt/runtime/record_imagegen_result.pyruns6,090 bytescli/image2ppt/runtime/record_page_dispatch.pyruns2,862 bytescli/image2ppt/runtime/record_page_result.pyruns4,574 bytescli/image2ppt/runtime/remove_chroma_key.pyruns13,858 bytescli/image2ppt/runtime/reset_page_job.pyruns2,626 bytescli/image2ppt/runtime/runtime_env.pyruns19,115 bytescli/image2ppt/runtime/split_alpha_components.pyruns9,451 bytescli/image2ppt/runtime/text_hints.pyruns14,291 bytescli/image2ppt/runtime/validate_pptx.pyruns39,588 bytescli/pyproject.tomlasset570 bytesconfig.example.yamlasset1,029 bytesmanifest.yamlasset480 bytesprompts/page-worker-base.mddoc7,552 bytesprompts/page-worker.mddoc5,231 bytesreferences/assets-provenance-contract.mddoc2,997 bytesreferences/cli-helper.mddoc18,246 bytesreferences/manifest-arrow-extension.mddoc2,569 bytesreferences/manifest-schema.mddoc20,370 bytesreferences/object-routing.mddoc3,530 bytesreferences/ocr-text-hints-contract.mddoc3,107 bytesreferences/page-decision-tree.mddoc22,228 bytesreferences/qa-contract.mddoc5,479 bytesreferences/region-decomposition.mddoc6,699 bytesreferences/runtime-dependencies.mddoc2,551 bytesreferences/workflow.mddoc6,822 bytesrequirements.txtdoc176 bytesschemas/page-manifest-v2.schema.jsonasset2,966 bytesscripts/build_page_worker_prompt.pyruns4,200 bytesscripts/inspect_arrow_atomicity.pyruns7,515 bytesscripts/inspect_region_decomposition.pyruns18,496 bytesscripts/postprocess_manifest_arrows.pyruns18,864 bytesscripts/render_image2ppt_qa.pyruns11,372 bytesscripts/run_final_image2ppt_qa.pyruns9,241 bytesscripts/run_image2ppt_qa.pyruns9,542 bytesscripts/runtime_paths.pyruns4,131 bytesscripts/visual_review_evidence.pyruns5,580 bytestests/support.pyruns6,539 bytestests/test_console_portability.pyruns1,021 bytestests/test_deck_slide_size.pyruns1,153 bytestests/test_dispatch_concurrency.pyruns2,919 bytestests/test_formula_renderer.pyruns4,358 bytestests/test_independence.pyruns2,244 bytestests/test_input_normalization_alpha.pyruns2,371 bytestests/test_input_normalization_opc_targets.pyruns1,978 bytestests/test_isolated_lifecycle.pyruns9,754 bytestests/test_manifest_arrows.pyruns8,832 bytestests/test_migration_parity.pyruns3,293 bytestests/test_multi_agent_backend.pyruns82,755 bytestests/test_ocr_http.pyruns17,065 bytestests/test_paddle_result_url_safety.pyruns3,259 bytestests/test_page_hints.pyruns10,688 bytestests/test_path_confinement.pyruns7,682 bytestests/test_pdf_backend.pyruns4,412 bytestests/test_project_metadata.pyruns4,778 bytestests/test_quality_contracts.pyruns9,279 bytestests/test_region_decomposition.pyruns6,357 bytestests/test_render_guard.pyruns2,489 bytestests/test_runtime_config.pyruns2,652 bytestests/test_runtime_paths.pyruns2,231 bytestests/test_script_inventory.pyruns2,186 bytestests/test_slide_layout.pyruns9,539 bytestests/test_state_e2e.pyruns8,026 bytestests/test_structure_reconstruction.pyruns12,822 bytestests/test_thin_profile.pyruns4,059 bytestests/test_visual_review_evidence.pyruns2,355 bytestests/test_visual_review_runtime.pyruns2,976 bytes
Read SKILL.md
# Nature Image2PPT
Use this directory as the complete runtime. Run deterministic actions only through:
```bash
python <image2ppt-root>/cli/image2ppt/cli.py <command> ...
```
Use Python 3.10 or later with `requirements.txt` installed. When a dedicated
environment exists, substitute `<image2ppt-root>/.venv/bin/python` on macOS/Linux
or `<image2ppt-root>/.venv/Scripts/python.exe` on Windows for every `python`
command below. Do not continue after a failed `doctor`; install only the reported
missing dependency, then rerun it.
View the complete source on GitHubnature-literature-pipeline
When your agent uses it
Complete automated literature discovery pipeline: multi-source search → six-dimension scoring → fine reading → formatted delivery → archival. Combines a configurable engine with daily cron-driven application layer. Works with Feishu, Telegram, or any messaging platform.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
1,126 tokensWhen the skill is activated
Reference documents
1,641 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What It Does
- Quick Start
- Architecture
- Configuration
- Built-in Safeguards
- Related Skills
- References
- Pitfalls
Scripts executed separately
references/cron-setup.mdreferences/gap-analysis.mdreferences/note-template.mdreferences/push-format.mdreferences/review-compilation-workflow.mdtemplates/literature-push-template.md
Files
README.mddoc2,111 bytesREADME_EN.mddoc2,340 bytesSKILL.mdcore4,770 bytesSKILL.mdcore4,770 bytesagents/openai.yamlasset273 bytesmanifest.yamlasset1,691 bytesreferences/cron-setup.mdruns2,820 bytesreferences/gap-analysis.mdruns2,442 bytesreferences/note-template.mdruns4,793 bytesreferences/push-format.mdruns3,525 bytesreferences/review-compilation-workflow.mdruns4,602 bytesreferences/scoring-system.mddoc2,503 bytestemplates/literature-push-template.mdruns5,009 bytes
Read SKILL.md
# Nature Literature Pipeline
A complete, production-tested automated literature pipeline. Not just "search for papers" — it's a structured engine that scores, classifies, reads, delivers, and archives research papers daily.
## What It Does
```
Cron (daily trigger, e.g. 08:30)
│
├─ ① SEARCH (30 candidates)
│ arXiv / OpenAlex / Crossref / Semantic Scholar (auto-degradation)
│
├─ ② COARSE FILTER (30 → 5)
│ Six-dimension scoring: topic match × 35 + methodology × 20View the complete source on GitHubnature-paper-card
When your agent uses it
Build a structured deep-reading Paper Card for one scientific paper, analysing methods, experiment-to-claim evidence, limitations, and research ideas. Use for 论文精读卡、方法拆解、证据链分析; not full-paper bilingual translation or formal peer review.
What it loads into context
Frontmatter
63 tokensAlways available to the agent
SKILL.md
1,727 tokensWhen the skill is activated
Reference documents
6,987 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
- Script red lines
- Relationship to adjacent skills
Scripts executed separately
scripts/audit_paper_card.pyscripts/prepare_paper.pytests/test_audit_page_ranges.pytests/test_prepare_paper.py
Files
README.mddoc3,863 bytesREADME_EN.mddoc4,348 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesSKILL.mdcore8,368 bytesagents/openai.yamlasset244 bytesevals/evals.jsonasset3,030 bytesmanifest.yamlasset2,755 bytesreferences/card-schema.mddoc5,296 bytesreferences/evidence-and-provenance.mddoc2,918 bytesreferences/research-idea-gates.mddoc1,204 bytesscripts/audit_paper_card.pyruns15,382 bytesscripts/prepare_paper.pyruns17,979 bytesstatic/core/output-contract.mddoc2,890 bytesstatic/core/principles.mddoc2,412 bytesstatic/core/workflow.mddoc5,636 bytesstatic/fragments/paper_type/clinical.mddoc722 bytesstatic/fragments/paper_type/discovery.mddoc614 bytesstatic/fragments/paper_type/materials.mddoc710 bytesstatic/fragments/paper_type/methods.mddoc873 bytesstatic/fragments/paper_type/resource.mddoc837 bytesstatic/fragments/paper_type/review.mddoc764 bytestests/test_audit_page_ranges.pyruns2,679 bytestests/test_prepare_paper.pyruns5,773 bytes
Read SKILL.md
# Nature Paper Card - Router
Use this skill to turn one paper into an evidence-grounded research card, not a translated abstract, generic summary, reviewer report, or publication article.
The skill uses:
- a static core under `static/core/` for principles, workflow, and the fixed output contract;
- one paper-type fragment under `static/fragments/paper_type/`;
- on-demand references for evidence labels, the exact card schema, and research-idea checks.
## Routing protocol
Follow these steps every time.
View the complete source on GitHubnature-paper-to-patent
When your agent uses it
Turn research papers or inventor materials into evidence-grounded Chinese invention patent drafts and technical disclosures. Use for 技术交底书、专利撰写、现有技术对比 and Chinese DOCX patent packages; not general manuscript writing.
What it loads into context
Frontmatter
61 tokensAlways available to the agent
SKILL.md
964 tokensWhen the skill is activated
Reference documents
32,351 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Load the workflow
- 2. Preserve source grounding
- 3. Draft through stage gates
- 4. Produce Chinese formal documents
- 5. Validate before delivery
Scripts executed separately
scripts/audit_claims.pyscripts/build_patent_package.pyscripts/disclosure/cnipa_epub_crawler.pyscripts/disclosure/cnipa_epub_parse.pyscripts/disclosure/cnipa_epub_search.pyscripts/disclosure/docx_to_md.pyscripts/disclosure/iteration_dialog_log.pyscripts/disclosure/math_render.pyscripts/disclosure/md_to_docx.pyscripts/disclosure/mermaid_render.pyscripts/disclosure/package.jsonscripts/disclosure/pptx_to_md.pyscripts/extract_pdf_text.pyscripts/init_patent_project.pyscripts/math_to_omml.pyscripts/render_flowchart_svg.pyscripts/render_patent_docx.pyscripts/validate_patent_draft.pytests/test_audit_claims.pytests/test_inline_math_paren.pytests/test_math_to_omml_superscript.pytests/test_md_to_docx_source_overwrite.pytests/test_mermaid_render.pytests/test_validation.pytests/test_validation_figure_node_ids.py
Files
README.mddoc2,996 bytesREADME_EN.mddoc3,411 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesagents/openai.yamlasset248 bytesevals/evals.jsonasset1,579 bytesmanifest.yamlasset3,170 bytesreferences/cn-patent-drafting-guide.mddoc8,141 bytesreferences/corpus-derived-patterns.mddoc3,546 bytesreferences/corpus-pair-audit.mddoc3,005 bytesreferences/disclosure/correction_handler.mddoc2,875 bytesreferences/disclosure/disclosure_builder.mddoc12,434 bytesreferences/disclosure/disclosure_preview.mddoc917 bytesreferences/disclosure/disclosure_self_check.mddoc6,068 bytesreferences/disclosure/intake.mddoc943 bytesreferences/disclosure/iteration_context.mddoc4,366 bytesreferences/disclosure/merger.mddoc3,437 bytesreferences/disclosure/patent-disclosure-skill-MIT-LICENSE.txtdoc1,070 bytesreferences/disclosure/patent_points_analyzer.mddoc951 bytesreferences/disclosure/prior_art_search.mddoc10,638 bytesreferences/disclosure/project_scan.mddoc3,657 bytesreferences/disclosure/template_reference.mddoc9,470 bytesreferences/disclosure/tooling.mddoc16,630 bytesreferences/draft-schema.mddoc9,237 bytesreferences/patent-figure-guide.mddoc2,935 bytesrequirements.txtdoc121 bytesscripts/audit_claims.pyruns6,588 bytesscripts/build_patent_package.pyruns6,624 bytesscripts/disclosure/cnipa_epub_crawler.pyruns10,790 bytesscripts/disclosure/cnipa_epub_parse.pyruns8,826 bytesscripts/disclosure/cnipa_epub_search.pyruns5,889 bytesscripts/disclosure/docx_to_md.pyruns3,835 bytesscripts/disclosure/iteration_dialog_log.pyruns3,245 bytesscripts/disclosure/math_render.pyruns13,043 bytesscripts/disclosure/md_to_docx.pyruns32,941 bytesscripts/disclosure/mermaid_render.pyruns15,595 bytesscripts/disclosure/package-lock.jsonasset86,430 bytesscripts/disclosure/package.jsonruns279 bytesscripts/disclosure/pptx_to_md.pyruns5,040 bytesscripts/disclosure/requirements-cnipa.txtdoc172 bytesscripts/extract_pdf_text.pyruns2,362 bytesscripts/init_patent_project.pyruns3,179 bytesscripts/math_to_omml.pyruns4,870 bytesscripts/render_flowchart_svg.pyruns14,626 bytesscripts/render_patent_docx.pyruns10,589 bytesscripts/validate_patent_draft.pyruns14,955 bytesstatic/core/output-contract.mddoc2,007 bytesstatic/core/principles.mddoc1,016 bytesstatic/core/workflow.mddoc3,920 bytesstatic/fragments/invention/algorithm-software.mddoc366 bytesstatic/fragments/invention/apparatus-system.mddoc288 bytesstatic/fragments/invention/mixed.mddoc255 bytesstatic/fragments/invention/process-material.mddoc278 bytesstatic/fragments/source/mixed-project.mddoc369 bytesstatic/fragments/source/pasted-text.mddoc316 bytesstatic/fragments/source/pdf-text.mddoc290 bytesstatic/fragments/source/scanned-pdf.mddoc272 bytesstatic/fragments/task/claim-set.mddoc249 bytesstatic/fragments/task/disclosure-analysis.mddoc236 bytesstatic/fragments/task/disclosure-iteration.mddoc1,005 bytesstatic/fragments/task/full-draft.mddoc247 bytesstatic/fragments/task/paper-patent-audit.mddoc280 bytesstatic/fragments/task/technical-disclosure.mddoc1,587 bytestests/test_audit_claims.pyruns1,661 bytestests/test_inline_math_paren.pyruns1,789 bytestests/test_math_to_omml_superscript.pyruns2,231 bytestests/test_md_to_docx_source_overwrite.pyruns1,406 bytestests/test_mermaid_render.pyruns2,356 bytestests/test_validation.pyruns6,104 bytestests/test_validation_figure_node_ids.pyruns614 bytes
Read SKILL.md
# Paper to Chinese Patent
Use this file as the router for the patent-drafting workflow. Do not draft the
application directly from the paper abstract or contribution list.
## 1. Load the workflow
Read `manifest.yaml`, then read every file under `always_load`.
Detect these axes from the user's files and request:
- `source_format`: selectable PDF, scanned PDF, pasted text, or mixed project;
- `task_mode`: full draft, claim set, disclosure analysis, technical
disclosure, disclosure iteration, or paper-patent audit;View the complete source on GitHubnature-paper-trans
When your agent uses it
将英文论文 PDF 的指定页面或全文逐页翻译为简体中文图片型 PDF,尽量保留原文的版式、分栏、图表和公式;最终仅交付中文 PDF。用于论文阅读翻译,不用于可编辑 Word 重建或逐字审校。
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
2,538 tokensWhen the skill is activated
Reference documents
3,672 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 输入与输出
- 执行约定
- 工具与资源
- 工作流程
- 异常与续跑
- 交付格式
Scripts executed separately
scripts/pages.pytests/test_json_channel.pytests/test_pages.pytests/test_pdf_publication.pytests/test_review_gate.py
Files
README.mddoc4,189 bytesREADME_EN.mddoc4,850 bytesSKILL.mdcore9,521 bytesSKILL.mdcore9,521 bytesSKILL.mdcore9,521 bytesSKILL.mdcore9,521 bytesSKILL.mdcore9,521 bytesSKILL.mdcore9,521 bytesagents/openai.yamlasset362 bytesassets/banner.pngasset1,237,745 bytesmanifest.yamlasset669 bytesreferences/image-translation-prompt.mddoc5,992 bytesrequirements.txtdoc23 bytesscripts/pages.pyruns45,702 bytestests/test_json_channel.pyruns1,244 bytestests/test_pages.pyruns33,789 bytestests/test_pdf_publication.pyruns1,542 bytestests/test_review_gate.pyruns2,163 bytes
Read SKILL.md
# 论文 PDF 翻译
逐页生成中文页面,对照源页检查并记录结果后,按原页序合并为一个图片型 PDF。默认保持源 PDF 每页的原始尺寸、方向和宽高比;只有用户明确要求时才统一转换为 A4。每页在本次任务中只调用一次生图;检查不增加生图机会,不自动修复。不交付逐页检查 Markdown,检查记录保存在任务账本中。
## 输入与输出
- 输入:英文论文 PDF,可选页码范围、已确认译文或术语表。未指定页码时处理全文。
- 页码:采用从 1 开始的 PDF 实际页序,去重并按原文排序。仅在文件不明确、页码有歧义或越界时询问。
- 输出:只交付一个简体中文图片型 PDF,按原文页序排列。默认逐页保留源 PDF 的页面尺寸、方向、比例和页面边界;图片在对应原页面内等比例居中,必要时只补页面内部白边。用户明确指定 A4 时,才将页面统一适配到 A4。
- 质量目标:内容完整、区域归属正确、主要版面关系可读。生图模型负责辨读、翻译和版式适配;不承诺像素级 1:1 或逐字准确。
## 执行约定
- 每页在本次用户任务中只有 **1 次生图机会**。预留即占用次数,失败或结果不明也不返还;没有自动修正、技术重试、多候选或自动择优。View the complete source on GitHubnature-paper-xray
When your agent uses it
Read one supplied paper closely enough to reconstruct how its authors actually got there, rather than restating what the abstract claims. Use for 精读论文, 讲透这篇论文, 把这篇读懂, 作者为什么这么设计, 这个公式怎么推出来的, paper x-ray, and deep single-paper comprehension before building on, reviewing, presenting, or citing that paper. Recovers the real starting point and the bet the authors placed, separates load-bearing design from decoration, grounds each key formula in a worked micro-example with concrete numbers, and checks how far the evidence actually reaches, including where the authors are confident and where the paper does not report something. Delivers a structured Markdown long-read by default. Not a summary, not a translation, not a peer review.
What it loads into context
Frontmatter
182 tokensAlways available to the agent
SKILL.md
1,286 tokensWhen the skill is activated
Reference documents
3,608 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Default stance
- Workflow
- Paper-type adaptation
- Boundaries
- Output discipline
Files
README.mddoc3,243 bytesREADME_EN.mddoc3,749 bytesSKILL.mdcore6,190 bytesSKILL.mdcore6,190 bytesSKILL.mdcore6,190 bytesagents/openai.yamlasset395 bytesmanifest.yamlasset1,147 bytesreferences/deep-reading-protocol.mddoc3,518 bytesreferences/evidence-boundary.mddoc3,396 bytes../nature-shared/core/paper-type-taxonomy.mddoc2,435 bytes
Read SKILL.md
# Nature Paper X-Ray
Read a paper the way a researcher explains it at a whiteboard to a colleague: what the authors saw, why they believed it, where they hesitated, what they gave up, and which numbers would change the conclusion.
The delivered artifact is a Markdown long-read. A section-by-section summary of the paper is a failure mode, not a fallback.
## Default stance
- The method section is a teaching order, not the order the work happened in. The introduction's story is arranged after the fact. The contribution list is written for reviewers.
- The judgments that decided the paper — what the authors noticed, why they trusted it, what they abandoned — are mostly not written down. Recovering them is the job.
- Every figure was chosen. Ask what the authors want a reader to believe from this one, then look for details inside it that do not support that reading.
- A figure contains its own counter-evidence more often than the text does: a curve that crosses later, an error bar wider than the gap between compared methods, a log axis hiding a constant-factor difference, one seed standing in for a variance claim.
- Name a mechanism or say the paper does not name one. Do not supply a motive the authors never stated.
View the complete source on GitHubnature-paper2ppt
When your agent uses it
Create or improve a Chinese academic PPTX from a scientific paper or research reading notes, with source figures and speaker notes. Use for 论文做PPT、文献汇报、组会PPT and paper-based conference or defense presentations.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
924 tokensWhen the skill is activated
Reference documents
12,322 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Scripts executed separately
scripts/audit_pptx_quality.py
Files
README.mddoc1,851 bytesREADME_EN.mddoc2,139 bytesSKILL.mdcore4,269 bytesSKILL.mdcore4,269 bytesagents/openai.yamlasset254 bytesmanifest.yamlasset2,860 bytesreferences/design-and-layout.mddoc14,768 bytesreferences/figure-assets.mddoc4,693 bytesreferences/self-review.mddoc6,919 bytesscripts/audit_pptx_quality.pyruns15,526 bytesstatic/core/output-and-quality.mddoc5,314 bytesstatic/core/principles.mddoc3,106 bytesstatic/core/toolchain.mddoc2,601 bytesstatic/core/workflow.mddoc6,384 bytesstatic/fragments/paper_type/clinical.mddoc1,210 bytesstatic/fragments/paper_type/discovery.mddoc1,300 bytesstatic/fragments/paper_type/materials.mddoc1,221 bytesstatic/fragments/paper_type/methods.mddoc1,275 bytesstatic/fragments/paper_type/resource.mddoc1,162 bytesstatic/fragments/paper_type/review.mddoc1,035 bytes../nature-shared/core/terminology-ledger.mddoc2,768 bytes
Read SKILL.md
# Paper-to-PPTX — Router
## Routing protocol
For an edit to an existing deck, reuse its paper source, narrative, terminology, and assets.
Change the requested slides and any affected cross-slide references; do not rerun paper intake
or rebuild the deck's story unless the request requires it. Inspect changed slides and run the
existing final PPTX audit before delivery. A requested outline or explanation alone does not
require creating a deck.
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 1. Load the manifest and the core layer
View the complete source on GitHubnature-paper2word
When your agent uses it
Compile an academic Markdown manuscript into a journal- or school-compliant Word (.docx): declared typography, native OMML equations, three-line tables, cross-references, per-section page numbers, CSL bibliographies (GB/T 7714, APA, Nature, IEEE), and pre/post-export quality gates. 把学术论文的 Markdown 稿件导出为符合期刊或学位论文规范的 Word:摘要、公式编号、三线表、题注、交叉引用、目录域、参考文献。Use when the user wants a submission-ready .docx — 论文转 Word、学位论文排版、期刊投稿排版、prepare submission docx — or a readable copy of a manuscript. Not for PDF, HTML or LaTeX output, and not for slide decks or grant forms.
What it loads into context
Frontmatter
184 tokensAlways available to the agent
SKILL.md
2,689 tokensWhen the skill is activated
Reference documents
1,744 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Decide the scenario first
- 2. Bring the manuscript to the input contract
- 3. Choose or build the format requirements
- 4. Export
- 5. How to read the gates
- 6. Verify before delivery
- 7. Boundaries
- 8. Related skills
Files
README.mddoc3,352 bytesREADME_EN.mddoc3,760 bytesSKILL.mdcore11,098 bytesSKILL.mdcore11,098 bytesSKILL.mdcore11,098 bytesUPSTREAM-LICENSE.txtdoc1,340 bytesagents/openai.yamlasset241 bytesmanifest.yamlasset390 bytes
Read SKILL.md
# Markdown → compliant Word
This file is the router. The engine is deterministic: the same manuscript and the same format
requirements always produce a byte-identical `.docx`. Do not substitute a hand-written
python-docx script; run the installed pipeline.
**Before the first export in a session, confirm the engine is available**: `md-to-word --version`
must print a version. This skill ships documentation only; if the command is missing, install it
with `pip install md-to-word-docx`, then run the check again.
**The full vocabulary lives in the manual inside the package**, not here. `md-to-word --contract`
prints its absolute path (Chinese or English, following the manuscript). Everything below is order
of work; every spelling is looked up in the manual.
View the complete source on GitHubnature-polishing
When your agent uses it
Polish, translate, or tighten existing academic prose while preserving facts, terminology, and evidence boundaries. Use for 论文润色、学术翻译、正文精简, or manuscript LaTeX layout fixes. Use nature-writing when the main task is drafting new sections or rebuilding the manuscript argument.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
1,265 tokensWhen the skill is activated
Reference documents
30,690 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Files
README.mddoc3,677 bytesREADME_EN.mddoc4,282 bytesSKILL.mdcore6,091 bytesagents/openai.yamlasset263 bytesmanifest.yamlasset6,568 bytesreferences/latex-layout.mddoc10,636 bytesreferences/nat-comms-2025-diction.mddoc4,009 bytesreferences/phrasebank-playbook.mddoc4,156 bytesreferences/published-article-patterns.mddoc4,719 bytesreferences/section-moves.mddoc6,000 bytesreferences/style-guardrails.mddoc2,669 bytesreferences/writing-strategy.mddoc4,856 bytesstatic/core/failure-modes.mddoc1,337 bytesstatic/core/output-format.mddoc840 bytesstatic/core/stance.mddoc1,672 bytesstatic/fragments/journal/generic.mddoc1,022 bytesstatic/fragments/journal/nat-comms.mddoc2,457 bytesstatic/fragments/journal/nat-mach-intell.mddoc4,711 bytesstatic/fragments/journal/nature.mddoc1,185 bytesstatic/fragments/language/en.mddoc1,214 bytesstatic/fragments/language/zh-to-en.mddoc1,241 bytesstatic/fragments/paper_type/algorithmic.mddoc953 bytesstatic/fragments/paper_type/hypothesis.mddoc765 bytesstatic/fragments/paper_type/methods.mddoc806 bytesstatic/fragments/paper_type/research.mddoc785 bytesstatic/fragments/paper_type/review.mddoc994 bytesstatic/fragments/section/abstract.mddoc1,139 bytesstatic/fragments/section/conclusion.mddoc512 bytesstatic/fragments/section/discussion.mddoc1,714 bytesstatic/fragments/section/intro.mddoc1,292 bytesstatic/fragments/section/methods.mddoc815 bytesstatic/fragments/section/results.mddoc2,808 bytesstatic/fragments/section/title.mddoc645 bytes../nature-shared/core/consistency-sweep.mddoc7,990 bytes../nature-shared/core/discussion-argument-language.mddoc9,457 bytes../nature-shared/core/main-text-discipline.mddoc9,168 bytes../nature-shared/core/nature-abstract.mddoc7,951 bytes../nature-shared/core/nature-introduction.mddoc7,680 bytes../nature-shared/core/nature-results-discussion.mddoc10,288 bytes../nature-shared/journal-formats/nature-machine-intelligence.mddoc18,975 bytes
Read SKILL.md
# Nature-Style Academic Polishing — Router
## Routing protocol
For a new polishing task, follow the routing below. For follow-up edits, reuse established task choices and already loaded guidance; read additional fragments only when the requested scope changes.
### 1. Load the manifest and the core layer
Read [manifest.yaml](manifest.yaml). It declares the axes (`paper_type`, `section`, `language`, `journal`), the allowed values, and the file paths each value maps to.
Also read every file listed under `always_load`. These hold the default stance, failure-mode diagnosis, ethics, and output format that apply to every polish job.
### 2. Detect the axis values for this request
View the complete source on GitHubresearchwrite
When your agent uses it
Compose, revise, or audit research proposals, opening reports, and research plans from supporting evidence. Use for 研究计划、开题报告、科研项目申请书. Invoked as researchwrite for compatibility; use nature-writing for general manuscript sections.
What it loads into context
Frontmatter
104 tokensAlways available to the agent
SKILL.md
1,912 tokensWhen the skill is activated
Reference documents
19,129 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 核心原则
- 模式分派
- 项目结构
- Reference 文件索引
- 运行交付
- QA Mode — 四层质量保障 Pipeline
- 配置你的研究域
Scripts executed separately
scripts/build_proposal_docx.pytemplates/00_scope.mdtemplates/01_research_canon.mdtemplates/02_evidence_table.mdtemplates/03_argument_map.mdtemplates/04_section_contracts.mdtemplates/05_style_guide.mdtemplates/qa_report.mdtemplates/revision_brief.mdtests/test_source_preservation.pytests/test_table_delimiters.py
Files
README.mddoc2,666 bytesREADME_EN.mddoc3,019 bytesSKILL.mdcore6,888 bytesagents/openai.yamlasset254 bytesmanifest.yamlasset4,568 bytesreferences/chinese-review-writing-style.mddoc4,363 bytesreferences/compose-mode.mddoc11,364 bytesreferences/evaluation-rubric.mddoc6,514 bytesreferences/export-archive.mddoc1,763 bytesreferences/foundation-files.mddoc1,129 bytesreferences/gpt-handoff-revision-brief.mddoc1,401 bytesreferences/hybrid-mode.mddoc560 bytesreferences/partial-proposal-scope.mddoc1,594 bytesreferences/professor-dispatch.mddoc5,782 bytesreferences/project-structure.mddoc870 bytesreferences/ref-renumbering-cascade.mddoc1,747 bytesreferences/research-anti-slop.mddoc1,096 bytesreferences/review-critique-methodology.mddoc8,286 bytesreferences/review-paper-framework.mddoc8,119 bytesreferences/revise-mode.mddoc8,873 bytesreferences/stopping-rules.mddoc497 bytesreferences/validation-checklist.mddoc1,765 bytesreferences/within-approved-proposal.mddoc4,878 bytesreferences/worked-example-quaternary-proposal.mddoc3,596 bytesreferences/降承诺提案模式.mddoc2,302 bytesscripts/build_proposal_docx.pyruns7,264 bytestemplates/00_scope.mdruns339 bytestemplates/01_research_canon.mdruns192 bytestemplates/02_evidence_table.mdruns200 bytestemplates/03_argument_map.mdruns389 bytestemplates/04_section_contracts.mdruns140 bytestemplates/05_style_guide.mdruns226 bytestemplates/qa_report.mdruns344 bytestemplates/revision_brief.mdruns190 bytestests/test_source_preservation.pyruns1,837 bytestests/test_table_delimiters.pyruns1,448 bytes
Read SKILL.md
# researchwrite — proposal-first 科研写作 pipeline
受 autonovel(状态机+打分)、professor(动态专家)、brainstorming(入口追问)、anti-AI-writing(语言清理)启发的科研写作状态机。**不是通用"帮我写论文"prompt。**
`researchwrite` 是为兼容既有安装保留的触发名称,仓库目录名仍为
`nature-proposal-writer`。不要在没有迁移方案时修改 frontmatter 名称。需要初始化模板、
按条件加载参考资料或执行导出脚本时,先读取 `manifest.yaml`,只加载与当前条件匹配的路径。
## 核心原则
1. **证据先于文字** — 起草前必须建立或读取 `research_canon` 和 `evidence_table`
2. **论证先于章节** — 写正文前必须完成 `argument_map`
3. **契约先于段落** — 每节需要 purpose / allowed claims / forbidden claims / inputs / validation
4. **范围先于完备** — 如果是分阶段写作,先锁定阶段边界View the complete source on GitHubnature-reader
When your agent uses it
Create source-grounded Chinese-English paper readers with aligned text, figures, tables, and equations. Use for 全文翻译、中英文对照、论文精读 or source-linked questions about a paper; respect a requested excerpt or question without generating a full reader.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
832 tokensWhen the skill is activated
Reference documents
9,671 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Scripts executed separately
scripts/validate_reader_math.py
Files
README.mddoc2,108 bytesREADME_EN.mddoc2,398 bytesSKILL.mdcore3,902 bytesSKILL.mdcore3,902 bytesSKILL.mdcore3,902 bytesSKILL.mdcore3,902 bytesSKILL.mdcore3,902 bytesSKILL.mdcore3,902 bytesagents/openai.yamlasset218 bytesevals/evals.jsonasset3,601 bytesmanifest.yamlasset2,194 bytesreferences/article-anatomy.mddoc3,363 bytesreferences/equation-handling.mddoc5,214 bytesreferences/figure-extraction.mddoc2,054 bytesreferences/grounding-rules.mddoc2,259 bytesreferences/output-spec.mddoc4,967 bytesscripts/validate_reader_math.pyruns17,840 bytesstatic/core/output-contract.mddoc2,159 bytesstatic/core/principles.mddoc3,807 bytesstatic/core/workflow.mddoc5,213 bytesstatic/fragments/source/doi-arxiv.mddoc1,251 bytesstatic/fragments/source/html.mddoc1,206 bytesstatic/fragments/source/pasted-text.mddoc1,236 bytesstatic/fragments/source/pdf-text.mddoc1,295 bytesstatic/fragments/source/scanned-pdf.mddoc1,230 bytes../nature-shared/core/terminology-ledger.mddoc2,768 bytes
Read SKILL.md
# Full-Paper Markdown Reader — Router
## Routing protocol
First distinguish creating a reader from answering a question or translating an excerpt.
For a source-linked question, read `references/grounding-rules.md` and inspect only the relevant
source material; reuse existing source-map IDs when available. Do not regenerate the reader or
require a full source map before answering. For an explicit excerpt request, apply extraction,
translation, and grounding rules to that excerpt. The full-artifact workflow below applies when
the user requests a reader or full-paper translation.
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 1. Load the manifest and the core layerView the complete source on GitHubnature-ref-verifier
When your agent uses it
对学术文献逐条执行多源交叉验证,逐字段对比作者、标题、年份、卷期、页码, 标记卷年/DOI年冲突、作者顺序异常、页码偏差等问题,输出结构化验证报告。 可批量处理整篇论文/开题报告的参考文献列表,也可单条校验,支持与 Zotero 同步修正。
What it loads into context
Frontmatter
105 tokensAlways available to the agent
SKILL.md
2,834 tokensWhen the skill is activated
Reference documents
2,052 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 触发词
- 适用场景
- 工作流
- 多来源交叉验证策略
- 已知局限与应对
- 环境依赖
Files
README.mddoc1,930 bytesREADME_EN.mddoc2,089 bytesSKILL.mdcore9,756 bytesagents/openai.yamlasset258 bytesmanifest.yamlasset793 bytesreferences/common-patterns.mddoc3,623 bytes
Read SKILL.md
# nature-ref-verifier — 学术参考文献多源验证技能
需要处理批量差异、反复出现的字段错误、DOI/标题冲突、作者顺序异常、页码漂移或
报告措辞时,读取 `references/common-patterns.md`。其他任务不要预加载该文件;
`manifest.yaml` 记录了同一按需路由,新增资源时必须同时在本文件中写明加载条件。
## 触发词
`verify references`、`校验文献`、`check references`、`核对参考文献`、`文献验证`、`ref check`
## 适用场景
- 开题报告/论文提交前,对全部参考文献做最终核查
- 收到审稿意见指出引用错误时,精准定位问题View the complete source on GitHubnature-response
When your agent uses it
Draft, audit, or revise responses to peer review, revision cover letters, and marked-manuscript or LaTeX revision packages. Use for 审稿意见回复、逐点回复、返修信、 rebuttals and edits to existing response drafts. Initial-submission materials belong to nature-writing; simulated peer review belongs to nature-reviewer.
What it loads into context
Frontmatter
86 tokensAlways available to the agent
SKILL.md
1,222 tokensWhen the skill is activated
Reference documents
27,188 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
Scripts executed separately
scripts/check_package_consistency.pytests/test_package_consistency.pytests/test_response_instruction_contracts.py
Files
README.mddoc3,843 bytesREADME_EN.mddoc4,272 bytesSKILL.mdcore5,970 bytesSKILL.mdcore5,970 bytesagents/openai.yamlasset248 bytesexamples/conflicting-reviewers.mddoc1,882 bytesexamples/major-revision-with-missing-evidence.mddoc1,502 bytesexamples/minor-revision.mddoc1,848 bytesmanifest.yamlasset4,189 bytesreferences/action-mapping.mddoc8,166 bytesreferences/chinese-author-alignment.mddoc3,341 bytesreferences/comment-taxonomy.mddoc4,168 bytesreferences/difficult-cases.mddoc5,817 bytesreferences/intake-and-routing.mddoc9,829 bytesreferences/latex-templates.mddoc3,172 bytesreferences/package-consistency-audit.mddoc10,721 bytesreferences/qa-checklist.mddoc7,400 bytesreferences/response-structure.mddoc8,851 bytesreferences/source-basis.mddoc3,432 bytesreferences/tone-and-stance.mddoc4,760 bytesscripts/check_package_consistency.pyruns10,364 bytesstatic/core/stance.mddoc5,867 bytesstatic/core/workflow.mddoc9,859 bytestemplates/cover-letter.texasset1,429 bytestemplates/response-to-reviewers.texasset2,066 bytestemplates/revised-manuscript-redline.texasset1,343 bytestests/conflicting-reviewers.mddoc2,534 bytestests/defensive-draft-audit.mddoc2,380 bytestests/evaluation-summary.mddoc3,067 bytestests/impossible-experiment.mddoc1,673 bytestests/local-edit-without-decision.mddoc1,210 bytestests/major-revision-missing-evidence.mddoc1,818 bytestests/minor-revision.mddoc1,396 bytestests/reviewer-visibility.mddoc1,934 bytestests/rubric.mddoc5,974 bytestests/task-status-tracking.mddoc1,263 bytestests/test_package_consistency.pyruns7,572 bytestests/test_response_instruction_contracts.pyruns1,424 bytestests/unclear-decision-type.mddoc1,528 bytes../nature-shared/core/main-text-discipline.mddoc9,168 bytes
Read SKILL.md
# Nature Reviewer Response — Router
## Routing protocol
For a new task, load the core and matching resources below. Reuse already loaded guidance on follow-ups; load more only when the task needs it.
### 1. Load the manifest and the core layer
Read [manifest.yaml](manifest.yaml). Then read every file listed under `always_load`:
- `static/core/stance.md` — the editor-facing purpose, the default stance, the red lines, and the source hierarchy that apply to every response job.
- `static/core/workflow.md` — accepted inputs, the revision correspondence workflow, and the output package format.
### 2. No content axis — identify mode and language inlineView the complete source on GitHubnature-reviewer
When your agent uses it
Provide evidence-grounded mock peer review of scientific manuscripts or excerpts, covering significance, validity, and major/minor concerns. Use for 模拟审稿、投稿前自审、审稿人视角评估; not author rebuttal drafting.
What it loads into context
Frontmatter
59 tokensAlways available to the agent
SKILL.md
2,583 tokensWhen the skill is activated
Reference documents
18,631 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Default stance
- Accepted inputs
- Workflow
- Output format
- Red lines
- Related files
- Source hierarchy
Scripts executed separately
tests/test_reviewer_instruction_contracts.py
Files
CHANGELOG.mddoc4,192 bytesREADME.mddoc3,407 bytesREADME_EN.mddoc3,869 bytesSKILL.mdcore12,931 bytesSKILL.mdcore12,931 bytesSKILL.mdcore12,931 bytesSKILL.mdcore12,931 bytesSKILL.mdcore12,931 bytesSKILL.mdcore12,931 bytesSKILL.mdcore12,931 bytesagents/openai.yamlasset253 bytesmanifest.yamlasset2,823 bytesreferences/domain-specific-review-gates.mddoc10,432 bytesreferences/editorial criteria and processes.mddoc4,391 bytesreferences/forensic-consistency-audit.mddoc8,494 bytesreferences/qa-checklist.mddoc8,450 bytesreferences/report-structure.mddoc5,718 bytesreferences/review-axes.mddoc3,439 bytesreferences/reviewer-workflow.mddoc8,617 bytesreferences/role-boundaries.mddoc3,421 bytesreferences/source-basis.mddoc5,473 bytesreferences/technical-concern-taxonomy.mddoc6,421 bytestests/punctuation-style.mddoc1,812 bytestests/reviewer-independence.mddoc2,738 bytestests/severity-tiering.mddoc2,738 bytestests/test_reviewer_instruction_contracts.pyruns1,978 bytestests/traceable-review.mddoc1,746 bytes../nature-shared/core/consistency-sweep.mddoc7,990 bytes
Read SKILL.md
# Nature Reviewer Assessment Skill
Use this skill to simulate a `Nature`-style reviewer assessment package from the referee
side.
This skill is for reviewer-style manuscript evaluation, not for drafting the authors'
response. If the user wants rebuttal writing, route to `nature-response`.
## Default stance
- Ground the review only in the local source basis plus manuscript facts supplied by the user.
- Evaluate the manuscript against source-grounded axes: `originality`, `scientific importance`, `interdisciplinary readership`, `technical soundness`, and `readability for nonspecialists`.
- Use the 12-axis technical concern taxonomy only as an internal coverage checklist; it supplements but never replaces the five source-grounded axes.
- Return exactly `3 mutually blind reviewer reports + 1 post-review synthesis` unless the user explicitly asks for another structure.View the complete source on GitHubnature-shared
When your agent uses it
Internal shared-reference support package for installed Nature Skills, including nature-writing, nature-polishing, nature-response, nature-reader, and nature-paper2ppt. Do not invoke it as a standalone user workflow. Load only the specific core or journal-format file requested by another Nature skill.
What it loads into context
Frontmatter
63 tokensAlways available to the agent
SKILL.md
435 tokensWhen the skill is activated
Reference documents
24,070 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Scripts executed separately
scripts/check_consistency.pytests/test_check_consistency.py
Files
README.mddoc3,351 bytesREADME_EN.mddoc3,441 bytesSKILL.mdcore2,130 bytesagents/openai.yamlasset271 bytescore/consistency-sweep.mddoc7,990 bytescore/discussion-argument-language.mddoc9,457 bytescore/ethics.mddoc3,424 bytescore/main-text-discipline.mddoc9,168 bytescore/nature-abstract.mddoc7,951 bytescore/nature-introduction.mddoc7,680 bytescore/nature-results-discussion.mddoc10,288 bytescore/paper-type-taxonomy.mddoc2,435 bytescore/reader-workflow.mddoc977 bytescore/research-compliance.mddoc7,717 bytescore/terminology-ledger.mddoc2,768 bytesjournal-formats/nat-comms.mddoc7,045 bytesjournal-formats/nature-machine-intelligence.mddoc18,975 bytesjournal-formats/nature.mddoc13,555 bytesmanifest.yamlasset4,518 bytesscripts/check_consistency.pyruns8,977 bytestests/test_check_consistency.pyruns3,488 bytes
Read SKILL.md
# Nature Shared References
Use this package only as a dependency of another installed Nature skill.
- Load the exact referenced file; do not preload the whole package.
- Treat `core/` and `journal-formats/` as shared definitions, not standalone workflows.
- Use `journal-formats/nature.md` only for the flagship journal Nature and
`core/research-compliance.md` only when its specialist applicability gate is
triggered.
- Use `journal-formats/nature-machine-intelligence.md` for exact NMI article
types, limits, initial-submission files, data/code duties and production
requirements; do not import flagship Nature or Nature Communications limits.
- Use `core/main-text-discipline.md` for result placement, main-text compression,
revision accretion, caption/SI allocation, and claim-repetition checks.View the complete source on GitHubnature-social-science
When your agent uses it
社会科学及相邻学科学术写作与选题论证工作台,覆盖选题构思、文献梳理、论证组织、学术表达四大要素。Use for 找论文题目/研究问题、把兴趣或宽泛主题变成可讨论的研究方向、文献综述与领域版图、区分"研究少"与真正未决的知识问题、设计证据路线与主张边界、新颖性审计与"审稿人2"式攻击、博士/论文可行性评估、导师沟通话术、或检查论文中的过度断言与概念混用。也适用于开题报告、研究计划书、学位论文的选题阶段与论证自检。
What it loads into context
Frontmatter
198 tokensAlways available to the agent
SKILL.md
3,362 tokensWhen the skill is activated
Reference documents
60,095 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 一、先做路由:用户在哪个环节?
- 二、四条铁律(每条回复都要守)
- 三、十二个判断(写作自检红线)
- 四、八步工作流一页速览
- 五、五套状态系统(不要合成一个分数)
- 六、工作节奏(每一步重复这五拍)
- 七、什么时候必须停下来找真人
- 八、使用约定
- 九、参考文件索引
Files
README.mddoc3,002 bytesREADME_EN.mddoc3,451 bytesSKILL.mdcore11,755 bytesSKILL.mdcore11,755 bytesagents/openai.yamlasset308 bytesmanifest.yamlasset2,424 bytesreferences/01-foundations.mddoc13,189 bytesreferences/02-workflow-steps1-3.mddoc39,220 bytesreferences/03-workflow-steps4-5.mddoc29,243 bytesreferences/04-workflow-steps6-8.mddoc41,334 bytesreferences/05-prompt-library.mddoc54,545 bytesreferences/06-worksheets.mddoc13,045 bytesreferences/07-status-terminology.mddoc11,523 bytesreferences/08-usage-handoff.mddoc8,888 bytesreferences/09-academic-expression.mddoc13,519 bytes
Read SKILL.md
# Nature Social Science — 社科写作与选题论证工作台
本技能将社科硕博科研选题可落地工作流(源自《Finding a PhD Topic with Codex》一文的思想)转成一套可执行的写作与自检流程,覆盖定量、质性、民族志、档案、文件、语料和数字研究。
**适用范围**:社会科学及相邻人文学科。定量、质性、民族志、档案、文件、语料和数字研究都能用。
判断标准始终相同:**问题是否清楚,证据是否匹配,主张是否诚实,项目是否能由这名研究者完成。**
**不做什么**:不替你生成一个"正确题目",不保证新颖、录取、资助、发表或论文成功,
不把某种方法当作高质量研究的默认答案。**AI 的自信不是证据;填完的表格不是通关证明。**
---
## 一、先做路由:用户在哪个环节?
View the complete source on GitHubnature-statistics
When your agent uses it
Audit or improve manuscript statistical reporting, including experimental units, replication, uncertainty, tests, and figure statistics. Use for 统计审查、统计方法小节、图注统计 and reviewer concerns; compute new analyses only when requested with data.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
1,669 tokensWhen the skill is activated
Reference documents
11,217 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Default stance
- Accepted inputs
- Workflow
- Output format
- Red lines
- Related files
- Source hierarchy
Files
../nature-shared/core/consistency-sweep.mddoc7,990 bytes../nature-shared/journal-formats/nature-machine-intelligence.mddoc18,975 bytesREADME.mddoc2,453 bytesREADME_EN.mddoc2,889 bytesSKILL.mdcore8,287 bytesSKILL.mdcore8,287 bytesSKILL.mdcore8,287 bytesSKILL.mdcore8,287 bytesSKILL.mdcore8,287 bytesagents/openai.yamlasset254 bytesmanifest.yamlasset2,117 bytesreferences/common-failure-modes.mddoc4,206 bytesreferences/figure-statistics.mddoc2,905 bytesreferences/nature-article-requirements.mddoc3,420 bytesreferences/reviewer-checklist.mddoc3,591 bytesreferences/source-basis.mddoc3,638 bytesreferences/statistical-reporting.mddoc4,037 bytes
Read SKILL.md
# Nature Statistics Reporting Skill
Use this skill to make manuscript statistics transparent, reproducible, and appropriately bounded. It is a reporting and review skill, not a substitute for a statistician reanalysing raw data unless the user supplies the data and explicitly asks for computation.
## Default stance
- Prioritize design transparency over decorative statistical language.
- Separate three questions: what was measured, what unit was analysed, and what inference was claimed.
- Treat the independent experimental unit as the default `n`; do not silently treat cells, fields of view, repeated readings, spectra, model runs, or technical replicates as independent biological or experimental samples.
- Prefer effect sizes, uncertainty intervals, sample sizes, and exact test definitions over significance-only phrasing.
- State missing information as `AUTHOR_INPUT_NEEDED` instead of inventing sample sizes, tests, software, corrections, exclusion rules, randomization, or blinding.
- If a journal-specific instruction, study-type guideline, or field standard conflicts with this skill, follow the more specific source and mark the source used.
## Accepted inputsView the complete source on GitHubnature-writing
When your agent uses it
Draft or restructure scientific manuscript arguments, sections, and initial-submission materials from author-provided evidence. Use for 论文写作、章节起草、论证重构、正文压缩、首次投稿材料. Use nature-polishing for language-only edits to existing prose and nature-response for post-decision correspondence.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
1,686 tokensWhen the skill is activated
Reference documents
56,659 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing protocol
- Submission boundary
Files
../nature-shared/core/discussion-argument-language.mddoc9,457 bytes../nature-shared/core/main-text-discipline.mddoc9,168 bytes../nature-shared/core/nature-abstract.mddoc7,951 bytes../nature-shared/core/nature-introduction.mddoc7,680 bytes../nature-shared/core/nature-results-discussion.mddoc10,288 bytes../nature-shared/core/research-compliance.mddoc7,717 bytes../nature-shared/journal-formats/nature-machine-intelligence.mddoc18,975 bytes../nature-shared/journal-formats/nature.mddoc13,555 bytesREADME.mddoc4,381 bytesREADME_EN.mddoc4,988 bytesSKILL.mdcore8,278 bytesSKILL.mdcore8,278 bytesagents/openai.yamlasset253 bytesmanifest.yamlasset8,678 bytesreferences/abstract.mddoc4,067 bytesreferences/article-architecture.mddoc3,434 bytesreferences/chinese-author-workflow.mddoc1,821 bytesreferences/conclusion.mddoc1,244 bytesreferences/examples/abstract-examples.mddoc875 bytesreferences/examples/abstract/template-a.mddoc950 bytesreferences/examples/abstract/template-b.mddoc3,265 bytesreferences/examples/abstract/template-c.mddoc1,750 bytesreferences/examples/index.mddoc2,402 bytesreferences/examples/introduction-examples.mddoc1,544 bytesreferences/examples/introduction/novel-task-challenge-decomposition.mddoc1,550 bytesreferences/examples/introduction/pipeline-not-recommended-abstract-only.mddoc2,976 bytesreferences/examples/introduction/pipeline-version-1-one-contribution-multi-advantages.mddoc2,039 bytesreferences/examples/introduction/pipeline-version-2-two-contributions.mddoc2,049 bytesreferences/examples/introduction/pipeline-version-3-new-module-on-existing-pipeline.mddoc1,514 bytesreferences/examples/introduction/pipeline-version-4-observation-driven.mddoc1,441 bytesreferences/examples/introduction/technical-challenge-version-1-existing-task.mddoc2,690 bytesreferences/examples/introduction/technical-challenge-version-2-existing-task-insight-backed-by-traditional.mddoc3,848 bytesreferences/examples/introduction/technical-challenge-version-3-novel-task.mddoc1,629 bytesreferences/examples/introduction/version-1-task-then-application.mddoc727 bytesreferences/examples/introduction/version-2-application-first.mddoc405 bytesreferences/examples/introduction/version-3-general-to-specific-setting.mddoc847 bytesreferences/examples/introduction/version-4-open-with-challenge.mddoc1,753 bytesreferences/examples/method-examples.mddoc1,028 bytesreferences/examples/method/example-of-the-three-elements.mddoc7,440 bytesreferences/examples/method/method-writing-common-issues-note.mddoc355 bytesreferences/examples/method/module-design-instant-ngp.mddoc4,557 bytesreferences/examples/method/module-motivation-patterns.mddoc410 bytesreferences/examples/method/module-triad-neural-body.mddoc763 bytesreferences/examples/method/neural-body-annotated-figure-text.mddoc2,845 bytesreferences/examples/method/overview-template.mddoc2,054 bytesreferences/examples/method/pre-writing-questions.mddoc479 bytesreferences/examples/method/section-skeleton.mddoc110 bytesreferences/experiments.mddoc4,860 bytesreferences/introduction.mddoc15,709 bytesreferences/method.mddoc7,102 bytesreferences/nat-comms-2025-corpus.mddoc7,457 bytesreferences/nature-summary-paragraph.mddoc10,587 bytesreferences/paper-review.mddoc5,428 bytesreferences/paragraph-flow.mddoc1,695 bytesreferences/related-work.mddoc1,283 bytesreferences/submission-package.mddoc8,066 bytesstatic/core/output-format.mddoc1,828 bytesstatic/core/stance.mddoc2,278 bytesstatic/core/workflow.mddoc5,269 bytesstatic/fragments/journal/generic.mddoc1,159 bytesstatic/fragments/journal/nat-comms.mddoc3,146 bytesstatic/fragments/journal/nat-mach-intell.mddoc6,033 bytesstatic/fragments/journal/nature-family.mddoc1,182 bytesstatic/fragments/journal/nature.mddoc2,794 bytesstatic/fragments/language/en.mddoc1,026 bytesstatic/fragments/language/zh-to-en.mddoc1,616 bytesstatic/fragments/paper_type/algorithmic.mddoc1,237 bytesstatic/fragments/paper_type/hypothesis.mddoc1,043 bytesstatic/fragments/paper_type/methods.mddoc1,241 bytesstatic/fragments/paper_type/research.mddoc1,288 bytesstatic/fragments/paper_type/review.mddoc1,209 bytesstatic/fragments/section/abstract.mddoc1,746 bytesstatic/fragments/section/conclusion.mddoc929 bytesstatic/fragments/section/discussion.mddoc1,796 bytesstatic/fragments/section/experiments.mddoc3,080 bytesstatic/fragments/section/intro.mddoc2,647 bytesstatic/fragments/section/method.mddoc1,510 bytesstatic/fragments/section/related-work.mddoc1,178 bytesstatic/fragments/section/title.mddoc999 bytesstatic/fragments/task/manuscript.mddoc288 bytesstatic/fragments/task/submission-package.mddoc2,593 bytestemplates/submission/declarations-and-reviewers.texasset2,650 bytestemplates/submission/highlights-and-summary.texasset1,149 bytestemplates/submission/initial-cover-letter.texasset1,589 bytestemplates/submission/title-page.texasset1,959 bytestests/scoped-drafting.mddoc1,910 bytes
Read SKILL.md
# Nature-Style Scientific Writing — Router
## Routing protocol
For a new drafting task, follow the routing below. For follow-up edits, reuse established task choices and already loaded guidance; read additional fragments only when the requested scope changes.
### 1. Load the manifest and the core layer
Read [manifest.yaml](manifest.yaml). It declares the axes (`task`, `paper_type`, `section`, `language`, `journal`), the allowed values, and the file paths each value maps to.
Also read every file listed under `always_load`. These hold the default stance, writing workflow, and output format that apply to every drafting job.
### 2. Detect the axis values for this request
View the complete source on GitHubSkills included
- nature-academic-search
- nature-citation
- nature-data
- nature-downloader
- nature-experiment-log
- nature-figure
- nature-image2ppt
- nature-literature-pipeline
- nature-paper-card
- nature-paper-to-patent
- nature-paper-trans
- nature-paper-xray
- nature-paper2ppt
- nature-paper2word
- nature-polishing
- researchwrite
- nature-reader
- nature-ref-verifier
- nature-response
- nature-reviewer
- nature-shared
- nature-social-science
- nature-statistics
- nature-writing
Repository facts
- License
- Apache-2.0
- Created
- Apr 24, 2026
- Last pushed
- Nov 7, 2026
- Forks
- 2,739
- Open issues
- 1
- Project activity
- Active
Rank over the last 12 weeks
Now #40 · best #37 · down 1 in 30 days
- #38 from Oct 11 to Oct 20
- #37 from Oct 21 to Oct 24
- #39 on Oct 25
- #38 on Oct 28
- #39 on Oct 29
- #40 since Oct 30
13 earlier periods
- #42 on Aug 2
- #42 on Aug 8
- #41 from Aug 9 to Aug 10
- #42 from Aug 11 to Aug 24
- #41 from Aug 25 to Aug 30
- #42 on Aug 31
- #41 from Sep 1 to Sep 5
- #40 from Sep 6 to Sep 10
- #41 from Sep 11 to Sep 13
- #40 from Sep 14 to Sep 16
- #39 from Sep 17 to Sep 18
- #38 from Sep 19 to Oct 7
- #39 from Oct 8 to Oct 10
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 2, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 77 notes
skills/nature-academic-search/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-academic-search/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-citation/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-citation/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-data/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-downloader/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-figure/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/nature-figure/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 2 dangerous shell commandsin 2 files: nature-downloader/scripts/lib/cdp-utils.mjs:12 nature-image2ppt/references/runtime-dependencies.md:52
- 1,267 network referencesin 120 files: nature-paper-to-patent/scripts/disclosure/package-lock.json:19 skills/nature-shared/journal-formats/nature-machine-intelligence.md:414 nature-image2ppt/tests/test_multi_agent_backend.py:171 and 117 more
- 3 obfuscation signalsin 2 files: nature-image2ppt/cli/image2ppt/runtime/image_gen.py:641 nature-figure/scripts/generate_openrouter_schematic.py:150
- No instruction overrides
- 252 executable scriptsin 252 files: nature-academic-search/SKILL.md:1 nature-academic-search/install.sh:1 nature-academic-search/mcp-server/academic_search_server.py:1 and 249 more
- 227 references to secretsin 51 files: nature-image2ppt/tests/test_multi_agent_backend.py:23 nature-downloader/tests/unit/springer-services.test.mjs:22 nature-downloader/scripts/configure_credentials.py:20 and 48 more
- No requests to vote in Hot
Show all 1,751 signals by file
skills/nature-academic-search/SKILL.md
- Executable scriptline 1
Executable file
skills/nature-academic-search/install.sh
skills/nature-academic-search/mcp-server/README.md
- Access to secretsline 28
[Credential-related source omitted]
skills/nature-academic-search/mcp-server/academic_search_server.py
- Executable scriptline 1
Executable file - Network accessline 584
parts.append(f" ({year}).") if doi: parts.append(f" https://doi.org/{doi}") - Network accessline 585
if doi: parts.append(f" https://doi.org/{doi}") return "".join(parts) - Network accessline 586
parts.append(f" https://doi.org/{doi}") - Network accessline 603
parts.append(f" *{journal}*.") if doi: parts.append(f" https://doi.org/{doi}") - Network accessline 604
if doi: parts.append(f" https://doi.org/{doi}") elif arxiv_id: - Network accessline 605
parts.append(f" https://doi.org/{doi}")
skills/nature-academic-search/mcp-server/config.toml
- Access to secretsline 3
[Credential-related source omitted]
skills/nature-academic-search/mcp-server/sources/__init__.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/sources/arxiv.py
- Executable scriptline 1
Executable file - Network accessline 18
ARXIV_API_URL = "https://export.arxiv.org/api/query" - Network accessline 20
ARXIV_NS = { "atom": "http://www.w3.org/2005/Atom", - Network accessline 21
"atom": "http://www.w3.org/2005/Atom", - Network accessline 22
"arxiv": "http://arxiv.org/schemas/atom", - Network accessline 179
try: resp = requests.get( - Network accessline 180
resp = requests.get( - Network accessline 251
# arXiv reports a bad request as an <entry> whose id is http://arxiv.org/api/errors#... - Network accessline 313
http://arxiv.org/abs/2401.12345v1 -> 2401.12345 - Network accessline 321
for prefix in ("https://arxiv.org/abs/", "http://arxiv.org/abs/"):
skills/nature-academic-search/mcp-server/sources/crossref.py
- Executable scriptline 1
Executable file - Network accessline 10
CROSSREF_API = "https://api.crossref.org" - Network accessline 80
} try: resp = requests.get(url, headers=headers, timeout=self._timeout) - Network accessline 81
try: resp = requests.get(url, headers=headers, timeout=self._timeout) except requests.RequestException as exc: - Network accessline 82
resp = requests.get(url, headers=headers, timeout=self._timeout) - Network accessline 118
url = f"{CROSSREF_API}{path}" try: resp = requests.get( - Network accessline 119
try: resp = requests.get( url, params=params, headers=self._headers, timeout=self._timeout - Network accessline 120
resp = requests.get(
skills/nature-academic-search/mcp-server/sources/elsevier_common.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/sources/pubmed.py
- Executable scriptline 1
Executable file - Network accessline 20
BASE_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/" - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Network accessline 53
url = BASE_URL + endpoint try: resp = requests.get(url, params=merged, timeout=timeout) - Network accessline 54
try: resp = requests.get(url, params=merged, timeout=timeout) resp.raise_for_status() - Network accessline 55
resp = requests.get(url, params=merged, timeout=timeout)
skills/nature-academic-search/mcp-server/sources/sciencedirect.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/sources/scopus.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/__init__.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_arxiv_error_entries.py
- Executable scriptline 1
Executable file - Network accessline 11
ATOM = "http://www.w3.org/2005/Atom" - Network accessline 21
feed = _feed( "<entry><id>http://arxiv.org/api/errors#incorrect_id_format_for_2401.99999</id>" - Network accessline 22
"<entry><id>http://arxiv.org/api/errors#incorrect_id_format_for_2401.99999</id>" - Network accessline 31
feed = _feed( "<entry><id>http://arxiv.org/api/errors#incorrect_id_format_for_2401.99999</id><title>Error</title></entry>" - Network accessline 32
"<entry><id>http://arxiv.org/api/errors#incorrect_id_format_for_2401.99999</id><title>Error</title></entry>" - Network accessline 43
feed = _feed( "<entry><id>http://arxiv.org/abs/2401.00001v1</id><title>Real Title</title>" - Network accessline 44
"<entry><id>http://arxiv.org/abs/2401.00001v1</id><title>Real Title</title>"
skills/nature-academic-search/mcp-server/tests/test_citation_errors.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_elsevier_live.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_format_converter_hardening.py
- Executable scriptline 1
Executable file - Network accessline 27
METADATA_HOST = "http://169.254.169.254/latest/meta-data/" - Network accessline 30
def test_is_allowed_url_accepts_known_api_hosts_and_rejects_others(): assert format_converter._is_allowed_url("https://api.crossref.org/works/10.1/x") - Network accessline 31
assert format_converter._is_allowed_url("https://api.crossref.org/works/10.1/x") - Network accessline 32
assert format_converter._is_allowed_url("https://eutils.ncbi.nlm.nih.gov/esearch.fcgi?x=1") - Network accessline 33
assert not format_converter._is_allowed_url(METADATA_HOST) assert not format_converter._is_allowed_url("https://evil.example.com/works") assert not format_converter._is_allowed_url("not a url") - Network accessline 34
assert not format_converter._is_allowed_url("https://evil.example.com/works") - Network accessline 38
def test_efetch_medline_skips_network_when_host_not_allowlisted(monkeypatch): monkeypatch.setattr(format_converter, "EUTILS_BASE", "http://169.254.169.254") with patch.object(format_converter, "urlopen", side_effect=AssertionError(" - Network accessline 39
monkeypatch.setattr(format_converter, "EUTILS_BASE", "http://169.254.169.254") with patch.object(format_converter, "urlopen", side_effect=AssertionError("must not fetch")) as opened: assert format_converter.efetch_medline("1") i - Network accessline 45
def test_download_crossref_skips_network_when_host_not_allowlisted(monkeypatch): monkeypatch.setattr(format_converter, "CROSSREF_BASE", "http://169.254.169.254/works") with patch.object(format_converter, "urlopen", side_effect=Asser - Network accessline 46
monkeypatch.setattr(format_converter, "CROSSREF_BASE", "http://169.254.169.254/works") with patch.object(format_converter, "urlopen", side_effect=AssertionError("must not fetch")) as opened: ok, message = format_converter.downlo - Network accessline 53
def test_download_arxiv_skips_network_when_host_not_allowlisted(monkeypatch): monkeypatch.setattr(format_converter, "ARXIV_BASE", "http://169.254.169.254/query") with patch.object(format_converter, "urlopen", side_effect=AssertionEr - Network accessline 54
monkeypatch.setattr(format_converter, "ARXIV_BASE", "http://169.254.169.254/query") with patch.object(format_converter, "urlopen", side_effect=AssertionError("must not fetch")) as opened: ok, message = format_converter.download_ - Network accessline 85
with patch.object(format_converter, "urlopen", side_effect=[_response(b"{}"), _response(b'<feed xmlns="http://www.w3.org/2005/Atom"/>')]):
skills/nature-academic-search/mcp-server/tests/test_mcp_tools.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_pubmed_parsing.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_scopus_empty_result.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_script_converters.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/tests/test_sources.py
- Executable scriptline 1
Executable file - Access to secretsline 32
[Credential-related source omitted] - Network accessline 161
"type": "journal-article", "references-count": 42, "URL": "https://doi.org/10.1038/nature12373", - Network accessline 162
"references-count": 42, "URL": "https://doi.org/10.1038/nature12373", } - Network accessline 163
"URL": "https://doi.org/10.1038/nature12373", - Network accessline 597
_ARXIV_ATOM_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" - Network accessline 598
<feed xmlns="http://www.w3.org/2005/Atom" - Network accessline 599
xmlns:arxiv="http://arxiv.org/schemas/atom"> - Network accessline 604
_ARXIV_ENTRY_TEMPLATE = """<entry> <id>http://arxiv.org/abs/{arxiv_id}v1</id> - Network accessline 605
<id>http://arxiv.org/abs/{arxiv_id}v1</id> - Network accessline 608
{author_elements} <published>{published}</published> <arxiv:primary_category term="{category}" xmlns:arxiv="http://arxiv.org/schemas/atom"/> - Network accessline 609
<published>{published}</published> <arxiv:primary_category term="{category}" xmlns:arxiv="http://arxiv.org/schemas/atom"/> <link rel="alternate" type="text/html" href="http://arxiv.org/abs/{arxiv_id}v1"/> - Network accessline 610
<arxiv:primary_category term="{category}" xmlns:arxiv="http://arxiv.org/schemas/atom"/> - Network accessline 611
<link rel="alternate" type="text/html" href="http://arxiv.org/abs/{arxiv_id}v1"/> - Network accessline 612
<link title="pdf" rel="related" type="application/pdf" href="http://arxiv.org/pdf/{arxiv_id}v1"/> - Network accessline 774
assert source._normalize_id("http://arxiv.org/abs/2401.12345v1") == "2401.12345" - Network accessline 775
assert source._normalize_id("https://arxiv.org/abs/2401.12345v2") == "2401.12345"
skills/nature-academic-search/mcp-server/utils/__init__.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/utils/config.py
skills/nature-academic-search/mcp-server/utils/errors.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/mcp-server/utils/logging.py
- Executable scriptline 1
Executable file
skills/nature-academic-search/references/dedup-engine.md
skills/nature-academic-search/references/pubmed-28344011.bib
- Executable scriptline 1
Executable file
skills/nature-academic-search/references/pubmed-28344011.nbib
- Executable scriptline 1
Executable file
skills/nature-academic-search/references/pubmed-28344011.ris
- Executable scriptline 1
Executable file
skills/nature-academic-search/references/ris-bibtex-format.md
- Executable scriptline 1
Executable file - Network accessline 28
EP - 145 DO - 10.1234/example UR - https://doi.org/10.1234/example - Network accessline 29
DO - 10.1234/example UR - https://doi.org/10.1234/example AB - Abstract text - Network accessline 30
UR - https://doi.org/10.1234/example - Network accessline 72
pages = {123--145}, doi = {10.1234/example}, url = {https://doi.org/10.1234/example}, - Network accessline 73
doi = {10.1234/example}, url = {https://doi.org/10.1234/example}, abstract = {Abstract text}, - Network accessline 74
url = {https://doi.org/10.1234/example}, - Network accessline 128
%D 2024 %R 10.1234/example %U https://doi.org/10.1234/example - Network accessline 129
%R 10.1234/example %U https://doi.org/10.1234/example %X Abstract text - Network accessline 130
%U https://doi.org/10.1234/example
skills/nature-academic-search/references/search-strategy.md
- Executable scriptline 1
Executable file
skills/nature-academic-search/scripts/academic_search.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 12
Source: OpenAlex (https://openalex.org). Basic queries work without a key, but - Network accessline 37
API key: create a free key at https://openalex.org and pass --api-key KEY or set - Access to secretsline 38
[Credential-related source omitted] - Network accessline 57
OPENALEX_API = "https://api.openalex.org/works" - Network accessline 58
AUTHORS_API = "https://api.openalex.org/authors" - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 124
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Network accessline 125
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Network accessline 126
req = urllib.request.Request(url, headers=headers) - Network accessline 127
with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 202
# Defensive: only keep records that actually carry the requested ORCID, so a # server-side filter miss can't resolve to an unrelated author. OpenAlex # stores orcid as a full URL, e.g. https://orcid.org/0000-.... - Network accessline 204
# stores orcid as a full URL, e.g. https://orcid.org/0000-.... - Network accessline 259
] doi = work.get("doi", "") if doi and doi.startswith("https://doi.org/"): - Network accessline 260
doi = work.get("doi", "") if doi and doi.startswith("https://doi.org/"): doi = doi[len("https://doi.org/"):] - Network accessline 261
if doi and doi.startswith("https://doi.org/"): - Network accessline 262
doi = doi[len("https://doi.org/"):] - Access to secretsline 330
[Credential-related source omitted] - Access to secretsline 337
[Credential-related source omitted] - Access to secretsline 338
[Credential-related source omitted] - Access to secretsline 339
[Credential-related source omitted] - Access to secretsline 414
[Credential-related source omitted] - Access to secretsline 417
[Credential-related source omitted]
skills/nature-academic-search/scripts/converters.py
- Executable scriptline 1
Executable file - Network accessline 107
if doi: lines.append(f"DO - {doi}") lines.append(f"UR - https://doi.org/{doi}") - Network accessline 109
lines.append(f"UR - https://doi.org/{doi}") - Network accessline 233
if doi: lines.append(f"DO - {doi}") lines.append(f"UR - https://doi.org/{doi}") - Network accessline 235
lines.append(f"UR - https://doi.org/{doi}") - Network accessline 310
ns = { "atom": "http://www.w3.org/2005/Atom", - Network accessline 311
"atom": "http://www.w3.org/2005/Atom", - Network accessline 312
"arxiv": "http://arxiv.org/schemas/atom", - Network accessline 347
if arxiv_id: lines.append(f"DO - {arxiv_id}") lines.append(f"UR - https://arxiv.org/abs/{arxiv_id}") - Network accessline 349
lines.append(f"UR - https://arxiv.org/abs/{arxiv_id}") - Network accessline 365
ns = { "atom": "http://www.w3.org/2005/Atom", - Network accessline 366
"atom": "http://www.w3.org/2005/Atom", - Network accessline 367
"arxiv": "http://arxiv.org/schemas/atom", - Network accessline 406
if arxiv_id: lines.append(f" doi = {{{arxiv_id}}},") lines.append(f" url = {{https://arxiv.org/abs/{arxiv_id}}},") - Network accessline 408
lines.append(f" url = {{https://arxiv.org/abs/{arxiv_id}}},") - Network accessline 452
if doi: lines.append(f"%R {doi}") lines.append(f"%U https://doi.org/{doi}") - Network accessline 454
lines.append(f"%U https://doi.org/{doi}") - Network accessline 502
if doi: lines.append(f"%R {doi}") lines.append(f"%U https://doi.org/{doi}") - Network accessline 504
lines.append(f"%U https://doi.org/{doi}") - Network accessline 516
def arxiv_to_enw(root): ns = { "atom": "http://www.w3.org/2005/Atom", - Network accessline 517
ns = { "atom": "http://www.w3.org/2005/Atom", "arxiv": "http://arxiv.org/schemas/atom", - Network accessline 518
"atom": "http://www.w3.org/2005/Atom", - Network accessline 519
"arxiv": "http://arxiv.org/schemas/atom", - Network accessline 553
if arxiv_id: lines.append(f"%R {arxiv_id}") lines.append(f"%U https://arxiv.org/abs/{arxiv_id}") - Network accessline 555
lines.append(f"%U https://arxiv.org/abs/{arxiv_id}")
skills/nature-academic-search/scripts/format-converter.py
- Executable scriptline 1
Executable file - Network accessline 43
EUTILS_BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils" - Network accessline 44
CROSSREF_BASE = "https://api.crossref.org/works" - Network accessline 45
ARXIV_BASE = "https://export.arxiv.org/api/query" - Network accessline 62
print(" ESearch error: URL host not in allowlist") return [] resp = requests.get(url, timeout=30) - Network accessline 63
return [] resp = requests.get(url, timeout=30) xml_data = resp.text - Network accessline 64
resp = requests.get(url, timeout=30) - Network accessline 356
import json time.sleep(0.5) url = f"https://api.crossref.org/works/{doi}" - Network accessline 357
time.sleep(0.5) url = f"https://api.crossref.org/works/{doi}" with urlopen(url, timeout=30) as resp: - Network accessline 358
url = f"https://api.crossref.org/works/{doi}" with urlopen(url, timeout=30) as resp: data = json.loads(resp.read().decode("utf-8"))
skills/nature-academic-search/scripts/preflight.py
- Executable scriptline 1
Executable file - Network accessline 5
Verifies that the 3 direct API endpoints used by format-converter.py are reachable. Uses urllib.request.urlopen (stdlib) for consistency with the - Network accessline 6
reachable. Uses urllib.request.urlopen (stdlib) for consistency with the - Network accessline 19
{ "name": "PubMed E-utilities", "url": "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmax=1", - Network accessline 20
"name": "PubMed E-utilities", "url": "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmax=1", "timeout": 10, - Network accessline 21
"url": "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmax=1", - Network accessline 25
{ "name": "CrossRef REST", "url": "https://api.crossref.org/works/10.1038/nature14539", - Network accessline 26
"name": "CrossRef REST", "url": "https://api.crossref.org/works/10.1038/nature14539", "timeout": 10, - Network accessline 27
"url": "https://api.crossref.org/works/10.1038/nature14539", - Network accessline 32
{ "name": "arXiv API", "url": "https://export.arxiv.org/api/query?id_list=1706.03762&max_results=1", - Network accessline 33
"name": "arXiv API", "url": "https://export.arxiv.org/api/query?id_list=1706.03762&max_results=1", "timeout": 10, - Network accessline 34
"url": "https://export.arxiv.org/api/query?id_list=1706.03762&max_results=1",
skills/nature-academic-search/static/core/routing-and-ops.md
- Network accessline 22
| Service | Env Var | Register At | Free Tier | |---------|---------|-------------|-----------| | Semantic Scholar | `SEMANTIC_SCHOLAR_API_KEY` | [api.semanticscholar.org](https://api.semanticscholar.org/) | 100 req/s with key (1/s without) - Network accessline 23
|---------|---------|-------------|-----------| | Semantic Scholar | `SEMANTIC_SCHOLAR_API_KEY` | [api.semanticscholar.org](https://api.semanticscholar.org/) | 100 req/s with key (1/s without) | | NCBI E-utilities | `NCBI_API_KEY` | [ncbi.n - Network accessline 24
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Network accessline 25
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 26
| Elsevier / Scopus / ScienceDirect | pybliometrics config | [dev.elsevier.com](https://dev.elsevier.com/) | Depends on API entitlement | - Network accessline 33
export http_proxy=http://127.0.0.1:7890 - Network accessline 34
export https_proxy=http://127.0.0.1:7890 - Access to secretsline 62
[Credential-related source omitted]
skills/nature-citation/references/journal-scope.md
- Network accessline 5
Verify missing or renamed titles on the publisher's official pages before updating the lists. The npj snapshot is in `data/npj-journals.json`, sourced from the [official npj Series directory](https://www.nature.com/nature-portfolio/about-jo - Network accessline 6
The npj snapshot is in `data/npj-journals.json`, sourced from the [official npj Series directory](https://www.nature.com/nature-portfolio/about-journals/npj-series) on 2026-10-16. Unknown names remain outside the automated scope until verif - Network accessline 7
[official npj Series directory](https://www.nature.com/nature-portfolio/about-journals/npj-series)
skills/nature-citation/references/ris-endnote.md
skills/nature-citation/scripts/nature_citation.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 29
CROSSREF_API = "https://api.crossref.org/works" - Network accessline 30
PUBMED_EFETCH = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi" - Network accessline 33
DEFAULT_EXPORT_FORMAT = "ris" ZOTERO_RDF_NS = { "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - Network accessline 34
ZOTERO_RDF_NS = { "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "z": "http://www.zotero.org/namespaces/export#", - Network accessline 35
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - Network accessline 36
"z": "http://www.zotero.org/namespaces/export#", - Network accessline 37
"dcterms": "http://purl.org/dc/terms/", - Network accessline 38
"bib": "http://purl.org/net/biblio#", - Network accessline 39
"foaf": "http://xmlns.com/foaf/0.1/", - Network accessline 40
"dc": "http://purl.org/dc/elements/1.1/", - Network accessline 41
"prism": "http://prismstandard.org/namespaces/1.2/basic/", - Network accessline 114
# Explicit names from the publisher's npj Series directory, checked 2026-10-16. # https://www.nature.com/nature-portfolio/about-journals/npj-series - Network accessline 115
# https://www.nature.com/nature-portfolio/about-journals/npj-series - Network accessline 219
@property def doi_url(self) -> str: return f"https://doi.org/{self.doi}" if self.doi else self.url - Network accessline 221
return f"https://doi.org/{self.doi}" if self.doi else self.url - Network accessline 862
y1=y1, doi=doi, url=f"https://pubmed.ncbi.nlm.nih.gov/{pmid}/" if pmid else "", - Network accessline 863
doi=doi, url=f"https://pubmed.ncbi.nlm.nih.gov/{pmid}/" if pmid else "", volume=xml_text(article_node.find("Journal/JournalIssue/Volume")), - Network accessline 864
url=f"https://pubmed.ncbi.nlm.nih.gov/{pmid}/" if pmid else "",
skills/nature-citation/tests/test_author_exports.py
- Executable scriptline 1
Executable file - Network accessline 149
def test_read_pmids_normalizes_urls_and_rejects_invalid_values(self): args = argparse.Namespace( pmid=["PMID: 123", "https://pubmed.ncbi.nlm.nih.gov/456/", "123"], - Network accessline 150
args = argparse.Namespace( pmid=["PMID: 123", "https://pubmed.ncbi.nlm.nih.gov/456/", "123"], pmid_file=None, - Network accessline 151
pmid=["PMID: 123", "https://pubmed.ncbi.nlm.nih.gov/456/", "123"],
skills/nature-citation/tests/test_journal_scope.py
- Executable scriptline 1
Executable file
skills/nature-data/references/nature-article-requirements.md
- Network accessline 123
- Nature initial submission: <https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 124
- Nature Portfolio reporting standards and availability: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Network accessline 125
- Nature forms and declarations: <https://www.nature.com/nature/for-authors/forms-and-declarations>
skills/nature-data/references/source-basis.md
- Network accessline 26
- Springer Nature, Research data policy: <https://www.springernature.com/gp/journal-policies/15369670> - Network accessline 27
<https://www.springernature.com/gp/journal-policies/15369670> - Network accessline 28
- Springer Nature, Data availability statements: <https://www.springernature.com/gp/authors/research-data-policy/data-availability-statements> - Springer Nature, Data repository guidance: - Network accessline 29
<https://www.springernature.com/gp/authors/research-data-policy/data-availability-statements> - Network accessline 30
- Springer Nature, Data repository guidance: <https://www.springernature.com/gp/authors/research-data-policy/recommended-repositories> - Springer Nature, Sensitive data: - Network accessline 31
<https://www.springernature.com/gp/authors/research-data-policy/recommended-repositories> - Network accessline 32
- Springer Nature, Sensitive data: <https://www.springernature.com/gp/authors/research-data-policy/sensitive-data> - Nature Portfolio, Reporting standards and availability of data, materials, code and protocols: - Network accessline 33
<https://www.springernature.com/gp/authors/research-data-policy/sensitive-data> - Network accessline 34
- Nature Portfolio, Reporting standards and availability of data, materials, code and protocols: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Example Nature Portfolio journal reporting standards page: - Network accessline 35
<https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Network accessline 36
- Example Nature Portfolio journal reporting standards page: <https://www.nature.com/npj2dmaterials/editorial-policies/reporting-standards> - Nature Research, Data availability statements and data citations policy FAQ: - Network accessline 37
<https://www.nature.com/npj2dmaterials/editorial-policies/reporting-standards> - Network accessline 38
- Nature Research, Data availability statements and data citations policy FAQ: <https://www.nature.com/documents/nr-data-availability-statements-data-citations-faqs.pdf> - Scientific Data, Data policies: - Network accessline 39
<https://www.nature.com/documents/nr-data-availability-statements-data-citations-faqs.pdf> - Network accessline 40
- Scientific Data, Data policies: <https://www.nature.com/sdata/policies/data-policies> - Wilkinson et al. 2016, The FAIR Guiding Principles for scientific data management and stewardship: - Network accessline 41
<https://www.nature.com/sdata/policies/data-policies> - Network accessline 42
- Wilkinson et al. 2016, The FAIR Guiding Principles for scientific data management and stewardship: <https://www.nature.com/articles/sdata201618> - DataCite Metadata Schema: - Network accessline 43
<https://www.nature.com/articles/sdata201618> - Network accessline 45
<https://schema.datacite.org/>
skills/nature-downloader/README.md
- Network accessline 44
python3 scripts/configure_school.py infer "https://example.edu/library/resources" - Network accessline 45
python3 scripts/configure_school.py url "https://example.edu/library/resources" - Network accessline 56
- Elsevier:[Developer Portal](https://dev.elsevier.com/) - Network accessline 57
- Springer Nature:[API Access](https://dev.springernature.com/docs/quick-start/api-access/) - Network accessline 58
- IEEE:[Developer Registration](https://developer.ieee.org/member/register) - Network accessline 63
python3 scripts/configure_credentials.py set elsevier python3 scripts/configure_credentials.py set springer_nature python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' - Network accessline 64
python3 scripts/configure_credentials.py set springer_nature python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' python3 scripts/configure_credentials.py show - Network accessline 65
python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' - Network accessline 134
node scripts/batch_download.mjs \ --pdf-url "https://arxiv.org/pdf/1706.03762" \ - Network accessline 135
--pdf-url "https://arxiv.org/pdf/1706.03762" \
skills/nature-downloader/README_EN.md
- Access to secretsline 12
[Credential-related source omitted] - Network accessline 32
python3 scripts/configure_school.py infer "https://example.edu/library/resources" - Network accessline 33
python3 scripts/configure_school.py url "https://example.edu/library/resources" - Network accessline 44
- Elsevier: [Developer Portal](https://dev.elsevier.com/) - Network accessline 45
- Springer Nature: [API Access](https://dev.springernature.com/docs/quick-start/api-access/) - Network accessline 46
- IEEE: [Developer Registration](https://developer.ieee.org/member/register) - Network accessline 51
python3 scripts/configure_credentials.py set elsevier python3 scripts/configure_credentials.py set springer_nature python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' - Network accessline 52
python3 scripts/configure_credentials.py set springer_nature python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' python3 scripts/configure_credentials.py show - Network accessline 53
python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' - Network accessline 118
node scripts/batch_download.mjs \ --pdf-url "https://arxiv.org/pdf/1706.03762" \ - Network accessline 119
--pdf-url "https://arxiv.org/pdf/1706.03762" \
skills/nature-downloader/SKILL.md
- Network accessline 62
python3 scripts/configure_school.py infer "https://example.edu/library/resources" - Network accessline 63
python3 scripts/configure_school.py url "https://example.edu/library/resources" - Network accessline 82
The downloader reads this config automatically. If `discovery.web_of_science_url` is present, `scripts/batch_download.mjs` uses it as the Web of Science entry; otherwise it falls back to `https://www.webofscience.com/wos/woscc/basic-search` - Network accessline 84
For Chinese literature, the downloader also reads `discovery.cnki_url` when present. If absent, `scripts/batch_download.mjs --title "<中文题名>"` falls back to `https://kns.cnki.net/kns8s/defaultresult/index`. - Network accessline 111
python3 scripts/configure_credentials.py set springer_nature --service fulltext python3 scripts/configure_credentials.py set springer_nature --service metadata python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://i - Network accessline 112
python3 scripts/configure_credentials.py set springer_nature --service metadata python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' python3 scripts/configure_credentials.py - Network accessline 113
python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}' - Network accessline 124
Give the user the official registration link: Elsevier `https://dev.elsevier.com/`, Springer Nature `https://dev.springernature.com/docs/quick-start/api-access/`, or IEEE `https://developer.ieee.org/member/register`. - Access to secretsline 126
[Credential-related source omitted] - Network accessline 128
Springer downloads try the configured Full Text service first, then the configured OA service on failure. OA-only credentials go directly to the OA service. Meta-only credentials do not qualify for API-first downloading. Both full-text serv - Network accessline 145
If the URL is a login page with a `service=` parameter, treat the callback host as the resource service and do not make the login page the whole workflow. For example, `https://login.university.example/authserver/login?service=https://resou - Access to secretsline 179
[Credential-related source omitted] - Network accessline 304
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:3456/targets" -TimeoutSec 10 - Network accessline 330
node scripts/batch_download.mjs --title "乡村振兴背景下数字治理研究" --cnki-format pdf --no-si --out "<project>" # by Chinese exact title with a library-provided CNKI entry: node scripts/batch_download.mjs --title "乡村振兴背景下数字治理研究" --cnki-url "https://kns - Network accessline 331
# by Chinese exact title with a library-provided CNKI entry: node scripts/batch_download.mjs --title "乡村振兴背景下数字治理研究" --cnki-url "https://kns.cnki.net/kns8s/defaultresult/index" --no-si --out "<project>" # by known PDF URL: - Network accessline 332
node scripts/batch_download.mjs --title "乡村振兴背景下数字治理研究" --cnki-url "https://kns.cnki.net/kns8s/defaultresult/index" --no-si --out "<project>" - Network accessline 333
# by known PDF URL: node scripts/batch_download.mjs --pdf-url "https://arxiv.org/pdf/1706.03762" --title "Attention Is All You Need" --no-si --out "<project>" # replace --no-si with --si only after the user explicitly requests SI - Network accessline 334
node scripts/batch_download.mjs --pdf-url "https://arxiv.org/pdf/1706.03762" --title "Attention Is All You Need" --no-si --out "<project>"
skills/nature-downloader/data/publishers.json
- Network accessline 2
"elsevier": { "name": "Elsevier / ScienceDirect", "config_url": "https://dev.elsevier.com/", - Network accessline 3
"name": "Elsevier / ScienceDirect", "config_url": "https://dev.elsevier.com/", "doi_pattern": "^10\\.(?:1016|1053|1067|1072|1097|1205|1383|1532|1588|1600|1618|2016|3168)/", - Network accessline 4
"config_url": "https://dev.elsevier.com/", - Access to secretsline 7
[Credential-related source omitted] - Network accessline 9
"springer_nature": { "name": "Springer Nature", "config_url": "https://dev.springernature.com/docs/quick-start/api-access/", - Network accessline 10
"name": "Springer Nature", "config_url": "https://dev.springernature.com/docs/quick-start/api-access/", "doi_pattern": "^10\\.(?:1007|1023|1038|1057|1134|1186|1365)/", - Network accessline 11
"config_url": "https://dev.springernature.com/docs/quick-start/api-access/", - Access to secretsline 14
[Credential-related source omitted] - Network accessline 16
"ieee": { "name": "IEEE Xplore", "config_url": "https://developer.ieee.org/member/register", - Network accessline 17
"name": "IEEE Xplore", "config_url": "https://developer.ieee.org/member/register", "doi_pattern": "^10\\.1109/", - Network accessline 18
"config_url": "https://developer.ieee.org/member/register", - Access to secretsline 21
[Credential-related source omitted]
skills/nature-downloader/data/school.schema.json
skills/nature-downloader/data/schools.yaml
- Network accessline 3
# nature-downloader is distributed as an institution-neutral skill. Users must # configure their own library/resource URL at runtime with: # python3 scripts/configure_school.py url "https://library.example.edu/resources" - Network accessline 4
# configure their own library/resource URL at runtime with: # python3 scripts/configure_school.py url "https://library.example.edu/resources" version: 1 - Network accessline 5
# python3 scripts/configure_school.py url "https://library.example.edu/resources"
skills/nature-downloader/docs/nature-downloader-reference-research-2026-07-15.md
- Network accessline 9
- `ShZhao27208/Aut_Sci_Download`:研究提交 [`5e0de4c`](https://github.com/ShZhao27208/Aut_Sci_Download/tree/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2)(该提交日期 2026-06-29),重点为 CNKI/FSSO/WebVPN 路线。仓库采用 MIT License。[项目清单](https://github.com/ShZhao2720 - Network accessline 10
- `kermitt2/article_dataset_builder`:研究提交 [`920fe29`](https://github.com/kermitt2/article_dataset_builder/tree/920fe298a81061e8a26d55d13829ccb6deb6501c)(该提交日期 2023-10-03),重点为 OA 发现、下载瀑布、恢复与输出。仓库采用 Apache-2.0 License,包版本为 0.2.6。[setup.py](ht - Network accessline 20
1. `fsso`:用户先在 `https://fsso.cnki.net` 通过高校 SSO/CARSI 登录,再把浏览器 cookies 导出到本地 JSON;请求仍直连 `kns.cnki.net`。 - Network accessline 23
README 明确要求用户自行登录并导出 cookies,cookie 文件默认位于 `~/.aut-sci-download/fsso_cookies.json` 或 `webvpn_cookies.json`。[认证说明](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/README.md#L135-L142) 运行时创建 `requ - Network accessline 25
WebVPN 不是浏览器自动化,而是把原 URL 的 hostname 用 AES-128-CFB 加密,再拼成学校代理 URL;学校 host、key、iv 来自配置/学校表。[URL 转换](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/webvpn_crypto.py#L14-L58) 两种模式共用后续搜索和下载逻 - Network accessline 35
- cookie 明文 JSON 与 WebVPN key/iv 明文配置没有权限收紧、系统钥匙串集成或自动轮换;重构时至少应限制本地文件权限,并明确 cookie 属于敏感凭据。 - `check_session` 只凭 HTTP 200 且正文包含 `cnki` 判为有效,可能把匿名页面、错误页误判成已获机构授权;登录重定向判断也只检查 URL 中少数字符串。[会话检查](https://github.com/ShZhao27208/Aut_Sci_Download/bl - Network accessline 36
- `check_session` 只凭 HTTP 200 且正文包含 `cnki` 判为有效,可能把匿名页面、错误页误判成已获机构授权;登录重定向判断也只检查 URL 中少数字符串。[会话检查](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_download.py#L119-L142) - Network accessline 41
搜索流程先 GET CNKI 搜索页以建立/补充会话 cookie,然后向 `/kns8s/brief/grid` POST 一个 `QueryJson`,检索字段固定为主题 `SU`,语言为中文,页大小最多 50。[搜索请求](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_download.py#L145-L - Network accessline 43
返回 HTML 后,主解析器从结果表抽取:题名、作者、来源、年份、详情 URL,并从 URL 查询参数中提取 `filename` 与 `dbcode`。结构化 CSS 选择器失败时,再用正则匹配旧/新详情链接,但回退结果会丢失作者、来源和年份。[结果解析](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_dow - Network accessline 52
- `KuaKuCode`、`productStr`、CSS 选择器和 URL 格式都是页面内部细节,容易随 CNKI 改版失效,应该封装在可测试的 provider adapter 中,不应泄漏到总路由。 - 该实现没有 DOI、题名、作者、年份的消歧评分,也没有对多个同名结果进行确认;Nature Downloader 需要独立的规范化文献实体与置信度。 - `_extract_filename` 在没有 `filename` 时把 `v` 参数当 filename,这个 - Network accessline 54
- `_extract_filename` 在没有 `filename` 时把 `v` 参数当 filename,这个假设未被验证,不宜作为可靠强标识符。[提取逻辑](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_download.py#L317-L335) - Network accessline 58
单篇下载先检查本地 `cnki_<id>.pdf` 是否存在且至少 10 KB;命中则直接返回缓存。否则访问新版 `kcms2` 详情页,若 HTTP 404 再试旧版 `kcms/detail/detail.aspx`。[详情页与缓存](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_download.py#L - Network accessline 60
下载链接按下列优先级从详情 HTML 中寻找:当前 `bar.cnki.net` PDF、经典 PDF 按钮、操作区 PDF、`bar.cnki.net` CAJ、经典 CAJ、任意 `bar.cnki.net order` 链接。[链接优先级](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_download. - Network accessline 62
最终 GET 下载链接,检查状态码、文件头(PDF/CAJ)、疑似登录页和最小体积;CAJ 会改扩展名,成功结果返回文件路径、大小和格式。[文件下载](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/cnki_download.py#L462-L501) - Network accessline 78
默认输出目录为 `~/papers`,配置目录为 `~/.aut-sci-download`;项目只声明 `requests`、`pycryptodome`、`beautifulsoup4` 三个核心依赖。[配置默认值](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/config.py#L16-L18) [依赖](htt - Network accessline 80
其配置层把 API key 放 `.env`,普通配置放 `config.json`,这是“敏感配置与普通配置分离”的可借鉴雏形;但文件仍是普通明文文件,没有权限或密钥存储机制。[配置写入](https://github.com/ShZhao27208/Aut_Sci_Download/blob/5e0de4cf68ab48dce8763fe7ca76a6f29874afc2/scripts/config.py#L85-L143) - Network accessline 86
该项目不是面向一次对话下载一篇论文的工具,而是面向 DOI/PMID/PMCID/CORD-19 清单的批量 OA 数据集采集器;它同时做元数据聚合、PDF 获取、可选 TEI 转换、缩略图和 S3 输出。[项目定位](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/Readme.md#L4-L38) - Network accessline 88
入口是本地文件清单:每行一个 DOI、PMID 或 PMCID,或 CORD-19 CSV;不是自然语言、题名搜索或浏览器会话。[输入类型](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/Readme.md#L8-L13) 外部服务认证主要是 Unpaywall/Crossref 的联系邮箱,以及可选 S3 凭据;OA 发现本身 - Network accessline 94
DOI 会去除两种常见 DOI URL 前缀、去空白并转小写。[DOI 清洗](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L1368-L1373) 元数据先请求 biblio-glutton;若 DOI 查询失败,再请求 Crossref,并删除体积很大的 - Network accessline 96
每个条目获得内部 UUID,并在 LMDB 中建立 DOI/PMID/PMCID/内部 ID 到同一条目的映射;元数据记录同时保存阶段状态,如 `has_valid_oa_url`、`has_valid_pdf`、`has_valid_tei`。[标识符映射](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dat - Network accessline 106
- biblio-glutton 默认公共实例的可靠性连 README 自己也提示不足;它不是 Nature Downloader 必需依赖。[服务说明](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/Readme.md#L94-L108) - Network accessline 108
- `getUUIDByStrongIdentifier` 返回 LMDB 原始 bytes,而调用方后续把它当字符串 `.encode()`,现有“恢复已处理条目”路径存在类型风险。[查重调用](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L558-L56 - Network accessline 120
主决策链见 [`processTask`](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L889-L945),Unpaywall 候选选择见 [`unpaywalling_doi`](https://github.com/kermitt2/article_d - Network accessline 130
- 代码只返回第一个满足启发式的 URL,没有保留所有候选、版本(published/accepted/submitted)、host 类型、license 或选择原因。 - `best_oa_location` 可能为空,但后续 `elif` 仍直接访问它;调用者用裸 `except` 吞掉异常,诊断信息会丢失。 - 项目声称 fair-use 覆盖不可再分发文章,但“可下载”不等于“允许再分发”;Nature Downloader 必须把个人获取、OA 状态与再分发许可分 - Network accessline 132
- 项目声称 fair-use 覆盖不可再分发文章,但“可下载”不等于“允许再分发”;Nature Downloader 必须把个人获取、OA 状态与再分发许可分开记录,不能沿用模糊语义。[项目声明](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/Readme.md#L15-L15) - Network accessline 136
对一个已选 URL,项目依次尝试:FTP 时先 `wget`、再 urllib FTP;然后 `cloudscraper`、`requests`,最后非 FTP 再 `wget`。[下载瀑布](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L1468-L149 - Network accessline 140
- 将“候选 URL 选择”和“传输实现回退”拆成两层;同一 OA URL 可按普通 HTTP、特殊站点适配器、浏览器访问等方式尝试。 - 每次传输必须落临时文件,使用内容/MIME 校验,失败时清理;PMC archive 单独作为资源包类型处理。 - 失败状态持久化后可显式重试,而不是每次从头重复元数据解析和所有候选。[失败重跑](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061 - Network accessline 142
- 失败状态持久化后可显式重试,而不是每次从头重复元数据解析和所有候选。[失败重跑](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L1328-L1359) - Network accessline 146
- 大量请求使用 `verify=False`,不应复制。 - `wget` 通过字符串拼接 URL 并 `shell=True` 执行,存在命令注入面;重构应使用参数数组或纯库调用。[wget 实现](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L1530 - Network accessline 147
- `wget` 通过字符串拼接 URL 并 `shell=True` 执行,存在命令注入面;重构应使用参数数组或纯库调用。[wget 实现](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L1530-L1583) - Network accessline 148
- cloudscraper 的重定向递归调用漏传 `filename`,该回退分支本身有缺陷。[cloudscraper 实现](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L1494-L1528) - Network accessline 153
项目用两套 LMDB 保存条目和标识符映射,以 `batch_size` 控制线程池批次;README 警告并发过高可能导致 OA 站点封锁。[批处理](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder/harvest.py#L530-L575) [并发说明](https://gith - Network accessline 155
每条记录生成 UUID 命名的 PDF、JSON,可选 NXML、TEI、缩略图和标注;本地存储按 UUID 分层目录,也可上传 S3。另可输出逐行 JSON 元数据 dump 和 `map.json` catalogue。[单条输出](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/article_dataset_builder - Network accessline 157
核心 Python 依赖为 boto3、python-magic、lmdb、tqdm、requests、cloudscraper、BeautifulSoup;可选处理还依赖系统 `wget`、ImageMagick、GROBID、Pub2TEI。[依赖](https://github.com/kermitt2/article_dataset_builder/blob/920fe298a81061e8a26d55d13829ccb6deb6501c/setup.py#L14-L - Network accessline 212
| Unpaywall + PMC +其他 OA location 候选瀑布 | 高 | 是 OA 发现的正确基本方向 | | LMDB 强标识符映射和阶段状态 | 中高 | 思想好;交互式 skill 可先用更轻的 manifest/SQLite | | 多 transport 回退 + MIME 验证 | 高 | 但实现应重写,不能复制 `verify=False`、shell wget 等细节 | - Network accessline 213
| LMDB 强标识符映射和阶段状态 | 中高 | 思想好;交互式 skill 可先用更轻的 manifest/SQLite | | 多 transport 回退 + MIME 验证 | 高 | 但实现应重写,不能复制 `verify=False`、shell wget 等细节 | | 整套 article_dataset_builder 作为依赖 | 低 | 过重、较旧、面向数据集构建,且存在已识别实现缺陷 | - Network accessline 214
| 多 transport 回退 + MIME 验证 | 高 | 但实现应重写,不能复制 `verify=False`、shell wget 等细节 |
skills/nature-downloader/examples/carsi-retry-template.tsv
- Network accessline 1
id project title doi year venue publisher failure_stage status source_url current_url next_action notes 1 example-project Example article title 10.xxxx/example 2026 Example Journal Example Publisher publisher_redirect carsi_waiting_user htt - Network accessline 2
1 example-project Example article title 10.xxxx/example 2026 Example Journal Example Publisher publisher_redirect carsi_waiting_user https://example.com/article https://login.university.example/ user_complete_institution_login_in_chrome Com
skills/nature-downloader/examples/manifest-template.tsv
- Network accessline 1
id title doi year venue status pdf_path si_status si_paths source_url notes 1 Innovative Use of an Injectable, Self-Healing Drug-Loaded Pectin-Based Hydrogel for Micro- and Supermicro-Vascular Anastomoses 10.1021/acs.biomac.4c00102 2024 Bio - Network accessline 2
1 Innovative Use of an Injectable, Self-Healing Drug-Loaded Pectin-Based Hydrogel for Micro- and Supermicro-Vascular Anastomoses 10.1021/acs.biomac.4c00102 2024 Biomacromolecules downloaded PDFs/Kocaaga_2024_Biomacromolecules_vascular_anast
skills/nature-downloader/examples/publisher-verification-template.tsv
- Network accessline 1
id project title doi year venue publisher status source_url current_url next_action notes 1 example-project Example ScienceDirect article 10.xxxx/example 2026 Example Journal ScienceDirect sciencedirect_robot_check https://www.sciencedirect - Network accessline 2
1 example-project Example ScienceDirect article 10.xxxx/example 2026 Example Journal ScienceDirect sciencedirect_robot_check https://www.sciencedirect.com/science/article/pii/... https://www.sciencedirect.com/... user_complete_publisher_ver
skills/nature-downloader/references/delivery-verification-and-failures.md
- Network accessline 48
https://pubs.acs.org/doi/suppl/<DOI>/suppl_file/<journal-code>_si_001.pdf
skills/nature-downloader/references/institutional-browser-workflow.md
- Network accessline 140
$node = "$env:LOCALAPPDATA\OpenAI\Codex\bin\node.exe" & $node "$env:USERPROFILE\.agents\skills\nature-downloader\scripts\browser_pdf_downloader.mjs" ` --url "https://www.sciencedirect.com/science/article/pii/SXXXXXXXXXXXXXXXX/pdfft" ` - Network accessline 141
& $node "$env:USERPROFILE\.agents\skills\nature-downloader\scripts\browser_pdf_downloader.mjs" --url "https://www.sciencedirect.com/science/article/pii/SXXXXXXXXXXXXXXXX/pdfft" - Network accessline 142
--url "https://www.sciencedirect.com/science/article/pii/SXXXXXXXXXXXXXXXX/pdfft" ` - Network accessline 148
- Opens the URL in the user's controlled Chrome session unless `--target` is provided. - Runs `fetch(location.href, { credentials: "include" })` inside the page. - Network accessline 149
- Runs `fetch(location.href, { credentials: "include" })` inside the page. - Network accessline 158
--target <targetId> Existing Chrome target/tab id to use --out <path> Output PDF path --proxy <url> CDP proxy URL, default http://127.0.0.1:3456 - Network accessline 159
--out <path> Output PDF path --proxy <url> CDP proxy URL, default http://127.0.0.1:3456 --close Close the tab after download if the script opened it - Network accessline 160
--proxy <url> CDP proxy URL, default http://127.0.0.1:3456 --close Close the tab after download if the script opened it --allow-non-pdf Save even when content does not start with %PDF
skills/nature-downloader/scripts/batch_download.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 11
// node batch_download.mjs --dois 10.x/a,10.y/b --out <dir> --si // node batch_download.mjs --title "<exact title>" --out <dir> --no-si // node batch_download.mjs --pdf-url "https://..." --title "<title>" --out <dir> --no-si - Network accessline 12
// node batch_download.mjs --title "<exact title>" --out <dir> --no-si // node batch_download.mjs --pdf-url "https://..." --title "<title>" --out <dir> --no-si // options: [--proxy http://127.0.0.1:3456] [--debug] [--legacy-status] - Network accessline 13
// node batch_download.mjs --pdf-url "https://..." --title "<title>" --out <dir> --no-si - Network accessline 14
// options: [--proxy http://127.0.0.1:3456] [--debug] [--legacy-status] - Network accessline 234
async function downloadDoi(proxy, doi, outDir, wantSi, debug, { cleanBundle = false, bundleTitle = "" } = {}) { const tab = (await newTab(proxy, "https://doi.org/" + doi)).targetId; - Network accessline 235
const tab = (await newTab(proxy, "https://doi.org/" + doi)).targetId; - Network accessline 307
if (/wiley\.com/i.test(meta.url || "") || (meta.cand || []).some((c) => /wiley\.com/i.test(c))) { meta.cand = [ `https://onlinelibrary.wiley.com/doi/pdfdirect/${doi}?download=true`, - Network accessline 308
meta.cand = [ `https://onlinelibrary.wiley.com/doi/pdfdirect/${doi}?download=true`, ...(meta.cand || []), - Network accessline 309
`https://onlinelibrary.wiley.com/doi/pdfdirect/${doi}?download=true`, - Network accessline 378
async function downloadDirectUrl(pdfUrl, outDir, title = "") { const response = await fetch(pdfUrl, { headers: { Accept: "application/pdf, text/html, application/xml" }, signal: AbortSignal.timeout(60000) }); - Network accessline 379
const response = await fetch(pdfUrl, { headers: { Accept: "application/pdf, text/html, application/xml" }, signal: AbortSignal.timeout(60000) }); - Network accessline 424
async function downloadSiForDoi(proxy, doi, outDir) { const tab = (await newTab(proxy, `https://doi.org/${doi}`)).targetId; - Network accessline 425
const tab = (await newTab(proxy, `https://doi.org/${doi}`)).targetId;
skills/nature-downloader/scripts/browser_pdf_downloader.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 15
function usage() { console.log(`Usage: node browser_pdf_downloader.mjs --url <pdf-url> --out <file.pdf> [--proxy http://127.0.0.1:3456] [--close] [--allow-non-pdf] - Network accessline 16
console.log(`Usage: node browser_pdf_downloader.mjs --url <pdf-url> --out <file.pdf> [--proxy http://127.0.0.1:3456] [--close] [--allow-non-pdf] node browser_pdf_downloader.mjs --target <targetId> --out <file.pdf> [--proxy http://127.0. - Network accessline 17
node browser_pdf_downloader.mjs --url <pdf-url> --out <file.pdf> [--proxy http://127.0.0.1:3456] [--close] [--allow-non-pdf] - Network accessline 18
node browser_pdf_downloader.mjs --target <targetId> --out <file.pdf> [--proxy http://127.0.0.1:3456] - Network accessline 86
const initJs = `( async () => { const r = await fetch(${fetchTarget}, { credentials: "include" }); - Network accessline 87
async () => { const r = await fetch(${fetchTarget}, { credentials: "include" }); const ct = r.headers.get("content-type") || ""; - Network accessline 88
const r = await fetch(${fetchTarget}, { credentials: "include" });
skills/nature-downloader/scripts/cdp_open_url.mjs
skills/nature-downloader/scripts/configure_credentials.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Network accessline 109
def _validation_request(provider: str, values: dict, service: str = "fulltext") -> urllib.request.Request: - Network accessline 110
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Network accessline 111
[Credential-related source omitted] - Network accessline 112
url = "https://api.elsevier.com/content/article/doi/10.1016/S0140-6736(20)30183-5?view=META" - Network accessline 114
if values.get("insttoken"): headers["X-ELS-Insttoken"] = values["insttoken"] return urllib.request.Request(url, headers=headers) - Network accessline 115
headers["X-ELS-Insttoken"] = values["insttoken"] return urllib.request.Request(url, headers=headers) if provider == "springer_nature": - Network accessline 116
return urllib.request.Request(url, headers=headers) - Network accessline 117
[Credential-related source omitted] - Network accessline 118
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 120
return urllib.request.Request(url, headers={"Accept": accept}) - Network accessline 121
[Credential-related source omitted] - Network accessline 122
return urllib.request.Request(url, headers={"Accept": "application/json"}) - Access to secretsline 131
[Credential-related source omitted] - Network accessline 133
return 2 try: with urllib.request.urlopen(_validation_request(args.provider, values, service), timeout=30) as response: - Network accessline 134
try: with urllib.request.urlopen(_validation_request(args.provider, values, service), timeout=30) as response: status = response.status - Network accessline 135
with urllib.request.urlopen(_validation_request(args.provider, values, service), timeout=30) as response: - Access to secretsline 169
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted]
skills/nature-downloader/scripts/configure_school.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-downloader/scripts/extract_pdf_text.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-downloader/scripts/lib/anti-bot.mjs
- Executable scriptline 1
Executable file - Network accessline 27
* Attempt to automatically pass any detected verification challenge. * * @param {string} proxy - CDP proxy URL (e.g. http://127.0.0.1:3456) - Network accessline 28
* * @param {string} proxy - CDP proxy URL (e.g. http://127.0.0.1:3456) * @param {string} target - Chrome target/tab ID - Network accessline 29
* @param {string} proxy - CDP proxy URL (e.g. http://127.0.0.1:3456) - Network accessline 650
async function dispatchMouse(type, x, y, button = "left", modifiers = 0) { const js = `fetch('http://localhost:0/cdp',{ - Network accessline 651
const js = `fetch('http://localhost:0/cdp',{
skills/nature-downloader/scripts/lib/cdp-utils.mjs
- Executable scriptline 1
Executable file - Dangerous shell operationline 12
// POST /eval (body=js, ?target=id) -> {value, ...} - Network accessline 19
export const DEFAULT_PROXY = "http://127.0.0.1:3456"; - Network accessline 29
let err; try { const r = await fetch(u, { signal: AbortSignal.timeout(timeoutMs) }); - Network accessline 30
try { const r = await fetch(u, { signal: AbortSignal.timeout(timeoutMs) }); if (!r.ok) { - Network accessline 31
const r = await fetch(u, { signal: AbortSignal.timeout(timeoutMs) }); - Network accessline 43
` Start: node <web-access>/scripts/check-deps.mjs\n` + ` Verify: chrome://inspect/#remote-debugging -> enable "Allow remote debugging"\n` + ` Probe: curl ${proxy}/targets` - Network accessline 44
` Verify: chrome://inspect/#remote-debugging -> enable "Allow remote debugging"\n` + ` Probe: curl ${proxy}/targets` ); - Network accessline 45
` Probe: curl ${proxy}/targets` - Network accessline 51
*/ export async function httpJson(url, options = {}) { const response = await fetch(url, { - Network accessline 52
export async function httpJson(url, options = {}) { const response = await fetch(url, { ...options, - Network accessline 53
const response = await fetch(url, {
skills/nature-downloader/scripts/lib/cnki.mjs
- Executable scriptline 1
Executable file - Network accessline 15
export const DEFAULT_CNKI_URL = "https://kns.cnki.net/kns8s/defaultresult/index"; - Network accessline 60
export function legacyCnkiDetailUrl({ filename = "", dbcode = "" } = {}) { if (!filename) return ""; const url = new URL("https://kns.cnki.net/kcms/detail/detail.aspx"); - Network accessline 61
if (!filename) return ""; const url = new URL("https://kns.cnki.net/kcms/detail/detail.aspx"); url.searchParams.set("filename", filename); - Network accessline 62
const url = new URL("https://kns.cnki.net/kcms/detail/detail.aspx");
skills/nature-downloader/scripts/lib/credentials.mjs
skills/nature-downloader/scripts/lib/direct-download.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/lib/manifest.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/lib/metadata.mjs
- Executable scriptline 1
Executable file - Network accessline 21
const headers = { Accept: "application/json" }; if (mailto) headers["User-Agent"] = `nature-downloader/1.0 (mailto:${mailto})`; const response = await fetchImpl(`https://api.crossref.org/works/${encodeURIComponent(normalizeDoi(doi))}`, - Network accessline 22
if (mailto) headers["User-Agent"] = `nature-downloader/1.0 (mailto:${mailto})`; const response = await fetchImpl(`https://api.crossref.org/works/${encodeURIComponent(normalizeDoi(doi))}`, { headers, - Network accessline 23
const response = await fetchImpl(`https://api.crossref.org/works/${encodeURIComponent(normalizeDoi(doi))}`, { - Network accessline 32
export async function findCrossrefByTitle(title, { fetchImpl = fetch, mailto = "" } = {}) { const url = new URL("https://api.crossref.org/works"); - Network accessline 33
const url = new URL("https://api.crossref.org/works");
skills/nature-downloader/scripts/lib/open-access-provider.mjs
- Executable scriptline 1
Executable file - Network accessline 18
function httpsForFtp(url = "") { return String(url).replace(/^ftp:\/\/ftp\.ncbi\.nlm\.nih\.gov\//i, "https://ftp.ncbi.nlm.nih.gov/"); - Network accessline 19
return String(url).replace(/^ftp:\/\/ftp\.ncbi\.nlm\.nih\.gov\//i, "https://ftp.ncbi.nlm.nih.gov/"); - Network accessline 54
async function findPmcidByDoi(doi, fetchImpl) { if (!doi) return { pmcid: "", checked: false }; const url = new URL("https://www.ebi.ac.uk/europepmc/webservices/rest/search"); - Network accessline 55
if (!doi) return { pmcid: "", checked: false }; const url = new URL("https://www.ebi.ac.uk/europepmc/webservices/rest/search"); url.searchParams.set("query", `DOI:${doi}`); - Network accessline 56
const url = new URL("https://www.ebi.ac.uk/europepmc/webservices/rest/search");
skills/nature-downloader/scripts/lib/open-access.mjs
- Executable scriptline 1
Executable file - Network accessline 19
const normalized = normalizeArxivId(id); if (!normalized) return ""; return `https://arxiv.org/pdf/${normalized}`; - Network accessline 20
if (!normalized) return ""; return `https://arxiv.org/pdf/${normalized}`; } - Network accessline 21
return `https://arxiv.org/pdf/${normalized}`; - Network accessline 46
export async function findArxivByTitle(title, { fetchImpl = fetch } = {}) { const url = new URL("https://export.arxiv.org/api/query"); - Network accessline 47
const url = new URL("https://export.arxiv.org/api/query"); - Network accessline 102
export async function findPmcCandidates(pmcid, { fetchImpl = fetch } = {}) { if (!pmcid) return []; const response = await fetchImpl(`https://www.ncbi.nlm.nih.gov/pmc/utils/oa/oa.fcgi?id=${encodeURIComponent(pmcid)}`, { signal: AbortSig - Network accessline 103
if (!pmcid) return []; const response = await fetchImpl(`https://www.ncbi.nlm.nih.gov/pmc/utils/oa/oa.fcgi?id=${encodeURIComponent(pmcid)}`, { signal: AbortSignal.timeout(30000) }); if (!response.ok) return []; - Network accessline 104
const response = await fetchImpl(`https://www.ncbi.nlm.nih.gov/pmc/utils/oa/oa.fcgi?id=${encodeURIComponent(pmcid)}`, { signal: AbortSignal.timeout(30000) }); - Network accessline 115
export async function fetchUnpaywallRecord(doi, email, { fetchImpl = fetch } = {}) { if (!doi || !email) return null; const response = await fetchImpl(`https://api.unpaywall.org/v2/${encodeURIComponent(doi)}?email=${encodeURIComponent(e - Network accessline 116
if (!doi || !email) return null; const response = await fetchImpl(`https://api.unpaywall.org/v2/${encodeURIComponent(doi)}?email=${encodeURIComponent(email)}`, { signal: AbortSignal.timeout(30000) }); if (!response.ok) throw new Error(` - Network accessline 117
const response = await fetchImpl(`https://api.unpaywall.org/v2/${encodeURIComponent(doi)}?email=${encodeURIComponent(email)}`, { signal: AbortSignal.timeout(30000) });
skills/nature-downloader/scripts/lib/pdf-utils.mjs
- Executable scriptline 1
Executable file - Network accessline 3
// All functions take proxy + target explicitly so they work regardless of // which script calls them. Bytes are fetched inside the page's authenticated // context via fetch(), then transferred to Node in base64 chunks and written - Network accessline 4
// which script calls them. Bytes are fetched inside the page's authenticated // context via fetch(), then transferred to Node in base64 chunks and written // to disk. This is the same approach as the original code but: - Network accessline 5
// context via fetch(), then transferred to Node in base64 chunks and written - Network accessline 54
const varName = `__litDlBytes_${Math.random().toString(36).slice(2, 10)}`; const js = `(async()=>{try{ const r=await fetch(${JSON.stringify(url)},{credentials:'include'}); - Network accessline 55
const js = `(async()=>{try{ const r=await fetch(${JSON.stringify(url)},{credentials:'include'}); const ab=await r.arrayBuffer(); - Network accessline 56
const r=await fetch(${JSON.stringify(url)},{credentials:'include'});
skills/nature-downloader/scripts/lib/provider-registry.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/lib/provider-utils.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/lib/publisher-providers.mjs
- Executable scriptline 1
Executable file - Access to secretsline 23
[Credential-related source omitted] - Network accessline 24
if (credentials.insttoken) headers["X-ELS-Insttoken"] = credentials.insttoken; if (credentials.authtoken) headers["X-ELS-Authtoken"] = credentials.authtoken; return { url: `https://api.elsevier.com/content/article/doi/${doi}?httpAcc - Network accessline 25
if (credentials.authtoken) headers["X-ELS-Authtoken"] = credentials.authtoken; return { url: `https://api.elsevier.com/content/article/doi/${doi}?httpAccept=application/pdf`, options: { headers } }; } - Network accessline 26
return { url: `https://api.elsevier.com/content/article/doi/${doi}?httpAccept=application/pdf`, options: { headers } }; - Network accessline 27
} if (provider === "springer_nature") { const url = new URL("https://api.springernature.com/xmldata/jats"); - Network accessline 28
if (provider === "springer_nature") { const url = new URL("https://api.springernature.com/xmldata/jats"); url.searchParams.set("q", `doi:${article.doi}`); - Network accessline 29
const url = new URL("https://api.springernature.com/xmldata/jats"); - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted]
skills/nature-downloader/scripts/lib/routing.mjs
skills/nature-downloader/scripts/lib/school-config.mjs
skills/nature-downloader/scripts/lib/settings.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/lib/status-codes.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/lib/wos-supporting-information.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/scripts/retry_elsevier_api.mjs
- Executable scriptline 1
#!/usr/bin/env node
skills/nature-downloader/src/config.py
skills/nature-downloader/src/health_check.py
- Executable scriptline 1
Executable file - Network accessline 57
if carsi_entry: suggestions.append( f"2. CARSI 入口可能变更:访问 https://www.carsi.edu.cn/ " - Network accessline 58
suggestions.append( f"2. CARSI 入口可能变更:访问 https://www.carsi.edu.cn/ " f"确认贵校当前入口,或说「换学校」重新配置。" - Network accessline 59
f"2. CARSI 入口可能变更:访问 https://www.carsi.edu.cn/ "
skills/nature-downloader/src/schools_loader.py
- Executable scriptline 1
Executable file
skills/nature-downloader/src/validators.py
- Executable scriptline 1
Executable file - Network accessline 42
for family, socktype, proto, _, sockaddr in addrs: try: with socket.create_connection(sockaddr, timeout=timeout) as sock: - Network accessline 43
try: with socket.create_connection(sockaddr, timeout=timeout) as sock: ctx = ssl.create_default_context() - Network accessline 44
with socket.create_connection(sockaddr, timeout=timeout) as sock: - Network accessline 48
if cert is None: return False, f"HTTPS 证书无效:{domain}" return True, f"SSO 域名可达:https://{domain}" - Network accessline 49
return False, f"HTTPS 证书无效:{domain}" return True, f"SSO 域名可达:https://{domain}" except (socket.timeout, ConnectionRefusedError, OSError) as e: - Network accessline 50
return True, f"SSO 域名可达:https://{domain}" except (socket.timeout, ConnectionRefusedError, OSError) as e: last_err = str(e) - Network accessline 55
return False, f"无法连接到 https://{domain}(443 端口):{last_err}" - Network accessline 70
try: req = urllib.request.Request( - Network accessline 71
req = urllib.request.Request( - Network accessline 76
}, ) with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 77
) with urllib.request.urlopen(req, timeout=timeout) as resp: status = resp.getcode() - Network accessline 78
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 116
try: req = urllib.request.Request( - Network accessline 117
req = urllib.request.Request( - Network accessline 122
}, ) with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 123
) with urllib.request.urlopen(req, timeout=timeout) as resp: status = resp.getcode() - Network accessline 124
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 192
print("\n=== CARSI 入口校验 ===") ok, msg = validate_carsi_entry("https://www.carsi.edu.cn/") - Network accessline 193
ok, msg = validate_carsi_entry("https://www.carsi.edu.cn/")
skills/nature-downloader/src/wizard.py
- Executable scriptline 1
Executable file - Network accessline 38
raw_url = url.strip() parsed = urlparse(raw_url if "://" in raw_url else f"https://{raw_url}") - Network accessline 39
parsed = urlparse(raw_url if "://" in raw_url else f"https://{raw_url}") - Network accessline 204
f"未在预设库中匹配到「{name}」,进入自助配置向导。\n\n" "Step 2: 你的学校/单位是否接入 CARSI 联邦认证?\n" "(CARSI 是高校统一身份认证联邦,查询入口:https://www.carsi.edu.cn/)\n\n" - Network accessline 205
"Step 2: 你的学校/单位是否接入 CARSI 联邦认证?\n" "(CARSI 是高校统一身份认证联邦,查询入口:https://www.carsi.edu.cn/)\n\n" " 1. 是,已接入 CARSI\n" - Network accessline 206
"(CARSI 是高校统一身份认证联邦,查询入口:https://www.carsi.edu.cn/)\n\n" - Network accessline 222
"prompt": ( "请粘贴贵校的 CARSI 入口 URL。\n" "(可在 https://www.carsi.edu.cn/ 成员机构列表中找到," - Network accessline 223
"请粘贴贵校的 CARSI 入口 URL。\n" "(可在 https://www.carsi.edu.cn/ 成员机构列表中找到," "例如 https://login.university.example/idp/shibboleth;请使用本机构实际入口)\n\n" - Network accessline 224
"(可在 https://www.carsi.edu.cn/ 成员机构列表中找到," - Network accessline 225
"例如 https://login.university.example/idp/shibboleth;请使用本机构实际入口)\n\n"
skills/nature-downloader/tests/python/test_config_credentials.py
skills/nature-downloader/tests/python/test_config_wizard.py
- Executable scriptline 1
Executable file - Network accessline 35
wizard = importlib.import_module("wizard") wizard = importlib.reload(wizard) result = wizard.infer_access_from_url("https://portal.metaersp.example/personal") - Network accessline 36
wizard = importlib.reload(wizard) result = wizard.infer_access_from_url("https://portal.metaersp.example/personal") finally: - Network accessline 37
result = wizard.infer_access_from_url("https://portal.metaersp.example/personal") - Network accessline 43
self.assertEqual(result["auth_type"], "cas") self.assertEqual(result["sso_domain"], "portal.metaersp.example") self.assertEqual(result["resource_entry"], "https://portal.metaersp.example/personal") - Network accessline 44
self.assertEqual(result["sso_domain"], "portal.metaersp.example") self.assertEqual(result["resource_entry"], "https://portal.metaersp.example/personal") self.assertEqual(result["institution_hint"], "portal") - Network accessline 45
self.assertEqual(result["resource_entry"], "https://portal.metaersp.example/personal") - Network accessline 52
wizard = importlib.reload(wizard) result = wizard.infer_access_from_url( "https://login.university.example/authserver/login?service=https%3A%2F%2Fresources.university.example%2Fservice%2Fcampus%2Fcallback" - Network accessline 53
result = wizard.infer_access_from_url( "https://login.university.example/authserver/login?service=https%3A%2F%2Fresources.university.example%2Fservice%2Fcampus%2Fcallback" ) - Network accessline 54
"https://login.university.example/authserver/login?service=https%3A%2F%2Fresources.university.example%2Fservice%2Fcampus%2Fcallback" - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Network accessline 75
wizard = importlib.reload(wizard) w = wizard.Wizard() w.handle_step1("https://portal.metaersp.example/personal") - Network accessline 76
w = wizard.Wizard() w.handle_step1("https://portal.metaersp.example/personal") result = w.handle_step7("1") - Network accessline 77
w.handle_step1("https://portal.metaersp.example/personal") - Network accessline 83
self.assertEqual(data["school"]["source"], "resource_url") self.assertEqual(data["auth"]["sso_domain"], "portal.metaersp.example") self.assertEqual(data["discovery"]["resource_portal_url"], "https://portal.me - Network accessline 84
self.assertEqual(data["auth"]["sso_domain"], "portal.metaersp.example") self.assertEqual(data["discovery"]["resource_portal_url"], "https://portal.metaersp.example/personal") finally: - Network accessline 85
self.assertEqual(data["discovery"]["resource_portal_url"], "https://portal.metaersp.example/personal") - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Network accessline 123
env["LIT_DL_CONFIG_DIR"] = tmp result = subprocess.run( [sys.executable, str(SCRIPT), "url", "https://portal.metaersp.example/personal"], - Network accessline 124
result = subprocess.run( [sys.executable, str(SCRIPT), "url", "https://portal.metaersp.example/personal"], cwd=ROOT, - Network accessline 125
[sys.executable, str(SCRIPT), "url", "https://portal.metaersp.example/personal"], - Access to secretsline 140
[Credential-related source omitted] - Network accessline 141
env["LIT_DL_CONFIG_DIR"] = tmp result = subprocess.run( [sys.executable, str(SCRIPT), "infer", "https://portal.metaersp.example/personal"], - Network accessline 142
result = subprocess.run( [sys.executable, str(SCRIPT), "infer", "https://portal.metaersp.example/personal"], cwd=ROOT, - Network accessline 143
[sys.executable, str(SCRIPT), "infer", "https://portal.metaersp.example/personal"], - Access to secretsline 158
[Credential-related source omitted] - Network accessline 159
env["LIT_DL_CONFIG_DIR"] = tmp configured = subprocess.run( [sys.executable, str(SCRIPT), "url", "https://portal.metaersp.example/personal"], - Network accessline 160
configured = subprocess.run( [sys.executable, str(SCRIPT), "url", "https://portal.metaersp.example/personal"], cwd=ROOT, - Network accessline 161
[sys.executable, str(SCRIPT), "url", "https://portal.metaersp.example/personal"], - Network accessline 169
result = subprocess.run( [sys.executable, str(SCRIPT), "cnki-url", "https://kns.cnki.net/kns8s/defaultresult/index"], - Network accessline 170
[sys.executable, str(SCRIPT), "cnki-url", "https://kns.cnki.net/kns8s/defaultresult/index"], - Network accessline 179
self.assertTrue(data["ok"]) saved = json.loads((Path(tmp) / "school.json").read_text(encoding="utf-8")) self.assertEqual(saved["discovery"]["cnki_url"], "https://kns.cnki.net/kns8s/defaultresult/index") - Network accessline 181
self.assertEqual(saved["discovery"]["cnki_url"], "https://kns.cnki.net/kns8s/defaultresult/index")
skills/nature-downloader/tests/python/test_credential_validation.py
- Executable scriptline 1
Executable file - Access to secretsline 23
[Credential-related source omitted] - Network accessline 42
[Credential-related source omitted] - Network accessline 43
[Credential-related source omitted] - Network accessline 44
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Network accessline 52
[Credential-related source omitted] - Network accessline 53
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted]
skills/nature-downloader/tests/python/test_springer_services.py
- Executable scriptline 1
Executable file - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted]
skills/nature-downloader/tests/unit/batch-cli.test.mjs
- Executable scriptline 1
Executable file - Network accessline 39
const args = parseArgs([ "node", "batch_download.mjs", "--pdf-url", "https://example.org/paper.pdf", - Network accessline 40
"node", "batch_download.mjs", "--pdf-url", "https://example.org/paper.pdf", "--title", "Example Paper", - Network accessline 41
"--pdf-url", "https://example.org/paper.pdf", - Network accessline 43
"--no-si", ]); assert.equal(args.pdfUrl, "https://example.org/paper.pdf"); - Network accessline 44
]); assert.equal(args.pdfUrl, "https://example.org/paper.pdf"); assert.equal(args.title, "Example Paper"); - Network accessline 45
assert.equal(args.pdfUrl, "https://example.org/paper.pdf"); - Network accessline 67
const run = spawnSync(process.execPath, [ script, "--pdf-url", "https://example.org/paper.pdf", - Network accessline 68
script, "--pdf-url", "https://example.org/paper.pdf", "--language", "zh", - Network accessline 69
"--pdf-url", "https://example.org/paper.pdf",
skills/nature-downloader/tests/unit/cnki.test.mjs
- Executable scriptline 1
Executable file - Network accessline 26
test("recognizes CNKI hosts", () => { assert.equal(isCnkiUrl("https://kns.cnki.net/kcms/detail/detail.aspx"), true); - Network accessline 27
assert.equal(isCnkiUrl("https://kns.cnki.net/kcms/detail/detail.aspx"), true); - Network accessline 28
assert.equal(isCnkiUrl("https://navi.cnki.com.cn/knavi/"), true); - Network accessline 29
assert.equal(isCnkiUrl("https://example.org/paper"), false); - Network accessline 40
test("filters CNKI candidates to PDF-only when requested", () => { const candidates = [ { text: "下载", url: "https://kns.cnki.net/kcms/download.aspx?filename=abc" }, - Network accessline 41
const candidates = [ { text: "下载", url: "https://kns.cnki.net/kcms/download.aspx?filename=abc" }, { text: "PDF下载", url: "https://kns.cnki.net/kcms/download.aspx?filename=abc&dflag=pdf" }, - Network accessline 42
{ text: "下载", url: "https://kns.cnki.net/kcms/download.aspx?filename=abc" }, - Network accessline 43
{ text: "PDF下载", url: "https://kns.cnki.net/kcms/download.aspx?filename=abc&dflag=pdf" }, - Network accessline 44
{ text: "CAJ下载", url: "https://kns.cnki.net/kcms/download.aspx?filename=abc&dflag=caj" }, - Network accessline 50
test("keeps browser/FSSO/WebVPN access behind one transport seam", () => { assert.equal(createCnkiTransport({ mode: "fsso" }).resolve("https://kns.cnki.net/a"), "https://kns.cnki.net/a"); - Network accessline 51
assert.equal(createCnkiTransport({ mode: "fsso" }).resolve("https://kns.cnki.net/a"), "https://kns.cnki.net/a"); - Network accessline 52
assert.equal( createCnkiTransport({ mode: "webvpn", webvpnUrlTemplate: "https://vpn.example/proxy?url={url}" }).resolve("https://kns.cnki.net/a"), "https://vpn.example/proxy?url=https%3A%2F%2Fkns.cnki.net%2Fa" - Network accessline 53
createCnkiTransport({ mode: "webvpn", webvpnUrlTemplate: "https://vpn.example/proxy?url={url}" }).resolve("https://kns.cnki.net/a"), - Network accessline 54
"https://vpn.example/proxy?url=https%3A%2F%2Fkns.cnki.net%2Fa"
skills/nature-downloader/tests/unit/credentials.test.mjs
skills/nature-downloader/tests/unit/direct-download-collision.test.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/tests/unit/generic-package.test.mjs
skills/nature-downloader/tests/unit/manifest.test.mjs
- Executable scriptline 1
Executable file - Network accessline 14
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Network accessline 16
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted]
skills/nature-downloader/tests/unit/metadata.test.mjs
- Executable scriptline 1
Executable file - Network accessline 10
publisher: "Elsevier BV", language: "en", license: [{ URL: "https://creativecommons.org/licenses/by/4.0/" }], - Network accessline 11
language: "en", license: [{ URL: "https://creativecommons.org/licenses/by/4.0/" }], link: [{ URL: "https://example.org/article.pdf", "content-type": "application/pdf", "intended-application": "text-mining" }], - Network accessline 12
license: [{ URL: "https://creativecommons.org/licenses/by/4.0/" }], - Network accessline 13
link: [{ URL: "https://example.org/article.pdf", "content-type": "application/pdf", "intended-application": "text-mining" }], - Network accessline 17
assert.equal(article.publisher, "Elsevier BV"); assert.equal(article.language, "en"); assert.equal(article.license, "https://creativecommons.org/licenses/by/4.0/"); - Network accessline 18
assert.equal(article.language, "en"); assert.equal(article.license, "https://creativecommons.org/licenses/by/4.0/"); assert.equal(article.publisherPdfUrl, "https://example.org/article.pdf"); - Network accessline 19
assert.equal(article.license, "https://creativecommons.org/licenses/by/4.0/"); - Network accessline 20
assert.equal(article.publisherPdfUrl, "https://example.org/article.pdf");
skills/nature-downloader/tests/unit/open-access-provider.test.mjs
- Executable scriptline 1
Executable file - Network accessline 14
fetchImpl: async (url) => { calls.push(String(url)); if (String(url).includes("oa.fcgi")) return new Response(`<OA><records><record><link format="pdf" href="https://ftp.ncbi.nlm.nih.gov/a.pdf" /></record></records></OA>`); - Network accessline 15
calls.push(String(url)); if (String(url).includes("oa.fcgi")) return new Response(`<OA><records><record><link format="pdf" href="https://ftp.ncbi.nlm.nih.gov/a.pdf" /></record></records></OA>`); if (String(url).includes("unp - Network accessline 16
if (String(url).includes("oa.fcgi")) return new Response(`<OA><records><record><link format="pdf" href="https://ftp.ncbi.nlm.nih.gov/a.pdf" /></record></records></OA>`); - Network accessline 17
if (String(url).includes("unpaywall")) return Response.json({ is_oa: true, best_oa_location: { url_for_pdf: "https://repo.example/a.pdf" }, oa_locations: [] }); - Network accessline 49
test("does not reclassify a confirmed OA article as closed when its file is temporarily unavailable", async () => { const result = await downloadOpenAccessArticle({ doi: "10.1234/oa", title: "OA", license: "cc-by", publisherPdfUrl: "htt - Network accessline 50
const result = await downloadOpenAccessArticle({ doi: "10.1234/oa", title: "OA", license: "cc-by", publisherPdfUrl: "https://publisher.example/a.pdf" }, { - Network accessline 52
outDir: fs.mkdtempSync(path.join(os.tmpdir(), "oa-")), fetchImpl: async (url) => String(url).includes("unpaywall") ? Response.json({ is_oa: true, best_oa_location: { url_for_pdf: "https://repo.example/a.pdf", host_type: "repos - Network accessline 53
fetchImpl: async (url) => String(url).includes("unpaywall") ? Response.json({ is_oa: true, best_oa_location: { url_for_pdf: "https://repo.example/a.pdf", host_type: "repository" }, oa_locations: [] }) : String(url).includes( - Network accessline 54
? Response.json({ is_oa: true, best_oa_location: { url_for_pdf: "https://repo.example/a.pdf", host_type: "repository" }, oa_locations: [] }) - Network accessline 65
doi: "10.1234/paywalled", title: "Paywalled", license: "http://www.elsevier.com/tdm/userlicense/1.0/", - Network accessline 66
title: "Paywalled", license: "http://www.elsevier.com/tdm/userlicense/1.0/", publisherPdfUrl: "https://publisher.example/p.pdf", - Network accessline 67
license: "http://www.elsevier.com/tdm/userlicense/1.0/", - Network accessline 68
publisherPdfUrl: "https://publisher.example/p.pdf", - Network accessline 84
doi: "10.1234/cc", title: "CC", license: "https://creativecommons.org/licenses/by/4.0/", - Network accessline 85
title: "CC", license: "https://creativecommons.org/licenses/by/4.0/", }, { - Network accessline 86
license: "https://creativecommons.org/licenses/by/4.0/",
skills/nature-downloader/tests/unit/open-access.test.mjs
- Executable scriptline 1
Executable file - Network accessline 16
assert.equal(normalizeArxivId("1706.03762"), "1706.03762"); assert.equal(normalizeArxivId("1706.03762v7"), "1706.03762v7"); assert.equal(normalizeArxivId("https://arxiv.org/abs/1706.03762"), "1706.03762"); - Network accessline 17
assert.equal(normalizeArxivId("1706.03762v7"), "1706.03762v7"); assert.equal(normalizeArxivId("https://arxiv.org/abs/1706.03762"), "1706.03762"); assert.equal(normalizeArxivId("https://arxiv.org/pdf/1706.03762.pdf"), "1706.03762"); - Network accessline 18
assert.equal(normalizeArxivId("https://arxiv.org/abs/1706.03762"), "1706.03762"); - Network accessline 19
assert.equal(normalizeArxivId("https://arxiv.org/pdf/1706.03762.pdf"), "1706.03762"); - Network accessline 22
test("builds canonical arXiv PDF URL", () => { assert.equal(arxivPdfUrl("1706.03762"), "https://arxiv.org/pdf/1706.03762"); - Network accessline 23
assert.equal(arxivPdfUrl("1706.03762"), "https://arxiv.org/pdf/1706.03762"); - Network accessline 34
<feed> <entry> <id>http://arxiv.org/abs/1706.03762v7</id> - Network accessline 35
<entry> <id>http://arxiv.org/abs/1706.03762v7</id> <title>Attention Is All You Need</title> - Network accessline 36
<id>http://arxiv.org/abs/1706.03762v7</id> - Network accessline 38
</entry> <entry> <id>http://arxiv.org/abs/0000.00000</id> - Network accessline 39
<entry> <id>http://arxiv.org/abs/0000.00000</id> <title>Getting the attention you need</title> - Network accessline 40
<id>http://arxiv.org/abs/0000.00000</id> - Network accessline 45
id: "1706.03762v7", title: "Attention Is All You Need", pdfUrl: "https://arxiv.org/pdf/1706.03762v7", - Network accessline 46
title: "Attention Is All You Need", pdfUrl: "https://arxiv.org/pdf/1706.03762v7", }); - Network accessline 47
pdfUrl: "https://arxiv.org/pdf/1706.03762v7", - Network accessline 51
test("creates readable PDF filenames", () => { assert.equal( filenameForPdfUrl("https://arxiv.org/pdf/1706.03762", "Attention Is All You Need"), - Network accessline 52
assert.equal( filenameForPdfUrl("https://arxiv.org/pdf/1706.03762", "Attention Is All You Need"), "Attention_Is_All_You_Need.pdf" - Network accessline 53
filenameForPdfUrl("https://arxiv.org/pdf/1706.03762", "Attention Is All You Need"), - Network accessline 55
); assert.equal( filenameForPdfUrl("https://example.org/papers/a/b/c.pdf"), - Network accessline 56
assert.equal( filenameForPdfUrl("https://example.org/papers/a/b/c.pdf"), "c.pdf" - Network accessline 57
filenameForPdfUrl("https://example.org/papers/a/b/c.pdf"), - Network accessline 64
const unpaywall = parseUnpaywallRecord({ is_oa: true, best_oa_location: { url_for_pdf: "https://repo.example/a.pdf", host_type: "repository", version: "acceptedVersion", license: "cc-by" }, - Network accessline 65
is_oa: true, best_oa_location: { url_for_pdf: "https://repo.example/a.pdf", host_type: "repository", version: "acceptedVersion", license: "cc-by" }, oa_locations: [], - Network accessline 66
best_oa_location: { url_for_pdf: "https://repo.example/a.pdf", host_type: "repository", version: "acceptedVersion", license: "cc-by" },
skills/nature-downloader/tests/unit/pdf-utils-atomic-write.test.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/tests/unit/provider-utils.test.mjs
- Executable scriptline 1
Executable file
skills/nature-downloader/tests/unit/publisher-providers.test.mjs
- Executable scriptline 1
Executable file - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 49
fetchImpl: async (input, options) => { const url = new URL(input); assert.equal(url.origin, "https://api.springernature.com"); - Network accessline 50
const url = new URL(input); assert.equal(url.origin, "https://api.springernature.com"); assert.equal(url.pathname, "/xmldata/jats"); - Network accessline 51
assert.equal(url.origin, "https://api.springernature.com"); - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Network accessline 79
[Credential-related source omitted] - Network accessline 80
[Credential-related source omitted] - Network accessline 81
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted]
skills/nature-downloader/tests/unit/routing.test.mjs
- Executable scriptline 1
Executable file - Network accessline 31
assert.equal(chooseRoute({ title: "乡村振兴研究", isOa: true, publisher: "Elsevier" }).provider, "cnki"); assert.equal(chooseRoute({ language: "zh", doi: "10.1016/example", isOa: false }).provider, "cnki"); assert.equal(chooseRoute({ sour - Network accessline 32
assert.equal(chooseRoute({ language: "zh", doi: "10.1016/example", isOa: false }).provider, "cnki"); assert.equal(chooseRoute({ sourceUrl: "https://kns.cnki.net/kcms/detail/detail.aspx?filename=x" }).provider, "cnki"); }); - Network accessline 33
assert.equal(chooseRoute({ sourceUrl: "https://kns.cnki.net/kcms/detail/detail.aspx?filename=x" }).provider, "cnki"); - Network accessline 36
test("does not let a non-CNKI PDF URL bypass Chinese routing", () => { assert.deepEqual(chooseDirectUrlRoute({ pdfUrl: "https://example.org/paper.pdf", - Network accessline 37
assert.deepEqual(chooseDirectUrlRoute({ pdfUrl: "https://example.org/paper.pdf", title: "乡村振兴研究", - Network accessline 38
pdfUrl: "https://example.org/paper.pdf", - Network accessline 40
}), { provider: "cnki", mode: "title_search", reason: "chinese_literature" }); assert.deepEqual(chooseDirectUrlRoute({ pdfUrl: "https://example.org/paper.pdf", - Network accessline 41
assert.deepEqual(chooseDirectUrlRoute({ pdfUrl: "https://example.org/paper.pdf", language: "zh-CN", - Network accessline 42
pdfUrl: "https://example.org/paper.pdf", - Network accessline 47
test("keeps CNKI direct URLs on the direct CNKI path", () => { assert.deepEqual(chooseDirectUrlRoute({ pdfUrl: "https://kns.cnki.net/kcms/detail/detail.aspx?filename=x", - Network accessline 48
assert.deepEqual(chooseDirectUrlRoute({ pdfUrl: "https://kns.cnki.net/kcms/detail/detail.aspx?filename=x", title: "乡村振兴研究", - Network accessline 49
pdfUrl: "https://kns.cnki.net/kcms/detail/detail.aspx?filename=x", - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Network accessline 63
[Credential-related source omitted] - Network accessline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 65
fulltext_endpoint: "https://ieee.example/articles/{doi}",
skills/nature-downloader/tests/unit/school-config.test.mjs
- Executable scriptline 1
Executable file - Network accessline 25
const config = { discovery: { web_of_science_url: "https://example.edu/wos", - Network accessline 26
discovery: { web_of_science_url: "https://example.edu/wos", }, - Network accessline 27
web_of_science_url: "https://example.edu/wos", - Network accessline 28
}, }; assert.equal(discoveryUrlFromConfig(config), "https://example.edu/wos"); - Network accessline 29
}; assert.equal(discoveryUrlFromConfig(config), "https://example.edu/wos"); }); - Network accessline 30
assert.equal(discoveryUrlFromConfig(config), "https://example.edu/wos");
skills/nature-downloader/tests/unit/springer-services.test.mjs
- Executable scriptline 1
Executable file - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Network accessline 36
calls++; const url = new URL(input); assert.equal(url.origin, "https://api.springernature.com"); - Network accessline 37
const url = new URL(input); assert.equal(url.origin, "https://api.springernature.com"); assert.equal(url.pathname, "/openaccess/jats"); - Network accessline 38
assert.equal(url.origin, "https://api.springernature.com"); - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 117
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Network accessline 127
[Credential-related source omitted] - Network accessline 128
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted] - Network accessline 129
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted]
skills/nature-downloader/tests/unit/status-codes.test.mjs
- Executable scriptline 1
Executable file - Network accessline 15
describe("classifyWall", () => { test("generic CAS URL -> carsi_waiting_user", () => { const r = classifyWall("https://login.university.example/authserver/login?service=x", "Login", ""); - Network accessline 16
test("generic CAS URL -> carsi_waiting_user", () => { const r = classifyWall("https://login.university.example/authserver/login?service=x", "Login", ""); assert.equal(r.status, STATUS.CARSI_WAITING_USER); - Network accessline 17
const r = classifyWall("https://login.university.example/authserver/login?service=x", "Login", ""); - Network accessline 22
test("generic IdP URL -> carsi_waiting_user", () => { const r = classifyWall("https://identity.university.example/idp/profile/SAML2/Redirect/SSO", "", ""); - Network accessline 23
const r = classifyWall("https://identity.university.example/idp/profile/SAML2/Redirect/SSO", "", ""); - Network accessline 27
test("carsi.edu.cn URL -> carsi_waiting_user", () => { const r = classifyWall("https://ds.carsi.edu.cn/wayf", "", ""); - Network accessline 28
const r = classifyWall("https://ds.carsi.edu.cn/wayf", "", ""); - Network accessline 32
test("shibboleth URL -> carsi_waiting_user", () => { const r = classifyWall("https://publisher.com/shibboleth", "", ""); - Network accessline 33
const r = classifyWall("https://publisher.com/shibboleth", "", ""); - Network accessline 37
test("ScienceDirect + 'Are you a robot?' -> sciencedirect_robot_check", () => { const r = classifyWall( "https://www.sciencedirect.com/science/article/pii/Sxxx", - Network accessline 38
const r = classifyWall( "https://www.sciencedirect.com/science/article/pii/Sxxx", "Are you a robot?", - Network accessline 39
"https://www.sciencedirect.com/science/article/pii/Sxxx", - Network accessline 46
test("non-ScienceDirect + 'Are you a robot?' -> publisher_verification_waiting_user", () => { const r = classifyWall( "https://www.springer.com/article/10.1007/x", - Network accessline 47
const r = classifyWall( "https://www.springer.com/article/10.1007/x", "Are you a robot?", - Network accessline 48
"https://www.springer.com/article/10.1007/x", - Network accessline 55
test("Cloudflare challenge -> publisher_verification_waiting_user", () => { const r = classifyWall("https://onlinelibrary.wiley.com/doi/x", "", "cloudflare challenge"); - Network accessline 56
const r = classifyWall("https://onlinelibrary.wiley.com/doi/x", "", "cloudflare challenge"); - Network accessline 60
test("CAPTCHA -> publisher_verification_waiting_user", () => { const r = classifyWall("https://publisher.com/x", "Verify", "please complete captcha"); - Network accessline 61
const r = classifyWall("https://publisher.com/x", "Verify", "please complete captcha"); - Network accessline 65
test("Access Denied -> publisher_blocked_waiting_user", () => { const r = classifyWall("https://publisher.com/x", "Access Denied", "403 forbidden"); - Network accessline 66
const r = classifyWall("https://publisher.com/x", "Access Denied", "403 forbidden"); - Network accessline 70
test("Forbidden -> publisher_blocked_waiting_user", () => { const r = classifyWall("https://publisher.com/x", "Forbidden", ""); - Network accessline 71
const r = classifyWall("https://publisher.com/x", "Forbidden", ""); - Network accessline 75
test("normal publisher page -> null (no wall)", () => { const r = classifyWall( "https://www.nature.com/articles/s41586-021-03819-2", - Network accessline 76
const r = classifyWall( "https://www.nature.com/articles/s41586-021-03819-2", "Article title", - Network accessline 77
"https://www.nature.com/articles/s41586-021-03819-2", - Network accessline 87
const r = classifyWall( "https://www.sciencedirect.com/science/article/pii/Sxxx", - Network accessline 88
"https://www.sciencedirect.com/science/article/pii/Sxxx",
skills/nature-downloader/tests/unit/wos-supporting-information.test.mjs
- Executable scriptline 1
Executable file - Network accessline 19
assert.equal(shouldUseCleanWosBundle({ topic: "rice", si: false }), false); assert.equal(shouldUseCleanWosBundle({ dois: ["10.1/x"], si: true }), false); assert.equal(shouldUseCleanWosBundle({ pdfUrl: "https://example.org/a.pdf", si - Network accessline 20
assert.equal(shouldUseCleanWosBundle({ dois: ["10.1/x"], si: true }), false); assert.equal(shouldUseCleanWosBundle({ pdfUrl: "https://example.org/a.pdf", si: true }), false); assert.equal(shouldUseCleanWosBundle({ title: "OA title", - Network accessline 21
assert.equal(shouldUseCleanWosBundle({ pdfUrl: "https://example.org/a.pdf", si: true }), false); - Network accessline 40
{ text: "Source Data", href: "/files/source-data.zip" }, { text: "Supplementary Information", dataDownloadUrl: "/download/123" }, { text: "GitHub", href: "https://github.com/example/project" }, - Network accessline 41
{ text: "Supplementary Information", dataDownloadUrl: "/download/123" }, { text: "GitHub", href: "https://github.com/example/project" }, { text: "References", href: "/references" }, - Network accessline 42
{ text: "GitHub", href: "https://github.com/example/project" }, - Network accessline 46
assert.deepEqual(selectSupportingInformationLinks(links, "https://publisher.test/article"), { attachments: [ { url: "https://publisher.test/files/table-s1.xlsx", label: "Download supplementary table", filename: "table-s1.xlsx" - Network accessline 47
attachments: [ { url: "https://publisher.test/files/table-s1.xlsx", label: "Download supplementary table", filename: "table-s1.xlsx" }, { url: "https://publisher.test/files/source-data.zip", label: "Source Data", filename: " - Network accessline 48
{ url: "https://publisher.test/files/table-s1.xlsx", label: "Download supplementary table", filename: "table-s1.xlsx" }, - Network accessline 49
{ url: "https://publisher.test/files/source-data.zip", label: "Source Data", filename: "source-data.zip" }, { url: "https://publisher.test/download/123", label: "Supplementary Information", filename: "123" }, ], - Network accessline 50
{ url: "https://publisher.test/download/123", label: "Supplementary Information", filename: "123" }, - Network accessline 51
], pages: [ { url: "https://publisher.test/articles/paper/supplementary-information", label: "Supplementary Information" }, - Network accessline 52
pages: [ { url: "https://publisher.test/articles/paper/supplementary-information", label: "Supplementary Information" }, ], - Network accessline 53
{ url: "https://publisher.test/articles/paper/supplementary-information", label: "Supplementary Information" }, - Network accessline 58
test("recognizes Elsevier, MDPI, and Wiley attachment patterns", () => { const links = [ { text: "mmc1", href: "https://publisher.test/article#mmc1", rawHref: "#mmc1" }, - Network accessline 59
const links = [ { text: "mmc1", href: "https://publisher.test/article#mmc1", rawHref: "#mmc1" }, { text: "mmc1", href: "/action/downloadSupplement?doi=10.1/x&file=mmc1.mp4" }, - Network accessline 60
{ text: "mmc1", href: "https://publisher.test/article#mmc1", rawHref: "#mmc1" }, - Network accessline 63
{ text: "Data S1", href: "/action/downloadSupplement?doi=10.1111/x&file=pce14065-sup-0001.pdf" }, ]; assert.equal(selectSupportingInformationLinks(links, "https://publisher.test/article").attachments.length, 3); - Network accessline 64
]; assert.equal(selectSupportingInformationLinks(links, "https://publisher.test/article").attachments.length, 3); }); - Network accessline 65
assert.equal(selectSupportingInformationLinks(links, "https://publisher.test/article").attachments.length, 3); - Network accessline 71
"proxy", "tab", { url: "https://cdn.publisher.test/mmc1.pdf" }, - Network accessline 72
"tab", { url: "https://cdn.publisher.test/mmc1.pdf" }, () => "/tmp/mmc1.pdf", - Network accessline 73
{ url: "https://cdn.publisher.test/mmc1.pdf" }, - Network accessline 112
proxy: "proxy", tab: "tab", landingUrl: "https://publisher.test/article", - Network accessline 113
tab: "tab", landingUrl: "https://publisher.test/article", bundleDir, - Network accessline 114
landingUrl: "https://publisher.test/article", - Network accessline 138
assert.deepEqual(scanned, [ "https://publisher.test/article", - Network accessline 139
"https://publisher.test/article", - Network accessline 140
"https://publisher.test/supplement-page", - Network accessline 152
proxy: "proxy", tab: "tab", landingUrl: "https://publisher.test/article", - Network accessline 153
tab: "tab", landingUrl: "https://publisher.test/article", bundleDir: "/tmp/out/Article", - Network accessline 154
landingUrl: "https://publisher.test/article", - Network accessline 170
proxy: "proxy", tab: "tab", landingUrl: "https://publisher.test/article", - Network accessline 171
tab: "tab", landingUrl: "https://publisher.test/article", bundleDir, - Network accessline 172
landingUrl: "https://publisher.test/article", - Network accessline 178
ok: true, file: resolvePath({ url: "https://publisher.test/downloadSupplement", - Network accessline 179
file: resolvePath({ url: "https://publisher.test/downloadSupplement", contentType: "application/pdf", - Network accessline 180
url: "https://publisher.test/downloadSupplement", - Network accessline 191
proxy: "proxy", tab: "tab", landingUrl: "https://publisher.test/article", - Network accessline 192
tab: "tab", landingUrl: "https://publisher.test/article", bundleDir, - Network accessline 193
landingUrl: "https://publisher.test/article", - Network accessline 209
proxy: "proxy", tab: "tab", landingUrl: "https://publisher.test/article", - Network accessline 210
tab: "tab", landingUrl: "https://publisher.test/article", bundleDir: "/tmp/out/Article", - Network accessline 211
landingUrl: "https://publisher.test/article",
skills/nature-experiment-log/SKILL.md
- Network accessline 101
本 skill 可以只向普通本地文件夹输出 Markdown,也可以与 [Obsidian](https://obsidian.md) vault 配合使用。Obsidian 是一个基于本地 Markdown 文件的笔记系统,配合 [Dataview](https://github.com/blacksmithgu/obsidian-dataview) 插件可实现实验数据的动态查询和仪表盘。
skills/nature-figure/assets/figures4papers/THIRD_PARTY_NOTICES.md
skills/nature-figure/assets/figures4papers/figure_CellSpliceNet/plot_ablation.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_CellSpliceNet/plot_comparison.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_CellSpliceNet/plot_comparison_cross_species.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_Cflows/diffusion_swiss_roll.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_Cflows/plot_comparison_Ablation.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_Cflows/plot_comparison_GeneRegulatory.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_Cflows/plot_comparison_Trajectory.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_Dispersion/plot_idea.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_Dispersion/plot_illustration.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_FPGM/plot_freq_prior.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_ImmunoStruct/plot_bars.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_ImmunoStruct/raw_data.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_comparison.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_hole_manifold.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_manifold.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_sweep.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_VIGIL/plot_ablation.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_VIGIL/plot_comparison_radar.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_VIGIL/plot_concept.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_VIGIL/plot_posttraining.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_brainteaser/plot_brute_force.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_brainteaser/plot_correctness_by_category.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_brainteaser/plot_correctness_by_subcategory.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_brainteaser/plot_rewriting.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_brainteaser/plot_selfcorrection_math.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_ophthal_review/plot_composition.py
- Executable scriptline 1
Executable file
skills/nature-figure/assets/figures4papers/figure_ophthal_review/plot_trend.py
- Executable scriptline 1
Executable file
skills/nature-figure/references/ai-graphical-abstract-workflow.md
- Network accessline 123
- Practitioner workflow: Ananya Thakur, “How to use AI to make a graphical abstract in minutes,” *Nature* Careers, 22 July 2026, <https://doi.org/10.1038/d41586-026-02072-9>. - Network accessline 124
abstract in minutes,” *Nature* Careers, 22 July 2026, <https://doi.org/10.1038/d41586-026-02072-9>. - Governing portfolio policy: Nature Portfolio, “Artificial Intelligence (AI),” - Network accessline 125
<https://doi.org/10.1038/d41586-026-02072-9>. - Network accessline 126
- Governing portfolio policy: Nature Portfolio, “Artificial Intelligence (AI),” <https://www.nature.com/nature-portfolio/editorial-policies/ai>, verified 15 August 2026. Recheck before each submission because the policy is reviewed - Network accessline 127
<https://www.nature.com/nature-portfolio/editorial-policies/ai>, verified
skills/nature-figure/references/demos.md
- Network accessline 55
<https://github.com/ChenLiu-1996/figures4papers>
skills/nature-figure/references/nature-article-requirements.md
- Network accessline 146
- Nature initial submission: <https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 147
- Preparing figures: <https://research-figure-guide.nature.com/figures/preparing-figures-our-specifications/> - Network accessline 148
- Building and exporting figure panels: <https://research-figure-guide.nature.com/figures/building-and-exporting-figure-panels/> - Network accessline 149
- Image integrity: <https://www.nature.com/nature-portfolio/editorial-policies/image-integrity>
skills/nature-figure/references/openrouter-image-generation.md
- Network accessline 26
- model discovery: `GET https://openrouter.ai/api/v1/images/models` - Network accessline 27
- generation: `POST https://openrouter.ai/api/v1/images` - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Network accessline 103
python skills/nature-figure/scripts/generate_openrouter_schematic.py --prompt-file schematic_prompt.md --reference-image draft_layout.png --reference-image https://example.com/style-reference.png - Network accessline 104
--prompt-file schematic_prompt.md \ --reference-image draft_layout.png \ --reference-image https://example.com/style-reference.png - Network accessline 106
--reference-image https://example.com/style-reference.png - Network accessline 114
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Network accessline 115
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Network accessline 116
--api-url https://api.orcarouter.ai/v1/images/generations \ - Access to secretsline 117
[Credential-related source omitted]
skills/nature-figure/references/qa-contract.md
- Network accessline 32
- Nature research figure guide: `https://research-figure-guide.nature.com/` - Network accessline 33
- Nature building/exporting panels: `https://research-figure-guide.nature.com/figures/building-and-exporting-figure-panels/` - Network accessline 34
- Nature preparing figures/specifications: `https://research-figure-guide.nature.com/figures/preparing-figures-our-specifications/` - Network accessline 35
- Nature initial submission and statistics guidance: `https://www.nature.com/nature/for-authors/initial-submission` - Network accessline 36
- Nature formatting guide: `https://www.nature.com/nature/for-authors/formatting-guide` - Network accessline 37
- Journal of Cell Biology figure/video guidelines for microscopy-oriented image QA: `https://rupress.org/jcb/pages/fig-vid-guidelines` - Network accessline 38
- Elsevier/Cell-family image-manipulation baseline: `https://www.sciencedirect.com/journal/the-cell-surface/publish/guide-for-authors`
skills/nature-figure/references/vector-schematic-workflow.md
- Network accessline 126
The structure of this workflow (brief gate, final-size drawing, check loop) follows the approach of the MIT-licensed FigGenie skill (<https://github.com/Sleepy-Avacado/FigGenie>), which additionally ships a - Network accessline 127
follows the approach of the MIT-licensed FigGenie skill (<https://github.com/Sleepy-Avacado/FigGenie>), which additionally ships a layout and exemplar library, a browser-based linter, and PowerPoint export for - Network accessline 128
(<https://github.com/Sleepy-Avacado/FigGenie>), which additionally ships a
skills/nature-figure/scripts/audit_figure_collisions.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-figure/scripts/audit_panel_alignment.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 660
} rows = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}pt" height="{height}pt" viewBox="0 0 {width} {height}">', - Network accessline 661
rows = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}pt" height="{height}pt" viewBox="0 0 {width} {height}">', '<rect width="100%" height="100%" fill="white"/>', - Network accessline 662
f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}pt" height="{height}pt" viewBox="0 0 {width} {height}">',
skills/nature-figure/scripts/audit_pdf_text.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-figure/scripts/audit_svg_schematic.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-figure/scripts/figure_safety.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-figure/scripts/generate_openrouter_schematic.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 21
API_URL = "https://openrouter.ai/api/v1/images" - Possible obfuscationline 150
return base64.b64decode(value) - Access to secretsline 154
[Credential-related source omitted] - Access to secretsline 155
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted] - Network accessline 169
request = urllib.request.Request( - Network accessline 174
) try: with urllib.request.urlopen(request, timeout=args.timeout) as response: - Network accessline 175
try: with urllib.request.urlopen(request, timeout=args.timeout) as response: return json.loads(response.read().decode("utf-8")) - Network accessline 176
with urllib.request.urlopen(request, timeout=args.timeout) as response: - Network accessline 202
_require_downloadable_url(item["url"], f"image URL in response item {index}") try: with urllib.request.urlopen(item["url"], timeout=args.timeout) as image_response: - Network accessline 203
try: with urllib.request.urlopen(item["url"], timeout=args.timeout) as image_response: outpath.write_bytes(image_response.read()) - Network accessline 204
with urllib.request.urlopen(item["url"], timeout=args.timeout) as image_response: - Access to secretsline 232
[Credential-related source omitted] - Access to secretsline 251
[Credential-related source omitted] - Access to secretsline 254
[Credential-related source omitted]
skills/nature-figure/scripts/nature_figure_backend.py
skills/nature-figure/scripts/plot_templates.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-figure/scripts/validate_figure.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-figure/tests/test_figure_safety.py
- Executable scriptline 1
Executable file
skills/nature-figure/tests/test_schematic_url_safety.py
- Executable scriptline 1
Executable file - Network accessline 28
def _args(tmpdir: str) -> Namespace: return Namespace(outdir=tmpdir, basename="schematic", output_format="png", timeout=10, api_url="https://api.example/v1") - Network accessline 29
return Namespace(outdir=tmpdir, basename="schematic", output_format="png", timeout=10, api_url="https://api.example/v1") - Network accessline 33
def test_save_outputs_refuses_non_http_image_url(self): response = {"data": [{"media_type": "image/png", "url": "file:///etc/hosts"}]} with patch("urllib.request.urlopen", side_effect=AssertionError("must not fetch")) as ope - Network accessline 34
response = {"data": [{"media_type": "image/png", "url": "file:///etc/hosts"}]} with patch("urllib.request.urlopen", side_effect=AssertionError("must not fetch")) as opened: with self.assertRaisesRegex(SystemExit, "non-ht - Network accessline 35
with patch("urllib.request.urlopen", side_effect=AssertionError("must not fetch")) as opened: - Network accessline 40
def test_save_outputs_refuses_local_image_url_host(self): response = {"data": [{"media_type": "image/png", "url": "http://127.0.0.1/x.png"}]} with patch("urllib.request.urlopen", side_effect=AssertionError("must not fetch")) - Network accessline 41
response = {"data": [{"media_type": "image/png", "url": "http://127.0.0.1/x.png"}]} with patch("urllib.request.urlopen", side_effect=AssertionError("must not fetch")) as opened: with self.assertRaisesRegex(SystemExit, "l - Network accessline 42
with patch("urllib.request.urlopen", side_effect=AssertionError("must not fetch")) as opened: - Network accessline 47
def test_save_outputs_downloads_https_image_url(self): response = {"data": [{"media_type": "image/png", "url": "https://cdn.example.com/x.png"}]} - Network accessline 48
response = {"data": [{"media_type": "image/png", "url": "https://cdn.example.com/x.png"}]} - Network accessline 50
downloaded = MagicMock() downloaded.__enter__.return_value.read.return_value = b"PNGDATA" with patch("urllib.request.urlopen", return_value=downloaded) as opened: - Network accessline 51
downloaded.__enter__.return_value.read.return_value = b"PNGDATA" with patch("urllib.request.urlopen", return_value=downloaded) as opened: SCHEMATIC.save_outputs(response, {"prompt": "x"}, _args(tmpdir)) - Network accessline 52
with patch("urllib.request.urlopen", return_value=downloaded) as opened:
skills/nature-image2ppt/.gitignore
- Access to secretsline 18
[Credential-related source omitted]
skills/nature-image2ppt/README.md
- Network accessline 47
- 图片生成和编辑可使用 Codex OAuth,或通过 `openai-compatible-api` 配置任意兼容 OpenAI Images API 的 Base URL、API Key 和模型 ID;第三方端点不会收到 Codex OAuth 凭证。 - 在线文字识别使用百度 AI Studio `PADDLE_OCR_TOKEN`。将 `config.example.yaml` 复制为同目录的 `config.yaml` 后填写 Token;真实配置已被 Git 忽 - Network accessline 49
- 完整实现同步自 [Paul-Jeo/Image2PPT](https://github.com/Paul-Jeo/Image2PPT),并在本技能目录中保留 MIT License。
skills/nature-image2ppt/README_EN.md
- Network accessline 47
- Image generation and editing can use Codex OAuth or an `openai-compatible-api` Base URL, API key, and arbitrary provider model ID; third-party endpoints never receive Codex OAuth credentials. - Online text recognition uses a Baidu AI Stud - Network accessline 49
- The complete implementation is synchronized from [Paul-Jeo/Image2PPT](https://github.com/Paul-Jeo/Image2PPT), with its MIT License retained in this skill directory.
skills/nature-image2ppt/cli/image2ppt/__init__.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/cli/image2ppt/cli.py
skills/nature-image2ppt/cli/image2ppt/runtime/__init__.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/cli/image2ppt/runtime/_input_normalization.py
- Executable scriptline 1
Executable file - Network accessline 16
IMG_EXTS = {".png", ".jpg", ".jpeg", ".webp", ".bmp", ".gif", ".tif", ".tiff"} PPT_EXTS = {".ppt", ".pptx"} REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships" - Network accessline 17
PPT_EXTS = {".ppt", ".pptx"} REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships" NS = { - Network accessline 18
REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships" - Network accessline 19
NS = { "a": "http://schemas.openxmlformats.org/drawingml/2006/main", "p": "http://schemas.openxmlformats.org/presentationml/2006/main", - Network accessline 20
"a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 21
"p": "http://schemas.openxmlformats.org/presentationml/2006/main", - Network accessline 22
"r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
skills/nature-image2ppt/cli/image2ppt/runtime/_page_artifacts.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/cli/image2ppt/runtime/build_pptx_from_manifest.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 18
EMU_PER_INCH = 914400 REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships" - Network accessline 19
REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships" - Network accessline 589
next_id += 1 return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p - Network accessline 590
return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas. - Network accessline 591
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> - Network accessline 604
def rels_xml(manifest, media_start=1, notes_index=None): rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>'] - Network accessline 605
rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>'] - Network accessline 606
for i, item in enumerate(manifest.get("images", []), start=1): target = f"../media/image{media_start + i - 1}{image_ext(item['path'])}" rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/offi - Network accessline 607
target = f"../media/image{media_start + i - 1}{image_ext(item['path'])}" rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="{target}"/>') if notes - Network accessline 608
rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="{target}"/>') - Network accessline 609
if notes_index is not None: rels.append( f'<Relationship Id="rId{len(rels) + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Target="../notesSlides/notesSlide{notes_index}.xml"/> - Network accessline 610
rels.append( f'<Relationship Id="rId{len(rels) + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Target="../notesSlides/notesSlide{notes_index}.xml"/>' ) - Network accessline 611
f'<Relationship Id="rId{len(rels) + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Target="../notesSlides/notesSlide{notes_index}.xml"/>' - Network accessline 613
return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' + "".join(rels) + "</Relationships>" - Network accessline 620
) or '<a:p><a:endParaRPr lang="zh-CN" sz="1200"/></a:p>' return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats. - Network accessline 621
return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schema - Network accessline 622
<p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> - Network accessline 639
return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="{REL_NS}"> <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="../notesMasters/not - Network accessline 640
<Relationships xmlns="{REL_NS}"> <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="../notesMasters/notesMaster1.xml"/> <Relationship Id="rId2" Type="http://schemas.ope - Network accessline 641
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="../notesMasters/notesMaster1.xml"/> - Network accessline 642
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="../slides/slide{slide_index}.xml"/> - Network accessline 646
def notes_master_xml(): return """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/rela - Network accessline 647
return """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://s - Network accessline 648
<p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> - Network accessline 655
return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="{REL_NS}"> <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/> - Network accessline 656
<Relationships xmlns="{REL_NS}"> <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/> </Relationships>""" - Network accessline 657
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/> - Network accessline 684
for i in notes_indices: overrides.append(f'<Override PartName="/ppt/notesSlides/notesSlide{i}.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml"/>') return f'<?xml version="1.0" en - Network accessline 686
return f'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">{default_xml}{"".join(overrides)}</Types>' - Network accessline 701
size_type = slide_size_type(width, height) return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/off - Network accessline 702
return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http:/ - Network accessline 703
<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> - Network accessline 711
def presentation_rels_xml(slide_count): rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/>'] - Network accessline 712
rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/>'] - Network accessline 713
for i in range(1, slide_count + 1): rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide{i}.xml"/>') return f'<?xml version="1.0" encod - Network accessline 714
rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide{i}.xml"/>') - Network accessline 718
def write_common_parts(z, slide_count, width, height, notes_count): presentation_format = "Widescreen" if slide_size_type(width, height) == "screen16x9" else "Custom" z.writestr("_rels/.rels", """<?xml version="1.0" encoding="UTF-8" - Network accessline 719
presentation_format = "Widescreen" if slide_size_type(width, height) == "screen16x9" else "Custom" z.writestr("_rels/.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.o - Network accessline 720
z.writestr("_rels/.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDo - Network accessline 721
z.writestr("docProps/core.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/"><dc: - Network accessline 722
z.writestr("docProps/app.xml", f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"><Application>Codex</Application><PresentationFormat>{pre - Network accessline 723
z.writestr("ppt/presentation.xml", presentation_xml(slide_count, width, height)) z.writestr("ppt/_rels/presentation.xml.rels", presentation_rels_xml(slide_count)) z.writestr("ppt/slideMasters/slideMaster1.xml", """<?xml version="1.0 - Network accessline 724
z.writestr("ppt/_rels/presentation.xml.rels", presentation_rels_xml(slide_count)) z.writestr("ppt/slideMasters/slideMaster1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><p:sldMaster xmlns:a="http://schemas.openxmlform - Network accessline 725
z.writestr("ppt/slideMasters/slideMaster1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><p:sldMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument - Network accessline 726
z.writestr("ppt/slideMasters/_rels/slideMaster1.xml.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://sc - Network accessline 727
z.writestr("ppt/slideLayouts/slideLayout1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument - Network accessline 728
z.writestr("ppt/slideLayouts/_rels/slideLayout1.xml.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://sc - Network accessline 729
z.writestr("ppt/theme/theme1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="ImageToEditablePPT"> <a:themeElements> - Network accessline 730
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="ImageToEditablePPT">
skills/nature-image2ppt/cli/image2ppt/runtime/configure_image_backend.py
skills/nature-image2ppt/cli/image2ppt/runtime/deck_run_state.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/cli/image2ppt/runtime/deck_text_hints.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Network accessline 113
"cost. ASK THE USER once " "before reconstructing pages: configure a token now (apply at " "https://aistudio.baidu.com/account/accessToken, then `image2ppt config " - Network accessline 114
"before reconstructing pages: configure a token now (apply at " "https://aistudio.baidu.com/account/accessToken, then `image2ppt config " "--paddle-ocr-token <token>` and `image2ppt run hints <run>` to regenerate thi - Network accessline 115
"https://aistudio.baidu.com/account/accessToken, then `image2ppt config "
skills/nature-image2ppt/cli/image2ppt/runtime/finalize_deck_run.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/formula_renderer.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/image_gen.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 50
MAX_IMAGE_BYTES = 50 * 1024 * 1024 DEFAULT_CODEX_AUTH_FILE = "~/.codex/auth.json" DEFAULT_CODEX_IMAGES_BASE_URL = "https://chatgpt.com/backend-api/codex" - Network accessline 51
DEFAULT_CODEX_AUTH_FILE = "~/.codex/auth.json" DEFAULT_CODEX_IMAGES_BASE_URL = "https://chatgpt.com/backend-api/codex" ENV_FIELDS = ( - Network accessline 52
DEFAULT_CODEX_IMAGES_BASE_URL = "https://chatgpt.com/backend-api/codex" - Access to secretsline 54
[Credential-related source omitted] - Network accessline 62
MAX_MODEL_ID_CHARS = 256 MAX_REMOTE_REDIRECTS = 5 CHATGPT_AUTH_CLAIM = "https://api.openai.com/auth" - Network accessline 63
MAX_REMOTE_REDIRECTS = 5 CHATGPT_AUTH_CLAIM = "https://api.openai.com/auth" CHATGPT_ACCOUNT_ID_CLAIM = "chatgpt_account_id" - Network accessline 64
CHATGPT_AUTH_CLAIM = "https://api.openai.com/auth" - Access to secretsline 72
[Credential-related source omitted] - Network accessline 76
codex login image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api \ --base-url https://example.test/v1 --model provider-image-model - Network accessline 77
image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api --base-url https://example.test/v1 --model provider-image-model - Network accessline 78
--base-url https://example.test/v1 --model provider-image-model - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 283
[Credential-related source omitted] - Network accessline 303
if not raw: return DEFAULT_CODEX_IMAGES_BASE_URL if re.fullmatch(r"https://chatgpt\.com/backend-api(?:/codex)?(?:/v1)?/?", raw, re.I): - Network accessline 304
return DEFAULT_CODEX_IMAGES_BASE_URL if re.fullmatch(r"https://chatgpt\.com/backend-api(?:/codex)?(?:/v1)?/?", raw, re.I): return DEFAULT_CODEX_IMAGES_BASE_URL - Network accessline 305
if re.fullmatch(r"https://chatgpt\.com/backend-api(?:/codex)?(?:/v1)?/?", raw, re.I): - Access to secretsline 309
[Credential-related source omitted] - Network accessline 319
def _validate_codex_image_url(url: str) -> None: if re.fullmatch( r"https://chatgpt\.com/backend-api/codex/images/(?:generations|edits)", - Network accessline 320
if re.fullmatch( r"https://chatgpt\.com/backend-api/codex/images/(?:generations|edits)", url, - Network accessline 321
r"https://chatgpt\.com/backend-api/codex/images/(?:generations|edits)", - Access to secretsline 505
[Credential-related source omitted] - Access to secretsline 506
[Credential-related source omitted] - Access to secretsline 509
[Credential-related source omitted] - Access to secretsline 523
[Credential-related source omitted] - Possible obfuscationline 641
out_path.write_bytes(base64.b64decode(image_b64)) - Possible obfuscationline 714
payload = base64.b64decode(image_b64, validate=True) - Access to secretsline 801
[Credential-related source omitted]
skills/nature-image2ppt/cli/image2ppt/runtime/main.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 419
[Credential-related source omitted] - Network accessline 498
epilog="""Examples: image2ppt config --api-key "your-api-key" --model gpt-image-2 image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api --base-url https://example.test/v1 --model provider-image-model - Network accessline 499
image2ppt config --api-key "your-api-key" --model gpt-image-2 image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api --base-url https://example.test/v1 --model provider-image-model image2ppt config --clear-base- - Network accessline 500
image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api --base-url https://example.test/v1 --model provider-image-model - Network accessline 503
) config.add_argument("--api-key", help="OpenAI or OpenAI-compatible API key to store.") config.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.") - Network accessline 504
config.add_argument("--api-key", help="OpenAI or OpenAI-compatible API key to store.") config.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.") config.add_argument("--clear-base-ur - Network accessline 505
config.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.") - Network accessline 517
help="Remove IMAGE2PPT_IMAGE_USER_AGENT from the config file.", ) config.add_argument("--paddle-ocr-token", metavar="TOKEN", help="PaddleOCR-VL token for content-aware text hints. Apply at https://aistudio.baidu.com/account/accessTo - Network accessline 518
) config.add_argument("--paddle-ocr-token", metavar="TOKEN", help="PaddleOCR-VL token for content-aware text hints. Apply at https://aistudio.baidu.com/account/accessToken.") config.set_defaults(func=cmd_config) - Network accessline 519
config.add_argument("--paddle-ocr-token", metavar="TOKEN", help="PaddleOCR-VL token for content-aware text hints. Apply at https://aistudio.baidu.com/account/accessToken.") - Access to secretsline 801
[Credential-related source omitted] - Network accessline 805
Setup: codex login image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api --base-url https://example.test/v1 --model provider-image-model - Network accessline 807
image2ppt config --api-key "your-api-key" --image-backend openai-compatible-api --base-url https://example.test/v1 --model provider-image-model
skills/nature-image2ppt/cli/image2ppt/runtime/make_page_contact_sheet.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/paddle_text_hints.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 34
JOB_URL = "https://paddleocr.aistudio-app.com/api/v2/ocr/jobs" - Network accessline 69
optional = {"useDocOrientationClassify": False, "useDocUnwarping": False, "useChartRecognition": False} with file_path.open("rb") as handle: response = requests.post( - Network accessline 70
with file_path.open("rb") as handle: response = requests.post( JOB_URL, - Network accessline 71
response = requests.post( - Network accessline 83
started = time.time() while True: status = requests.get(f"{JOB_URL}/{job_id}", headers=headers, timeout=60).json()["data"] - Network accessline 84
while True: status = requests.get(f"{JOB_URL}/{job_id}", headers=headers, timeout=60).json()["data"] state = status["state"] - Network accessline 85
status = requests.get(f"{JOB_URL}/{job_id}", headers=headers, timeout=60).json()["data"] - Network accessline 95
_require_public_result_url(status) jsonl = requests.get(status["resultUrl"]["jsonUrl"], timeout=60) - Network accessline 96
jsonl = requests.get(status["resultUrl"]["jsonUrl"], timeout=60) - Access to secretsline 199
[Credential-related source omitted]
skills/nature-image2ppt/cli/image2ppt/runtime/page_job_status.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/page_text_metrics.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/prepare_deck_run.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/process_asset_sheet.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/record_imagegen_result.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/record_page_dispatch.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/record_page_result.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/remove_chroma_key.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/reset_page_job.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/runtime_env.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 24
[Credential-related source omitted] - Network accessline 29
"PADDLE_OCR_TOKEN", ) PADDLE_TOKEN_APPLY_URL = "https://aistudio.baidu.com/account/accessToken" - Network accessline 30
) PADDLE_TOKEN_APPLY_URL = "https://aistudio.baidu.com/account/accessToken" PADDLE_ENDPOINT = "https://paddleocr.aistudio-app.com/api/v2/ocr/jobs" - Network accessline 31
PADDLE_TOKEN_APPLY_URL = "https://aistudio.baidu.com/account/accessToken" - Network accessline 32
PADDLE_ENDPOINT = "https://paddleocr.aistudio-app.com/api/v2/ocr/jobs" - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 167
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 312
[Credential-related source omitted] - Access to secretsline 319
[Credential-related source omitted] - Access to secretsline 323
[Credential-related source omitted] - Network accessline 366
[Credential-related source omitted] - Network accessline 367
[Credential-related source omitted] - Access to secretsline 367
[Credential-related source omitted] - Network accessline 368
"OPENAI_BASE_URL": values.get("OPENAI_BASE_URL", "https://api.openai.com/v1"),
skills/nature-image2ppt/cli/image2ppt/runtime/split_alpha_components.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/text_hints.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/cli/image2ppt/runtime/validate_pptx.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 15
NS = { "a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 16
"a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 17
"p": "http://schemas.openxmlformats.org/presentationml/2006/main", - Network accessline 18
"rel": "http://schemas.openxmlformats.org/package/2006/relationships",
skills/nature-image2ppt/config.example.yaml
- Network accessline 6
# One Baidu AI Studio Access Token, not an API Key/Secret Key pair. # Apply at https://aistudio.baidu.com/account/accessToken - Network accessline 7
# Apply at https://aistudio.baidu.com/account/accessToken - Network accessline 13
[Credential-related source omitted] - Network accessline 14
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Network accessline 15
# OPENAI_BASE_URL: "https://api.openai.com/v1"
skills/nature-image2ppt/manifest.yaml
skills/nature-image2ppt/references/ocr-text-hints-contract.md
- Network accessline 5
The cloud backend requires one Baidu AI Studio Access Token named `PADDLE_OCR_TOKEN`. It is not the traditional Baidu `API Key + Secret Key` pair. Apply at <https://aistudio.baidu.com/account/accessToken> and configure it with: - Network accessline 7
Apply at <https://aistudio.baidu.com/account/accessToken> and configure it with: - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Network accessline 20
- Endpoint: `https://paddleocr.aistudio-app.com/api/v2/ocr/jobs`
skills/nature-image2ppt/references/runtime-dependencies.md
- Dangerous shell operationline 52
sudo apt-get install libreoffice-impress fonts-noto-cjk imagemagick
skills/nature-image2ppt/schemas/page-manifest-v2.schema.json
skills/nature-image2ppt/scripts/build_page_worker_prompt.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/inspect_arrow_atomicity.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/inspect_region_decomposition.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/postprocess_manifest_arrows.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 26
NS = { "a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 27
"a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 28
"p": "http://schemas.openxmlformats.org/presentationml/2006/main",
skills/nature-image2ppt/scripts/render_image2ppt_qa.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/run_final_image2ppt_qa.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/run_image2ppt_qa.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/runtime_paths.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/scripts/visual_review_evidence.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-image2ppt/tests/support.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_console_portability.py
skills/nature-image2ppt/tests/test_deck_slide_size.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_dispatch_concurrency.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_formula_renderer.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_independence.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_input_normalization_alpha.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_input_normalization_opc_targets.py
- Executable scriptline 1
Executable file - Network accessline 12
REL_HEAD = '<?xml version="1.0"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' - Network accessline 13
PRES = ( '<?xml version="1.0"?><p:presentation xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" ' 'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">' - Network accessline 14
'<?xml version="1.0"?><p:presentation xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" ' - Network accessline 15
'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'
skills/nature-image2ppt/tests/test_isolated_lifecycle.py
skills/nature-image2ppt/tests/test_manifest_arrows.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_migration_parity.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_multi_agent_backend.py
- Executable scriptline 1
Executable file - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 171
with mock.patch.dict( os.environ, {"CODEX_IMAGES_BASE_URL": "https://example.test/backend-api/codex"}, - Network accessline 172
[Credential-related source omitted] - Access to secretsline 172
[Credential-related source omitted] - Network accessline 173
{"CODEX_IMAGES_BASE_URL": "https://example.test/backend-api/codex"}, - Network accessline 180
with mock.patch.dict( os.environ, {"CODEX_IMAGES_BASE_URL": "https://chatgpt.com/backend-api/codex/v1"}, - Network accessline 181
[Credential-related source omitted] - Access to secretsline 181
[Credential-related source omitted] - Network accessline 182
{"CODEX_IMAGES_BASE_URL": "https://chatgpt.com/backend-api/codex/v1"}, - Network accessline 189
with self.assertRaisesRegex(RuntimeError, "official ChatGPT Images endpoint"): image_gen._post_codex_image_json( "https://example.test/images/generations", - Network accessline 190
image_gen._post_codex_image_json( "https://example.test/images/generations", {"model": "gpt-image-2", "prompt": "test"}, - Network accessline 191
"https://example.test/images/generations", - Network accessline 206
) req = image_gen.request.Request( "https://chatgpt.com/backend-api/codex/images/generations" - Network accessline 207
req = image_gen.request.Request( "https://chatgpt.com/backend-api/codex/images/generations" ) - Network accessline 208
"https://chatgpt.com/backend-api/codex/images/generations" - Network accessline 216
"Found", {}, "https://example.test/capture", - Network accessline 217
{}, "https://example.test/capture", ) - Network accessline 218
"https://example.test/capture", - Access to secretsline 281
[Credential-related source omitted] - Access to secretsline 634
[Credential-related source omitted] - Access to secretsline 665
[Credential-related source omitted] - Access to secretsline 666
[Credential-related source omitted] - Network accessline 669
[Credential-related source omitted] - Network accessline 670
[Credential-related source omitted] - Access to secretsline 670
[Credential-related source omitted] - Network accessline 671
"OPENAI_BASE_URL": "https://images.example.test/v1", - Access to secretsline 706
[Credential-related source omitted] - Access to secretsline 707
[Credential-related source omitted] - Network accessline 710
[Credential-related source omitted] - Network accessline 711
[Credential-related source omitted] - Access to secretsline 711
[Credential-related source omitted] - Network accessline 712
"OPENAI_BASE_URL": "https://images.example.test/v1", - Access to secretsline 744
[Credential-related source omitted] - Access to secretsline 745
[Credential-related source omitted] - Network accessline 778
self.assertEqual( b"url-image", image_gen._api_result_bytes({"url": "https://cdn.example.test/image.png"}, 10), - Network accessline 779
b"url-image", image_gen._api_result_bytes({"url": "https://cdn.example.test/image.png"}, 10), ) - Network accessline 780
image_gen._api_result_bytes({"url": "https://cdn.example.test/image.png"}, 10), ) download.assert_called_once_with("https://cdn.example.test/image.png", 10) - Network accessline 782
download.assert_called_once_with("https://cdn.example.test/image.png", 10) - Access to secretsline 786
[Credential-related source omitted] - Network accessline 787
[Credential-related source omitted] - Network accessline 788
[Credential-related source omitted] - Access to secretsline 788
[Credential-related source omitted] - Network accessline 789
"OPENAI_BASE_URL": "https://images.example.test/v1", - Access to secretsline 822
[Credential-related source omitted] - Network accessline 831
"test-api-key", "--base-url", "https://images.example.test/v1", - Network accessline 832
"--base-url", "https://images.example.test/v1", "--image-backend", - Network accessline 833
"https://images.example.test/v1", - Access to secretsline 859
[Credential-related source omitted] - Access to secretsline 860
[Credential-related source omitted] - Network accessline 883
payload = json.loads(result.stdout) self.assertEqual("codex-oauth", payload["backend"]) self.assertEqual("https://chatgpt.com/backend-api/codex/images/edits", payload["endpoint"]) - Network accessline 884
self.assertEqual("codex-oauth", payload["backend"]) self.assertEqual("https://chatgpt.com/backend-api/codex/images/edits", payload["endpoint"]) self.assertEqual("edit", payload["operation"]) - Network accessline 885
self.assertEqual("https://chatgpt.com/backend-api/codex/images/edits", payload["endpoint"]) - Access to secretsline 898
[Credential-related source omitted] - Access to secretsline 899
[Credential-related source omitted] - Network accessline 920
payload = json.loads(result.stdout) self.assertEqual("codex-oauth", payload["backend"]) self.assertEqual("https://chatgpt.com/backend-api/codex/images/generations", payload["endpoint"]) - Network accessline 921
self.assertEqual("codex-oauth", payload["backend"]) self.assertEqual("https://chatgpt.com/backend-api/codex/images/generations", payload["endpoint"]) self.assertEqual("generate", payload["operation"]) - Network accessline 922
self.assertEqual("https://chatgpt.com/backend-api/codex/images/generations", payload["endpoint"]) - Access to secretsline 934
[Credential-related source omitted] - Network accessline 946
http_500 = error.HTTPError( "https://example.test", - Network accessline 947
"https://example.test", - Access to secretsline 953
[Credential-related source omitted] - Access to secretsline 955
[Credential-related source omitted] - Network accessline 958
) as open_request, mock.patch("image2ppt.runtime.image_gen.time.sleep") as sleep: response = image_gen._post_codex_image_json( "https://chatgpt.com/backend-api/codex/images/generations", - Network accessline 959
response = image_gen._post_codex_image_json( "https://chatgpt.com/backend-api/codex/images/generations", {"model": "gpt-image-2", "prompt": "test"}, - Network accessline 960
"https://chatgpt.com/backend-api/codex/images/generations", - Access to secretsline 969
[Credential-related source omitted] - Network accessline 972
) as open_request, mock.patch("image2ppt.runtime.image_gen.time.sleep") as sleep: response = image_gen._post_codex_image_json( "https://chatgpt.com/backend-api/codex/images/generations", - Network accessline 973
response = image_gen._post_codex_image_json( "https://chatgpt.com/backend-api/codex/images/generations", {"model": "gpt-image-2", "prompt": "test"}, - Network accessline 974
"https://chatgpt.com/backend-api/codex/images/generations", - Network accessline 983
http_429 = error.HTTPError( "https://example.test", - Network accessline 984
"https://example.test", - Access to secretsline 990
[Credential-related source omitted] - Network accessline 994
with self.assertRaisesRegex(RuntimeError, r"HTTP 429"): image_gen._post_codex_image_json( "https://chatgpt.com/backend-api/codex/images/generations", - Network accessline 995
image_gen._post_codex_image_json( "https://chatgpt.com/backend-api/codex/images/generations", {"model": "gpt-image-2", "prompt": "test"}, - Network accessline 996
"https://chatgpt.com/backend-api/codex/images/generations", - Access to secretsline 1006
[Credential-related source omitted] - Network accessline 1015
"sk-test-secret", "--base-url", "https://example.test/v1", - Network accessline 1016
"--base-url", "https://example.test/v1", "--model", - Network accessline 1017
"https://example.test/v1", - Access to secretsline 1030
[Credential-related source omitted] - Access to secretsline 1037
[Credential-related source omitted] - Access to secretsline 1064
[Credential-related source omitted] - Network accessline 1073
"sk-test-secret", "--base-url", "https://example.test/v1", - Network accessline 1074
"--base-url", "https://example.test/v1", "--model", - Network accessline 1075
"https://example.test/v1", - Access to secretsline 1143
[Credential-related source omitted] - Access to secretsline 1455
[Credential-related source omitted]
skills/nature-image2ppt/tests/test_ocr_http.py
- Executable scriptline 1
Executable file - Network accessline 36
def raise_for_status(self) -> None: if self.status_code >= 400: raise requests.HTTPError(f"status={self.status_code}") - Network accessline 38
raise requests.HTTPError(f"status={self.status_code}") - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 84
[Credential-related source omitted] - Network accessline 94
submitted = FakeResponse(payload={"data": {"jobId": "job-123"}}) status = FakeResponse( payload={"data": {"state": "done", "resultUrl": {"jsonUrl": "https://example.test/result.jsonl"}}} - Network accessline 95
status = FakeResponse( payload={"data": {"state": "done", "resultUrl": {"jsonUrl": "https://example.test/result.jsonl"}}} ) - Network accessline 96
payload={"data": {"state": "done", "resultUrl": {"jsonUrl": "https://example.test/result.jsonl"}}} - Network accessline 121
Image.new("RGB", (20, 20), "white").save(source) responses = [ FakeResponse(payload={"data": {"state": "done", "resultUrl": {"jsonUrl": "https://example.test/empty"}}}), - Network accessline 122
responses = [ FakeResponse(payload={"data": {"state": "done", "resultUrl": {"jsonUrl": "https://example.test/empty"}}}), FakeResponse(text=""), - Network accessline 123
FakeResponse(payload={"data": {"state": "done", "resultUrl": {"jsonUrl": "https://example.test/empty"}}}), - Network accessline 187
paddle_text_hints.requests, "post", side_effect=requests.ConnectionError("offline"), - Network accessline 188
"post", side_effect=requests.ConnectionError("offline"), ): - Network accessline 189
side_effect=requests.ConnectionError("offline"), - Network accessline 302
], } result_url = "https://results.example.com/job.jsonl" - Network accessline 303
} result_url = "https://results.example.com/job.jsonl" result = {"result": {"layoutParsingResults": [{"prunedResult": pruned}]}} - Network accessline 304
result_url = "https://results.example.com/job.jsonl" result = {"result": {"layoutParsingResults": [{"prunedResult": pruned}]}} with patch.object(paddle_text_hints.requests, "post", return_value=FakeResponse( - Network accessline 340
slide = ET.fromstring(package.read("ppt/slides/slide1.xml")) ns = { "a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 341
ns = { "a": "http://schemas.openxmlformats.org/drawingml/2006/main", "p": "http://schemas.openxmlformats.org/presentationml/2006/main", - Network accessline 342
"a": "http://schemas.openxmlformats.org/drawingml/2006/main", - Network accessline 343
"p": "http://schemas.openxmlformats.org/presentationml/2006/main",
skills/nature-image2ppt/tests/test_paddle_result_url_safety.py
- Executable scriptline 1
Executable file - Network accessline 60
def test_submit_and_fetch_rejects_local_result_url_host(self): status = _status_response("http://127.0.0.1/result.jsonl") - Network accessline 61
status = _status_response("http://127.0.0.1/result.jsonl") with ( patch.object(PADDLE.requests, "post", return_value=_post_response("job-1")), - Network accessline 70
def test_submit_and_fetch_accepts_https_result_url(self): jsonl = MagicMock(text='{"result": {"layoutParsingResults": [{"prunedResult": {"page": 1}}]}}') status = _status_response("https://results.example.com/job-1.jsonl") - Network accessline 71
jsonl = MagicMock(text='{"result": {"layoutParsingResults": [{"prunedResult": {"page": 1}}]}}') status = _status_response("https://results.example.com/job-1.jsonl") with ( - Network accessline 72
status = _status_response("https://results.example.com/job-1.jsonl") with ( patch.object(PADDLE.requests, "post", return_value=_post_response("job-1")),
skills/nature-image2ppt/tests/test_page_hints.py
skills/nature-image2ppt/tests/test_path_confinement.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_pdf_backend.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_project_metadata.py
- Executable scriptline 1
Executable file - Network accessline 44
self.assertIn("[中文说明](README.md)", readme_en) for readme in (readme_cn, readme_en): self.assertIn("https://github.com/Paul-Jeo/Image2PPT", readme) - Network accessline 45
for readme in (readme_cn, readme_en): self.assertIn("https://github.com/Paul-Jeo/Image2PPT", readme) self.assertIn("config.example.yaml", readme) - Network accessline 46
self.assertIn("https://github.com/Paul-Jeo/Image2PPT", readme) - Access to secretsline 63
[Credential-related source omitted]
skills/nature-image2ppt/tests/test_quality_contracts.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_region_decomposition.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_render_guard.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_runtime_config.py
- Executable scriptline 1
Executable file - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted]
skills/nature-image2ppt/tests/test_runtime_paths.py
skills/nature-image2ppt/tests/test_script_inventory.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_slide_layout.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_state_e2e.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_structure_reconstruction.py
skills/nature-image2ppt/tests/test_thin_profile.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_visual_review_evidence.py
- Executable scriptline 1
Executable file
skills/nature-image2ppt/tests/test_visual_review_runtime.py
- Executable scriptline 1
Executable file
skills/nature-literature-pipeline/references/cron-setup.md
- Executable scriptline 1
Executable file
skills/nature-literature-pipeline/references/gap-analysis.md
- Executable scriptline 1
Executable file
skills/nature-literature-pipeline/references/note-template.md
- Executable scriptline 1
Executable file
skills/nature-literature-pipeline/references/push-format.md
skills/nature-literature-pipeline/references/review-compilation-workflow.md
- Executable scriptline 1
Executable file
skills/nature-literature-pipeline/templates/literature-push-template.md
- Executable scriptline 1
Executable file
skills/nature-paper-card/scripts/audit_paper_card.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-card/scripts/prepare_paper.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-card/tests/test_audit_page_ranges.py
- Executable scriptline 1
Executable file
skills/nature-paper-card/tests/test_prepare_paper.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/references/disclosure/prior_art_search.md
- Network accessline 19
1. **站点**:[国家知识产权局 中国专利公布公告](http://epub.cnipa.gov.cn/)(**仅** `epub.cnipa.gov.cn`)。 - Network accessline 60
6. **链接与著录**:国知局详情 URL 以脚本输出为准;**禁止编造**;若仅能从公布站得到公开号,可再配 **Google Patents** 稳定页 `https://patents.google.com/patent/CN…/en` 作为**补充**公开源(仍须打开校验)。 - Network accessline 66
1. **中文文献与学术**:[Google 学术搜索](https://scholar.google.com)(`scholar.google.com`)。 - Network accessline 68
- 强化「中国」语境时可加:`中国`、`site:.cn`、`专利`、`CN`(与专利号区分使用)等,以实际命中为准。 - 通过 **WebSearch** 或浏览器可用能力检索 Scholar;结果中优先选用**可打开、与标题/作者匹配**的条目链接。 2. **中国专利公开文献(补充)**:[Google Patents](https://patents.google.com/) 检索中文标题、申请人或公开号(`CN…A` / `CN…B` 等),每条使用**稳定著 - Network accessline 69
- 通过 **WebSearch** 或浏览器可用能力检索 Scholar;结果中优先选用**可打开、与标题/作者匹配**的条目链接。 2. **中国专利公开文献(补充)**:[Google Patents](https://patents.google.com/) 检索中文标题、申请人或公开号(`CN…A` / `CN…B` 等),每条使用**稳定著录页 URL**。 3. **其它来源**:英文文献、非中国专利等可继续用 Google Patents、出版社页面、DOI、 - Network accessline 70
2. **中国专利公开文献(补充)**:[Google Patents](https://patents.google.com/) 检索中文标题、申请人或公开号(`CN…A` / `CN…B` 等),每条使用**稳定著录页 URL**。 - Network accessline 86
| 类型 | 推荐 URL 形式 | 说明 | |------|----------------|------| | 美国等专利(公开出版物号) | `https://patents.google.com/patent/US20240118920A1/en` | 将 `US20240118920A1` 替换为实际公开号;以 Google Patents 页面能打开且标题/摘要匹配为准。 | - Network accessline 87
|------|----------------|------| | 美国等专利(公开出版物号) | `https://patents.google.com/patent/US20240118920A1/en` | 将 `US20240118920A1` 替换为实际公开号;以 Google Patents 页面能打开且标题/摘要匹配为准。 | | 中国专利 | **`https://patents.google.com/patent/CNXXXXXXXXXA/en`**(或对 - Network accessline 88
| 美国等专利(公开出版物号) | `https://patents.google.com/patent/US20240118920A1/en` | 将 `US20240118920A1` 替换为实际公开号;以 Google Patents 页面能打开且标题/摘要匹配为准。 | - Network accessline 89
| 中国专利 | **`https://patents.google.com/patent/CNXXXXXXXXXA/en`**(或对应 B 型等) | **优先**国知局公布站或 Google Patents 稳定著录页;勿依赖易过期的检索会话 URL。 | - Network accessline 90
| 学术论文(含 Scholar) | Scholar 条目页、出版社官方页或 **`https://doi.org/10.xxxx/...`** | Scholar 链接若重定向或镜像,以最终可长期解析的 DOI/出版社页为准。 | - Network accessline 91
| arXiv 预印本 | `https://arxiv.org/abs/2008.09213` | `abs` 页为规范条目页;勿用未经验证的镜像域名冒充官方。 | - Network accessline 92
| 期刊 / 会议 | 出版社 DOI:`https://doi.org/10.xxxx/...` 或官方摘要页 | 以 DOI 解析后页面与文献一致为准。 |
skills/nature-paper-to-patent/references/disclosure/tooling.md
- Network accessline 67
(或按报错提示选用 `chrome` 等;详见 [Puppeteer 文档](https://pptr.dev/)。) - Network accessline 245
- 仅 **`.docx`**(OOXML);老版 **`.doc`** 不支持。 - **Markdown 输出在 mammoth 侧标记为 deprecated**,复杂排版可能弱于「先导出 HTML 再转 MD」;专利扫描一般足够。若版式崩坏,建议所内 **另存为 PDF 或纯文本** 再扫。 - **WMF/EMF** 等 Windows 图元可能需单独处理(见 [mammoth WMF 配方](https://github.com/mwilliamson/pytho - Network accessline 247
- **WMF/EMF** 等 Windows 图元可能需单独处理(见 [mammoth WMF 配方](https://github.com/mwilliamson/python-mammoth))。
skills/nature-paper-to-patent/scripts/audit_claims.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/build_patent_package.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/disclosure/cnipa_epub_crawler.py
- Network accessline 1
# -*- coding: utf-8 -*- """ 中国专利公布公告网站点:http://epub.cnipa.gov.cn/ —— **首页「公布公告查询」** 检索(#indexForm / #searchStr)。 - Executable scriptline 1
Executable file - Network accessline 3
中国专利公布公告网站点:http://epub.cnipa.gov.cn/ —— **首页「公布公告查询」** 检索(#indexForm / #searchStr)。 - Network accessline 65
EPUB_BASE = "http://epub.cnipa.gov.cn/" - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 237
[Credential-related source omitted]
skills/nature-paper-to-patent/scripts/disclosure/cnipa_epub_parse.py
- Network accessline 1
# -*- coding: utf-8 -*- """ 解析 http://epub.cnipa.gov.cn/ 检索结果页 HTML,提取公布公告列表中的标题、公开号、详情链接、摘要(若有)。 - Executable scriptline 1
Executable file - Network accessline 3
解析 http://epub.cnipa.gov.cn/ 检索结果页 HTML,提取公布公告列表中的标题、公开号、详情链接、摘要(若有)。 - Network accessline 15
EPUB_BASE = "http://epub.cnipa.gov.cn/" - Network accessline 119
""" 新版「公布模式」结果页:无表格行,每条为 ``div.item``,题名在 ``h1.title``, 详情 URL 多在二维码 ``div.qrcode`` 的 ``title="http://epub.../patent/CN…"`` 上; - Network accessline 120
新版「公布模式」结果页:无表格行,每条为 ``div.item``,题名在 ``h1.title``, 详情 URL 多在二维码 ``div.qrcode`` 的 ``title="http://epub.../patent/CN…"`` 上; 摘要位于 ``dt`` 为「摘要」的 ``dd`` 内(含 ``span.alltxt`` 折叠段)。 - Network accessline 121
详情 URL 多在二维码 ``div.qrcode`` 的 ``title="http://epub.../patent/CN…"`` 上;
skills/nature-paper-to-patent/scripts/disclosure/cnipa_epub_search.py
skills/nature-paper-to-patent/scripts/disclosure/docx_to_md.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/disclosure/iteration_dialog_log.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/disclosure/math_render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/disclosure/md_to_docx.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/disclosure/mermaid_render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/disclosure/package-lock.json
- Network accessline 19
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 20
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 21
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 31
}, "funding": { "url": "https://github.com/sponsors/antfu" - Network accessline 32
"funding": { "url": "https://github.com/sponsors/antfu" } - Network accessline 33
"url": "https://github.com/sponsors/antfu" - Network accessline 430
"funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" - Network accessline 431
"type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, - Network accessline 432
"url": "https://github.com/sponsors/tannerlinsley" - Network accessline 443
"funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" - Network accessline 444
"type": "github", "url": "https://github.com/sponsors/tannerlinsley" } - Network accessline 445
"url": "https://github.com/sponsors/tannerlinsley" - Network accessline 790
}, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 791
"funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - Network accessline 792
"url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 951
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 952
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 953
"url": "https://github.com/sponsors/feross" - Network accessline 955
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 956
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 957
"url": "https://www.patreon.com/feross" - Network accessline 959
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 960
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 961
"url": "https://feross.org/support" - Network accessline 980
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 981
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 982
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 1000
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 1001
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 1002
"url": "https://github.com/sponsors/feross" - Network accessline 1004
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 1005
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 1006
"url": "https://www.patreon.com/feross" - Network accessline 1008
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 1009
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 1010
"url": "https://feross.org/support" - Network accessline 1049
}, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 1050
"funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } - Network accessline 1051
"url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 1095
}, "funding": { "url": "https://paulmillr.com/funding/" - Network accessline 1096
"funding": { "url": "https://paulmillr.com/funding/" }, - Network accessline 1097
"url": "https://paulmillr.com/funding/" - Network accessline 1132
}, "funding": { "url": "https://polar.sh/cva" - Network accessline 1133
"funding": { "url": "https://polar.sh/cva" } - Network accessline 1134
"url": "https://polar.sh/cva" - Network accessline 1226
}, "funding": { "url": "https://github.com/sponsors/d-fischer" - Network accessline 1227
"funding": { "url": "https://github.com/sponsors/d-fischer" }, - Network accessline 1228
"url": "https://github.com/sponsors/d-fischer" - Network accessline 1982
"node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 1983
"version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - Network accessline 1984
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 2000
"license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 2001
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 2002
"url": "https://github.com/sponsors/ljharb" - Network accessline 2022
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 2023
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 2024
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 2119
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 2120
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 2121
"url": "https://github.com/sponsors/feross" - Network accessline 2123
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 2124
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 2125
"url": "https://www.patreon.com/feross" - Network accessline 2127
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 2128
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 2129
"url": "https://feross.org/support" - Network accessline 2138
"funding": { "type": "opencollective", "url": "https://opencollective.com/immer" - Network accessline 2139
"type": "opencollective", "url": "https://opencollective.com/immer" } - Network accessline 2140
"url": "https://opencollective.com/immer" - Network accessline 2153
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 2154
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 2155
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 2162
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 2163
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 2164
"url": "https://github.com/sponsors/wooorm" - Network accessline 2208
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 2209
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 2210
"url": "https://github.com/sponsors/ljharb" - Network accessline 2307
"dev": true, "funding": [ "https://opencollective.com/katex", - Network accessline 2308
"funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" - Network accessline 2309
"https://opencollective.com/katex", - Network accessline 2310
"https://github.com/sponsors/katex" - Network accessline 2360
}, "funding": { "url": "https://github.com/sponsors/antonk52" - Network accessline 2361
"funding": { "url": "https://github.com/sponsors/antonk52" } - Network accessline 2362
"url": "https://github.com/sponsors/antonk52" - Network accessline 2493
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 2494
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 2495
"url": "https://github.com/sponsors/ai" - Network accessline 2617
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 2618
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 2619
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 2653
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 2654
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 2655
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 2737
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 2738
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 2739
"url": "https://opencollective.com/postcss/" - Network accessline 2741
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 2742
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, - Network accessline 2743
"url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 2745
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 2746
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 2747
"url": "https://github.com/sponsors/ai" - Network accessline 2780
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 2781
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 2782
"url": "https://opencollective.com/postcss/" - Network accessline 2784
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 2785
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 2786
"url": "https://github.com/sponsors/ai" - Network accessline 2804
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 2805
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 2806
"url": "https://opencollective.com/postcss/" - Network accessline 2808
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 2809
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 2810
"url": "https://github.com/sponsors/ai" - Network accessline 2845
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 2846
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 2847
"url": "https://opencollective.com/postcss/" - Network accessline 2849
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 2850
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 2851
"url": "https://github.com/sponsors/ai" - Network accessline 2975
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 2976
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 2977
"url": "https://github.com/sponsors/feross" - Network accessline 2979
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 2980
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 2981
"url": "https://www.patreon.com/feross" - Network accessline 2983
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 2984
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 2985
"url": "https://feross.org/support" - Network accessline 3078
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 3079
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 3080
"url": "https://github.com/sponsors/ljharb" - Network accessline 3120
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 3121
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 3122
"url": "https://github.com/sponsors/feross" - Network accessline 3124
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 3125
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 3126
"url": "https://www.patreon.com/feross" - Network accessline 3128
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 3129
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 3130
"url": "https://feross.org/support" - Network accessline 3147
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 3148
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 3149
"url": "https://github.com/sponsors/feross" - Network accessline 3151
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 3152
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 3153
"url": "https://www.patreon.com/feross" - Network accessline 3155
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 3156
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 3157
"url": "https://feross.org/support" - Network accessline 3341
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 3342
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 3343
"url": "https://github.com/sponsors/ljharb" - Network accessline 3355
"funding": { "type": "github", "url": "https://github.com/sponsors/dcastil" - Network accessline 3356
"type": "github", "url": "https://github.com/sponsors/dcastil" } - Network accessline 3357
"url": "https://github.com/sponsors/dcastil" - Network accessline 3486
}, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 3487
"funding": { "url": "https://github.com/sponsors/SuperchupuDev" } - Network accessline 3488
"url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 3513
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 3514
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 3515
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 3570
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 3571
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 3572
"url": "https://github.com/sponsors/feross" - Network accessline 3574
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 3575
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 3576
"url": "https://www.patreon.com/feross" - Network accessline 3578
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 3579
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 3580
"url": "https://feross.org/support" - Network accessline 3610
"dev": true, "funding": [ "https://github.com/sponsors/broofa", - Network accessline 3611
"funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" - Network accessline 3612
"https://github.com/sponsors/broofa", - Network accessline 3613
"https://github.com/sponsors/ctavan" - Network accessline 3674
}, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 3675
"funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } - Network accessline 3676
"url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 3749
"license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" - Network accessline 3750
"funding": { "url": "https://github.com/sponsors/colinhacks" } - Network accessline 3751
"url": "https://github.com/sponsors/colinhacks"
skills/nature-paper-to-patent/scripts/disclosure/package.json
- Executable scriptline 1
Executable file
skills/nature-paper-to-patent/scripts/disclosure/pptx_to_md.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/extract_pdf_text.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/init_patent_project.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/math_to_omml.py
skills/nature-paper-to-patent/scripts/render_flowchart_svg.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 189
parts = [ '<?xml version="1.0" encoding="UTF-8"?>', f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" ' - Network accessline 190
'<?xml version="1.0" encoding="UTF-8"?>', f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" ' f'viewBox="0 0 {width} {height}" role="img" aria-label="{html.escape(title)}">', - Network accessline 191
f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" '
skills/nature-paper-to-patent/scripts/render_patent_docx.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/scripts/validate_patent_draft.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-to-patent/tests/test_audit_claims.py
- Executable scriptline 1
Executable file
skills/nature-paper-to-patent/tests/test_inline_math_paren.py
- Executable scriptline 1
Executable file
skills/nature-paper-to-patent/tests/test_math_to_omml_superscript.py
- Executable scriptline 1
Executable file - Network accessline 17
def test_msup_uses_superscript_child(self) -> None: mathml = ElementTree.fromstring( '<msup xmlns="http://www.w3.org/1998/Math/MathML">' - Network accessline 18
mathml = ElementTree.fromstring( '<msup xmlns="http://www.w3.org/1998/Math/MathML">' "<mi>x</mi><mn>2</mn></msup>" - Network accessline 19
'<msup xmlns="http://www.w3.org/1998/Math/MathML">' - Network accessline 42
children = "".join(f"<mi>{value}</mi>" for value in values) mathml = ElementTree.fromstring( f'<{tag} xmlns="http://www.w3.org/1998/Math/MathML">' - Network accessline 43
mathml = ElementTree.fromstring( f'<{tag} xmlns="http://www.w3.org/1998/Math/MathML">' f"{children}</{tag}>" - Network accessline 44
f'<{tag} xmlns="http://www.w3.org/1998/Math/MathML">'
skills/nature-paper-to-patent/tests/test_md_to_docx_source_overwrite.py
- Executable scriptline 1
Executable file
skills/nature-paper-to-patent/tests/test_mermaid_render.py
- Executable scriptline 1
Executable file
skills/nature-paper-to-patent/tests/test_validation.py
- Executable scriptline 1
Executable file
skills/nature-paper-to-patent/tests/test_validation_figure_node_ids.py
- Executable scriptline 1
Executable file
skills/nature-paper-trans/README.md
skills/nature-paper-trans/README_EN.md
- Network accessline 60
- [nature-reader](https://github.com/Yuan1z0825/nature-skills/tree/main/skills/nature-reader): for full-paper Markdown, bilingual comparison, and source anchors. - Network accessline 61
- [nature-paper2ppt](https://github.com/Yuan1z0825/nature-skills/tree/main/skills/nature-paper2ppt): for Chinese paper-presentation PPTX decks.
skills/nature-paper-trans/scripts/pages.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-trans/tests/test_json_channel.py
- Executable scriptline 1
Executable file
skills/nature-paper-trans/tests/test_pages.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-paper-trans/tests/test_pdf_publication.py
- Executable scriptline 1
Executable file
skills/nature-paper-trans/tests/test_review_gate.py
- Executable scriptline 1
Executable file
skills/nature-paper2ppt/scripts/audit_pptx_quality.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 28
NS = { "p": "http://schemas.openxmlformats.org/presentationml/2006/main", - Network accessline 29
"p": "http://schemas.openxmlformats.org/presentationml/2006/main", - Network accessline 30
"a": "http://schemas.openxmlformats.org/drawingml/2006/main",
skills/nature-paper2word/README.md
- Network accessline 61
排版引擎与本文档来自开源项目 [md-to-word](https://github.com/ls-open/md-to-word)(MIT)。包内 CSL 引文样式来自 [Citation Style Language](https://github.com/citation-style-language/styles),按 CC BY-SA 3.0 使用。
skills/nature-paper2word/README_EN.md
- Network accessline 61
The engine and this documentation come from the open-source project [md-to-word](https://github.com/ls-open/md-to-word) (MIT). Bundled CSL styles come from [Citation Style Language](https://github.com/citation-style-language/styles), under
skills/nature-paper2word/SKILL.md
skills/nature-paper2word/UPSTREAM-LICENSE.txt
skills/nature-proposal-writer/SKILL.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/scripts/build_proposal_docx.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-proposal-writer/templates/00_scope.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/01_research_canon.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/02_evidence_table.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/03_argument_map.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/04_section_contracts.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/05_style_guide.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/qa_report.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/templates/revision_brief.md
- Executable scriptline 1
Executable file
skills/nature-proposal-writer/tests/test_source_preservation.py
skills/nature-proposal-writer/tests/test_table_delimiters.py
skills/nature-reader/scripts/validate_reader_math.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-ref-verifier/SKILL.md
- Network accessline 45
**Step 2.0(最便宜、最先做):DOI 可解析性检查。** 对每条有 DOI 的文献先请求 `https://api.crossref.org/works/<DOI>`:404 → DOI 本身错误(高度疑似错号);200 → 比对返回记录的标题/作者/卷期页与条目,不一致即"DOI 张冠李戴"。单次请求即可发现实践中最常见的一类错误(一次 35 条核查中 7/9 的错误属于此类)。 - Network accessline 136
- **Zotero 7 本地 HTTP API(localhost:23119)只读**——写操作返回 501,zotero-mcp 类集成不稳定多源于此层包装或 Zotero 繁忙,直连 curl 加 `--max-time` 探测即可判断;
skills/nature-response/references/source-basis.md
- Network accessline 18
| Source | URL | Source type | Local rule summary | |---|---|---|---| | Nature editorial criteria and processes | https://www.nature.com/nature/for-authors/editorial-criteria-and-processes | Formal journal process | Revised papers that need - Network accessline 19
|---|---|---|---| | Nature editorial criteria and processes | https://www.nature.com/nature/for-authors/editorial-criteria-and-processes | Formal journal process | Revised papers that need technical work should be accompanied by a point-by- - Network accessline 20
| Nature editorial criteria and processes | https://www.nature.com/nature/for-authors/editorial-criteria-and-processes | Formal journal process | Revised papers that need technical work should be accompanied by a point-by-point response to - Network accessline 21
| Nature transparent peer review information | https://www.nature.com/nature/for-authors/editorial-criteria-and-processes | Formal journal process | For some published original research articles, reviewer comments and author rebuttal materi - Network accessline 22
| Nature Electronics editorial process | https://www.nature.com/natelectron/submission-guidelines/editorial-process | Journal instruction | A revision package commonly includes the revised manuscript, a response to each reviewer, and a cove - Network accessline 23
| Springer Nature rebuttal guidance | https://communities.springernature.com/posts/how-to-write-a-rebuttal-letter | Editorial advice | Preserve reviewer comments, respond immediately after each concern, number or clearly separate replies, s - Network accessline 24
| Scientific Reviews peer-review policies | https://www.nature.com/scirev/journal-policies/peer-review | Journal policy | Revisions should include point-by-point responses explaining manuscript changes. Appeals and revision responses follow
skills/nature-response/scripts/check_package_consistency.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-response/tests/test_package_consistency.py
- Executable scriptline 1
Executable file
skills/nature-response/tests/test_response_instruction_contracts.py
- Executable scriptline 1
Executable file
skills/nature-reviewer/tests/test_reviewer_instruction_contracts.py
- Executable scriptline 1
Executable file
skills/nature-shared/core/discussion-argument-language.md
- Network accessline 7
This is **writing guidance, not an official Nature Portfolio requirement**. Its functional model is informed in part by the author-supplied public article [“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCf - Network accessline 7
This is **writing guidance, not an official Nature Portfolio requirement**. Its functional model is informed in part by the author-supplied public article [“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCf - Network accessline 7
This is **writing guidance, not an official Nature Portfolio requirement**. Its functional model is informed in part by the author-supplied public article [“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCf - Network accessline 8
Its functional model is informed in part by the author-supplied public article [“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCfjINw) (22 August 2026), which summarizes material from *Science Research Wri - Network accessline 8
Its functional model is informed in part by the author-supplied public article [“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCfjINw) (22 August 2026), which summarizes material from *Science Research Wri - Network accessline 8
Its functional model is informed in part by the author-supplied public article [“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCfjINw) (22 August 2026), which summarizes material from *Science Research Wri - Network accessline 9
[“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCfjINw) - Network accessline 9
[“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCfjINw) - Network accessline 9
[“学术训练 | How to Write the Discussion?”](https://mp.weixin.qq.com/s/exPlMmjkrDPchE6dCfjINw)
skills/nature-shared/core/ethics.md
skills/nature-shared/core/research-compliance.md
- Network accessline 188
- Research ethics: <https://www.nature.com/nature-portfolio/editorial-policies/ethics-and-biosecurity> - Network accessline 188
- Research ethics: <https://www.nature.com/nature-portfolio/editorial-policies/ethics-and-biosecurity> - Network accessline 189
- Clinical research: <https://www.nature.com/nature-portfolio/editorial-policies/clinical-research> - Network accessline 189
- Clinical research: <https://www.nature.com/nature-portfolio/editorial-policies/clinical-research> - Network accessline 190
- Reporting and availability: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Network accessline 190
- Reporting and availability: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Network accessline 191
- Image integrity: <https://www.nature.com/nature-portfolio/editorial-policies/image-integrity> - Network accessline 191
- Image integrity: <https://www.nature.com/nature-portfolio/editorial-policies/image-integrity> - Network accessline 192
- Nature initial submission: <https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 192
- Nature initial submission: <https://www.nature.com/nature/for-authors/initial-submission>
skills/nature-shared/journal-formats/nat-comms.md
- Network accessline 113
- Fully open access — APC applies (verify current rate; substantial) - Default license: **CC BY 4.0** - Some funders (e.g., UKRI) require CC BY; others allow CC BY-NC — check funder requirements - Network accessline 115
- Some funders (e.g., UKRI) require CC BY; others allow CC BY-NC — check funder requirements
skills/nature-shared/journal-formats/nature-machine-intelligence.md
- Network accessline 414
- Submission guidelines: <https://www.nature.com/natmachintell/submission-guidelines> - Network accessline 414
- Submission guidelines: <https://www.nature.com/natmachintell/submission-guidelines> - Network accessline 414
- Submission guidelines: <https://www.nature.com/natmachintell/submission-guidelines> - Network accessline 414
- Submission guidelines: <https://www.nature.com/natmachintell/submission-guidelines> - Network accessline 414
- Submission guidelines: <https://www.nature.com/natmachintell/submission-guidelines> - Network accessline 414
- Submission guidelines: <https://www.nature.com/natmachintell/submission-guidelines> - Network accessline 415
- Content types: <https://www.nature.com/natmachintell/content> - Network accessline 415
- Content types: <https://www.nature.com/natmachintell/content> - Network accessline 415
- Content types: <https://www.nature.com/natmachintell/content> - Network accessline 415
- Content types: <https://www.nature.com/natmachintell/content> - Network accessline 415
- Content types: <https://www.nature.com/natmachintell/content> - Network accessline 415
- Content types: <https://www.nature.com/natmachintell/content> - Network accessline 416
- Preparing your submission: <https://www.nature.com/natmachintell/submission-guidelines/preparing-your-submission> - Network accessline 416
- Preparing your submission: <https://www.nature.com/natmachintell/submission-guidelines/preparing-your-submission> - Network accessline 416
- Preparing your submission: <https://www.nature.com/natmachintell/submission-guidelines/preparing-your-submission> - Network accessline 416
- Preparing your submission: <https://www.nature.com/natmachintell/submission-guidelines/preparing-your-submission> - Network accessline 416
- Preparing your submission: <https://www.nature.com/natmachintell/submission-guidelines/preparing-your-submission> - Network accessline 416
- Preparing your submission: <https://www.nature.com/natmachintell/submission-guidelines/preparing-your-submission> - Network accessline 417
- Initial formatting: <https://www.nature.com/natmachintell/submission-guidelines/initial-formatting> - Network accessline 417
- Initial formatting: <https://www.nature.com/natmachintell/submission-guidelines/initial-formatting> - Network accessline 417
- Initial formatting: <https://www.nature.com/natmachintell/submission-guidelines/initial-formatting> - Network accessline 417
- Initial formatting: <https://www.nature.com/natmachintell/submission-guidelines/initial-formatting> - Network accessline 417
- Initial formatting: <https://www.nature.com/natmachintell/submission-guidelines/initial-formatting> - Network accessline 417
- Initial formatting: <https://www.nature.com/natmachintell/submission-guidelines/initial-formatting> - Network accessline 418
- Writing and language: <https://www.nature.com/natmachintell/submission-guidelines/writing-and-language> - Network accessline 418
- Writing and language: <https://www.nature.com/natmachintell/submission-guidelines/writing-and-language> - Network accessline 418
- Writing and language: <https://www.nature.com/natmachintell/submission-guidelines/writing-and-language> - Network accessline 418
- Writing and language: <https://www.nature.com/natmachintell/submission-guidelines/writing-and-language> - Network accessline 418
- Writing and language: <https://www.nature.com/natmachintell/submission-guidelines/writing-and-language> - Network accessline 418
- Writing and language: <https://www.nature.com/natmachintell/submission-guidelines/writing-and-language> - Network accessline 419
- Accepted-in-principle and formatting: <https://www.nature.com/natmachintell/submission-guidelines/aip-and-formatting> - Network accessline 419
- Accepted-in-principle and formatting: <https://www.nature.com/natmachintell/submission-guidelines/aip-and-formatting> - Network accessline 419
- Accepted-in-principle and formatting: <https://www.nature.com/natmachintell/submission-guidelines/aip-and-formatting> - Network accessline 419
- Accepted-in-principle and formatting: <https://www.nature.com/natmachintell/submission-guidelines/aip-and-formatting> - Network accessline 419
- Accepted-in-principle and formatting: <https://www.nature.com/natmachintell/submission-guidelines/aip-and-formatting> - Network accessline 419
- Accepted-in-principle and formatting: <https://www.nature.com/natmachintell/submission-guidelines/aip-and-formatting> - Network accessline 420
- Double-anonymized peer review: <https://www.nature.com/natmachintell/submission-guidelines/dapr> - Network accessline 420
- Double-anonymized peer review: <https://www.nature.com/natmachintell/submission-guidelines/dapr> - Network accessline 420
- Double-anonymized peer review: <https://www.nature.com/natmachintell/submission-guidelines/dapr> - Network accessline 420
- Double-anonymized peer review: <https://www.nature.com/natmachintell/submission-guidelines/dapr> - Network accessline 420
- Double-anonymized peer review: <https://www.nature.com/natmachintell/submission-guidelines/dapr> - Network accessline 420
- Double-anonymized peer review: <https://www.nature.com/natmachintell/submission-guidelines/dapr> - Network accessline 421
- Editorial policies: <https://www.nature.com/natmachintell/editorial-policies> - Network accessline 421
- Editorial policies: <https://www.nature.com/natmachintell/editorial-policies> - Network accessline 421
- Editorial policies: <https://www.nature.com/natmachintell/editorial-policies> - Network accessline 421
- Editorial policies: <https://www.nature.com/natmachintell/editorial-policies> - Network accessline 421
- Editorial policies: <https://www.nature.com/natmachintell/editorial-policies> - Network accessline 421
- Editorial policies: <https://www.nature.com/natmachintell/editorial-policies> - Network accessline 422
- Reporting standards, data and code: <https://www.nature.com/natmachintell/editorial-policies/reporting-standards> - Network accessline 422
- Reporting standards, data and code: <https://www.nature.com/natmachintell/editorial-policies/reporting-standards> - Network accessline 422
- Reporting standards, data and code: <https://www.nature.com/natmachintell/editorial-policies/reporting-standards> - Network accessline 422
- Reporting standards, data and code: <https://www.nature.com/natmachintell/editorial-policies/reporting-standards> - Network accessline 422
- Reporting standards, data and code: <https://www.nature.com/natmachintell/editorial-policies/reporting-standards> - Network accessline 422
- Reporting standards, data and code: <https://www.nature.com/natmachintell/editorial-policies/reporting-standards> - Network accessline 423
- Preprints and conference proceedings: <https://www.nature.com/natmachintell/editorial-policies/preprints-conference-proceedings> - Network accessline 423
- Preprints and conference proceedings: <https://www.nature.com/natmachintell/editorial-policies/preprints-conference-proceedings> - Network accessline 423
- Preprints and conference proceedings: <https://www.nature.com/natmachintell/editorial-policies/preprints-conference-proceedings> - Network accessline 423
- Preprints and conference proceedings: <https://www.nature.com/natmachintell/editorial-policies/preprints-conference-proceedings> - Network accessline 423
- Preprints and conference proceedings: <https://www.nature.com/natmachintell/editorial-policies/preprints-conference-proceedings> - Network accessline 423
- Preprints and conference proceedings: <https://www.nature.com/natmachintell/editorial-policies/preprints-conference-proceedings> - Network accessline 424
- Presubmission enquiries: <https://www.nature.com/natmachintell/submission-guidelines/presubmission-enquiries> - Network accessline 424
- Presubmission enquiries: <https://www.nature.com/natmachintell/submission-guidelines/presubmission-enquiries> - Network accessline 424
- Presubmission enquiries: <https://www.nature.com/natmachintell/submission-guidelines/presubmission-enquiries> - Network accessline 424
- Presubmission enquiries: <https://www.nature.com/natmachintell/submission-guidelines/presubmission-enquiries> - Network accessline 424
- Presubmission enquiries: <https://www.nature.com/natmachintell/submission-guidelines/presubmission-enquiries> - Network accessline 424
- Presubmission enquiries: <https://www.nature.com/natmachintell/submission-guidelines/presubmission-enquiries> - Network accessline 425
- Aims and scope: <https://www.nature.com/natmachintell/aims> - Network accessline 425
- Aims and scope: <https://www.nature.com/natmachintell/aims> - Network accessline 425
- Aims and scope: <https://www.nature.com/natmachintell/aims> - Network accessline 425
- Aims and scope: <https://www.nature.com/natmachintell/aims> - Network accessline 425
- Aims and scope: <https://www.nature.com/natmachintell/aims> - Network accessline 425
- Aims and scope: <https://www.nature.com/natmachintell/aims> - Network accessline 426
- Publishing options: <https://www.nature.com/natmachintell/submission-guidelines/publishing-options> - Network accessline 426
- Publishing options: <https://www.nature.com/natmachintell/submission-guidelines/publishing-options> - Network accessline 426
- Publishing options: <https://www.nature.com/natmachintell/submission-guidelines/publishing-options> - Network accessline 426
- Publishing options: <https://www.nature.com/natmachintell/submission-guidelines/publishing-options> - Network accessline 426
- Publishing options: <https://www.nature.com/natmachintell/submission-guidelines/publishing-options> - Network accessline 426
- Publishing options: <https://www.nature.com/natmachintell/submission-guidelines/publishing-options> - Network accessline 430
- Brief guide for submission to Nature Machine Intelligence, revised 9 July 2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 430
- Brief guide for submission to Nature Machine Intelligence, revised 9 July 2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 430
- Brief guide for submission to Nature Machine Intelligence, revised 9 July 2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 430
- Brief guide for submission to Nature Machine Intelligence, revised 9 July 2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 430
- Brief guide for submission to Nature Machine Intelligence, revised 9 July 2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 430
- Brief guide for submission to Nature Machine Intelligence, revised 9 July 2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 431
2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 431
2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 431
2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 431
2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 431
2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf> - Network accessline 431
2018: <https://www.nature.com/documents/natmachintell-brief-submission-guide.pdf>
skills/nature-shared/journal-formats/nature.md
- Network accessline 306
- Initial submission: <https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 306
- Initial submission: <https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 307
- Formatting guide: <https://www.nature.com/nature/for-authors/formatting-guide> - Network accessline 307
- Formatting guide: <https://www.nature.com/nature/for-authors/formatting-guide> - Network accessline 308
- Editorial criteria and processes: <https://www.nature.com/nature/for-authors/editorial-criteria-and-processes> - Network accessline 308
- Editorial criteria and processes: <https://www.nature.com/nature/for-authors/editorial-criteria-and-processes> - Network accessline 309
- Supplementary Information: <https://www.nature.com/nature/for-authors/supp-info> - Network accessline 309
- Supplementary Information: <https://www.nature.com/nature/for-authors/supp-info> - Network accessline 310
- Forms and declarations: <https://www.nature.com/nature/for-authors/forms-and-declarations> - Network accessline 310
- Forms and declarations: <https://www.nature.com/nature/for-authors/forms-and-declarations> - Network accessline 311
- Final submission: <https://www.nature.com/nature/for-authors/final-submission> - Network accessline 311
- Final submission: <https://www.nature.com/nature/for-authors/final-submission> - Network accessline 312
- Nature Portfolio reporting standards: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Network accessline 312
- Nature Portfolio reporting standards: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards> - Network accessline 313
- Nature Portfolio AI policy: <https://www.nature.com/nature-portfolio/editorial-policies/ai> - Network accessline 313
- Nature Portfolio AI policy: <https://www.nature.com/nature-portfolio/editorial-policies/ai>
skills/nature-shared/scripts/check_consistency.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/nature-shared/tests/test_check_consistency.py
- Executable scriptline 1
Executable file
skills/nature-statistics/references/nature-article-requirements.md
- Network accessline 81
- Nature initial submission, Statistical information: <https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 82
<https://www.nature.com/nature/for-authors/initial-submission> - Network accessline 84
<https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards>
skills/nature-statistics/references/source-basis.md
- Network accessline 13
- Where relevant, manuscripts sent for review may require completed reporting summary documents. - For life sciences, behavioural and social sciences, ecology, evolution and environmental sciences, the reporting summary asks authors to p - Network accessline 15
- Source: https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards - Network accessline 18
- The Nature collection `Statistics for Biologists` groups practical guidance on statistical design, P values, power, sample size, error bars, multiple comparisons, nonparametric tests, experimental design, replication, nested designs, regr - Network accessline 19
- Treat this collection as practical guidance for common failure modes, not as a single mandatory checklist for every field. - Source: https://www.nature.com/collections/qghhqm - For a flagship Nature Article, load `nature-article-req - Network accessline 20
- Source: https://www.nature.com/collections/qghhqm
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 24 facts
- Contacts doi.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/mcp-server/academic_search_server.py:586High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/mcp-server/sources/arxiv.py:21High confidence
- Contacts eutils.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/mcp-server/sources/pubmed.py:20High confidence
- Contacts doi.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/references/ris-bibtex-format.md:30High confidence
- Contacts api.openalex.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/scripts/academic_search.py:57High confidence
- Contacts doi.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/scripts/academic_search.py:261High confidence
- Contacts doi.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/scripts/converters.py:109High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/scripts/converters.py:311High confidence
- Contacts eutils.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/scripts/format-converter.py:43High confidence
- Contacts eutils.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-academic-search/scripts/preflight.py:21High confidence
- Contacts eutils.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:30High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:35High confidence
- Contacts www.zotero.org, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:36High confidence
- Contacts purl.org, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:37High confidence
- Contacts xmlns.com, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:39High confidence
- Contacts prismstandard.org, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:41High confidence
- Contacts doi.org, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:221High confidence
- Contacts pubmed.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-citation/scripts/nature_citation.py:864High confidence
- Contacts doi.org, which SKILL.md, the README and the plugin manifest do not mentionnature-downloader/scripts/batch_download.mjs:235High confidence
- Contacts onlinelibrary.wiley.com, which SKILL.md, the README and the plugin manifest do not mentionnature-downloader/scripts/batch_download.mjs:309High confidence
- Contacts ftp.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-downloader/scripts/lib/open-access-provider.mjs:19High confidence
- Contacts www.ebi.ac.uk, which SKILL.md, the README and the plugin manifest do not mentionnature-downloader/scripts/lib/open-access-provider.mjs:56High confidence
- Contacts www.ncbi.nlm.nih.gov, which SKILL.md, the README and the plugin manifest do not mentionnature-downloader/scripts/lib/open-access.mjs:104High confidence
- Contacts api.unpaywall.org, which SKILL.md, the README and the plugin manifest do not mentionnature-downloader/scripts/lib/open-access.mjs:117High confidence
Signal confidence: 476 facts
- Executable script in the frontmatter of the SKILL.mdnature-academic-search/SKILL.md:1Low confidence
- Executable script in code of a file that runsnature-academic-search/install.sh:1High confidence
- Access to secrets in code of a file that runsnature-academic-search/install.sh:145High confidence
- Access to secrets in prose of documentationnature-academic-search/mcp-server/README.md:28Low confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/academic_search_server.py:1Low confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/academic_search_server.py:584High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/academic_search_server.py:585High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/academic_search_server.py:586High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/academic_search_server.py:603High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/academic_search_server.py:604High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/academic_search_server.py:605High confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/__init__.py:1Low confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:1Low confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:18High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:20High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:21High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:22High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:179High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:180High confidence
- Network access in a comment of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:251Low confidence
- Network access in prose of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:313Low confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/arxiv.py:321High confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/crossref.py:1Low confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:10High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:80High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:81High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:82High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:118High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:119High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/crossref.py:120High confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/elsevier_common.py:1Low confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:1Low confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:20High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuenature-academic-search/mcp-server/sources/pubmed.py:30Low confidence
- Access to secrets in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:33High confidence
- Access to secrets in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:43High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuenature-academic-search/mcp-server/sources/pubmed.py:45Low confidence
- Access to secrets in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:50High confidence
- Access to secrets in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:51High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:53High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:54High confidence
- Network access in code of a file that runsnature-academic-search/mcp-server/sources/pubmed.py:55High confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/sciencedirect.py:1Low confidence
- Executable script in prose of a file that runsnature-academic-search/mcp-server/sources/scopus.py:1Low confidence
- Executable script in prose of a testnature-academic-search/mcp-server/tests/__init__.py:1Low confidence
- Executable script in prose of a testnature-academic-search/mcp-server/tests/test_arxiv_error_entries.py:1Low confidence
- Network access in code of a testnature-academic-search/mcp-server/tests/test_arxiv_error_entries.py:11Low confidence
- Network access in code of a testnature-academic-search/mcp-server/tests/test_arxiv_error_entries.py:21Low confidence
- Network access in code of a testnature-academic-search/mcp-server/tests/test_arxiv_error_entries.py:22Low confidence
- Network access in code of a testnature-academic-search/mcp-server/tests/test_arxiv_error_entries.py:31Low confidence
and 426 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md skills/nature-academic-search/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md skills/nature-academic-search/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skills/nature-academic-search/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md skills/nature-academic-search/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skills/nature-academic-search/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md skills/nature-academic-search/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/yuan1z0825-nature-skills/)