#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

Compare on GitHub

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.

Compare on GitHub

skills/nature-citation/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-data/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

skills/nature-experiment-log/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Instructions only

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

skills/nature-literature-pipeline/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-paper-card/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

skills/nature-paper-trans/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-paper-xray/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-paper2ppt/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-paper2word/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-polishing/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Instructions only

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-proposal-writer/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Local scripts

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-reader/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

skills/nature-reviewer/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

skills/nature-social-science/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-statistics/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

skills/nature-writing/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Network or broad shell

c1637a89c709 → c1cee246a489

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit c1cee246a489a676e3c80cae9e282da4b58cf19a

52.6kGitHub stars
1kstars in 7 days
24skills in this repository
88commits in 30 days

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

Aug 2, 2026Nov 7, 202652,595

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

801 tokens

When the skill is activated

Reference documents

10,182 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Routing protocol

Scripts executed separately

  • install.sh
  • mcp-server/academic_search_server.py
  • mcp-server/sources/__init__.py
  • mcp-server/sources/arxiv.py
  • mcp-server/sources/crossref.py
  • mcp-server/sources/elsevier_common.py
  • mcp-server/sources/pubmed.py
  • mcp-server/sources/sciencedirect.py
  • mcp-server/sources/scopus.py
  • mcp-server/tests/__init__.py
  • mcp-server/tests/test_arxiv_error_entries.py
  • mcp-server/tests/test_citation_errors.py
  • mcp-server/tests/test_elsevier_live.py
  • mcp-server/tests/test_format_converter_hardening.py
  • mcp-server/tests/test_mcp_tools.py
  • mcp-server/tests/test_pubmed_parsing.py
  • mcp-server/tests/test_scopus_empty_result.py
  • mcp-server/tests/test_script_converters.py
  • mcp-server/tests/test_sources.py
  • mcp-server/utils/__init__.py
  • mcp-server/utils/config.py
  • mcp-server/utils/errors.py
  • mcp-server/utils/logging.py
  • references/pubmed-28344011.bib
  • references/pubmed-28344011.nbib
  • references/pubmed-28344011.ris
  • references/ris-bibtex-format.md
  • references/search-strategy.md
  • scripts/academic_search.py
  • scripts/converters.py
  • scripts/format-converter.py
  • scripts/preflight.py

