- 新增常驻调度器 daily/scheduler.py + run-scheduler.ps1(定时生成/推送) - 新增 daily/bridge_manager.py:Windows 兼容的 Cursor SDK 桥接 - 新增 skills/daily-featured-pick 首推 Skill 与叙事轴/去重逻辑 - 新闻抓取窗口、GitHub 搜索、企微 delta 模式等多项改进 - 补充设计文档与 superpowers 计划/规范 - 新增对应测试(scheduler、featured_pick、github_search、news_fetch_window 等) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
"""五榜唯一列表主人:周去重 + 深池补满。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
from typing import Any, Literal
|
||
|
||
from daily.delta import skill_id
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
def board_select(
|
||
*,
|
||
board: str,
|
||
items: list[dict[str, Any]],
|
||
recent_keys: set[str],
|
||
limit: int,
|
||
pool_size: int,
|
||
kind: Literal["skill", "github"],
|
||
) -> list[dict[str, Any]]:
|
||
"""从深池过滤近 N 日已展示 key,按原顺序取满 limit;不足则短榜。"""
|
||
if kind == "skill":
|
||
from daily.skills_group import group_skills_by_source
|
||
|
||
pool = group_skills_by_source(items, limit=pool_size, pool_size=pool_size)
|
||
else:
|
||
pool = items[: max(pool_size, limit)]
|
||
|
||
out: list[dict[str, Any]] = []
|
||
for item in pool:
|
||
if kind == "skill":
|
||
key = skill_id(item)
|
||
source = str(item.get("source") or "").strip()
|
||
if (key and key in recent_keys) or (source and source in recent_keys):
|
||
continue
|
||
if not key and not source:
|
||
continue
|
||
else:
|
||
key = str(item.get("repo") or "")
|
||
if not key or key in recent_keys:
|
||
continue
|
||
out.append(item)
|
||
if len(out) >= limit:
|
||
break
|
||
if len(out) < limit:
|
||
logger.info("board_short:%s:%s", board, len(out))
|
||
return out
|