mcp-astgl-knowledge 1.0.2 → 1.1.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 (46) hide show
  1. package/README.md +146 -38
  2. package/data/knowledge.db +0 -0
  3. package/dist/alerts.d.ts +22 -0
  4. package/dist/alerts.js +433 -0
  5. package/dist/alerts.js.map +1 -0
  6. package/dist/citation-test.d.ts +14 -0
  7. package/dist/citation-test.js +298 -0
  8. package/dist/citation-test.js.map +1 -0
  9. package/dist/daily-report.d.ts +15 -0
  10. package/dist/daily-report.js +441 -0
  11. package/dist/daily-report.js.map +1 -0
  12. package/dist/discover.js +3 -1
  13. package/dist/discover.js.map +1 -1
  14. package/dist/freshness.d.ts +20 -0
  15. package/dist/freshness.js +508 -0
  16. package/dist/freshness.js.map +1 -0
  17. package/dist/index.d.ts +6 -1
  18. package/dist/index.js +253 -14
  19. package/dist/index.js.map +1 -1
  20. package/dist/ingest-projects.d.ts +16 -0
  21. package/dist/ingest-projects.js +196 -0
  22. package/dist/ingest-projects.js.map +1 -0
  23. package/dist/knowledge-db.d.ts +13 -0
  24. package/dist/knowledge-db.js +156 -0
  25. package/dist/knowledge-db.js.map +1 -0
  26. package/dist/pipeline.d.ts +12 -0
  27. package/dist/pipeline.js +83 -0
  28. package/dist/pipeline.js.map +1 -0
  29. package/dist/query-log.d.ts +15 -0
  30. package/dist/query-log.js +93 -0
  31. package/dist/query-log.js.map +1 -0
  32. package/dist/rate-limit.d.ts +34 -0
  33. package/dist/rate-limit.js +206 -0
  34. package/dist/rate-limit.js.map +1 -0
  35. package/dist/related-articles.d.ts +15 -0
  36. package/dist/related-articles.js +217 -0
  37. package/dist/related-articles.js.map +1 -0
  38. package/dist/search.d.ts +13 -4
  39. package/dist/search.js +274 -39
  40. package/dist/search.js.map +1 -1
  41. package/dist/structure.d.ts +11 -0
  42. package/dist/structure.js +451 -0
  43. package/dist/structure.js.map +1 -0
  44. package/dist/types.d.ts +65 -0
  45. package/dist/types.js.map +1 -1
  46. package/package.json +10 -2
