tkzzzzzz6

保研信息自动化跟踪-保包

监控GitHub仓库CS-BAOYAN/CSLabInfo2025的更新,跟踪计算机、生物医学工程、电子信息专业的保研招生和实习信息,通过时间过滤避免重复推送。 【重要原则】:没有新的更新或不满足条件时,绝对不能发送任何消息推送,必须完全静默。

tkzzzzzz6 0 Updated 2mo ago
GitHub

Install

npx skillscat add tkzzzzzz6/baoyan-info-tracker

Install via the SkillsCat registry.

SKILL.md

核心任务

监控目标仓库 CS-BAOYAN/CSLabInfo2025 的实时更新,筛选符合条件的保研情报并推送。

最高原则

【绝对禁止】没有新的更新或不满足时间窗口条件时,必须完全静默,不能发送任何消息!

环境配置

必需工具gitghjq

环境变量

  • REPO_DIR:仓库本地路径(默认:$HOME/CSLabInfo2025
  • TRACKER_DIR:数据存储目录(默认:$HOME/baoyan-tracker/data
  • WATERMARK_FILE:水位线文件(默认:$TRACKER_DIR/watermark
  • LOG_FILE:审计日志文件(默认:$TRACKER_DIR/llog

执行流程

1. 初始化环境

# 创建数据目录
mkdir -p "$TRACKER_DIR"

# 初始化水位线(如果不存在)
if [ ! -f "$WATERMARK_FILE" ]; then
    date -u +"%Y-%m-%dT%H:%M:%SZ" > "$WATERMARK_FILE"
fi

# 克隆或更新仓库
if [ ! -d "$REPO_DIR/.git" ]; then
    git clone https://github.com/CS-BAOYAN/CSLabInfo2025.git "$REPO_DIR"
else
    cd "$REPO_DIR" && git pull origin main
fi

2. 检查最新Commit(早退机制)

cd "$REPO_DIR"

# 获取最新commit时间
LATEST_COMMIT=$(git log -1 --format="%ct" main)
CURRENT_TIME=$(date +%s)
WATERMARK=$(cat "$WATERMARK_FILE" | xargs date -u +"%s" 2>/dev/null || echo 0)

# 检查是否在1小时窗口内
COMMIT_AGE=$((CURRENT_TIME - LATEST_COMMIT))
if [ $COMMIT_AGE -le 3600 ] && [ $LATEST_COMMIT -gt $WATERMARK ]; then
    # 早退:推送commit摘要
    COMMIT_HASH=$(git log -1 --format="%h" main)
    COMMIT_MSG=$(git log -1 --format="%s" main)
    COMMIT_AUTHOR=$(git log -1 --format="%an" main)
    CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD)

    echo "Found new commit on main branch."
    echo "Commit: $COMMIT_HASH"
    echo "Author: $COMMIT_AUTHOR"
    echo "Message: $COMMIT_MSG"
    echo "Changed files:"
    echo "$CHANGED_FILES" | sed 's/^/  /'

    # 更新水位线
    date -u +"%Y-%m-%dT%H:%M:%SZ" > "$WATERMARK_FILE"

    # 记录审计日志
    echo "[$(date +"%Y-%m-%d %H:%M:%S")] Status: CommitEarlyExit (New commit detected within 1h window)" >> "$LOG_FILE"
    exit 0
fi

3. 获取并筛选PR

cd "$REPO_DIR"
WATERMARK=$(cat "$WATERMARK_FILE")
CURRENT_TIME=$(date +%s)

# 获取最近更新的PR(最多50个)
gh pr list --repo CS-BAOYAN/CSLabInfo2025 --limit 50 --state open --json number,title,updatedAt > /tmp/prs.json

# 筛选PR
CANDIDATES=()
while IFS= read -r pr; do
    PR_UPDATED=$(echo "$pr" | jq -r '.updatedAt' | xargs date -u +"%s" 2>/dev/null || echo 0)
    WATERMARK_TS=$(date -u -d "$WATERMARK" +"%s" 2>/dev/null || echo 0)

    # PR静默窗口:1小时内不推送
    PR_AGE=$((CURRENT_TIME - PR_UPDATED))
    if [ $PR_AGE -ge 3600 ] && [ $PR_UPDATED -gt $WATERMARK_TS ]; then
        CANDIDATES+=("$pr")
    fi
done < <(jq -c '.[]' /tmp/prs.json)

4. 处理候选PR

HIT_COUNT=0

for pr in "${CANDIDATES[@]}"; do
    PR_NUMBER=$(echo "$pr" | jq -r '.number')
    PR_TITLE=$(echo "$pr" | jq -r '.title')

    # 输出结果
    echo "Result: PR#${PR_NUMBER} | Title: ${PR_TITLE}"
    HIT_COUNT=$((HIT_COUNT + 1))
done

5. 记录审计日志

SCANNED=$(jq '. | length' /tmp/prs.json 2>/dev/null || echo 0)
CANDIDATE_COUNT=${#CANDIDATES[@]}
FILTERED=$((SCANNED - CANDIDATE_COUNT))

if [ $HIT_COUNT -gt 0 ]; then
    echo "[$(date +"%Y-%m-%d %H:%M:%S")] 扫描PR数: ${SCANNED} | 候选PR数: ${CANDIDATE_COUNT} | 命中: ${HIT_COUNT} | 过滤干扰项: ${FILTERED}" >> "$LOG_FILE"
    # 更新水位线
    date -u +"%Y-%m-%dT%H:%M:%SZ" > "$WATERMARK_FILE"
else
    echo "[$(date +"%Y-%m-%d %H:%M:%S")] Status: Idle (No relevant updates)." >> "$LOG_FILE"
fi

时间窗口规则

  • Commit早退窗口:1小时(3600秒)- 最新commit在1小时内且新于水位线才推送
  • PR静默窗口:1小时(3600秒)- PR更新后1小时内不推送
  • 水位线机制:记录上次扫描时间,实现增量扫描

输出格式

Commit早退路径

Found new commit on main branch.
Commit: <hash>
Author: <author>
Message: <message>
Changed files:
  <file1>
  <file2>

PR处理路径

Result: PR#<编号> | Title: <PR标题>

审计日志

[YYYY-MM-DD HH:MM:SS] 扫描PR数: N | 候选PR数: C | 命中: H | 过滤干扰项: Z
[YYYY-MM-DD HH:MM:SS] Status: Idle (No relevant updates).
[YYYY-MM-DD HH:MM:SS] Status: CommitEarlyExit (New commit detected within 1h window)