Files

  • README.mddoc2,435 bytes
  • README_EN.mddoc2,762 bytes
  • SKILL.mdcore3,610 bytes
  • SKILL.mdcore3,610 bytes
  • SKILL.mdcore3,610 bytes
  • agents/openai.yamlasset265 bytes
  • config/mcp-snippet.jsonasset502 bytes
  • config/settings-snippet.jsonasset59 bytes
  • config/triggers-academic-search.tomlasset978 bytes
  • install.shruns4,442 bytes
  • manifest.yamlasset3,154 bytes
  • mcp-server/README.mddoc1,959 bytes
  • mcp-server/academic_search_server.pyruns21,382 bytes
  • mcp-server/config.tomlasset249 bytes
  • mcp-server/requirements.txtdoc134 bytes
  • mcp-server/sources/__init__.pyruns352 bytes
  • mcp-server/sources/arxiv.pyruns11,659 bytes
  • mcp-server/sources/crossref.pyruns7,080 bytes
  • mcp-server/sources/elsevier_common.pyruns2,498 bytes
  • mcp-server/sources/pubmed.pyruns13,440 bytes
  • mcp-server/sources/sciencedirect.pyruns7,057 bytes
  • mcp-server/sources/scopus.pyruns19,499 bytes
  • mcp-server/tests/__init__.pyruns40 bytes
  • mcp-server/tests/test_arxiv_error_entries.pyruns1,462 bytes
  • mcp-server/tests/test_citation_errors.pyruns1,669 bytes
  • mcp-server/tests/test_elsevier_live.pyruns2,639 bytes
  • mcp-server/tests/test_format_converter_hardening.pyruns4,263 bytes
  • mcp-server/tests/test_mcp_tools.pyruns2,699 bytes
  • mcp-server/tests/test_pubmed_parsing.pyruns894 bytes
  • mcp-server/tests/test_scopus_empty_result.pyruns1,006 bytes
  • mcp-server/tests/test_script_converters.pyruns2,938 bytes
  • mcp-server/tests/test_sources.pyruns31,209 bytes
  • mcp-server/utils/__init__.pyruns359 bytes
  • mcp-server/utils/config.pyruns1,398 bytes
  • mcp-server/utils/errors.pyruns620 bytes
  • mcp-server/utils/logging.pyruns1,166 bytes
  • references/citation-parser.mddoc2,715 bytes
  • references/dedup-engine.mddoc1,947 bytes
  • references/pubmed-28344011.bibruns3,410 bytes
  • references/pubmed-28344011.nbibruns12,205 bytes
  • references/pubmed-28344011.risruns3,513 bytes
  • references/ris-bibtex-format.mdruns4,629 bytes
  • references/search-strategy.mdruns2,067 bytes
  • references/source-tiers.mddoc2,744 bytes
  • references/workflows/wf1-multi-source-search.mddoc1,913 bytes
  • references/workflows/wf2-citation-verification.mddoc1,650 bytes
  • references/workflows/wf3-mesh-strategy.mddoc538 bytes
  • references/workflows/wf4-citation-file-mgmt.mddoc1,921 bytes
  • references/workflows/wf5-reference-mgmt.mddoc1,333 bytes
  • references/workflows/wf6-strict-other-citation-impact-audit.mddoc11,315 bytes
  • scripts/academic_search.pyruns21,383 bytes
  • scripts/converters.pyruns18,981 bytes
  • scripts/format-converter.pyruns19,995 bytes
  • scripts/preflight.pyruns3,780 bytes
  • static/core/routing-and-ops.mddoc5,280 bytes
  • static/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 GitHub

Skills 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

  1. #38 from Oct 11 to Oct 20
  2. #37 from Oct 21 to Oct 24
  3. #39 on Oct 25
  4. #38 on Oct 28
  5. #39 on Oct 29
  6. #40 since Oct 30
13 earlier periods
  1. #42 on Aug 2
  2. #42 on Aug 8
  3. #41 from Aug 9 to Aug 10
  4. #42 from Aug 11 to Aug 24
  5. #41 from Aug 25 to Aug 30
  6. #42 on Aug 31
  7. #41 from Sep 1 to Sep 5
  8. #40 from Sep 6 to Sep 10
  9. #41 from Sep 11 to Sep 13
  10. #40 from Sep 14 to Sep 16
  11. #39 from Sep 17 to Sep 18
  12. #38 from Sep 19 to Oct 7
  13. #39 from Oct 8 to Oct 10

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-academic-search/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-citation/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-citation/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-data/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-downloader/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-figure/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/nature-figure/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 1,751 signals by file

skills/nature-academic-search/SKILL.md

  • Executable scriptline 1
    Executable file

