openclaw-github-trending 1.0.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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +480 -0
  3. package/dist/channels/email.d.ts +61 -0
  4. package/dist/channels/email.d.ts.map +1 -0
  5. package/dist/channels/email.js +599 -0
  6. package/dist/channels/email.js.map +1 -0
  7. package/dist/channels/feishu.d.ts +50 -0
  8. package/dist/channels/feishu.d.ts.map +1 -0
  9. package/dist/channels/feishu.js +322 -0
  10. package/dist/channels/feishu.js.map +1 -0
  11. package/dist/channels/types.d.ts +66 -0
  12. package/dist/channels/types.d.ts.map +1 -0
  13. package/dist/channels/types.js +12 -0
  14. package/dist/channels/types.js.map +1 -0
  15. package/dist/cli.d.ts +2 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/core/config.d.ts +83 -0
  19. package/dist/core/config.d.ts.map +1 -0
  20. package/dist/core/config.js +145 -0
  21. package/dist/core/config.js.map +1 -0
  22. package/dist/core/fetcher.d.ts +43 -0
  23. package/dist/core/fetcher.d.ts.map +1 -0
  24. package/dist/core/fetcher.js +306 -0
  25. package/dist/core/fetcher.js.map +1 -0
  26. package/dist/core/file-storage.d.ts +62 -0
  27. package/dist/core/file-storage.d.ts.map +1 -0
  28. package/dist/core/file-storage.js +253 -0
  29. package/dist/core/file-storage.js.map +1 -0
  30. package/dist/core/history.d.ts +71 -0
  31. package/dist/core/history.d.ts.map +1 -0
  32. package/dist/core/history.js +133 -0
  33. package/dist/core/history.js.map +1 -0
  34. package/dist/core/summarizer.d.ts +64 -0
  35. package/dist/core/summarizer.d.ts.map +1 -0
  36. package/dist/core/summarizer.js +324 -0
  37. package/dist/core/summarizer.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +668 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/models/config.d.ts +93 -0
  43. package/dist/models/config.d.ts.map +1 -0
  44. package/dist/models/config.js +3 -0
  45. package/dist/models/config.js.map +1 -0
  46. package/dist/models/history.d.ts +6 -0
  47. package/dist/models/history.d.ts.map +1 -0
  48. package/dist/models/history.js +7 -0
  49. package/dist/models/history.js.map +1 -0
  50. package/dist/models/repository.d.ts +28 -0
  51. package/dist/models/repository.d.ts.map +1 -0
  52. package/dist/models/repository.js +3 -0
  53. package/dist/models/repository.js.map +1 -0
  54. package/dist/models/service.types.d.ts +87 -0
  55. package/dist/models/service.types.d.ts.map +1 -0
  56. package/dist/models/service.types.js +3 -0
  57. package/dist/models/service.types.js.map +1 -0
  58. package/dist/services/trending.service.d.ts +29 -0
  59. package/dist/services/trending.service.d.ts.map +1 -0
  60. package/dist/services/trending.service.js +306 -0
  61. package/dist/services/trending.service.js.map +1 -0
  62. package/dist/tool.d.ts +47 -0
  63. package/dist/tool.d.ts.map +1 -0
  64. package/dist/tool.js +314 -0
  65. package/dist/tool.js.map +1 -0
  66. package/dist/utils/logger.d.ts +77 -0
  67. package/dist/utils/logger.d.ts.map +1 -0
  68. package/dist/utils/logger.js +214 -0
  69. package/dist/utils/logger.js.map +1 -0
  70. package/dist/utils/markdown.d.ts +9 -0
  71. package/dist/utils/markdown.d.ts.map +1 -0
  72. package/dist/utils/markdown.js +40 -0
  73. package/dist/utils/markdown.js.map +1 -0
  74. package/openclaw.plugin.json +152 -0
  75. package/package.json +78 -0
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrendingService = void 0;
4
+ const history_1 = require("../core/history");
5
+ const fetcher_1 = require("../core/fetcher");
6
+ const summarizer_1 = require("../core/summarizer");
7
+ const feishu_1 = require("../channels/feishu");
8
+ const email_1 = require("../channels/email");
9
+ const config_1 = require("../core/config");
10
+ /**
11
+ * TrendingService - Core business logic service for GitHub trending workflow
12
+ *
13
+ * This service encapsulates the complete business flow:
14
+ * 1. Fetch trending repositories
15
+ * 2. Categorize using history
16
+ * 3. Generate AI summaries
17
+ * 4. Push to channels
18
+ * 5. Update history
19
+ *
20
+ * It is a stateless service - all dependencies are injected via parameters.
21
+ */
22
+ class TrendingService {
23
+ /**
24
+ * Execute the complete GitHub trending workflow
25
+ *
26
+ * @param params - Business parameters (already validated)
27
+ * @param config - Valid plugin configuration
28
+ * @param storage - OpenClaw storage interface
29
+ * @param logger - Logger interface for consistent logging
30
+ * @param openclawConfig - OpenClaw global configuration (optional)
31
+ * @returns Structured execution result
32
+ */
33
+ static async execute(params, config, storage, logger, openclawConfig) {
34
+ try {
35
+ // 1. Initialize history manager
36
+ const historyManager = new history_1.HistoryManager();
37
+ if (storage) {
38
+ const historyData = await storage.get('github-trending-history');
39
+ if (historyData) {
40
+ historyManager.importData(historyData);
41
+ }
42
+ }
43
+ // 2. Resolve AI configuration
44
+ const aiConfig = config_1.ConfigManager.getAIConfig(config, openclawConfig);
45
+ if (!aiConfig.apiKey) {
46
+ logger.error('AI API key not found');
47
+ return {
48
+ success: false,
49
+ pushedCount: 0,
50
+ newCount: 0,
51
+ seenCount: 0,
52
+ totalCount: 0,
53
+ pushResults: [],
54
+ timestamp: new Date().toISOString(),
55
+ error: 'AI API key is required. Please configure it in plugin settings, OpenClaw global config, or environment variables (OPENAI_API_KEY or ANTHROPIC_API_KEY).'
56
+ };
57
+ }
58
+ logger.info(`Using AI provider: ${aiConfig.provider}, model: ${aiConfig.model}`);
59
+ // 3. Fetch trending repositories
60
+ logger.info(`Fetching GitHub trending repositories (${params.since})`);
61
+ const fetcher = new fetcher_1.GitHubFetcher(config);
62
+ const repositories = await fetcher.fetchTrending(params.since);
63
+ // 4. Categorize repositories into new entries and continuous chart-toppers
64
+ const historyConfig = {
65
+ enabled: config?.history?.enabled ?? true,
66
+ star_threshold: config?.history?.star_threshold ?? 100
67
+ };
68
+ const { newEntries, continuousChartToppers, alreadySeen } = historyManager.categorizeRepositories(repositories, historyConfig);
69
+ const shouldPush = [...newEntries, ...continuousChartToppers.map(item => item.repo)];
70
+ logger.info(`Found ${repositories.length} repos, ${shouldPush.length} to push (${newEntries.length} new, ${continuousChartToppers.length} continuous)`);
71
+ // Log detailed repository information
72
+ logger.info('Detailed repository list:');
73
+ repositories.forEach((repo, index) => {
74
+ logger.info(` ${index + 1}. ${repo.full_name}`);
75
+ logger.info(` Stars: ${repo.stars.toLocaleString()} | Description: ${repo.description || 'N/A'}`);
76
+ });
77
+ logger.info('Categorization results:');
78
+ if (newEntries.length > 0) {
79
+ logger.info(` 🆕 New entries (${newEntries.length}) - Will generate AI summary:`);
80
+ newEntries.forEach((repo, idx) => {
81
+ logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars)`);
82
+ });
83
+ }
84
+ if (continuousChartToppers.length > 0) {
85
+ logger.info(` 🔥 Continuous chart-toppers (${continuousChartToppers.length}) - Use cached brief intro:`);
86
+ continuousChartToppers.forEach(({ repo, history }, idx) => {
87
+ const starsDiff = repo.stars - history.last_stars;
88
+ logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars, +${starsDiff} since last, pushed ${history.push_count} times)`);
89
+ });
90
+ }
91
+ if (alreadySeen.length > 0) {
92
+ logger.info(` ⏭️ Already seen (${alreadySeen.length}) - Skipped:`);
93
+ alreadySeen.forEach((repo, idx) => {
94
+ const history = historyManager.getProject(repo.full_name);
95
+ const starsDiff = repo.stars - (history?.last_stars || 0);
96
+ logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars, +${starsDiff} since last)`);
97
+ });
98
+ }
99
+ // 5. Generate AI summaries ONLY for new entries
100
+ const summarizer = new summarizer_1.AISummarizer(aiConfig);
101
+ const maxWorkers = config_1.ConfigManager.getMaxWorkers(config);
102
+ const aiSummaries = new Map();
103
+ logger.info(`Generating AI summaries for ${newEntries.length} new entries with ${maxWorkers} workers...`);
104
+ // Process new entries in batches with concurrency control
105
+ for (let i = 0; i < newEntries.length; i += maxWorkers) {
106
+ const batch = newEntries.slice(i, i + maxWorkers);
107
+ logger.info(`[Batch ${Math.floor(i / maxWorkers) + 1}/${Math.ceil(newEntries.length / maxWorkers)}] Processing ${batch.length} new repositories...`);
108
+ const batchResults = await Promise.allSettled(batch.map(async (repo) => {
109
+ try {
110
+ logger.info(` 📖 [${repo.full_name}] Fetching README...`);
111
+ const readmeContent = await fetcher.fetchReadme(repo.full_name);
112
+ let summary = '';
113
+ if (readmeContent) {
114
+ const readmePreview = readmeContent.substring(0, 100).replace(/\n/g, ' ').trim();
115
+ logger.info(` ✓ README found (${readmeContent.length} chars), preview: "${readmePreview}..."`);
116
+ logger.info(` 🤖 [${repo.full_name}] Generating AI summary from README...`);
117
+ const startTime = Date.now();
118
+ summary = await summarizer.summarizeReadme(repo.full_name, readmeContent);
119
+ const duration = Date.now() - startTime;
120
+ logger.info(` ✓ Summary generated (${summary.length} chars) in ${duration}ms`);
121
+ if (summary) {
122
+ logger.info(` 📝 [${repo.full_name}] Summary: ${summary.substring(0, 100)}...`);
123
+ aiSummaries.set(repo.full_name, summary);
124
+ repo.ai_summary = summary;
125
+ }
126
+ else {
127
+ logger.warn(` ⚠ [${repo.full_name}] Summary is empty`);
128
+ }
129
+ }
130
+ else {
131
+ logger.warn(` ✗ No README found for ${repo.full_name}`);
132
+ logger.info(` 🤖 [${repo.full_name}] Generating AI summary from metadata...`);
133
+ const startTime = Date.now();
134
+ summary = await summarizer.generateSummary(repo);
135
+ const duration = Date.now() - startTime;
136
+ logger.info(` ✓ Summary generated (${summary.length} chars) in ${duration}ms`);
137
+ if (summary) {
138
+ logger.info(` 📝 [${repo.full_name}] Summary: ${summary.substring(0, 100)}...`);
139
+ }
140
+ else {
141
+ logger.warn(` ⚠ [${repo.full_name}] Summary is empty`);
142
+ }
143
+ }
144
+ return { ...repo, ai_summary: summary };
145
+ }
146
+ catch (error) {
147
+ logger.error(` ❌ [${repo.full_name}] Failed to generate summary: ${error}`);
148
+ return { ...repo, ai_summary: '' };
149
+ }
150
+ }));
151
+ // Collect results from this batch
152
+ for (const result of batchResults) {
153
+ if (result.status === 'fulfilled') {
154
+ reposWithSummary.push(result.value);
155
+ }
156
+ }
157
+ }
158
+ // 6. Push to channels
159
+ const seenWithSummary = alreadySeen.map(r => ({
160
+ ...r,
161
+ ai_summary: historyManager.getProject(r.full_name)?.ai_summary || ''
162
+ }));
163
+ const pushResults = [];
164
+ for (const targetChannel of params.channels) {
165
+ try {
166
+ if (targetChannel === 'feishu') {
167
+ const webhookUrl = config?.channels?.feishu?.webhook_url;
168
+ if (!webhookUrl) {
169
+ logger.warn('Feishu webhook URL not configured, skipping');
170
+ pushResults.push({ channel: 'feishu', success: false, error: 'Webhook URL not configured' });
171
+ continue;
172
+ }
173
+ logger.info(`Pushing ${reposWithSummary.length} repos to Feishu...`);
174
+ const result = await feishu_1.FeishuChannel.push(webhookUrl, reposWithSummary, seenWithSummary, params.since);
175
+ if (!result) {
176
+ logger.error('FeishuChannel.push returned undefined!');
177
+ pushResults.push({ channel: 'feishu', success: false, error: 'Push returned undefined' });
178
+ continue;
179
+ }
180
+ pushResults.push({
181
+ channel: 'feishu',
182
+ success: result.success,
183
+ messageId: result.messageId,
184
+ error: result.error || undefined
185
+ });
186
+ if (result.success) {
187
+ logger.info(`✅ Feishu push successful!`);
188
+ }
189
+ else {
190
+ logger.error(`❌ Feishu push failed: ${result.error || 'Unknown error'}`);
191
+ }
192
+ }
193
+ else if (targetChannel === 'email') {
194
+ const emailTo = config?.channels?.email?.recipient || config?.channels?.email?.sender;
195
+ if (!emailTo) {
196
+ logger.warn('Email recipient not configured, skipping');
197
+ pushResults.push({ channel: 'email', success: false, error: 'Recipient not configured' });
198
+ continue;
199
+ }
200
+ if (!config?.channels?.email) {
201
+ logger.warn('Email SMTP configuration missing, skipping');
202
+ pushResults.push({ channel: 'email', success: false, error: 'SMTP configuration missing' });
203
+ continue;
204
+ }
205
+ if (!config.channels.email.password) {
206
+ logger.warn('Email SMTP password missing, skipping');
207
+ pushResults.push({ channel: 'email', success: false, error: 'SMTP password not configured' });
208
+ continue;
209
+ }
210
+ logger.info(`Sending email...`);
211
+ logger.info(` From: ${config.channels.email.sender}`);
212
+ logger.info(` To: ${emailTo}`);
213
+ logger.info(` Subject: GitHub Trending ${params.since === 'daily' ? 'Daily' : params.since === 'weekly' ? 'Weekly' : 'Monthly'}`);
214
+ logger.info(` Repositories: ${reposWithSummary.length} new + ${alreadySeen.length} seen`);
215
+ const result = await email_1.EmailChannel.send({
216
+ from: config.channels.email.sender,
217
+ to: emailTo,
218
+ subject: `GitHub ${params.since === 'daily' ? '今日' : params.since === 'weekly' ? '本周' : '本月'}热榜推送`,
219
+ smtp: {
220
+ host: config.channels.email.smtp_host || 'smtp.qq.com',
221
+ port: config.channels.email.smtp_port || 587,
222
+ secure: false,
223
+ auth: {
224
+ user: config.channels.email.sender,
225
+ pass: config.channels.email.password
226
+ }
227
+ }
228
+ }, reposWithSummary, seenWithSummary, params.since);
229
+ pushResults.push({
230
+ channel: 'email',
231
+ success: result.success,
232
+ messageId: result.messageId,
233
+ error: result.error || undefined
234
+ });
235
+ if (result.success) {
236
+ logger.info(`Email sent successfully! Message ID: ${result.messageId || 'N/A'}`);
237
+ logger.info(`Check inbox: ${emailTo}`);
238
+ if (emailTo === config.channels.email.sender) {
239
+ logger.warn(`Email was sent to sender (self). To send to others, set EMAIL_TO in .env`);
240
+ }
241
+ }
242
+ else {
243
+ logger.error(`Failed to send email: ${result.error || 'Unknown error'}`);
244
+ }
245
+ }
246
+ }
247
+ catch (error) {
248
+ logger.error(`Failed to push to ${targetChannel}: ${error}`);
249
+ pushResults.push({
250
+ channel: targetChannel,
251
+ success: false,
252
+ error: error instanceof Error ? error.message : 'Unknown error'
253
+ });
254
+ }
255
+ }
256
+ // 7. Update history
257
+ historyManager.markPushed(reposWithSummary);
258
+ if (storage) {
259
+ await storage.set('github-trending-history', historyManager.exportData());
260
+ }
261
+ // 8. Return result
262
+ const successCount = pushResults.filter(r => r.success).length;
263
+ const failedChannels = pushResults.filter(r => !r.success).map(r => r.channel);
264
+ logger.info('Execution completed', {
265
+ successCount,
266
+ failedCount: failedChannels.length,
267
+ totalChannels: params.channels.length,
268
+ pushedCount: reposWithSummary.length,
269
+ newCount: newlySeen.length,
270
+ seenCount: alreadySeen.length
271
+ });
272
+ return {
273
+ success: successCount > 0,
274
+ pushedCount: reposWithSummary.length,
275
+ newCount: newlySeen.length,
276
+ seenCount: alreadySeen.length,
277
+ totalCount: repositories.length,
278
+ pushResults,
279
+ timestamp: new Date().toISOString(),
280
+ message: successCount === params.channels.length
281
+ ? `成功推送到所有 ${successCount} 个通道`
282
+ : successCount > 0
283
+ ? `部分成功:${successCount}/${params.channels.length} 个通道推送成功,失败通道:${failedChannels.join(', ')}`
284
+ : `所有通道推送失败:${failedChannels.join(', ')}`
285
+ };
286
+ }
287
+ catch (error) {
288
+ logger.error('Execution failed', {
289
+ error: error instanceof Error ? error.message : 'Unknown error',
290
+ stack: error instanceof Error ? error.stack : undefined
291
+ });
292
+ return {
293
+ success: false,
294
+ pushedCount: 0,
295
+ newCount: 0,
296
+ seenCount: 0,
297
+ totalCount: 0,
298
+ pushResults: [],
299
+ timestamp: new Date().toISOString(),
300
+ error: error instanceof Error ? error.message : 'Unknown error'
301
+ };
302
+ }
303
+ }
304
+ }
305
+ exports.TrendingService = TrendingService;
306
+ //# sourceMappingURL=trending.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trending.service.js","sourceRoot":"","sources":["../../src/services/trending.service.ts"],"names":[],"mappings":"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"}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { HistoryManager } from './core/history';
2
+ import { OpenClawGlobalConfig } from './core/config';
3
+ import { GitHubTrendingParams, GitHubTrendingResult, PluginConfig } from './models/config';
4
+ /**
5
+ * GitHub Trending Tool
6
+ * Fetches trending repositories and pushes to Feishu or Email with AI summaries
7
+ */
8
+ export interface GitHubTrendingTool {
9
+ name: string;
10
+ description: string;
11
+ parameters: {
12
+ type: string;
13
+ properties: {
14
+ since: {
15
+ type: string;
16
+ enum: ['daily', 'weekly', 'monthly'];
17
+ description: 'Time period for trending';
18
+ };
19
+ channels?: {
20
+ type: 'array';
21
+ items: {
22
+ type: string;
23
+ enum: ['feishu', 'email'];
24
+ };
25
+ description: 'Push channels (array: ["email"], ["feishu"], or ["email", "feishu"])';
26
+ };
27
+ email_to?: {
28
+ type: string;
29
+ format: 'email';
30
+ description: 'Email recipient (required for email channel)';
31
+ };
32
+ feishu_webhook?: {
33
+ type: string;
34
+ description: 'Feishu webhook URL (required for feishu channel)';
35
+ };
36
+ };
37
+ required: string[];
38
+ };
39
+ handler: (params: GitHubTrendingParams, pluginConfig: PluginConfig, openclawConfig: OpenClawGlobalConfig, historyData?: any) => Promise<GitHubTrendingResult>;
40
+ }
41
+ export { HistoryManager };
42
+ /**
43
+ * Export the GitHub Trending Tool
44
+ */
45
+ export declare const githubTrendingTool: GitHubTrendingTool;
46
+ export default githubTrendingTool;
47
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAiB,oBAAoB,EAAc,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,YAAY,EAAuC,MAAM,iBAAiB,CAAC;AAIhI;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACrC,WAAW,EAAE,0BAA0B,CAAC;aACzC,CAAC;YACF,QAAQ,CAAC,EAAE;gBACT,IAAI,EAAE,OAAO,CAAC;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,MAAM,CAAC;oBACb,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;iBAC3B,CAAC;gBACF,WAAW,EAAE,sEAAsE,CAAC;aACrF,CAAC;YACF,QAAQ,CAAC,EAAE;gBACT,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,OAAO,CAAC;gBAChB,WAAW,EAAE,8CAA8C,CAAC;aAC7D,CAAC;YACF,cAAc,CAAC,EAAE;gBACf,IAAI,EAAE,MAAM,CAAC;gBACb,WAAW,EAAE,kDAAkD,CAAC;aACjE,CAAC;SACH,CAAC;QACF,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,CACP,MAAM,EAAE,oBAAoB,EAC5B,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,oBAAoB,EACpC,WAAW,CAAC,EAAE,GAAG,KACd,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACpC;AA6TD,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBAgChC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}