youknow 0.3.0
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/LICENSE +21 -0
- package/README.md +361 -0
- package/dist/banner.d.ts +1 -0
- package/dist/banner.js +14 -0
- package/dist/banner.js.map +1 -0
- package/dist/channels/claude/action.d.ts +12 -0
- package/dist/channels/claude/action.js +71 -0
- package/dist/channels/claude/action.js.map +1 -0
- package/dist/channels/claude/fetch.d.ts +44 -0
- package/dist/channels/claude/fetch.js +182 -0
- package/dist/channels/claude/fetch.js.map +1 -0
- package/dist/channels/github/action.d.ts +18 -0
- package/dist/channels/github/action.js +79 -0
- package/dist/channels/github/action.js.map +1 -0
- package/dist/channels/github/fetch.d.ts +42 -0
- package/dist/channels/github/fetch.js +109 -0
- package/dist/channels/github/fetch.js.map +1 -0
- package/dist/channels/openai/action.d.ts +12 -0
- package/dist/channels/openai/action.js +59 -0
- package/dist/channels/openai/action.js.map +1 -0
- package/dist/channels/openai/fetch.d.ts +33 -0
- package/dist/channels/openai/fetch.js +90 -0
- package/dist/channels/openai/fetch.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/sources.d.ts +1 -0
- package/dist/commands/sources.js +40 -0
- package/dist/commands/sources.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.js +45 -0
- package/dist/errors.js.map +1 -0
- package/dist/network.d.ts +7 -0
- package/dist/network.js +65 -0
- package/dist/network.js.map +1 -0
- package/dist/program.d.ts +2 -0
- package/dist/program.js +88 -0
- package/dist/program.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as cheerio from 'cheerio';
|
|
2
|
+
export const OPENAI_NEWS_PAGE_URL = 'https://openai.com/zh-Hans-CN/news/';
|
|
3
|
+
export const OPENAI_NEWS_FEED_URL = 'https://openai.com/news/rss.xml';
|
|
4
|
+
function normalizeText(value) {
|
|
5
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
6
|
+
}
|
|
7
|
+
function normalizeSummary(value) {
|
|
8
|
+
return normalizeText(cheerio.load(value).root().text());
|
|
9
|
+
}
|
|
10
|
+
function articleId(url) {
|
|
11
|
+
return url.pathname.split('/').filter(Boolean).at(-1) ?? url.toString();
|
|
12
|
+
}
|
|
13
|
+
export function parseOpenAINewsFeed(xml) {
|
|
14
|
+
const $ = cheerio.load(xml, { xmlMode: true });
|
|
15
|
+
const collectedAt = new Date().toISOString();
|
|
16
|
+
const items = [];
|
|
17
|
+
$('channel > item').each((_, element) => {
|
|
18
|
+
const item = $(element);
|
|
19
|
+
const title = normalizeText(item.find('title').first().text());
|
|
20
|
+
const rawUrl = normalizeText(item.find('link').first().text());
|
|
21
|
+
const rawPublishedAt = normalizeText(item.find('pubDate').first().text());
|
|
22
|
+
if (!title || !rawUrl || !rawPublishedAt)
|
|
23
|
+
return;
|
|
24
|
+
let url;
|
|
25
|
+
try {
|
|
26
|
+
url = new URL(rawUrl, OPENAI_NEWS_PAGE_URL);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const publishedAt = new Date(rawPublishedAt);
|
|
32
|
+
if (Number.isNaN(publishedAt.getTime()))
|
|
33
|
+
return;
|
|
34
|
+
const rawSummary = item.find('description').first().text();
|
|
35
|
+
const category = normalizeText(item.find('category').first().text());
|
|
36
|
+
items.push({
|
|
37
|
+
source: 'openai',
|
|
38
|
+
type: 'news',
|
|
39
|
+
rank: items.length + 1,
|
|
40
|
+
id: articleId(url),
|
|
41
|
+
title,
|
|
42
|
+
url: url.toString(),
|
|
43
|
+
summary: normalizeSummary(rawSummary),
|
|
44
|
+
category: category || null,
|
|
45
|
+
publishedAt: publishedAt.toISOString(),
|
|
46
|
+
collectedAt,
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
return items;
|
|
50
|
+
}
|
|
51
|
+
export async function fetchOpenAINews(options = {}, context = {}) {
|
|
52
|
+
const request = context.fetch ?? globalThis.fetch;
|
|
53
|
+
const response = await request(OPENAI_NEWS_FEED_URL, {
|
|
54
|
+
headers: {
|
|
55
|
+
accept: 'application/rss+xml,application/xml,text/xml',
|
|
56
|
+
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
57
|
+
'user-agent': 'TrendingKnowledge/0.1 (+https://openai.com/news)',
|
|
58
|
+
},
|
|
59
|
+
signal: AbortSignal.timeout(options.timeout ?? 20_000),
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`OpenAI 请求失败:HTTP ${response.status}`);
|
|
63
|
+
}
|
|
64
|
+
const parsedItems = parseOpenAINewsFeed(await response.text());
|
|
65
|
+
if (parsedItems.length === 0) {
|
|
66
|
+
throw new Error('OpenAI RSS 已返回,但没有解析到新闻条目;Feed 结构可能已变化');
|
|
67
|
+
}
|
|
68
|
+
const requestedCategory = options.category?.trim() || null;
|
|
69
|
+
const items = requestedCategory
|
|
70
|
+
? parsedItems.filter((item) => item.category?.toLocaleLowerCase('en-US') ===
|
|
71
|
+
requestedCategory.toLocaleLowerCase('en-US'))
|
|
72
|
+
: parsedItems;
|
|
73
|
+
if (requestedCategory && items.length === 0) {
|
|
74
|
+
throw new Error(`OpenAI RSS 中没有匹配分类 “${requestedCategory}” 的新闻`);
|
|
75
|
+
}
|
|
76
|
+
items.forEach((item, index) => {
|
|
77
|
+
item.rank = index + 1;
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
source: 'openai',
|
|
81
|
+
type: 'news-feed',
|
|
82
|
+
pageUrl: OPENAI_NEWS_PAGE_URL,
|
|
83
|
+
feedUrl: OPENAI_NEWS_FEED_URL,
|
|
84
|
+
category: requestedCategory,
|
|
85
|
+
collectedAt: parsedItems[0]?.collectedAt ?? new Date().toISOString(),
|
|
86
|
+
total: items.length,
|
|
87
|
+
items,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/channels/openai/fetch.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { formatErrorResponse } from './errors.js';
|
|
6
|
+
import { configureNetwork } from './network.js';
|
|
7
|
+
import { createProgram } from './program.js';
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const packageJson = require('../package.json');
|
|
10
|
+
export function printCliError(error) {
|
|
11
|
+
process.stderr.write(`${formatErrorResponse(error)}\n`);
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
}
|
|
14
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
15
|
+
configureNetwork();
|
|
16
|
+
const program = createProgram(packageJson.version);
|
|
17
|
+
if (argv.length === 0) {
|
|
18
|
+
program.outputHelp();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
await program.parseAsync(argv, { from: 'user' });
|
|
22
|
+
}
|
|
23
|
+
function isCliEntrypoint() {
|
|
24
|
+
if (!process.argv[1])
|
|
25
|
+
return false;
|
|
26
|
+
try {
|
|
27
|
+
return (realpathSync(process.argv[1]) ===
|
|
28
|
+
realpathSync(fileURLToPath(import.meta.url)));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (isCliEntrypoint()) {
|
|
35
|
+
main().catch(printCliError);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtC,gBAAgB,EAAE,CAAC;IACnB,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,CACL,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAC7C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,eAAe,EAAE,EAAE,CAAC;IACtB,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runSourcesCommand(): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
const sourceCatalog = [
|
|
3
|
+
{
|
|
4
|
+
key: 'github',
|
|
5
|
+
name: 'GitHub Trending',
|
|
6
|
+
status: 'active',
|
|
7
|
+
description: 'GitHub 社区每日、每周和每月热门仓库',
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
key: 'openai',
|
|
11
|
+
name: 'OpenAI 官网',
|
|
12
|
+
status: 'active',
|
|
13
|
+
description: '官方新闻、研究、产品与工程更新',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
key: 'claude',
|
|
17
|
+
name: 'Anthropic / Claude 官网',
|
|
18
|
+
status: 'active',
|
|
19
|
+
description: '官方新闻、研究与 Claude Platform 更新',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
key: 'x',
|
|
23
|
+
name: 'X',
|
|
24
|
+
status: 'planned',
|
|
25
|
+
description: '指定账号和话题热度',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
export function runSourcesCommand() {
|
|
29
|
+
const lines = sourceCatalog.map((source) => {
|
|
30
|
+
const active = source.status === 'active';
|
|
31
|
+
const marker = active ? chalk.green('●') : chalk.gray('○');
|
|
32
|
+
const key = active
|
|
33
|
+
? chalk.magenta.bold(source.key.padEnd(8))
|
|
34
|
+
: chalk.gray(source.key.padEnd(8));
|
|
35
|
+
const name = active ? chalk.white(source.name) : chalk.gray(source.name);
|
|
36
|
+
return `${marker} ${key} ${name} ${chalk.dim(source.description)}`;
|
|
37
|
+
});
|
|
38
|
+
process.stdout.write(`${chalk.magenta.bold('数据源')}\n\n${lines.join('\n')}\n`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/commands/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,MAAM,aAAa,GAAwB;IACzC;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,iBAAiB;KAC/B;IACD;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,6BAA6B;KAC3C;IACD;QACE,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,WAAW;KACzB;CACF,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACxD,CAAC;AACJ,CAAC"}
|
package/dist/errors.d.ts
ADDED
package/dist/errors.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function errorProperty(error, property) {
|
|
2
|
+
try {
|
|
3
|
+
return Reflect.get(error, property);
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function serializeError(error) {
|
|
10
|
+
const seen = new WeakSet();
|
|
11
|
+
let current = error;
|
|
12
|
+
while (typeof current === 'object' && current !== null) {
|
|
13
|
+
if (seen.has(current))
|
|
14
|
+
break;
|
|
15
|
+
seen.add(current);
|
|
16
|
+
const cause = errorProperty(current, 'cause');
|
|
17
|
+
if (cause === undefined)
|
|
18
|
+
break;
|
|
19
|
+
current = cause;
|
|
20
|
+
}
|
|
21
|
+
const rootCause = current;
|
|
22
|
+
if (typeof rootCause !== 'object' || rootCause === null) {
|
|
23
|
+
return {
|
|
24
|
+
name: 'Error',
|
|
25
|
+
message: String(rootCause),
|
|
26
|
+
code: 'UNKNOWN_ERROR',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const rawName = errorProperty(rootCause, 'name');
|
|
30
|
+
const rawMessage = errorProperty(rootCause, 'message');
|
|
31
|
+
const rawCode = errorProperty(rootCause, 'code');
|
|
32
|
+
return {
|
|
33
|
+
name: typeof rawName === 'string' && rawName ? rawName : 'Error',
|
|
34
|
+
message: typeof rawMessage === 'string' && rawMessage
|
|
35
|
+
? rawMessage
|
|
36
|
+
: String(rootCause),
|
|
37
|
+
code: typeof rawCode === 'string' || typeof rawCode === 'number'
|
|
38
|
+
? rawCode
|
|
39
|
+
: 'UNKNOWN_ERROR',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function formatErrorResponse(error) {
|
|
43
|
+
return JSON.stringify(serializeError(error), null, 2);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAMA,SAAS,aAAa,CACpB,KAAa,EACb,QAA+C;IAE/C,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,MAAM;QAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAElB,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM;QAC/B,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC;IAC1B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC;YAC1B,IAAI,EAAE,eAAe;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QAChE,OAAO,EACL,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU;YAC1C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QACvB,IAAI,EACF,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;YACxD,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,eAAe;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Dispatcher } from 'undici';
|
|
2
|
+
type NetworkEnvironment = Partial<Pick<NodeJS.ProcessEnv, 'HTTP_PROXY' | 'http_proxy' | 'HTTPS_PROXY' | 'https_proxy' | 'ALL_PROXY' | 'all_proxy' | 'NO_PROXY' | 'no_proxy'>>;
|
|
3
|
+
type DispatcherSetter = (dispatcher: Dispatcher) => void;
|
|
4
|
+
export declare function parseMacOSProxySettings(output: string): NetworkEnvironment;
|
|
5
|
+
export declare function configureNetworkFromEnvironment(environment?: NetworkEnvironment, setDispatcher?: DispatcherSetter): boolean;
|
|
6
|
+
export declare function configureNetwork(): boolean;
|
|
7
|
+
export {};
|
package/dist/network.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { EnvHttpProxyAgent, setGlobalDispatcher, } from 'undici';
|
|
3
|
+
let proxyAgent;
|
|
4
|
+
function firstValue(...values) {
|
|
5
|
+
return values.find((value) => value !== undefined && value.length > 0);
|
|
6
|
+
}
|
|
7
|
+
function httpCompatibleProxy(value) {
|
|
8
|
+
if (!value)
|
|
9
|
+
return undefined;
|
|
10
|
+
try {
|
|
11
|
+
const protocol = new URL(value).protocol;
|
|
12
|
+
return protocol === 'http:' || protocol === 'https:' ? value : undefined;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function macOSProxyUrl(output, kind) {
|
|
19
|
+
const enabled = new RegExp(`^\\s*${kind}Enable\\s*:\\s*1\\s*$`, 'm').test(output);
|
|
20
|
+
if (!enabled)
|
|
21
|
+
return undefined;
|
|
22
|
+
const host = output.match(new RegExp(`^\\s*${kind}Proxy\\s*:\\s*(\\S+)\\s*$`, 'm'))?.[1];
|
|
23
|
+
const port = output.match(new RegExp(`^\\s*${kind}Port\\s*:\\s*(\\d+)\\s*$`, 'm'))?.[1];
|
|
24
|
+
if (!host || !port)
|
|
25
|
+
return undefined;
|
|
26
|
+
const urlHost = host.includes(':') ? `[${host}]` : host;
|
|
27
|
+
return `http://${urlHost}:${port}`;
|
|
28
|
+
}
|
|
29
|
+
export function parseMacOSProxySettings(output) {
|
|
30
|
+
return {
|
|
31
|
+
HTTP_PROXY: macOSProxyUrl(output, 'HTTP'),
|
|
32
|
+
HTTPS_PROXY: macOSProxyUrl(output, 'HTTPS'),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function configureNetworkFromEnvironment(environment = process.env, setDispatcher = setGlobalDispatcher) {
|
|
36
|
+
const allProxy = httpCompatibleProxy(firstValue(environment.all_proxy, environment.ALL_PROXY));
|
|
37
|
+
const httpProxy = firstValue(environment.http_proxy, environment.HTTP_PROXY, allProxy);
|
|
38
|
+
const httpsProxy = firstValue(environment.https_proxy, environment.HTTPS_PROXY, allProxy);
|
|
39
|
+
if (!httpProxy && !httpsProxy)
|
|
40
|
+
return false;
|
|
41
|
+
proxyAgent = new EnvHttpProxyAgent({
|
|
42
|
+
httpProxy,
|
|
43
|
+
httpsProxy,
|
|
44
|
+
noProxy: firstValue(environment.no_proxy, environment.NO_PROXY),
|
|
45
|
+
});
|
|
46
|
+
setDispatcher(proxyAgent);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
export function configureNetwork() {
|
|
50
|
+
if (configureNetworkFromEnvironment())
|
|
51
|
+
return true;
|
|
52
|
+
if (process.platform !== 'darwin')
|
|
53
|
+
return false;
|
|
54
|
+
try {
|
|
55
|
+
const output = execFileSync('/usr/sbin/scutil', ['--proxy'], {
|
|
56
|
+
encoding: 'utf8',
|
|
57
|
+
timeout: 1_000,
|
|
58
|
+
});
|
|
59
|
+
return configureNetworkFromEnvironment(parseMacOSProxySettings(output));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
|
package/dist/program.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { Command, InvalidArgumentError, Option } from 'commander';
|
|
3
|
+
import { renderBanner } from './banner.js';
|
|
4
|
+
import { runClaudeCommand } from './channels/claude/action.js';
|
|
5
|
+
import { githubDefaults, runGitHubCommand } from './channels/github/action.js';
|
|
6
|
+
import { runOpenAICommand } from './channels/openai/action.js';
|
|
7
|
+
import { runSourcesCommand } from './commands/sources.js';
|
|
8
|
+
function positiveInteger(value) {
|
|
9
|
+
const parsed = Number.parseInt(value, 10);
|
|
10
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
11
|
+
throw new InvalidArgumentError('必须是大于 0 的整数');
|
|
12
|
+
}
|
|
13
|
+
return parsed;
|
|
14
|
+
}
|
|
15
|
+
const examples = `
|
|
16
|
+
示例:
|
|
17
|
+
${chalk.magenta('youknow github')}
|
|
18
|
+
${chalk.magenta('youknow github --since daily --language python --limit 5')}
|
|
19
|
+
${chalk.magenta('youknow github --format md --output output/github.md')}
|
|
20
|
+
${chalk.magenta('youknow openai --category product --limit 5')}
|
|
21
|
+
${chalk.magenta('youknow claude --scope research --limit 5')}
|
|
22
|
+
`;
|
|
23
|
+
function localizeHelp(message) {
|
|
24
|
+
return message
|
|
25
|
+
.replace(/^Usage:/gm, chalk.magenta.bold('用法:'))
|
|
26
|
+
.replace(/^Options:/gm, chalk.magenta.bold('选项:'))
|
|
27
|
+
.replace(/^Commands:/gm, chalk.magenta.bold('命令:'));
|
|
28
|
+
}
|
|
29
|
+
export function createProgram(version) {
|
|
30
|
+
const program = new Command()
|
|
31
|
+
.name('youknow')
|
|
32
|
+
.description('从多个渠道发现值得关注的热点信号')
|
|
33
|
+
.version(version, '-v, --version', '显示版本')
|
|
34
|
+
.helpOption('-h, --help', '显示帮助')
|
|
35
|
+
.helpCommand('help [command]', '显示指定命令的帮助')
|
|
36
|
+
.showHelpAfterError('(运行 youknow --help 查看完整用法)')
|
|
37
|
+
.configureOutput({
|
|
38
|
+
writeOut: (message) => process.stdout.write(localizeHelp(message)),
|
|
39
|
+
writeErr: (message) => process.stderr.write(chalk.red(message)),
|
|
40
|
+
});
|
|
41
|
+
program.addHelpText('before', `${renderBanner()}\n`);
|
|
42
|
+
program
|
|
43
|
+
.command('github')
|
|
44
|
+
.description('获取 GitHub Trending 热门仓库')
|
|
45
|
+
.option('-l, --language <language>', '开发语言', githubDefaults.language)
|
|
46
|
+
.addOption(new Option('-s, --since <since>', '时间范围')
|
|
47
|
+
.choices(['daily', 'weekly', 'monthly'])
|
|
48
|
+
.default(githubDefaults.period))
|
|
49
|
+
.option('--spoken-language <code>', '项目自然语言代码,如 zh、en')
|
|
50
|
+
.option('-n, --limit <number>', '返回条数', positiveInteger, 20)
|
|
51
|
+
.addOption(new Option('-f, --format <format>', '输出格式')
|
|
52
|
+
.choices(['json', 'md'])
|
|
53
|
+
.default('json'))
|
|
54
|
+
.option('-o, --output <path>', '同时写入文件')
|
|
55
|
+
.option('--timeout <ms>', '请求超时毫秒数', positiveInteger, 20_000)
|
|
56
|
+
.action(runGitHubCommand);
|
|
57
|
+
program
|
|
58
|
+
.command('openai')
|
|
59
|
+
.description('获取 OpenAI 官方新闻与发布')
|
|
60
|
+
.option('-c, --category <category>', '按 RSS 分类筛选,如 Product、Research')
|
|
61
|
+
.option('-n, --limit <number>', '返回条数', positiveInteger, 20)
|
|
62
|
+
.addOption(new Option('-f, --format <format>', '输出格式')
|
|
63
|
+
.choices(['json', 'md'])
|
|
64
|
+
.default('json'))
|
|
65
|
+
.option('-o, --output <path>', '同时写入文件')
|
|
66
|
+
.option('--timeout <ms>', '请求超时毫秒数', positiveInteger, 20_000)
|
|
67
|
+
.action(runOpenAICommand);
|
|
68
|
+
program
|
|
69
|
+
.command('claude')
|
|
70
|
+
.description('获取 Anthropic 与 Claude 官方动态')
|
|
71
|
+
.addOption(new Option('--scope <scope>', '动态范围')
|
|
72
|
+
.choices(['all', 'news', 'research', 'platform'])
|
|
73
|
+
.default('all'))
|
|
74
|
+
.option('-n, --limit <number>', '返回条数', positiveInteger, 20)
|
|
75
|
+
.addOption(new Option('-f, --format <format>', '输出格式')
|
|
76
|
+
.choices(['json', 'md'])
|
|
77
|
+
.default('json'))
|
|
78
|
+
.option('-o, --output <path>', '同时写入文件')
|
|
79
|
+
.option('--timeout <ms>', '单个请求超时毫秒数', positiveInteger, 20_000)
|
|
80
|
+
.action(runClaudeCommand);
|
|
81
|
+
program
|
|
82
|
+
.command('sources')
|
|
83
|
+
.description('查看当前与规划中的数据源')
|
|
84
|
+
.action(runSourcesCommand);
|
|
85
|
+
program.addHelpText('after', examples);
|
|
86
|
+
return program;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "youknow",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "在终端获取 GitHub、OpenAI 与 Claude 官方动态,支持 JSON 和 Markdown 输出",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"youknow": "dist/cli.js",
|
|
9
|
+
"youKnow": "dist/cli.js",
|
|
10
|
+
"trending-knowledge": "dist/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"clean": "node scripts/clean.mjs",
|
|
18
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
19
|
+
"dev": "tsx src/cli.ts",
|
|
20
|
+
"link": "node scripts/link-src.mjs",
|
|
21
|
+
"unlink": "node scripts/link-src.mjs --unlink",
|
|
22
|
+
"start": "node dist/cli.js",
|
|
23
|
+
"test": "node --import tsx --test tests/*.test.ts",
|
|
24
|
+
"format": "prettier --write .",
|
|
25
|
+
"format:check": "prettier --check .",
|
|
26
|
+
"check": "npm run format:check && tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json && node --check src/youKnow.mjs && node --check scripts/link-src.mjs",
|
|
27
|
+
"prepublishOnly": "npm test && npm run check",
|
|
28
|
+
"prepare": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/wanglsh97/trending-knowledge.git"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/wanglsh97/trending-knowledge#readme",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/wanglsh97/trending-knowledge/issues"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"github",
|
|
40
|
+
"trending",
|
|
41
|
+
"cli",
|
|
42
|
+
"typescript",
|
|
43
|
+
"markdown"
|
|
44
|
+
],
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=20.18.1"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"chalk": "^5.6.2",
|
|
53
|
+
"cheerio": "1.1.2",
|
|
54
|
+
"commander": "^14.0.3",
|
|
55
|
+
"undici": "^7.29.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "24.3.0",
|
|
59
|
+
"prettier": "3.6.2",
|
|
60
|
+
"tsx": "4.20.5",
|
|
61
|
+
"typescript": "5.9.2"
|
|
62
|
+
}
|
|
63
|
+
}
|