skills/nature-academic-search/install.sh

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Access to secretsline 145
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 17
    [Credential-related source omitted]
  • Access to secretsline 20
    [Credential-related source omitted]
  • Access to secretsline 21
    [Credential-related source omitted]

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

  • Network accessline 8
    1. Extract DOI from each record. Match `10.\d{4,}/[^\s]+` pattern. 2. Strip leading `https://doi.org/` prefix if present.
  • Network accessline 9
    2. Strip leading `https://doi.org/` prefix if present.

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

  • Network accessline 96
    <rdf:RDF ...>   <bib:Article rdf:about="https://doi.org/...">
  • Network accessline 97
    <bib:Article rdf:about="https://doi.org/...">

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

  • Network accessline 1
    {   "$schema": "http://json-schema.org/draft-07/schema#",
  • Network accessline 2
    "$schema": "http://json-schema.org/draft-07/schema#",

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

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 4
    function usage() {   console.log(`Usage:   node cdp_open_url.mjs --url <url> [--proxy http://127.0.0.1:3456] [--wait]
  • Network accessline 6
    node cdp_open_url.mjs --url <url> [--proxy http://127.0.0.1:3456] [--wait]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 44
    [Credential-related source omitted]
  • Access to secretsline 45
    [Credential-related source omitted]
  • Access to secretsline 46
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 21
    [Credential-related source omitted]
  • Access to secretsline 23
    [Credential-related source omitted]

skills/nature-downloader/scripts/lib/school-config.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 5
    export const DEFAULT_DISCOVERY_URL = "https://www.webofscience.com/wos/woscc/basic-search";

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 22
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 19
    [Credential-related source omitted]
  • Access to secretsline 36
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 20
    [Credential-related source omitted]
  • Access to secretsline 25
    [Credential-related source omitted]

skills/nature-downloader/tests/unit/direct-download-collision.test.mjs

  • Executable scriptline 1
    Executable file

skills/nature-downloader/tests/unit/generic-package.test.mjs

  • Executable scriptline 1
    Executable file
  • Access to secretsline 35
    [Credential-related source omitted]

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

  • Network accessline 5
    - Project: `figures4papers` - Upstream: <https://github.com/ChenLiu-1996/figures4papers>
  • Network accessline 6
    - Upstream: <https://github.com/ChenLiu-1996/figures4papers>

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

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 17
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 18
    [Credential-related source omitted]

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

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 18
    [Credential-related source omitted]
  • Access to secretsline 26
    [Credential-related source omitted]

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

  • Network accessline 7
    source:   repository: https://github.com/Paul-Jeo/Image2PPT
  • Network accessline 8
    repository: https://github.com/Paul-Jeo/Image2PPT

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

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://github.com/Paul-Jeo/nature-skills/nature-image2ppt/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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 19
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 44
    [Credential-related source omitted]
  • Access to secretsline 58
    [Credential-related source omitted]
  • Access to secretsline 62
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 197
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 53
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 18
    NS = {     "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
  • Network accessline 19
    "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
  • Network accessline 20
    "p": "http://schemas.openxmlformats.org/presentationml/2006/main",

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

  • Executable scriptline 1
    Executable file
  • Network accessline 68
    📎 https://example.org/paper

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 104
    [Credential-related source omitted]

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

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 11
    MATHML_NS = "{http://www.w3.org/1998/Math/MathML}"

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

  • Network accessline 60
    - [nature-reader](https://github.com/Yuan1z0825/nature-skills/tree/main/skills/nature-reader):需要全文 Markdown、中英文对照及来源锚点时使用。
  • Network accessline 61
    - [nature-paper2ppt](https://github.com/Yuan1z0825/nature-skills/tree/main/skills/nature-paper2ppt):需要中文论文汇报 PPTX 时使用。

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

  • Network accessline 170
    Upstream engine, the general-purpose pip package, and the changelog: [md-to-word](https://github.com/ls-open/md-to-word).
  • Network accessline 171
    [md-to-word](https://github.com/ls-open/md-to-word).

skills/nature-paper2word/UPSTREAM-LICENSE.txt

  • Network accessline 1
    The skill documentation in this directory (SKILL.md, README.md, README_EN.md) is derived from md-to-word (https://github.com/ls-open/md-to-word), which is
  • Network accessline 2
    derived from md-to-word (https://github.com/ls-open/md-to-word), which is

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 15
    [Credential-related source omitted]

skills/nature-proposal-writer/tests/test_table_delimiters.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 17
    [Credential-related source omitted]

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

  • Network accessline 87
    Current policy source, verified 2026-08-08: <https://www.nature.com/nature-portfolio/editorial-policies/ai>.
  • Network accessline 88
    <https://www.nature.com/nature-portfolio/editorial-policies/ai>.

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
Signal confidence: 476 facts

and 426 more

Only the first 500 facts are listed.

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md skills/nature-academic-search/SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md skills/nature-academic-search/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/nature-academic-search/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/nature-academic-search/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/nature-academic-search/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

Yuan1z0825/nature-skills: #40 on hotskills, 52.6k stars

[![Yuan1z0825/nature-skills on hotskills](https://hotskills.dev/badge/yuan1z0825-nature-skills.svg)](https://hotskills.dev/skill/yuan1z0825-nature-skills/)