@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.
Files changed (184) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +3 -3
  3. package/README.zh-CN.md +3 -3
  4. package/dist/adapters/acl-anthology/papers.d.ts +16 -9
  5. package/dist/adapters/acl-anthology/papers.d.ts.map +1 -1
  6. package/dist/adapters/acl-anthology/papers.js +322 -58
  7. package/dist/adapters/acl-anthology/papers.js.map +1 -1
  8. package/dist/adapters/arxiv/papers.d.ts +22 -4
  9. package/dist/adapters/arxiv/papers.d.ts.map +1 -1
  10. package/dist/adapters/arxiv/papers.js +202 -4
  11. package/dist/adapters/arxiv/papers.js.map +1 -1
  12. package/dist/adapters/baidu-scholar/search.d.ts +15 -1
  13. package/dist/adapters/baidu-scholar/search.d.ts.map +1 -1
  14. package/dist/adapters/baidu-scholar/search.js +72 -8
  15. package/dist/adapters/baidu-scholar/search.js.map +1 -1
  16. package/dist/adapters/biorxiv/preprints.d.ts +9 -0
  17. package/dist/adapters/biorxiv/preprints.d.ts.map +1 -0
  18. package/dist/adapters/biorxiv/preprints.js +78 -0
  19. package/dist/adapters/biorxiv/preprints.js.map +1 -0
  20. package/dist/adapters/cnki/search.d.ts +82 -0
  21. package/dist/adapters/cnki/search.d.ts.map +1 -0
  22. package/dist/adapters/cnki/search.js +236 -0
  23. package/dist/adapters/cnki/search.js.map +1 -0
  24. package/dist/adapters/cvf/papers.d.ts +12 -7
  25. package/dist/adapters/cvf/papers.d.ts.map +1 -1
  26. package/dist/adapters/cvf/papers.js +210 -27
  27. package/dist/adapters/cvf/papers.js.map +1 -1
  28. package/dist/adapters/dblp/publications.d.ts +12 -5
  29. package/dist/adapters/dblp/publications.d.ts.map +1 -1
  30. package/dist/adapters/dblp/publications.js +31 -8
  31. package/dist/adapters/dblp/publications.js.map +1 -1
  32. package/dist/adapters/google-scholar/search.d.ts +22 -1
  33. package/dist/adapters/google-scholar/search.d.ts.map +1 -1
  34. package/dist/adapters/google-scholar/search.js +129 -14
  35. package/dist/adapters/google-scholar/search.js.map +1 -1
  36. package/dist/adapters/hf/paper.d.ts +12 -3
  37. package/dist/adapters/hf/paper.d.ts.map +1 -1
  38. package/dist/adapters/hf/paper.js +65 -5
  39. package/dist/adapters/hf/paper.js.map +1 -1
  40. package/dist/adapters/medrxiv/preprints.d.ts +9 -0
  41. package/dist/adapters/medrxiv/preprints.d.ts.map +1 -0
  42. package/dist/adapters/medrxiv/preprints.js +78 -0
  43. package/dist/adapters/medrxiv/preprints.js.map +1 -0
  44. package/dist/adapters/neurips/proceedings.d.ts +8 -7
  45. package/dist/adapters/neurips/proceedings.d.ts.map +1 -1
  46. package/dist/adapters/neurips/proceedings.js +209 -21
  47. package/dist/adapters/neurips/proceedings.js.map +1 -1
  48. package/dist/adapters/openalex/works.d.ts +21 -5
  49. package/dist/adapters/openalex/works.d.ts.map +1 -1
  50. package/dist/adapters/openalex/works.js +108 -8
  51. package/dist/adapters/openalex/works.js.map +1 -1
  52. package/dist/adapters/openreview/papers.d.ts +10 -4
  53. package/dist/adapters/openreview/papers.d.ts.map +1 -1
  54. package/dist/adapters/openreview/papers.js +351 -24
  55. package/dist/adapters/openreview/papers.js.map +1 -1
  56. package/dist/adapters/pmlr/proceedings.d.ts +6 -6
  57. package/dist/adapters/pmlr/proceedings.d.ts.map +1 -1
  58. package/dist/adapters/pmlr/proceedings.js +92 -12
  59. package/dist/adapters/pmlr/proceedings.js.map +1 -1
  60. package/dist/adapters/pubmed/articles.d.ts +8 -4
  61. package/dist/adapters/pubmed/articles.d.ts.map +1 -1
  62. package/dist/adapters/pubmed/articles.js +272 -39
  63. package/dist/adapters/pubmed/articles.js.map +1 -1
  64. package/dist/adapters/rxiv/preprints.d.ts +75 -0
  65. package/dist/adapters/rxiv/preprints.d.ts.map +1 -0
  66. package/dist/adapters/rxiv/preprints.js +651 -0
  67. package/dist/adapters/rxiv/preprints.js.map +1 -0
  68. package/dist/adapters/scholar-artifacts/pdf-read.d.ts +49 -0
  69. package/dist/adapters/scholar-artifacts/pdf-read.d.ts.map +1 -0
  70. package/dist/adapters/scholar-artifacts/pdf-read.js +204 -0
  71. package/dist/adapters/scholar-artifacts/pdf-read.js.map +1 -0
  72. package/dist/adapters/scholar-artifacts/pdf.d.ts +16 -0
  73. package/dist/adapters/scholar-artifacts/pdf.d.ts.map +1 -0
  74. package/dist/adapters/scholar-artifacts/pdf.js +122 -0
  75. package/dist/adapters/scholar-artifacts/pdf.js.map +1 -0
  76. package/dist/adapters/semantic-scholar/papers.d.ts +6 -6
  77. package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -1
  78. package/dist/adapters/semantic-scholar/papers.js +80 -6
  79. package/dist/adapters/semantic-scholar/papers.js.map +1 -1
  80. package/dist/adapters/unpaywall/works.d.ts +7 -7
  81. package/dist/adapters/unpaywall/works.d.ts.map +1 -1
  82. package/dist/adapters/unpaywall/works.js +104 -12
  83. package/dist/adapters/unpaywall/works.js.map +1 -1
  84. package/dist/adapters/wanfang/search.d.ts +14 -0
  85. package/dist/adapters/wanfang/search.d.ts.map +1 -1
  86. package/dist/adapters/wanfang/search.js +56 -7
  87. package/dist/adapters/wanfang/search.js.map +1 -1
  88. package/dist/browser/page.d.ts +2 -0
  89. package/dist/browser/page.d.ts.map +1 -1
  90. package/dist/browser/page.js +12 -0
  91. package/dist/browser/page.js.map +1 -1
  92. package/dist/commands/browser/actions.d.ts.map +1 -1
  93. package/dist/commands/browser/actions.js +59 -3
  94. package/dist/commands/browser/actions.js.map +1 -1
  95. package/dist/commands/scholar.d.ts +77 -5
  96. package/dist/commands/scholar.d.ts.map +1 -1
  97. package/dist/commands/scholar.js +2945 -83
  98. package/dist/commands/scholar.js.map +1 -1
  99. package/dist/core/command-contract.d.ts.map +1 -1
  100. package/dist/core/command-contract.js +5 -0
  101. package/dist/core/command-contract.js.map +1 -1
  102. package/dist/core/schema-v2.d.ts +1 -0
  103. package/dist/core/schema-v2.d.ts.map +1 -1
  104. package/dist/core/schema-v2.js +1 -0
  105. package/dist/core/schema-v2.js.map +1 -1
  106. package/dist/discovery/aliases.d.ts.map +1 -1
  107. package/dist/discovery/aliases.js +208 -0
  108. package/dist/discovery/aliases.js.map +1 -1
  109. package/dist/discovery/core-catalog.d.ts +2 -0
  110. package/dist/discovery/core-catalog.d.ts.map +1 -1
  111. package/dist/discovery/core-catalog.js +487 -0
  112. package/dist/discovery/core-catalog.js.map +1 -1
  113. package/dist/discovery/intents.d.ts.map +1 -1
  114. package/dist/discovery/intents.js +273 -2
  115. package/dist/discovery/intents.js.map +1 -1
  116. package/dist/discovery/loader.d.ts.map +1 -1
  117. package/dist/discovery/loader.js +3 -0
  118. package/dist/discovery/loader.js.map +1 -1
  119. package/dist/engine/capability-policy.d.ts.map +1 -1
  120. package/dist/engine/capability-policy.js +30 -4
  121. package/dist/engine/capability-policy.js.map +1 -1
  122. package/dist/engine/kernel/stages.d.ts.map +1 -1
  123. package/dist/engine/kernel/stages.js +3 -0
  124. package/dist/engine/kernel/stages.js.map +1 -1
  125. package/dist/engine/operation-policy.d.ts +4 -1
  126. package/dist/engine/operation-policy.d.ts.map +1 -1
  127. package/dist/engine/operation-policy.js +23 -0
  128. package/dist/engine/operation-policy.js.map +1 -1
  129. package/dist/fast-path/manifest.d.ts +3 -0
  130. package/dist/fast-path/manifest.d.ts.map +1 -1
  131. package/dist/fast-path/manifest.js.map +1 -1
  132. package/dist/fast-path/policy.d.ts.map +1 -1
  133. package/dist/fast-path/policy.js +3 -0
  134. package/dist/fast-path/policy.js.map +1 -1
  135. package/dist/manifest-compact.txt +1 -1
  136. package/dist/manifest.json +6804 -1002
  137. package/dist/registry.d.ts +2 -0
  138. package/dist/registry.d.ts.map +1 -1
  139. package/dist/registry.js +1 -0
  140. package/dist/registry.js.map +1 -1
  141. package/dist/types/scholarly.d.ts +19 -4
  142. package/dist/types/scholarly.d.ts.map +1 -1
  143. package/dist/types/scholarly.js +4 -4
  144. package/dist/types.d.ts +8 -0
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/types.js.map +1 -1
  147. package/package.json +1 -1
  148. package/server.json +2 -2
  149. package/skills/unicli/SKILL.md +1 -1
  150. package/skills/unicli-claude-code/SKILL.md +1 -1
  151. package/skills/unicli-hermes/SKILL.md +1 -1
  152. package/src/adapters/acl-anthology/papers.test.ts +111 -0
  153. package/src/adapters/acl-anthology/papers.ts +379 -71
  154. package/src/adapters/arxiv/papers.test.ts +46 -0
  155. package/src/adapters/arxiv/papers.ts +251 -4
  156. package/src/adapters/baidu-scholar/search.ts +74 -11
  157. package/src/adapters/biorxiv/preprints.ts +112 -0
  158. package/src/adapters/cnki/search.ts +357 -0
  159. package/src/adapters/cvf/papers.ts +260 -27
  160. package/src/adapters/dblp/publications.test.ts +9 -0
  161. package/src/adapters/dblp/publications.ts +31 -8
  162. package/src/adapters/google-scholar/search.ts +165 -17
  163. package/src/adapters/hf/paper.test.ts +23 -0
  164. package/src/adapters/hf/paper.ts +89 -5
  165. package/src/adapters/hf/top.yaml +34 -2
  166. package/src/adapters/huggingface-papers/daily.yaml +37 -3
  167. package/src/adapters/huggingface-papers/search.yaml +43 -9
  168. package/src/adapters/medrxiv/preprints.ts +112 -0
  169. package/src/adapters/neurips/proceedings.ts +266 -22
  170. package/src/adapters/openalex/works.test.ts +15 -4
  171. package/src/adapters/openalex/works.ts +136 -8
  172. package/src/adapters/openreview/papers.test.ts +31 -0
  173. package/src/adapters/openreview/papers.ts +407 -29
  174. package/src/adapters/pmlr/proceedings.ts +102 -12
  175. package/src/adapters/pubmed/articles.test.ts +88 -1
  176. package/src/adapters/pubmed/articles.ts +343 -44
  177. package/src/adapters/rxiv/preprints.test.ts +233 -0
  178. package/src/adapters/rxiv/preprints.ts +849 -0
  179. package/src/adapters/scholar-artifacts/pdf-read.ts +277 -0
  180. package/src/adapters/scholar-artifacts/pdf.ts +133 -0
  181. package/src/adapters/semantic-scholar/papers.ts +98 -6
  182. package/src/adapters/unpaywall/works.ts +141 -12
  183. package/src/adapters/wanfang/search.ts +57 -7
  184. 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
+ });