@@ -0,0 +1,441 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Daily AEO report generator.
4
+ *
5
+ * WHAT: Aggregates query logs, content stats, and health metrics into a daily report
6
+ * WHY: Tracks AEO effectiveness — query volume, top topics, gaps, stale content
7
+ *
8
+ * Usage:
9
+ * npm run daily-report Print report to stdout (JSON)
10
+ * npm run daily-report -- --discord Send report to Discord webhook
11
+ * npm run daily-report -- --days 7 Look back 7 days instead of 1
12
+ *
13
+ * Env: DISCORD_WEBHOOK_URL — Discord webhook for automated delivery
14
+ */
15
+ import { join } from "path";
16
+ import { existsSync } from "fs";
17
+ import Database from "better-sqlite3";
18
+ const DATA_DIR = join(import.meta.dirname, "..", "data");
19
+ const QUERY_LOG_PATH = join(DATA_DIR, "query-log.db");
20
+ const KNOWLEDGE_PATH = join(DATA_DIR, "knowledge.db");
21
+ const DISCOVERY_PATH = join(DATA_DIR, "discovery.db");
22
+ const DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL || "";
23
+ // WHAT: Parse CLI args for --discord flag and --days N
24
+ // WHY: Keeps the script flexible for both cron (Discord) and manual (stdout) use
25
+ function parseArgs() {
26
+ const args = process.argv.slice(2);
27
+ return {
28
+ sendToDiscord: args.includes("--discord"),
29
+ days: (() => {
30
+ const idx = args.indexOf("--days");
31
+ return idx >= 0 && args[idx + 1] ? parseInt(args[idx + 1], 10) : 1;
32
+ })(),
33
+ };
34
+ }
35
+ function getQueryStats(days, fromDate) {
36
+ const defaults = {
37
+ total: 0,
38
+ by_tool: {},
39
+ unique_sessions: 0,
40
+ avg_response_ms: 0,
41
+ avg_confidence: 0,
42
+ top_queries: [],
43
+ top_cited: [],
44
+ low_confidence: [],
45
+ };
46
+ if (!existsSync(QUERY_LOG_PATH))
47
+ return defaults;
48
+ let db;
49
+ try {
50
+ db = new Database(QUERY_LOG_PATH, { readonly: true });
51
+ }
52
+ catch {
53
+ return defaults;
54
+ }
55
+ // WHAT: Check if table exists (DB may be empty/corrupt)
56
+ const tableCheck = db
57
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='query_log'")
58
+ .get();
59
+ if (!tableCheck) {
60
+ db.close();
61
+ return defaults;
62
+ }
63
+ const summary = db
64
+ .prepare(`SELECT
65
+ COUNT(*) as total,
66
+ COUNT(DISTINCT client_id) as unique_sessions,
67
+ ROUND(AVG(response_time_ms)) as avg_response_ms,
68
+ ROUND(AVG(confidence_score), 3) as avg_confidence
69
+ FROM query_log
70
+ WHERE timestamp >= ?`)
71
+ .get(fromDate);
72
+ const byTool = db
73
+ .prepare(`SELECT tool_name, COUNT(*) as count
74
+ FROM query_log WHERE timestamp >= ?
75
+ GROUP BY tool_name ORDER BY count DESC`)
76
+ .all(fromDate);
77
+ // WHAT: Extract the actual query text from JSON params
78
+ // WHY: query_params is stored as JSON — need to parse for readability
79
+ const topQueries = db
80
+ .prepare(`SELECT query_params, tool_name, COUNT(*) as count
81
+ FROM query_log WHERE timestamp >= ?
82
+ GROUP BY query_params, tool_name
83
+ ORDER BY count DESC LIMIT 10`)
84
+ .all(fromDate);
85
+ // WHAT: Count how often each URL was cited across all queries
86
+ // WHY: Shows which content is most valuable to AI consumers
87
+ const allCited = db
88
+ .prepare(`SELECT content_cited FROM query_log
89
+ WHERE timestamp >= ? AND content_cited IS NOT NULL`)
90
+ .all(fromDate);
91
+ const citedCounts = new Map();
92
+ for (const row of allCited) {
93
+ try {
94
+ const urls = JSON.parse(row.content_cited);
95
+ for (const url of urls) {
96
+ citedCounts.set(url, (citedCounts.get(url) || 0) + 1);
97
+ }
98
+ }
99
+ catch {
100
+ // Skip malformed JSON
101
+ }
102
+ }
103
+ const topCited = [...citedCounts.entries()]
104
+ .sort((a, b) => b[1] - a[1])
105
+ .slice(0, 10)
106
+ .map(([url, count]) => ({ url, times_cited: count }));
107
+ // WHAT: Queries with low confidence scores (< 0.6)
108
+ // WHY: These represent content gaps — users asking questions we can't answer well
109
+ const lowConf = db
110
+ .prepare(`SELECT query_params, confidence_score, tool_name
111
+ FROM query_log
112
+ WHERE timestamp >= ? AND confidence_score < 0.6 AND confidence_score IS NOT NULL
113
+ ORDER BY confidence_score ASC LIMIT 10`)
114
+ .all(fromDate);
115
+ db.close();
116
+ return {
117
+ total: summary.total,
118
+ by_tool: Object.fromEntries(byTool.map((r) => [r.tool_name, r.count])),
119
+ unique_sessions: summary.unique_sessions,
120
+ avg_response_ms: summary.avg_response_ms || 0,
121
+ avg_confidence: summary.avg_confidence || 0,
122
+ top_queries: topQueries.map((r) => {
123
+ let query = r.query_params;
124
+ try {
125
+ const parsed = JSON.parse(r.query_params);
126
+ query = parsed.query || parsed.question || parsed.topic_a || r.query_params;
127
+ }
128
+ catch {
129
+ // Use raw string
130
+ }
131
+ return { query, tool: r.tool_name, count: r.count };
132
+ }),
133
+ top_cited: topCited,
134
+ low_confidence: lowConf.map((r) => {
135
+ let query = r.query_params;
136
+ try {
137
+ const parsed = JSON.parse(r.query_params);
138
+ query = parsed.query || parsed.question || r.query_params;
139
+ }
140
+ catch {
141
+ // Use raw
142
+ }
143
+ return { query, confidence: r.confidence_score, tool: r.tool_name };
144
+ }),
145
+ };
146
+ }
147
+ function getContentStats(days, fromDate) {
148
+ const defaults = {
149
+ total_articles: 0,
150
+ total_chunks: 0,
151
+ by_type: {},
152
+ recently_indexed: [],
153
+ stale: [],
154
+ freshnessSummary: {},
155
+ };
156
+ if (!existsSync(KNOWLEDGE_PATH))
157
+ return defaults;
158
+ const db = new Database(KNOWLEDGE_PATH, { readonly: true });
159
+ const articleCount = db
160
+ .prepare("SELECT COUNT(*) as count FROM articles")
161
+ .get();
162
+ const chunkCount = db
163
+ .prepare("SELECT COUNT(*) as count FROM chunks")
164
+ .get();
165
+ const byType = db
166
+ .prepare(`SELECT COALESCE(content_type, 'article') as content_type, COUNT(*) as count
167
+ FROM articles GROUP BY content_type`)
168
+ .all();
169
+ const recentlyIndexed = db
170
+ .prepare(`SELECT title, url, processed_at
171
+ FROM articles
172
+ WHERE processed_at >= ?
173
+ ORDER BY processed_at DESC LIMIT 10`)
174
+ .all(fromDate);
175
+ // WHAT: Articles not updated in 90+ days
176
+ // WHY: Stale content may have outdated info that hurts citation quality
177
+ const STALE_DAYS = 90;
178
+ const staleDate = new Date();
179
+ staleDate.setDate(staleDate.getDate() - STALE_DAYS);
180
+ const stale = db
181
+ .prepare(`SELECT title, url, processed_at
182
+ FROM articles
183
+ WHERE processed_at IS NOT NULL AND processed_at < ?
184
+ ORDER BY processed_at ASC LIMIT 10`)
185
+ .all(staleDate.toISOString());
186
+ // WHAT: Count articles by freshness_status
187
+ // WHY: Shows at a glance how many articles need attention
188
+ let freshnessSummary = {};
189
+ try {
190
+ const byStatus = db
191
+ .prepare(`SELECT COALESCE(freshness_status, 'current') as status, COUNT(*) as count
192
+ FROM articles GROUP BY freshness_status`)
193
+ .all();
194
+ freshnessSummary = Object.fromEntries(byStatus.map((r) => [r.status, r.count]));
195
+ }
196
+ catch {
197
+ // freshness_status column may not exist yet
198
+ }
199
+ db.close();
200
+ const now = Date.now();
201
+ return {
202
+ total_articles: articleCount.count,
203
+ total_chunks: chunkCount.count,
204
+ by_type: Object.fromEntries(byType.map((r) => [r.content_type, r.count])),
205
+ recently_indexed: recentlyIndexed.map((r) => ({
206
+ title: r.title,
207
+ url: r.url,
208
+ indexed_at: r.processed_at,
209
+ })),
210
+ stale: stale.map((r) => ({
211
+ title: r.title,
212
+ url: r.url,
213
+ days_since_indexed: Math.floor((now - new Date(r.processed_at).getTime()) / (1000 * 60 * 60 * 24)),
214
+ })),
215
+ freshnessSummary,
216
+ };
217
+ }
218
+ function getDiscoveryStats() {
219
+ if (!existsSync(DISCOVERY_PATH))
220
+ return { pending: 0, total_discovered: 0 };
221
+ const db = new Database(DISCOVERY_PATH, { readonly: true });
222
+ const tableCheck = db
223
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='discovered_content'")
224
+ .get();
225
+ if (!tableCheck) {
226
+ db.close();
227
+ return { pending: 0, total_discovered: 0 };
228
+ }
229
+ const stats = db
230
+ .prepare(`SELECT
231
+ COUNT(*) as total,
232
+ SUM(CASE WHEN is_new = 1 THEN 1 ELSE 0 END) as pending
233
+ FROM discovered_content`)
234
+ .get();
235
+ db.close();
236
+ return { pending: stats.pending, total_discovered: stats.total };
237
+ }
238
+ function buildReport(days) {
239
+ const now = new Date();
240
+ const from = new Date(now);
241
+ from.setDate(from.getDate() - days);
242
+ const fromDate = from.toISOString();
243
+ const queryStats = getQueryStats(days, fromDate);
244
+ const contentStats = getContentStats(days, fromDate);
245
+ const discoveryStats = getDiscoveryStats();
246
+ const issues = [];
247
+ if (!existsSync(QUERY_LOG_PATH))
248
+ issues.push("query-log.db not found — MCP server may not have been used yet");
249
+ if (!existsSync(KNOWLEDGE_PATH))
250
+ issues.push("knowledge.db not found — run 'npm run ingest'");
251
+ if (!existsSync(DISCOVERY_PATH))
252
+ issues.push("discovery.db not found — run 'npm run discover'");
253
+ if (discoveryStats.pending > 0)
254
+ issues.push(`${discoveryStats.pending} discovered items pending structuring`);
255
+ if (queryStats.avg_confidence > 0 && queryStats.avg_confidence < 0.6)
256
+ issues.push("Average confidence below 0.6 — content may need expansion");
257
+ return {
258
+ generated_at: now.toISOString(),
259
+ period: {
260
+ days,
261
+ from: fromDate,
262
+ to: now.toISOString(),
263
+ },
264
+ query_volume: {
265
+ total: queryStats.total,
266
+ by_tool: queryStats.by_tool,
267
+ unique_sessions: queryStats.unique_sessions,
268
+ avg_response_ms: queryStats.avg_response_ms,
269
+ avg_confidence: queryStats.avg_confidence,
270
+ },
271
+ top_queries: queryStats.top_queries,
272
+ top_cited: queryStats.top_cited,
273
+ low_confidence: queryStats.low_confidence,
274
+ content_stats: {
275
+ total_articles: contentStats.total_articles,
276
+ total_chunks: contentStats.total_chunks,
277
+ by_type: contentStats.by_type,
278
+ recently_indexed: contentStats.recently_indexed,
279
+ },
280
+ stale_content: contentStats.stale,
281
+ freshness_summary: contentStats.freshnessSummary,
282
+ discovery_stats: discoveryStats,
283
+ health: {
284
+ query_log_exists: existsSync(QUERY_LOG_PATH),
285
+ knowledge_db_exists: existsSync(KNOWLEDGE_PATH),
286
+ discovery_db_exists: existsSync(DISCOVERY_PATH),
287
+ issues,
288
+ },
289
+ };
290
+ }
291
+ // WHAT: Format report as a Discord embed message
292
+ // WHY: Embeds are structured, scannable, and look professional in Discord channels
293
+ function formatDiscordEmbed(report) {
294
+ const fields = [];
295
+ // Query volume
296
+ const toolBreakdown = Object.entries(report.query_volume.by_tool)
297
+ .map(([tool, count]) => `${tool}: ${count}`)
298
+ .join("\n") || "No queries";
299
+ fields.push({
300
+ name: "Query Volume",
301
+ value: [
302
+ `**Total:** ${report.query_volume.total}`,
303
+ `**Sessions:** ${report.query_volume.unique_sessions}`,
304
+ `**Avg Response:** ${report.query_volume.avg_response_ms}ms`,
305
+ `**Avg Confidence:** ${report.query_volume.avg_confidence}`,
306
+ ].join("\n"),
307
+ inline: true,
308
+ });
309
+ fields.push({
310
+ name: "By Tool",
311
+ value: toolBreakdown,
312
+ inline: true,
313
+ });
314
+ // Content stats
315
+ const typeBreakdown = Object.entries(report.content_stats.by_type)
316
+ .map(([type, count]) => `${type}: ${count}`)
317
+ .join(", ");
318
+ fields.push({
319
+ name: "Knowledge Base",
320
+ value: [
321
+ `**Articles:** ${report.content_stats.total_articles}`,
322
+ `**Chunks:** ${report.content_stats.total_chunks}`,
323
+ `**Types:** ${typeBreakdown}`,
324
+ ].join("\n"),
325
+ inline: true,
326
+ });
327
+ // Top queries
328
+ if (report.top_queries.length > 0) {
329
+ fields.push({
330
+ name: "Top Queries",
331
+ value: report.top_queries
332
+ .slice(0, 5)
333
+ .map((q, i) => `${i + 1}. "${q.query}" (${q.count}x)`)
334
+ .join("\n"),
335
+ });
336
+ }
337
+ // Top cited
338
+ if (report.top_cited.length > 0) {
339
+ fields.push({
340
+ name: "Most Cited",
341
+ value: report.top_cited
342
+ .slice(0, 5)
343
+ .map((c, i) => `${i + 1}. ${c.url} (${c.times_cited}x)`)
344
+ .join("\n"),
345
+ });
346
+ }
347
+ // Low confidence (content gaps)
348
+ if (report.low_confidence.length > 0) {
349
+ fields.push({
350
+ name: "Content Gaps (Low Confidence)",
351
+ value: report.low_confidence
352
+ .slice(0, 5)
353
+ .map((q) => `"${q.query}" → ${q.confidence}`)
354
+ .join("\n"),
355
+ });
356
+ }
357
+ // New content
358
+ if (report.content_stats.recently_indexed.length > 0) {
359
+ fields.push({
360
+ name: "Recently Indexed",
361
+ value: report.content_stats.recently_indexed
362
+ .slice(0, 5)
363
+ .map((a) => `[${a.title}](${a.url})`)
364
+ .join("\n"),
365
+ });
366
+ }
367
+ // Freshness summary
368
+ if (Object.keys(report.freshness_summary).length > 0) {
369
+ const statusLine = Object.entries(report.freshness_summary)
370
+ .map(([status, count]) => `**${status}:** ${count}`)
371
+ .join(" | ");
372
+ fields.push({ name: "Content Freshness", value: statusLine });
373
+ }
374
+ // Stale content
375
+ if (report.stale_content.length > 0) {
376
+ fields.push({
377
+ name: "Stale Content (90+ days)",
378
+ value: report.stale_content
379
+ .slice(0, 5)
380
+ .map((a) => `${a.title} (${a.days_since_indexed}d)`)
381
+ .join("\n"),
382
+ });
383
+ }
384
+ // Health issues
385
+ if (report.health.issues.length > 0) {
386
+ fields.push({
387
+ name: "Issues",
388
+ value: report.health.issues.map((i) => `⚠ ${i}`).join("\n"),
389
+ });
390
+ }
391
+ // Discovery
392
+ fields.push({
393
+ name: "Discovery Pipeline",
394
+ value: `**Total discovered:** ${report.discovery_stats.total_discovered} | **Pending:** ${report.discovery_stats.pending}`,
395
+ });
396
+ const color = report.health.issues.length > 0 ? 0xffa500 : 0x00c853;
397
+ return {
398
+ embeds: [
399
+ {
400
+ title: `ASTGL AEO Daily Report — ${report.period.days}d`,
401
+ color,
402
+ fields,
403
+ footer: { text: `Generated ${report.generated_at}` },
404
+ },
405
+ ],
406
+ };
407
+ }
408
+ async function sendToDiscord(report) {
409
+ if (!DISCORD_WEBHOOK_URL) {
410
+ console.error("DISCORD_WEBHOOK_URL not set. Set it in your environment to enable Discord delivery.");
411
+ console.error("Example: export DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...");
412
+ process.exit(1);
413
+ }
414
+ const payload = formatDiscordEmbed(report);
415
+ const resp = await fetch(DISCORD_WEBHOOK_URL, {
416
+ method: "POST",
417
+ headers: { "Content-Type": "application/json" },
418
+ body: JSON.stringify(payload),
419
+ });
420
+ if (!resp.ok) {
421
+ const body = await resp.text();
422
+ throw new Error(`Discord webhook failed: ${resp.status} ${body}`);
423
+ }
424
+ console.error("Report sent to Discord successfully.");
425
+ }
426
+ async function main() {
427
+ const { sendToDiscord: shouldSend, days } = parseArgs();
428
+ const report = buildReport(days);
429
+ // Always output JSON to stdout (for OpenClaw logging)
430
+ console.log(JSON.stringify(report, null, 2));
431
+ if (shouldSend) {
432
+ await sendToDiscord(report);
433
+ }
434
+ }
435
+ main()
436
+ .then(() => process.exit(0))
437
+ .catch((err) => {
438
+ console.error("Daily report failed:", err);
439
+ process.exit(1);
440
+ });
441
+ //# sourceMappingURL=daily-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-report.js","sourceRoot":"","sources":["../src/daily-report.ts"],"names":[],"mappings":"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"}
package/dist/discover.js CHANGED
@@ -140,7 +140,9 @@ async function main() {
140
140
  closeDb();
141
141
  console.error("Content discovery complete");
142
142
  }
