@zenalexa/unicli 0.221.0 → 0.221.1

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 (133) hide show
  1. package/AGENTS.md +12 -12
  2. package/README.md +13 -11
  3. package/README.zh-CN.md +13 -11
  4. package/dist/adapters/acl-anthology/papers.d.ts +16 -0
  5. package/dist/adapters/acl-anthology/papers.d.ts.map +1 -0
  6. package/dist/adapters/acl-anthology/papers.js +135 -0
  7. package/dist/adapters/acl-anthology/papers.js.map +1 -0
  8. package/dist/adapters/arxiv/papers.js +2 -0
  9. package/dist/adapters/arxiv/papers.js.map +1 -1
  10. package/dist/adapters/baidu-scholar/search.js +5 -0
  11. package/dist/adapters/baidu-scholar/search.js.map +1 -1
  12. package/dist/adapters/crossref/works.d.ts +42 -0
  13. package/dist/adapters/crossref/works.d.ts.map +1 -0
  14. package/dist/adapters/crossref/works.js +157 -0
  15. package/dist/adapters/crossref/works.js.map +1 -0
  16. package/dist/adapters/cvf/papers.d.ts +17 -0
  17. package/dist/adapters/cvf/papers.d.ts.map +1 -0
  18. package/dist/adapters/cvf/papers.js +124 -0
  19. package/dist/adapters/cvf/papers.js.map +1 -0
  20. package/dist/adapters/dblp/publications.js +4 -0
  21. package/dist/adapters/dblp/publications.js.map +1 -1
  22. package/dist/adapters/google-scholar/cite.js +1 -0
  23. package/dist/adapters/google-scholar/cite.js.map +1 -1
  24. package/dist/adapters/google-scholar/profile.js +5 -0
  25. package/dist/adapters/google-scholar/profile.js.map +1 -1
  26. package/dist/adapters/google-scholar/search.js +5 -0
  27. package/dist/adapters/google-scholar/search.js.map +1 -1
  28. package/dist/adapters/hf/paper.js +1 -0
  29. package/dist/adapters/hf/paper.js.map +1 -1
  30. package/dist/adapters/neurips/proceedings.d.ts +17 -0
  31. package/dist/adapters/neurips/proceedings.d.ts.map +1 -0
  32. package/dist/adapters/neurips/proceedings.js +112 -0
  33. package/dist/adapters/neurips/proceedings.js.map +1 -0
  34. package/dist/adapters/openalex/works.d.ts.map +1 -1
  35. package/dist/adapters/openalex/works.js +32 -0
  36. package/dist/adapters/openalex/works.js.map +1 -1
  37. package/dist/adapters/openreview/papers.js +5 -0
  38. package/dist/adapters/openreview/papers.js.map +1 -1
  39. package/dist/adapters/pmlr/proceedings.d.ts +35 -0
  40. package/dist/adapters/pmlr/proceedings.d.ts.map +1 -0
  41. package/dist/adapters/pmlr/proceedings.js +139 -0
  42. package/dist/adapters/pmlr/proceedings.js.map +1 -0
  43. package/dist/adapters/pubmed/articles.js +5 -0
  44. package/dist/adapters/pubmed/articles.js.map +1 -1
  45. package/dist/adapters/semantic-scholar/papers.d.ts +36 -0
  46. package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -0
  47. package/dist/adapters/semantic-scholar/papers.js +214 -0
  48. package/dist/adapters/semantic-scholar/papers.js.map +1 -0
  49. package/dist/adapters/unpaywall/works.d.ts +33 -0
  50. package/dist/adapters/unpaywall/works.d.ts.map +1 -0
  51. package/dist/adapters/unpaywall/works.js +101 -0
  52. package/dist/adapters/unpaywall/works.js.map +1 -0
  53. package/dist/cli.d.ts.map +1 -1
  54. package/dist/cli.js +15 -1
  55. package/dist/cli.js.map +1 -1
  56. package/dist/commands/do.d.ts +30 -0
  57. package/dist/commands/do.d.ts.map +1 -0
  58. package/dist/commands/do.js +248 -0
  59. package/dist/commands/do.js.map +1 -0
  60. package/dist/commands/extract.d.ts +34 -0
  61. package/dist/commands/extract.d.ts.map +1 -0
  62. package/dist/commands/extract.js +316 -0
  63. package/dist/commands/extract.js.map +1 -0
  64. package/dist/commands/scholar.d.ts +33 -0
  65. package/dist/commands/scholar.d.ts.map +1 -0
  66. package/dist/commands/scholar.js +494 -0
  67. package/dist/commands/scholar.js.map +1 -0
  68. package/dist/commands/search.d.ts.map +1 -1
  69. package/dist/commands/search.js +2 -5
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/discovery/aliases.d.ts +2 -2
  72. package/dist/discovery/aliases.d.ts.map +1 -1
  73. package/dist/discovery/aliases.js +182 -11
  74. package/dist/discovery/aliases.js.map +1 -1
  75. package/dist/discovery/intents.d.ts +10 -0
  76. package/dist/discovery/intents.d.ts.map +1 -0
  77. package/dist/discovery/intents.js +255 -0
  78. package/dist/discovery/intents.js.map +1 -0
  79. package/dist/discovery/search.d.ts +4 -1
  80. package/dist/discovery/search.d.ts.map +1 -1
  81. package/dist/discovery/search.js +28 -140
  82. package/dist/discovery/search.js.map +1 -1
  83. package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
  84. package/dist/fast-path/handlers/discovery.js +17 -3
  85. package/dist/fast-path/handlers/discovery.js.map +1 -1
  86. package/dist/manifest-compact.txt +13 -11
  87. package/dist/manifest-search.json +1 -1
  88. package/dist/manifest.json +462 -68
  89. package/dist/mcp/handler.d.ts.map +1 -1
  90. package/dist/mcp/handler.js +14 -2
  91. package/dist/mcp/handler.js.map +1 -1
  92. package/dist/mcp/tools.d.ts.map +1 -1
  93. package/dist/mcp/tools.js +11 -3
  94. package/dist/mcp/tools.js.map +1 -1
  95. package/dist/registry.d.ts +1 -0
  96. package/dist/registry.d.ts.map +1 -1
  97. package/dist/registry.js +5 -0
  98. package/dist/registry.js.map +1 -1
  99. package/dist/types/scholarly.d.ts +49 -0
  100. package/dist/types/scholarly.d.ts.map +1 -0
  101. package/dist/types/scholarly.js +16 -0
  102. package/dist/types/scholarly.js.map +1 -0
  103. package/package.json +1 -1
  104. package/server.json +2 -2
  105. package/skills/unicli/SKILL.md +1 -1
  106. package/skills/unicli-claude-code/SKILL.md +1 -1
  107. package/skills/unicli-hermes/SKILL.md +1 -1
  108. package/src/adapters/acl-anthology/papers.ts +157 -0
  109. package/src/adapters/arxiv/download.yaml +1 -1
  110. package/src/adapters/arxiv/paper.yaml +1 -1
  111. package/src/adapters/arxiv/papers.ts +2 -0
  112. package/src/adapters/arxiv/search.yaml +1 -1
  113. package/src/adapters/arxiv/trending.yaml +1 -1
  114. package/src/adapters/baidu-scholar/search.ts +5 -0
  115. package/src/adapters/crossref/works.ts +209 -0
  116. package/src/adapters/cvf/papers.ts +136 -0
  117. package/src/adapters/dblp/publications.ts +4 -0
  118. package/src/adapters/google-scholar/cite.ts +1 -0
  119. package/src/adapters/google-scholar/profile.ts +5 -0
  120. package/src/adapters/google-scholar/search.ts +5 -0
  121. package/src/adapters/hf/paper.test.ts +10 -0
  122. package/src/adapters/hf/paper.ts +1 -0
  123. package/src/adapters/hf/top.yaml +1 -1
  124. package/src/adapters/huggingface-papers/daily.yaml +1 -1
  125. package/src/adapters/huggingface-papers/search.yaml +1 -1
  126. package/src/adapters/neurips/proceedings.ts +126 -0
  127. package/src/adapters/openalex/works.ts +33 -0
  128. package/src/adapters/openreview/papers.ts +5 -0
  129. package/src/adapters/pmlr/proceedings.ts +167 -0
  130. package/src/adapters/pubmed/articles.ts +5 -0
  131. package/src/adapters/semantic-scholar/papers.ts +268 -0
  132. package/src/adapters/unpaywall/works.ts +138 -0
  133. package/src/adapters/zotero/search.yaml +1 -1
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @owner src::commands::scholar
3
+ * @does Top-level `unicli scholar` meta-command for academic source discovery: searches, retrieves, PDF availability, citation/reference traversal, and doctor output across adapters tagged with `scholar.*` capabilities.
4
+ * @needs src/registry.ts, src/types/scholarly.ts, src/engine/kernel/execute.ts, src/output/formatter.ts
5
+ * @feeds src/cli.ts, MCP/agent command discovery via list/search/do
6
+ * @breaks Missing capability tags make scholarly sources invisible to the meta-command; weak reference routing can send DOI/arXiv/PMID lookups to the wrong first source.
7
+ * @invariants --sources default is a conservative first-source set; --sources all is registry capability discovery; DOI is the primary dedupe key; no non-scholarly adapter is invoked as fallback.
8
+ * @side-effects Executes adapter commands through the engine kernel; writes stdout/stderr only.
9
+ * @perf Fan-out is sequential today, O(S * R), where S is source count and R is rows per source.
10
+ * @concurrency safe — Commander handlers run one at a time per process
11
+ * @test tests/unit/commands/scholar.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-19
14
+ */
15
+ import type { Command } from "commander";
16
+ import type { AdapterCommand, AdapterManifest } from "../types.js";
17
+ import type { ScholarlyReferenceRoute, ScholarlyWorkRecord } from "../types/scholarly.js";
18
+ export declare const DEFAULT_SCHOLAR_SOURCES: readonly ["semantic-scholar", "openalex", "crossref", "arxiv", "dblp", "pubmed"];
19
+ export declare const SCHOLAR_CAPABILITIES: readonly ["scholar.search", "scholar.get", "scholar.pdf", "scholar.citations", "scholar.references", "scholar.venue", "scholar.author", "scholar.datasets", "scholar.code", "scholar.review"];
20
+ export type ScholarCapability = (typeof SCHOLAR_CAPABILITIES)[number];
21
+ export declare function listScholarAdapters(): AdapterManifest[];
22
+ export declare function resolveScholarSources(sourcesArg: string | undefined, fallback?: readonly string[]): string[];
23
+ export declare function findScholarCommandByCapability(adapter: AdapterManifest, capability: ScholarCapability): {
24
+ name: string;
25
+ command: AdapterCommand;
26
+ } | undefined;
27
+ export declare function resolveScholarReference(ref: string): ScholarlyReferenceRoute;
28
+ export declare function reciprocalRankFusion(rankedLists: ScholarlyWorkRecord[][], options?: {
29
+ k?: number;
30
+ topN?: number;
31
+ }): ScholarlyWorkRecord[];
32
+ export declare function registerScholarCommand(program: Command): void;
33
+ //# sourceMappingURL=scholar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scholar.d.ts","sourceRoot":"","sources":["../../src/commands/scholar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,uBAAuB,kFAO1B,CAAC;AAEX,eAAO,MAAM,oBAAoB,+LAWvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAQtE,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAIvD;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,GAAE,SAAS,MAAM,EAA4B,GACpD,MAAM,EAAE,CAQV;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,iBAAiB,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAAG,SAAS,CAMvD;AAkBD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAuE5E;AASD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,mBAAmB,EAAE,EAAE,EACpC,OAAO,GAAE;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,mBAAmB,EAAE,CA+BvB;AAmUD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+F7D"}
@@ -0,0 +1,494 @@
1
+ /**
2
+ * @owner src::commands::scholar
3
+ * @does Top-level `unicli scholar` meta-command for academic source discovery: searches, retrieves, PDF availability, citation/reference traversal, and doctor output across adapters tagged with `scholar.*` capabilities.
4
+ * @needs src/registry.ts, src/types/scholarly.ts, src/engine/kernel/execute.ts, src/output/formatter.ts
5
+ * @feeds src/cli.ts, MCP/agent command discovery via list/search/do
6
+ * @breaks Missing capability tags make scholarly sources invisible to the meta-command; weak reference routing can send DOI/arXiv/PMID lookups to the wrong first source.
7
+ * @invariants --sources default is a conservative first-source set; --sources all is registry capability discovery; DOI is the primary dedupe key; no non-scholarly adapter is invoked as fallback.
8
+ * @side-effects Executes adapter commands through the engine kernel; writes stdout/stderr only.
9
+ * @perf Fan-out is sequential today, O(S * R), where S is source count and R is rows per source.
10
+ * @concurrency safe — Commander handlers run one at a time per process
11
+ * @test tests/unit/commands/scholar.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-19
14
+ */
15
+ import { commandStrategy, getAllAdapters, resolveCommand, } from "../registry.js";
16
+ import { buildInvocation, execute } from "../engine/kernel/execute.js";
17
+ import { makeCtx } from "../output/envelope.js";
18
+ import { detectFormat, format } from "../output/formatter.js";
19
+ import { ExitCode, Strategy } from "../types.js";
20
+ export const DEFAULT_SCHOLAR_SOURCES = [
21
+ "semantic-scholar",
22
+ "openalex",
23
+ "crossref",
24
+ "arxiv",
25
+ "dblp",
26
+ "pubmed",
27
+ ];
28
+ export const SCHOLAR_CAPABILITIES = [
29
+ "scholar.search",
30
+ "scholar.get",
31
+ "scholar.pdf",
32
+ "scholar.citations",
33
+ "scholar.references",
34
+ "scholar.venue",
35
+ "scholar.author",
36
+ "scholar.datasets",
37
+ "scholar.code",
38
+ "scholar.review",
39
+ ];
40
+ function hasAnyScholarCapability(adapter) {
41
+ return Object.values(adapter.commands).some((command) => (command.capabilities ?? []).some((cap) => cap.startsWith("scholar.")));
42
+ }
43
+ export function listScholarAdapters() {
44
+ return getAllAdapters()
45
+ .filter(hasAnyScholarCapability)
46
+ .sort((a, b) => a.name.localeCompare(b.name));
47
+ }
48
+ export function resolveScholarSources(sourcesArg, fallback = DEFAULT_SCHOLAR_SOURCES) {
49
+ if (!sourcesArg || sourcesArg.trim().length === 0)
50
+ return [...fallback];
51
+ if (sourcesArg.trim() === "all")
52
+ return listScholarAdapters().map((a) => a.name);
53
+ return sourcesArg
54
+ .split(",")
55
+ .map((source) => source.trim())
56
+ .filter(Boolean);
57
+ }
58
+ export function findScholarCommandByCapability(adapter, capability) {
59
+ for (const [name, command] of Object.entries(adapter.commands)) {
60
+ if ((command.capabilities ?? []).includes(capability))
61
+ return { name, command };
62
+ }
63
+ return undefined;
64
+ }
65
+ function bareDoi(value) {
66
+ return value
67
+ .trim()
68
+ .replace(/^doi:/i, "")
69
+ .replace(/^https?:\/\/(?:dx\.)?doi\.org\//i, "");
70
+ }
71
+ function bareArxiv(value) {
72
+ return value
73
+ .trim()
74
+ .replace(/^arxiv:/i, "")
75
+ .replace(/^https?:\/\/arxiv\.org\/(?:abs|pdf)\//i, "")
76
+ .replace(/\.pdf$/i, "")
77
+ .replace(/v\d+$/i, "");
78
+ }
79
+ export function resolveScholarReference(ref) {
80
+ const raw = ref.trim();
81
+ const doi = bareDoi(raw);
82
+ if (/^10\.\S+\/\S+/i.test(doi)) {
83
+ return {
84
+ kind: "doi",
85
+ value: doi,
86
+ preferredSources: ["openalex", "crossref", "semantic-scholar"],
87
+ };
88
+ }
89
+ if (/^(?:arxiv:|https?:\/\/arxiv\.org\/(?:abs|pdf)\/|\d{4}\.\d{4,5})/i.test(raw)) {
90
+ return {
91
+ kind: "arxiv",
92
+ value: bareArxiv(raw),
93
+ preferredSources: ["arxiv", "semantic-scholar", "openalex"],
94
+ };
95
+ }
96
+ const pmid = raw.match(/^pmid:\s*(\d+)$/i);
97
+ if (pmid) {
98
+ return {
99
+ kind: "pmid",
100
+ value: pmid[1],
101
+ preferredSources: ["pubmed", "semantic-scholar", "openalex"],
102
+ };
103
+ }
104
+ const openReview = raw.match(/^openreview:\s*([A-Za-z0-9_-]{6,20})$/i);
105
+ if (openReview) {
106
+ return {
107
+ kind: "openreview",
108
+ value: openReview[1],
109
+ preferredSources: ["openreview", "semantic-scholar", "openalex"],
110
+ };
111
+ }
112
+ const openAlex = raw.match(/^(?:https?:\/\/(?:api\.)?openalex\.org\/)?(?:works\/)?(W\d{4,})$/i);
113
+ if (openAlex) {
114
+ return {
115
+ kind: "openalex",
116
+ value: openAlex[1].toUpperCase(),
117
+ preferredSources: ["openalex", "semantic-scholar", "crossref"],
118
+ };
119
+ }
120
+ if (/^[a-f0-9]{40}$/i.test(raw)) {
121
+ return {
122
+ kind: "semantic-scholar",
123
+ value: raw,
124
+ preferredSources: ["semantic-scholar", "openalex", "crossref"],
125
+ };
126
+ }
127
+ if (/^[a-z]+(?:\/[A-Za-z0-9_.-]+)+$/.test(raw)) {
128
+ return {
129
+ kind: "dblp",
130
+ value: raw,
131
+ preferredSources: ["dblp", "semantic-scholar", "openalex"],
132
+ };
133
+ }
134
+ return {
135
+ kind: "unknown",
136
+ value: raw,
137
+ preferredSources: [...DEFAULT_SCHOLAR_SOURCES],
138
+ };
139
+ }
140
+ function dedupeKey(record) {
141
+ if (record.doi)
142
+ return `doi:${record.doi.toLowerCase()}`;
143
+ if (record.arxiv_id)
144
+ return `arxiv:${record.arxiv_id.toLowerCase()}`;
145
+ if (record.pmid)
146
+ return `pmid:${record.pmid}`;
147
+ return `${record.source_adapter}:${record.id}`;
148
+ }
149
+ export function reciprocalRankFusion(rankedLists, options = {}) {
150
+ const k = options.k ?? 60;
151
+ const buckets = new Map();
152
+ let order = 0;
153
+ for (const list of rankedLists) {
154
+ for (let rank = 0; rank < list.length; rank += 1) {
155
+ const record = list[rank];
156
+ const key = dedupeKey(record);
157
+ const increment = 1 / (k + rank + 1);
158
+ const existing = buckets.get(key);
159
+ if (existing) {
160
+ existing.score += increment;
161
+ }
162
+ else {
163
+ buckets.set(key, { score: increment, record, firstSeen: order });
164
+ order += 1;
165
+ }
166
+ }
167
+ }
168
+ const fused = [...buckets.values()].sort((a, b) => b.score - a.score || a.firstSeen - b.firstSeen);
169
+ return (options.topN ? fused.slice(0, options.topN) : fused).map((bucket) => bucket.record);
170
+ }
171
+ function numberOpt(raw, fallback, max) {
172
+ if (raw === undefined || raw === "")
173
+ return fallback;
174
+ const n = Number(raw);
175
+ if (!Number.isInteger(n) || n < 1 || n > max) {
176
+ throw new Error(`limit must be an integer in [1, ${max}].`);
177
+ }
178
+ return n;
179
+ }
180
+ function coerceStringArray(value) {
181
+ if (!Array.isArray(value))
182
+ return undefined;
183
+ const out = value.map((item) => String(item ?? "").trim()).filter(Boolean);
184
+ return out.length > 0 ? out : undefined;
185
+ }
186
+ function coerceNumber(value) {
187
+ if (typeof value === "number" && Number.isFinite(value))
188
+ return value;
189
+ if (typeof value === "string" && value.length > 0) {
190
+ const n = Number(value);
191
+ return Number.isFinite(n) ? n : undefined;
192
+ }
193
+ return undefined;
194
+ }
195
+ function coerceToScholarlyRecords(rows, source) {
196
+ if (!Array.isArray(rows))
197
+ return [];
198
+ const out = [];
199
+ for (const row of rows) {
200
+ if (!row || typeof row !== "object")
201
+ continue;
202
+ const record = row;
203
+ if (typeof record.id !== "string" || typeof record.title !== "string") {
204
+ continue;
205
+ }
206
+ const work = {
207
+ id: record.id,
208
+ title: record.title,
209
+ source_adapter: typeof record.source_adapter === "string"
210
+ ? record.source_adapter
211
+ : source,
212
+ retrieved_at: typeof record.retrieved_at === "string" &&
213
+ record.retrieved_at.length > 0
214
+ ? record.retrieved_at
215
+ : new Date().toISOString(),
216
+ };
217
+ const authors = coerceStringArray(record.authors);
218
+ if (authors)
219
+ work.authors = authors;
220
+ const year = coerceNumber(record.year);
221
+ if (year !== undefined)
222
+ work.year = year;
223
+ for (const field of [
224
+ "date",
225
+ "venue",
226
+ "type",
227
+ "abstract",
228
+ "doi",
229
+ "arxiv_id",
230
+ "pmid",
231
+ "openalex_id",
232
+ "semantic_scholar_id",
233
+ "dblp_key",
234
+ "openreview_id",
235
+ "oa_status",
236
+ "pdf_url",
237
+ "landing_url",
238
+ "code_url",
239
+ "dataset_url",
240
+ "source_url",
241
+ ]) {
242
+ if (typeof record[field] === "string" && record[field].length > 0) {
243
+ work[field] = record[field];
244
+ }
245
+ }
246
+ for (const [sourceField, targetField] of [
247
+ ["cited_by_count", "cited_by_count"],
248
+ ["references_count", "references_count"],
249
+ ]) {
250
+ const n = coerceNumber(record[sourceField]);
251
+ if (n !== undefined)
252
+ work[targetField] = n;
253
+ }
254
+ if (typeof record.is_open_access === "boolean") {
255
+ work.is_open_access = record.is_open_access;
256
+ }
257
+ if (record.raw !== undefined)
258
+ work.raw = record.raw;
259
+ out.push(work);
260
+ }
261
+ return out;
262
+ }
263
+ async function runAdapterCommand(source, capability, args) {
264
+ const adapter = getAllAdapters().find((candidate) => candidate.name === source);
265
+ if (!adapter) {
266
+ return {
267
+ source,
268
+ records: [],
269
+ error: {
270
+ code: "adapter_not_found",
271
+ message: `unknown source: ${source}`,
272
+ },
273
+ };
274
+ }
275
+ const found = findScholarCommandByCapability(adapter, capability);
276
+ if (!found) {
277
+ return {
278
+ source,
279
+ records: [],
280
+ error: {
281
+ code: "capability_unsupported",
282
+ message: `${source} does not expose ${capability}`,
283
+ },
284
+ };
285
+ }
286
+ const invocation = buildInvocation("cli", source, found.name, { args, source: "internal" }, { approved: true });
287
+ if (!invocation) {
288
+ return {
289
+ source,
290
+ records: [],
291
+ error: {
292
+ code: "build_invocation_failed",
293
+ message: `could not build invocation for ${source}.${found.name}`,
294
+ },
295
+ };
296
+ }
297
+ const result = await execute(invocation);
298
+ if (result.error) {
299
+ return {
300
+ source,
301
+ records: [],
302
+ error: {
303
+ code: result.error.code ?? "execution_error",
304
+ message: result.error.message ?? "adapter command failed",
305
+ },
306
+ };
307
+ }
308
+ return {
309
+ source,
310
+ records: coerceToScholarlyRecords(result.results, source),
311
+ };
312
+ }
313
+ function columns(detailed = false) {
314
+ return detailed
315
+ ? [
316
+ "id",
317
+ "title",
318
+ "authors",
319
+ "year",
320
+ "venue",
321
+ "type",
322
+ "doi",
323
+ "arxiv_id",
324
+ "pmid",
325
+ "cited_by_count",
326
+ "references_count",
327
+ "is_open_access",
328
+ "oa_status",
329
+ "pdf_url",
330
+ "source_adapter",
331
+ "source_url",
332
+ ]
333
+ : ["id", "title", "year", "venue", "doi", "pdf_url", "source_adapter"];
334
+ }
335
+ async function runSearch(program, query, opts) {
336
+ const startedAt = Date.now();
337
+ const fmt = detectFormat(program.opts().format);
338
+ const ctx = makeCtx("scholar.search", startedAt);
339
+ const limit = numberOpt(opts.limit, 20, 100);
340
+ const sources = resolveScholarSources(opts.sources);
341
+ const outcomes = [];
342
+ for (const source of sources) {
343
+ outcomes.push(await runAdapterCommand(source, "scholar.search", { query, limit }));
344
+ }
345
+ const fused = reciprocalRankFusion(outcomes.map((outcome) => outcome.records), { topN: limit });
346
+ ctx.duration_ms = Date.now() - startedAt;
347
+ ctx.surface = "web";
348
+ if (fused.length === 0) {
349
+ const errors = outcomes.filter((outcome) => outcome.error);
350
+ ctx.error = {
351
+ code: "SCHOLAR_NOT_FOUND",
352
+ message: `no scholarly works returned for "${query}" across [${sources.join(", ")}]`,
353
+ suggestion: errors.length > 0
354
+ ? `Per-source errors: ${errors.map((outcome) => `${outcome.source}: ${outcome.error?.code}`).join("; ")}`
355
+ : "Try --sources all or a more specific query.",
356
+ retryable: errors.some((outcome) => outcome.error?.code === "rate_limit"),
357
+ };
358
+ console.error(format(null, undefined, fmt, ctx));
359
+ process.exit(ExitCode.EMPTY_RESULT);
360
+ }
361
+ console.log(format(fused, columns(opts.detailed), fmt, ctx));
362
+ }
363
+ async function runSingle(program, capability, ref, opts) {
364
+ const startedAt = Date.now();
365
+ const fmt = detectFormat(program.opts().format);
366
+ const ctx = makeCtx(capability, startedAt);
367
+ const route = resolveScholarReference(ref);
368
+ const sourceList = opts.source
369
+ ? [opts.source]
370
+ : resolveScholarSources(opts.sources, route.preferredSources);
371
+ const outcomes = [];
372
+ for (const source of sourceList) {
373
+ outcomes.push(await runAdapterCommand(source, capability, {
374
+ ref: route.value,
375
+ id: route.value,
376
+ doi: route.kind === "doi" ? route.value : undefined,
377
+ arxiv_id: route.kind === "arxiv" ? route.value : undefined,
378
+ pmid: route.kind === "pmid" ? route.value : undefined,
379
+ }));
380
+ }
381
+ const fused = reciprocalRankFusion(outcomes.map((outcome) => outcome.records), { topN: capability === "scholar.pdf" ? 10 : 50 });
382
+ ctx.duration_ms = Date.now() - startedAt;
383
+ ctx.surface = "web";
384
+ if (fused.length === 0) {
385
+ const errors = outcomes.filter((outcome) => outcome.error);
386
+ ctx.error = {
387
+ code: "SCHOLAR_NOT_FOUND",
388
+ message: `no scholarly records returned for "${ref}" across [${sourceList.join(", ")}]`,
389
+ suggestion: errors.length > 0
390
+ ? `Per-source errors: ${errors.map((outcome) => `${outcome.source}: ${outcome.error?.code}`).join("; ")}`
391
+ : "Run `unicli scholar doctor` to inspect available scholarly sources.",
392
+ retryable: errors.some((outcome) => outcome.error?.code === "rate_limit"),
393
+ };
394
+ console.error(format(null, undefined, fmt, ctx));
395
+ process.exit(ExitCode.EMPTY_RESULT);
396
+ }
397
+ console.log(format(fused, columns(opts.detailed), fmt, ctx));
398
+ }
399
+ async function runDoctor(program, opts) {
400
+ const startedAt = Date.now();
401
+ const fmt = detectFormat(program.opts().format);
402
+ const ctx = makeCtx("scholar.doctor", startedAt);
403
+ const selected = resolveScholarSources(opts.sources, listScholarAdapters().map((adapter) => adapter.name));
404
+ const rows = listScholarAdapters()
405
+ .filter((adapter) => selected.includes(adapter.name))
406
+ .map((adapter) => {
407
+ const caps = new Set();
408
+ for (const command of Object.values(adapter.commands)) {
409
+ for (const cap of command.capabilities ?? []) {
410
+ if (cap.startsWith("scholar."))
411
+ caps.add(cap);
412
+ }
413
+ }
414
+ const health = resolveCommand(adapter.name, "health");
415
+ const strategy = health
416
+ ? commandStrategy(adapter, health.command)
417
+ : undefined;
418
+ return {
419
+ source: adapter.name,
420
+ capabilities: [...caps].sort(),
421
+ health: !health
422
+ ? "skipped"
423
+ : strategy !== undefined && strategy !== Strategy.PUBLIC
424
+ ? "blocked"
425
+ : "available",
426
+ detail: !health
427
+ ? "no `health` command — adapter passes by capability introspection"
428
+ : strategy !== undefined && strategy !== Strategy.PUBLIC
429
+ ? `health probe requires ${strategy} auth — skipped`
430
+ : "health probe command is public",
431
+ };
432
+ });
433
+ ctx.duration_ms = Date.now() - startedAt;
434
+ ctx.surface = "web";
435
+ console.log(format(rows, ["source", "capabilities", "health", "detail"], fmt, ctx));
436
+ }
437
+ export function registerScholarCommand(program) {
438
+ const scholar = program
439
+ .command("scholar")
440
+ .description("Scholarly meta-command — search, retrieve, PDF, citations, references, and source audit across first-source academic adapters");
441
+ scholar
442
+ .command("search <query>")
443
+ .description("Fan-out scholarly paper search across first-source adapters")
444
+ .option("--sources <csv>", "comma-separated source list, or `all`")
445
+ .option("--limit <n>", "maximum fused result count", "20")
446
+ .option("-D, --detailed", "include richer metadata columns")
447
+ .action(async (query, opts) => {
448
+ await runSearch(program, query, opts);
449
+ });
450
+ scholar
451
+ .command("get <ref>")
452
+ .description("Retrieve one paper/work by DOI, arXiv id, PMID, OpenAlex id, Semantic Scholar id, dblp key, or OpenReview forum")
453
+ .option("--source <site>", "force one source")
454
+ .option("--sources <csv>", "override auto-routed source list")
455
+ .option("-D, --detailed", "include richer metadata columns")
456
+ .action(async (ref, opts) => {
457
+ await runSingle(program, "scholar.get", ref, opts);
458
+ });
459
+ scholar
460
+ .command("pdf <ref>")
461
+ .description("Find open-access PDF candidates for a DOI, arXiv id, PMID, or source id")
462
+ .option("--source <site>", "force one source")
463
+ .option("--sources <csv>", "override auto-routed source list")
464
+ .option("-D, --detailed", "include richer metadata columns")
465
+ .action(async (ref, opts) => {
466
+ await runSingle(program, "scholar.pdf", ref, opts);
467
+ });
468
+ scholar
469
+ .command("citations <ref>")
470
+ .description("List works citing this paper when the source supports it")
471
+ .option("--source <site>", "force one source")
472
+ .option("--sources <csv>", "override auto-routed source list")
473
+ .option("-D, --detailed", "include richer metadata columns")
474
+ .action(async (ref, opts) => {
475
+ await runSingle(program, "scholar.citations", ref, opts);
476
+ });
477
+ scholar
478
+ .command("references <ref>")
479
+ .description("List works referenced by this paper when the source supports it")
480
+ .option("--source <site>", "force one source")
481
+ .option("--sources <csv>", "override auto-routed source list")
482
+ .option("-D, --detailed", "include richer metadata columns")
483
+ .action(async (ref, opts) => {
484
+ await runSingle(program, "scholar.references", ref, opts);
485
+ });
486
+ scholar
487
+ .command("doctor")
488
+ .description("Inspect registered scholarly adapters and capability tags")
489
+ .option("--sources <csv>", "limit to a comma-separated source list")
490
+ .action(async (opts) => {
491
+ await runDoctor(program, opts);
492
+ });
493
+ }
494
+ //# sourceMappingURL=scholar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scholar.js","sourceRoot":"","sources":["../../src/commands/scholar.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6D5D"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D5D"}
@@ -25,12 +25,9 @@ export function registerSearchCommand(program) {
25
25
  process.exitCode = 2;
26
26
  return;
27
27
  }
28
- const effectiveQuery = opts.category
29
- ? `${opts.category} ${query}`.trim()
30
- : query;
31
- const results = search(effectiveQuery, limit);
28
+ const results = search(query, limit, { category: opts.category });
32
29
  if (results.length === 0) {
33
- console.error(chalk.yellow(`No commands found for: ${effectiveQuery}`));
30
+ console.error(chalk.yellow(`No commands found for: ${[opts.category, query].filter(Boolean).join(" ")}`));
34
31
  process.exitCode = 66; // EX_EMPTY
35
32
  return;
36
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,oEAAoE,CACrE;SACA,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CACL,CAAC,UAAoB,EAAE,IAA0C,EAAE,EAAE;QACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,kEAAkE,CACnE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ;YAClC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE;YACpC,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAE9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,0BAA0B,cAAc,EAAE,CAAC,CACzD,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,WAAW;YAClC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CACtB,OAAO,CAAC,IAAI,EAAE,CAAC,MAAkC,CAClD,CAAC;QAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;YACjC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,EAAE;YAC1D,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAiB;YACxB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa;YACvC,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CACrE,CAAC;IACJ,CAAC,CACF,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,oEAAoE,CACrE;SACA,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CACL,CAAC,UAAoB,EAAE,IAA0C,EAAE,EAAE;QACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,kEAAkE,CACnE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC7E,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,WAAW;YAClC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CACtB,OAAO,CAAC,IAAI,EAAE,CAAC,MAAkC,CAClD,CAAC;QAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;YACjC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,EAAE;YAC1D,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAiB;YACxB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa;YACvC,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CACrE,CAAC;IACJ,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @owner src/discovery/aliases.ts
3
- * @does Define bilingual aliases, action synonyms, domain synonyms, and site categories.
3
+ * @does Define bilingual aliases, action synonyms, domain synonyms, site categories, and scholarly discovery vocabulary.
4
4
  * @needs Supported site ids, discovery search scoring rules
5
- * @feeds src/discovery/search.ts, generated manifest categories
5
+ * @feeds src/discovery/search.ts, src/registry.ts, generated manifest categories
6
6
  * @breaks Missing aliases or categories degrade command discovery relevance.
7
7
  */
8
8
  export declare const SITE_ALIASES: ReadonlyMap<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/discovery/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiLnD,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAuIhE,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA+bhE,CAAC;AAKH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAyNtD,CAAC;AAKH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CA6CvD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AASD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAiCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiErD"}
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/discovery/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiLnD,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAuIhE,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA8gBhE,CAAC;AAKH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAmStD,CAAC;AAKH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiEvD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AASD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAiCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiErD"}