@zenalexa/unicli 0.225.2 → 0.225.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/dist/adapters/acl-anthology/papers.d.ts +16 -9
- package/dist/adapters/acl-anthology/papers.d.ts.map +1 -1
- package/dist/adapters/acl-anthology/papers.js +322 -58
- package/dist/adapters/acl-anthology/papers.js.map +1 -1
- package/dist/adapters/arxiv/papers.d.ts +22 -4
- package/dist/adapters/arxiv/papers.d.ts.map +1 -1
- package/dist/adapters/arxiv/papers.js +202 -4
- package/dist/adapters/arxiv/papers.js.map +1 -1
- package/dist/adapters/baidu-scholar/search.d.ts +15 -1
- package/dist/adapters/baidu-scholar/search.d.ts.map +1 -1
- package/dist/adapters/baidu-scholar/search.js +72 -8
- package/dist/adapters/baidu-scholar/search.js.map +1 -1
- package/dist/adapters/biorxiv/preprints.d.ts +9 -0
- package/dist/adapters/biorxiv/preprints.d.ts.map +1 -0
- package/dist/adapters/biorxiv/preprints.js +78 -0
- package/dist/adapters/biorxiv/preprints.js.map +1 -0
- package/dist/adapters/cnki/search.d.ts +82 -0
- package/dist/adapters/cnki/search.d.ts.map +1 -0
- package/dist/adapters/cnki/search.js +236 -0
- package/dist/adapters/cnki/search.js.map +1 -0
- package/dist/adapters/cvf/papers.d.ts +12 -7
- package/dist/adapters/cvf/papers.d.ts.map +1 -1
- package/dist/adapters/cvf/papers.js +210 -27
- package/dist/adapters/cvf/papers.js.map +1 -1
- package/dist/adapters/dblp/publications.d.ts +12 -5
- package/dist/adapters/dblp/publications.d.ts.map +1 -1
- package/dist/adapters/dblp/publications.js +31 -8
- package/dist/adapters/dblp/publications.js.map +1 -1
- package/dist/adapters/google-scholar/search.d.ts +22 -1
- package/dist/adapters/google-scholar/search.d.ts.map +1 -1
- package/dist/adapters/google-scholar/search.js +129 -14
- package/dist/adapters/google-scholar/search.js.map +1 -1
- package/dist/adapters/hf/paper.d.ts +12 -3
- package/dist/adapters/hf/paper.d.ts.map +1 -1
- package/dist/adapters/hf/paper.js +65 -5
- package/dist/adapters/hf/paper.js.map +1 -1
- package/dist/adapters/medrxiv/preprints.d.ts +9 -0
- package/dist/adapters/medrxiv/preprints.d.ts.map +1 -0
- package/dist/adapters/medrxiv/preprints.js +78 -0
- package/dist/adapters/medrxiv/preprints.js.map +1 -0
- package/dist/adapters/neurips/proceedings.d.ts +8 -7
- package/dist/adapters/neurips/proceedings.d.ts.map +1 -1
- package/dist/adapters/neurips/proceedings.js +209 -21
- package/dist/adapters/neurips/proceedings.js.map +1 -1
- package/dist/adapters/openalex/works.d.ts +21 -5
- package/dist/adapters/openalex/works.d.ts.map +1 -1
- package/dist/adapters/openalex/works.js +108 -8
- package/dist/adapters/openalex/works.js.map +1 -1
- package/dist/adapters/openreview/papers.d.ts +10 -4
- package/dist/adapters/openreview/papers.d.ts.map +1 -1
- package/dist/adapters/openreview/papers.js +351 -24
- package/dist/adapters/openreview/papers.js.map +1 -1
- package/dist/adapters/pmlr/proceedings.d.ts +6 -6
- package/dist/adapters/pmlr/proceedings.d.ts.map +1 -1
- package/dist/adapters/pmlr/proceedings.js +92 -12
- package/dist/adapters/pmlr/proceedings.js.map +1 -1
- package/dist/adapters/pubmed/articles.d.ts +8 -4
- package/dist/adapters/pubmed/articles.d.ts.map +1 -1
- package/dist/adapters/pubmed/articles.js +272 -39
- package/dist/adapters/pubmed/articles.js.map +1 -1
- package/dist/adapters/rxiv/preprints.d.ts +75 -0
- package/dist/adapters/rxiv/preprints.d.ts.map +1 -0
- package/dist/adapters/rxiv/preprints.js +651 -0
- package/dist/adapters/rxiv/preprints.js.map +1 -0
- package/dist/adapters/scholar-artifacts/pdf-read.d.ts +49 -0
- package/dist/adapters/scholar-artifacts/pdf-read.d.ts.map +1 -0
- package/dist/adapters/scholar-artifacts/pdf-read.js +204 -0
- package/dist/adapters/scholar-artifacts/pdf-read.js.map +1 -0
- package/dist/adapters/scholar-artifacts/pdf.d.ts +16 -0
- package/dist/adapters/scholar-artifacts/pdf.d.ts.map +1 -0
- package/dist/adapters/scholar-artifacts/pdf.js +122 -0
- package/dist/adapters/scholar-artifacts/pdf.js.map +1 -0
- package/dist/adapters/semantic-scholar/papers.d.ts +6 -6
- package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -1
- package/dist/adapters/semantic-scholar/papers.js +80 -6
- package/dist/adapters/semantic-scholar/papers.js.map +1 -1
- package/dist/adapters/unpaywall/works.d.ts +7 -7
- package/dist/adapters/unpaywall/works.d.ts.map +1 -1
- package/dist/adapters/unpaywall/works.js +104 -12
- package/dist/adapters/unpaywall/works.js.map +1 -1
- package/dist/adapters/wanfang/search.d.ts +14 -0
- package/dist/adapters/wanfang/search.d.ts.map +1 -1
- package/dist/adapters/wanfang/search.js +56 -7
- package/dist/adapters/wanfang/search.js.map +1 -1
- package/dist/browser/page.d.ts +2 -0
- package/dist/browser/page.d.ts.map +1 -1
- package/dist/browser/page.js +12 -0
- package/dist/browser/page.js.map +1 -1
- package/dist/commands/browser/actions.d.ts.map +1 -1
- package/dist/commands/browser/actions.js +59 -3
- package/dist/commands/browser/actions.js.map +1 -1
- package/dist/commands/scholar.d.ts +77 -5
- package/dist/commands/scholar.d.ts.map +1 -1
- package/dist/commands/scholar.js +2945 -83
- package/dist/commands/scholar.js.map +1 -1
- package/dist/core/command-contract.d.ts.map +1 -1
- package/dist/core/command-contract.js +5 -0
- package/dist/core/command-contract.js.map +1 -1
- package/dist/core/schema-v2.d.ts +1 -0
- package/dist/core/schema-v2.d.ts.map +1 -1
- package/dist/core/schema-v2.js +1 -0
- package/dist/core/schema-v2.js.map +1 -1
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +208 -0
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/core-catalog.d.ts +2 -0
- package/dist/discovery/core-catalog.d.ts.map +1 -1
- package/dist/discovery/core-catalog.js +487 -0
- package/dist/discovery/core-catalog.js.map +1 -1
- package/dist/discovery/intents.d.ts.map +1 -1
- package/dist/discovery/intents.js +273 -2
- package/dist/discovery/intents.js.map +1 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +3 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/capability-policy.d.ts.map +1 -1
- package/dist/engine/capability-policy.js +30 -4
- package/dist/engine/capability-policy.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts.map +1 -1
- package/dist/engine/kernel/stages.js +3 -0
- package/dist/engine/kernel/stages.js.map +1 -1
- package/dist/engine/operation-policy.d.ts +4 -1
- package/dist/engine/operation-policy.d.ts.map +1 -1
- package/dist/engine/operation-policy.js +23 -0
- package/dist/engine/operation-policy.js.map +1 -1
- package/dist/fast-path/manifest.d.ts +3 -0
- package/dist/fast-path/manifest.d.ts.map +1 -1
- package/dist/fast-path/manifest.js.map +1 -1
- package/dist/fast-path/policy.d.ts.map +1 -1
- package/dist/fast-path/policy.js +3 -0
- package/dist/fast-path/policy.js.map +1 -1
- package/dist/manifest-compact.txt +1 -1
- package/dist/manifest.json +6804 -1002
- package/dist/registry.d.ts +2 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +1 -0
- package/dist/registry.js.map +1 -1
- package/dist/types/scholarly.d.ts +19 -4
- package/dist/types/scholarly.d.ts.map +1 -1
- package/dist/types/scholarly.js +4 -4
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/acl-anthology/papers.test.ts +111 -0
- package/src/adapters/acl-anthology/papers.ts +379 -71
- package/src/adapters/arxiv/papers.test.ts +46 -0
- package/src/adapters/arxiv/papers.ts +251 -4
- package/src/adapters/baidu-scholar/search.ts +74 -11
- package/src/adapters/biorxiv/preprints.ts +112 -0
- package/src/adapters/cnki/search.ts +357 -0
- package/src/adapters/cvf/papers.ts +260 -27
- package/src/adapters/dblp/publications.test.ts +9 -0
- package/src/adapters/dblp/publications.ts +31 -8
- package/src/adapters/google-scholar/search.ts +165 -17
- package/src/adapters/hf/paper.test.ts +23 -0
- package/src/adapters/hf/paper.ts +89 -5
- package/src/adapters/hf/top.yaml +34 -2
- package/src/adapters/huggingface-papers/daily.yaml +37 -3
- package/src/adapters/huggingface-papers/search.yaml +43 -9
- package/src/adapters/medrxiv/preprints.ts +112 -0
- package/src/adapters/neurips/proceedings.ts +266 -22
- package/src/adapters/openalex/works.test.ts +15 -4
- package/src/adapters/openalex/works.ts +136 -8
- package/src/adapters/openreview/papers.test.ts +31 -0
- package/src/adapters/openreview/papers.ts +407 -29
- package/src/adapters/pmlr/proceedings.ts +102 -12
- package/src/adapters/pubmed/articles.test.ts +88 -1
- package/src/adapters/pubmed/articles.ts +343 -44
- package/src/adapters/rxiv/preprints.test.ts +233 -0
- package/src/adapters/rxiv/preprints.ts +849 -0
- package/src/adapters/scholar-artifacts/pdf-read.ts +277 -0
- package/src/adapters/scholar-artifacts/pdf.ts +133 -0
- package/src/adapters/semantic-scholar/papers.ts +98 -6
- package/src/adapters/unpaywall/works.ts +141 -12
- package/src/adapters/wanfang/search.ts +57 -7
- package/src/adapters/cnki/search.yaml +0 -49
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
fetchSearchRows,
|
|
4
|
+
mapRxivJatsFullTextRow,
|
|
5
|
+
mapRxivPreprint,
|
|
6
|
+
requireRxivCursor,
|
|
7
|
+
requireRxivDate,
|
|
8
|
+
requireRxivDoi,
|
|
9
|
+
requireRxivLimit,
|
|
10
|
+
requireRxivMaxChars,
|
|
11
|
+
requireRxivQuery,
|
|
12
|
+
requireRxivSearchPages,
|
|
13
|
+
rxivArtifactFilename,
|
|
14
|
+
rxivSearchMatchedFields,
|
|
15
|
+
type RxivConfig,
|
|
16
|
+
} from "./preprints.js";
|
|
17
|
+
|
|
18
|
+
const BIORXIV: RxivConfig = {
|
|
19
|
+
site: "biorxiv",
|
|
20
|
+
label: "bioRxiv",
|
|
21
|
+
apiServer: "biorxiv",
|
|
22
|
+
webOrigin: "https://www.biorxiv.org",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
describe("xRxiv preprint adapters", () => {
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
vi.restoreAllMocks();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("validates DOI, query, date, cursor, limit, search pages, and max text bounds", () => {
|
|
31
|
+
expect(requireRxivDoi("doi:10.64898/2026.06.18.733205")).toBe(
|
|
32
|
+
"10.64898/2026.06.18.733205",
|
|
33
|
+
);
|
|
34
|
+
expect(requireRxivDoi("https://doi.org/10.1101/2020.01.01.1")).toBe(
|
|
35
|
+
"10.1101/2020.01.01.1",
|
|
36
|
+
);
|
|
37
|
+
expect(() => requireRxivDoi("not-a-doi", "biorxiv")).toThrow("biorxiv DOI");
|
|
38
|
+
expect(requireRxivDate("2026-06-26", "from")).toBe("2026-06-26");
|
|
39
|
+
expect(() => requireRxivDate("2026/06/26", "from")).toThrow("YYYY-MM-DD");
|
|
40
|
+
expect(requireRxivCursor(undefined)).toBe(0);
|
|
41
|
+
expect(() => requireRxivCursor("-1")).toThrow("non-negative");
|
|
42
|
+
expect(requireRxivLimit(undefined)).toBe(30);
|
|
43
|
+
expect(() => requireRxivLimit("31")).toThrow("rxiv limit");
|
|
44
|
+
expect(requireRxivQuery(" artificial intelligence ")).toBe(
|
|
45
|
+
"artificial intelligence",
|
|
46
|
+
);
|
|
47
|
+
expect(() => requireRxivQuery(" ")).toThrow("query cannot be empty");
|
|
48
|
+
expect(requireRxivSearchPages(undefined)).toBe(10);
|
|
49
|
+
expect(() => requireRxivSearchPages("21")).toThrow("rxiv max-pages");
|
|
50
|
+
expect(requireRxivMaxChars(undefined)).toBe(40000);
|
|
51
|
+
expect(() => requireRxivMaxChars("999")).toThrow("rxiv max-chars");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("maps official API records into scholarly rows", () => {
|
|
55
|
+
const row = mapRxivPreprint(
|
|
56
|
+
{
|
|
57
|
+
title: " A Preprint ",
|
|
58
|
+
authors: "Ada Lovelace; Grace Hopper",
|
|
59
|
+
author_corresponding: "Ada Lovelace",
|
|
60
|
+
author_corresponding_institution: "Example University",
|
|
61
|
+
doi: "10.64898/2026.06.18.733205",
|
|
62
|
+
date: "2026-06-20",
|
|
63
|
+
version: "2",
|
|
64
|
+
type: "new results",
|
|
65
|
+
license: "cc_by",
|
|
66
|
+
category: "systems biology",
|
|
67
|
+
jatsxml:
|
|
68
|
+
"https://www.biorxiv.org/content/early/2026/06/20/example.source.xml",
|
|
69
|
+
abstract: " An abstract ",
|
|
70
|
+
published: "NA",
|
|
71
|
+
server: "bioRxiv",
|
|
72
|
+
},
|
|
73
|
+
BIORXIV,
|
|
74
|
+
3,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
expect(row).toMatchObject({
|
|
78
|
+
rank: 3,
|
|
79
|
+
id: "10.64898/2026.06.18.733205",
|
|
80
|
+
title: "A Preprint",
|
|
81
|
+
authors: ["Ada Lovelace", "Grace Hopper"],
|
|
82
|
+
year: 2026,
|
|
83
|
+
version: "2",
|
|
84
|
+
venue: "bioRxiv",
|
|
85
|
+
doi: "10.64898/2026.06.18.733205",
|
|
86
|
+
pdf_url:
|
|
87
|
+
"https://www.biorxiv.org/content/10.64898/2026.06.18.733205v2.full.pdf",
|
|
88
|
+
source_adapter: "biorxiv",
|
|
89
|
+
source_url:
|
|
90
|
+
"https://www.biorxiv.org/content/10.64898/2026.06.18.733205v2",
|
|
91
|
+
});
|
|
92
|
+
expect(row.retrieved_at).toEqual(
|
|
93
|
+
expect.stringMatching(/^\d{4}-\d{2}-\d{2}T/),
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("extracts JATS XML text before PDF fallback is needed", () => {
|
|
98
|
+
const row = mapRxivJatsFullTextRow(
|
|
99
|
+
`
|
|
100
|
+
<article>
|
|
101
|
+
<front>
|
|
102
|
+
<article-meta>
|
|
103
|
+
<title-group><article-title>JATS Demo</article-title></title-group>
|
|
104
|
+
<abstract><p>Abstract text.</p></abstract>
|
|
105
|
+
</article-meta>
|
|
106
|
+
</front>
|
|
107
|
+
<body>
|
|
108
|
+
<sec>
|
|
109
|
+
<title>Methods</title>
|
|
110
|
+
<p>First paragraph.</p>
|
|
111
|
+
<sec><title>Nested</title><p>Nested paragraph.</p></sec>
|
|
112
|
+
</sec>
|
|
113
|
+
</body>
|
|
114
|
+
</article>
|
|
115
|
+
`,
|
|
116
|
+
{
|
|
117
|
+
id: "10.64898/2026.06.18.733205",
|
|
118
|
+
title: "Fallback title",
|
|
119
|
+
doi: "10.64898/2026.06.18.733205",
|
|
120
|
+
version: "1",
|
|
121
|
+
pdf_url:
|
|
122
|
+
"https://www.biorxiv.org/content/10.64898/2026.06.18.733205v1.full.pdf",
|
|
123
|
+
source_url:
|
|
124
|
+
"https://www.biorxiv.org/content/10.64898/2026.06.18.733205v1",
|
|
125
|
+
},
|
|
126
|
+
BIORXIV,
|
|
127
|
+
1000,
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
expect(row).toMatchObject({
|
|
131
|
+
id: "10.64898/2026.06.18.733205",
|
|
132
|
+
title: "JATS Demo",
|
|
133
|
+
text_source: "jats_xml",
|
|
134
|
+
source_adapter: "biorxiv",
|
|
135
|
+
});
|
|
136
|
+
expect(String(row.text)).toContain("## Abstract");
|
|
137
|
+
expect(String(row.text)).toContain("## Methods");
|
|
138
|
+
expect(String(row.text)).toContain("Nested paragraph.");
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("matches search queries against official metadata fields", () => {
|
|
142
|
+
const fields = rxivSearchMatchedFields(
|
|
143
|
+
{
|
|
144
|
+
title: "Clinical artificial intelligence in imaging",
|
|
145
|
+
authors: "Ada Lovelace; Grace Hopper",
|
|
146
|
+
doi: "10.64898/2026.06.23.26356399",
|
|
147
|
+
category: "radiology and imaging",
|
|
148
|
+
abstract: "<p>Deep learning triage model.</p>",
|
|
149
|
+
},
|
|
150
|
+
"artificial intelligence",
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
expect(fields).toEqual(["title"]);
|
|
154
|
+
expect(
|
|
155
|
+
rxivSearchMatchedFields(
|
|
156
|
+
{
|
|
157
|
+
title: "Triage system",
|
|
158
|
+
authors: "Ada Lovelace; Grace Hopper",
|
|
159
|
+
doi: "10.64898/2026.06.23.26356399",
|
|
160
|
+
category: "radiology and imaging",
|
|
161
|
+
abstract: "<p>Deep learning triage model.</p>",
|
|
162
|
+
},
|
|
163
|
+
"deep triage",
|
|
164
|
+
),
|
|
165
|
+
).toEqual(["abstract"]);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("searches bounded official API windows and annotates scope", async () => {
|
|
169
|
+
const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValue({
|
|
170
|
+
ok: true,
|
|
171
|
+
status: 200,
|
|
172
|
+
json: async () => ({
|
|
173
|
+
messages: [{ status: "ok", cursor: 0, count: 2, total: 2 }],
|
|
174
|
+
collection: [
|
|
175
|
+
{
|
|
176
|
+
title: "Unrelated preprint",
|
|
177
|
+
authors: "Example Author",
|
|
178
|
+
doi: "10.64898/2026.06.01.111111",
|
|
179
|
+
date: "2026-06-01",
|
|
180
|
+
version: "1",
|
|
181
|
+
category: "epidemiology",
|
|
182
|
+
abstract: "No matching text.",
|
|
183
|
+
server: "bioRxiv",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
title: "Clinical artificial intelligence in imaging",
|
|
187
|
+
authors: "Ada Lovelace; Grace Hopper",
|
|
188
|
+
doi: "10.64898/2026.06.02.222222",
|
|
189
|
+
date: "2026-06-02",
|
|
190
|
+
version: "1",
|
|
191
|
+
category: "radiology and imaging",
|
|
192
|
+
abstract: "A source-first preprint.",
|
|
193
|
+
server: "bioRxiv",
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
}),
|
|
197
|
+
} as Response);
|
|
198
|
+
|
|
199
|
+
const rows = await fetchSearchRows(BIORXIV, {
|
|
200
|
+
query: "artificial intelligence",
|
|
201
|
+
from: "2026-06-01",
|
|
202
|
+
to: "2026-06-07",
|
|
203
|
+
limit: 1,
|
|
204
|
+
"max-pages": 1,
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
expect(fetchMock).toHaveBeenCalledWith(
|
|
208
|
+
"https://api.biorxiv.org/details/biorxiv/2026-06-01/2026-06-07/0/json",
|
|
209
|
+
expect.any(Object),
|
|
210
|
+
);
|
|
211
|
+
expect(rows).toHaveLength(1);
|
|
212
|
+
expect(rows[0]).toMatchObject({
|
|
213
|
+
rank: 1,
|
|
214
|
+
id: "10.64898/2026.06.02.222222",
|
|
215
|
+
matched_fields: ["title"],
|
|
216
|
+
search_scope: "official_api_date_window",
|
|
217
|
+
search_window: "2026-06-01:2026-06-07",
|
|
218
|
+
search_scanned_records: 2,
|
|
219
|
+
search_total_records: 2,
|
|
220
|
+
search_exhaustive: true,
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("generates safe PDF artifact filenames", () => {
|
|
225
|
+
expect(
|
|
226
|
+
rxivArtifactFilename({
|
|
227
|
+
doi: "10.64898/2026.06.18.733205",
|
|
228
|
+
version: "1",
|
|
229
|
+
title: "A / Demo: Preprint",
|
|
230
|
+
}),
|
|
231
|
+
).toBe("10.64898_2026.06.18.733205v1-A-Demo-Preprint.pdf");
|
|
232
|
+
});
|
|
233
|
+
});
|