Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4328595
feat(route): add hex2077 namespace
fc525260 May 13, 2026
8ed4e66
feat(route): add hex2077 AI daily route v3 - all fixes
fc525260 May 13, 2026
8468050
fix(route): hex2077 daily route - use map/flatMap
fc525260 May 15, 2026
43ccfd6
fix(route): hex2077 daily route - use map/flatMap instead of push in …
fc525260 May 15, 2026
6c005b7
fix(route): hex2077 daily route - fix push in loop, replaceAll, impor…
fc525260 May 19, 2026
970b35d
fix(route): hex2077 - toArray() instead of get(), toSorted() instead …
fc525260 May 19, 2026
fbfa948
fix(route): hex2077 - toArray() before map(), toSorted(), import order
fc525260 May 19, 2026
73529d6
fix(route): hex2077 - import sort, filter(Boolean), toSorted, toArray…
fc525260 May 19, 2026
3661b8b
fix(route): hex2077 - import order grouping
fc525260 May 19, 2026
371dced
fix(route): hex2077 - correct import order: cheerio -> @/types -> @/u…
fc525260 May 19, 2026
4b695f8
fix(route/hex2077): remove custom section filter per AGENTS.md rule 34
fc525260 May 19, 2026
dc3c4f5
fix(route/hex2077): lint fixes — _ctx/_si, split import, English comm…
fc525260 May 20, 2026
825a068
fix(route/hex2077): remove _ctx parameter — oxlint disallows it
fc525260 May 20, 2026
fe34112
fix(route/hex2077): remove _si from flatMap callback
fc525260 May 20, 2026
959712f
fix(route/hex2077): merge cheerio imports — oxlint import-x/no-duplic…
fc525260 May 20, 2026
eeeb085
fix: merge section <li>s into single RSS item per section (@hermes)
fc525260 Jun 2, 2026
f1183f8
fix: add /daily/:index param for individual section access (@hermes)
fc525260 Jun 2, 2026
7e8d81f
fix: add /daily/:index param for individual section access (@hermes)
fc525260 Jun 2, 2026
ce462a1
fix: add /daily/:index param for individual section access (@hermes)
fc525260 Jun 2, 2026
040fa5f
fix: add /daily/:index param for individual section access (@hermes)
fc525260 Jun 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions lib/routes/hex2077/daily.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { load } from 'cheerio';

Check failure

Code scanning / oxlint

simple-import-sort(imports) Error

Run autofix to sort these imports!
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
import type { CheerioAPI } from 'cheerio';
import type { Route, DataItem } from '@/types';
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';

const BASE = 'https://hex2077.dev';

const SECTION_NAMES = [
'产品与功能更新',
'前沿研究',
'行业展望与社会影响',
'开源TOP项目',
'社媒分享',
];

function extractSection($: CheerioAPI, sectionName: string): string[] {
const ol = $(`h3[id="${sectionName}"]`).nextAll('ol').first();
if (!ol.length) {
return [];
}

return ol
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
.find('> li')
.toArray()
.map((liEl) => $(liEl as any).text().trim().replaceAll(/\s+/g, ' '))
.filter(Boolean);
}

export const route: Route = {
name: 'AI 日报',
categories: ['programming'],
path: '/daily',
example: '/hex2077/daily',
maintainers: ['fc525260'],
handler: async (_ctx) => {

Check failure

Code scanning / oxlint

eslint-js(no-restricted-syntax) Error

Usage of _ctx is not allowed.
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
// Step 1: fetch listing page
const listingHtml = await ofetch<string>(BASE + '/docs/');
const $ = load(listingHtml);

const paths: string[] = $('a[href^="/docs/20"]')
.toArray()
.map((el) => $(el as any).attr('href') || '')
.filter((href) => /^\/docs\/\d{4}-\d{2}\/\d{4}-\d{2}-\d{2}\/$/.test(href))
.toSorted((a, b) => b.localeCompare(a));
const latestPath = paths[0];
if (!latestPath) {
throw new Error('未找到日报文章');
}

const dateLabel = latestPath.match(/\d{4}-\d{2}-\d{2}/)?.[0] || '';
const articleUrl = BASE + latestPath;

// Step 2: fetch article page
const detailHtml = await ofetch<string>(articleUrl);
const $d = load(detailHtml);

// Step 3: build RSS items from all sections
const allItems: DataItem[] = SECTION_NAMES.flatMap((sectionDisplay, _si) => {
const sectionItems = extractSection($d, sectionDisplay);
return sectionItems.map((text, i) => ({
title: `[${sectionDisplay}] ${text}`,
description: text,
link: articleUrl,
guid: `${latestPath}${sectionDisplay}-${i}`,
pubDate: parseDate(dateLabel),
}));
});

return {
title: `hex2077 AI日报 · 全文 (${dateLabel})`,
link: BASE + '/docs/',
description: 'hex2077 每日 AI 资讯日报 - 全 5 个栏目',
language: 'zh-CN',
item: allItems,
};
},
};
9 changes: 9 additions & 0 deletions lib/routes/hex2077/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: 'hex2077 AI 日报',
url: 'hex2077.dev/docs',
lang: 'zh-CN',
description:
'hex2077.dev 每日发布的 AI 资讯日报,涵盖产品功能、前沿研究、行业影响、开源项目等。',
};
Loading