143
- main().catch((err) => {
143
+ main()
144
+ .then(() => process.exit(0))
145
+ .catch((err) => {
144
146
  console.error("Discovery failed:", err);
145
147
  process.exit(1);
146
148
  });
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,MAAM,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGhE,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,0BAA0B,CAAC;AAC1D,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iCAAiC,CAAC;AACpE,MAAM,iBAAiB,GACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gCAAgC,CAAC;AAgBpE,gDAAgD;AAChD,yEAAyE;AACzE,SAAS,WAAW,CAClB,KAAoB,EACpB,WAA0B,EAC1B,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,EAAE,IAAI,WAAW,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;IAC3D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,yDAAyD;AACzD,gEAAgE;AAChE,KAAK,UAAU,QAAQ,CACrB,GAAW,EACX,MAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QACjC,MAAM,WAAW,GACf,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QAErD,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,KAAK;YACL,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YAC3D,OAAO;YACP,MAAM;YACN,WAAW,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC;SACtD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2CAA2C;AAC3C,iEAAiE;AACjE,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,oBAAoB,CAAC;IACtC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,eAAwB;QAChC,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;KAC9C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,6DAA6D;AAC7D,+DAA+D;AAC/D,SAAS,YAAY,CACnB,EAA6B,EAC7B,KAAuB;IAEvB,MAAM,MAAM,GAAiB;QAC3B,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,GAAG,EAAE,CAAC;QACN,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAiB,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,EAAE,CAAC;IACZ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAqB;QAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;KAC3C,CAAC;IAEF,6DAA6D;IAC7D,4DAA4D;IAC5D,MAAM,OAAO,GAGR;QACH;YACE,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;SAClD;QACD;YACE,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;SACxD;QACD;YACE,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC;SAC7C;KACF,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACvC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YACtC,OAAO,CAAC,KAAK,CACX,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,GAAG,SAAS,MAAM,CAAC,OAAO,UAAU,CAC5F,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,IAAI,YAAY,OAAO,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;gBAC7B,OAAO,EAAE,CAAC;gBACV,GAAG,EAAE,CAAC;gBACN,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC;aACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9C,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAC9C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Content freshness automation.
4
+ *
5
+ * WHAT: Detects stale content and ecosystem version changes, sends Discord alerts
6
+ * WHY: Proactive freshness tracking prevents serving outdated info that hurts
7
+ * citation quality and reader trust
8
+ *
9
+ * Checks:
10
+ * 1. Stale content — articles older than 90 days (pub_date or processed_at)
11
+ * 2. MCP SDK version — polls npm registry for @modelcontextprotocol/sdk updates
12
+ * 3. Key tool releases — polls GitHub releases for Ollama, MCP servers, Open WebUI
13
+ *
14
+ * Usage:
15
+ * npm run freshness Check all, print to stdout (JSON)
16
+ * npm run freshness -- --discord Also send triggered alerts to Discord
17
+ *
18
+ * Env: DISCORD_WEBHOOK_URL — Discord webhook for alert delivery
19
+ */
20
+ export {};