From personal
用于收集和整理个人双周记或周记的素材。用户提出「收集双周记素材」「准备周记」 「周记素材」「双周记」「最近发生了什么」「整理素材写周记」、"biweekly materials" 或 "gather journal materials" 时立即使用。从日记、Pinboard、豆瓣、Telegram、 Calendar、Reminders、照片、RSS 摘要和 plrom diff 中收集最近 2~4 周的原始材料, 并按周记模板整理,但不代写最终正文。工作周报使用 weekly-report。
How this skill is triggered — by the user, by Claude, or both
Slash command
/personal:biweekly-collectorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
收集双周记写作素材。从日记、书签、豆瓣、Telegram、日历、提醒事项、照片、RSS 精选、plrom 变更等
收集双周记写作素材。从日记、书签、豆瓣、Telegram、日历、提醒事项、照片、RSS 精选、plrom 变更等 多个来源抓取过去 2-4 周的素材,整理成周记模板结构,供用户手写周记时参考。
这个 skill 不代写周记。 周记的核心是作者自己的文字和反思。这里只聚合散落素材, 减少写作时的遗漏。
| 工具 | 类型 | 必需 | 安装方式 |
|---|---|---|---|
| macOS | 系统 | 是 | 此 skill 仅支持 macOS |
| reminders-cli | CLI | 是 | brew install keith/formulae/reminders-cli |
| icalBuddy | CLI | 是 | brew install ical-buddy |
| curl | CLI | 是 | macOS 内置 |
| Git | CLI | 是 | 系统内置或运行 brew install git |
PINBOARD_AUTH_TOKEN | 环境变量 | 是 | 登录 Pinboard 后在 Settings → Password 中获取 |
加载 skill 时不要主动检查这些工具。命令因缺少工具而失败时,跳过对应数据源, 使用其余可用数据继续。
| 路径 | 用途 |
|---|---|
~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Note/Archives/日记(Daily)/ | 每日日记 |
~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Note/Areas/生活(Life)/周记(Weekly)/ | 旧版周记输出目录 |
~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Note/Areas/生活(Life)/月记(Monthly)/ | 当前月记输出目录 |
~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Note/templates/monthly.md | 周记模板 |
| RSS 摘要目录(运行时发现) | AI 筛选的 RSS 每日摘要 |
~/code/plrom/README.md | plrom「人 × 社区 × 物」源文件,使用独立 Git 仓库 |
┌──────────────────────────────────────────────────────────────┐
│ biweekly-collector 完整流程(~15-20min) │
└──────────────────────────────────────────────────────────────┘
┌──────────────────┐
│ 用户触发素材收集 │
└──────┬───────────┘
│
▼
┌────────────────────────────────────┐
│ 1. 确认时间范围 + 创建文件 (~2min) │
└──────┬─────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 2. 并行数据收集(subagent) (~5-8min) │
│ ┌─ 日记条目提取 │
│ ├─ Pinboard 书签 │
│ ├─ 豆瓣动态 (RSS) │
│ ├─ Telegram 频道 (RSS) │
│ ├─ Apple Calendar 事件 │
│ ├─ Apple Reminders 完成项 │
│ ├─ RSS 精选摘要 │
│ └─ plrom git diff │
└──────┬──────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ 3. 整理素材到模板结构 (~3min) │
└──────┬─────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ 4. 展示 + 用户确认写入 (~3min) │
└──────┬─────────────────────────────┘
│
▼
┌──────┐
│ 完成 │
└──────┘
双周记允许覆盖 2~4 周。询问用户:
Claude: 「这次周记要覆盖什么时间段?」
建议:3/10 - 3/23(两周)
或者你可以指定其他范围(最短两周,最长一个月)
根据上一篇记录的日期建议默认范围。扫描 Areas/生活(Life)/周记(Weekly)/ 和
Areas/生活(Life)/月记(Monthly)/,以最近一篇记录计算间隔。
周记文件名采用 YYYYMM-N-title.md:
YYYYMM:周期结束日期所在的年月。N:当月第几篇记录,从 1 开始。title:用户选择的简短描述性标题。询问标题,也可以在看完素材后再决定。
使用 templates/monthly.md 创建文件。输出目录可以是 周记(Weekly)/ 或
月记(Monthly)/;询问用户,或直接采用用户指定的路径:
---
aliases:
tags:
- 周记
date: {start_date}
modified: {today}
---
> {用户稍后填写的开场白}
## 关于现实生活的记录
> [!info]
> 我所有的周记或许并没有谎言,起码没有主动撒谎的部分。但其中的内容可能都具有某种倾向性,例如隐藏了某些未言明的黑暗成分,或者说是选择性的表达。
<!-- 以下是收集到的素材,请根据这些素材手写正文 -->
### 素材:生活事件与日记摘要
{collected_diary_materials}
### 素材:日历事件
{collected_calendar_events}
### 素材:当前提醒事项(个人相关)
{collected_reminders}
### 素材:plrom 变更
{collected_plrom_diff}
## 👀 还看了什么
### 📚 🎬 📺 作品
| 作品 & 产品名 | 媒介 | 进度 | 打分 | 吐槽 |
| -------- | --- | --- | --- | --- |
{collected_douban_entries}
### 🌐 文章
{collected_articles}
### 素材:RSS 精选回顾
{collected_rss_digests}
### 素材:Telegram 频道分享
{collected_telegram_posts}
## 后记
<!-- 这里是你的个人反思空间 -->
为每个数据源并行启动 subagent。各数据源相互独立;某个来源失败时跳过并继续。
读取 Archives/日记(Daily)/ 中日期范围内的每篇日记。
从三个章节提取内容:
## 1 title Journal:个人事件、反思和照片。## 2 Work Log:浏览与个人兴趣相关的内容,跳过正式周报。## 3 Today I Learn:TIL 和作品感想。输出格式:
#### 3/10 (周一)
- 在图书馆看了《断舍离》
- 跟朋友 L 约了羽毛球
#### 3/11 (周二)
- 家庭自动化 Dashboard 大整理
- 看完了《迷宫饭》第二季
保留用户原有语气,只整理摘要,不改写。照片引用 ![[filename]] 或  原样保留。
获取日期范围内的书签:
curl -s "https://api.pinboard.in/v1/posts/all?auth_token=$PINBOARD_AUTH_TOKEN&format=json&fromdt={start_date}T00:00:00Z&todt={end_date}T23:59:59Z"
每条书签采用以下格式:
- [Title](url) - {description if any} `{tags}`
数量较多时按周或标签分类。
获取用户的豆瓣兴趣动态。先访问直接订阅源,失败后使用 RSSHub:
# Try direct feed first
curl -s "https://www.douban.com/feed/people/niracler/interests"
# If empty or blocked, use RSSHub
curl -s "https://rsshub.app/douban/people/niracler/interests"
解析 RSS 或 Atom 条目,提取:
整理为作品表格行:
| 《作品名》 | 电影 | 100% | 8 | 用户的短评 |
豆瓣订阅源不可用或为空时,标记该情况,由用户手动补充。
获取用户的 Telegram 频道 RSS:
curl -s "https://tg.niracler.com/rss.xml"
订阅源使用标准 RSS 2.0,正文是 <content:encoded> HTML。解析时注意:
<content:encoded> 文本的第一行。<a href="/search/..."> 链接,例如 #pinboard、
#bilibili、#梦、#暴论、#网易云音乐。使用正则表达式提取并分类。使用脚本严格过滤:
# Fetch and filter Telegram RSS by date range
curl -s "https://tg.niracler.com/rss.xml" | python3 -c "
import sys, xml.etree.ElementTree as ET
from email.utils import parsedate_to_datetime
from datetime import datetime, timezone
start = datetime({start_year}, {start_month}, {start_day}, tzinfo=timezone.utc)
end = datetime({end_year}, {end_month}, {end_day}, 23, 59, 59, tzinfo=timezone.utc)
tree = ET.parse(sys.stdin)
for item in tree.findall('.//item'):
pub = item.find('pubDate')
if pub is not None:
dt = parsedate_to_datetime(pub.text)
if start <= dt <= end:
title = item.find('title')
link = item.find('link')
print(f'{dt.strftime(\"%m/%d\")} | {title.text if title is not None and title.text else \"(untitled)\"} | {link.text}')
"
尽可能按 hashtag 分类:
#### 文章分享 (#pinboard)
- [Article title](url) - user's comment
#### 随想 (#暴论)
- 3/15: "some thought..."
#### 其他
- 3/12: 新电脑到了
使用 icalBuddy 查询日期范围内的日程:
icalBuddy -sd -ic "Personal,Learn&Create" \
eventsFrom:{start_date} to:{end_date}
关键参数:
-sd:按日期分组。-ic "Personal,Learn&Create":只包含个人日历,跳过 Work 和
Scheduled Reminders;提醒事项由 reminders-cli 单独收集。输出已经按日期分组。保留聚会、预约、旅行和爱好等个人日程,跳过重复的工作会议。
使用 icalBuddy calendars 列出可用日历名称。
查询当前提醒事项,了解用户正在关注和计划的内容:
reminders show-all
该命令返回所有列表中尚未完成的提醒事项,包括截止日期和备注。对于月记,当前提醒比 已完成提醒更有价值,可以反映生活目标、人际维护、重复习惯、后续计划和学习节点。
只保留「生活」「健康」「人际关系」「阅读」「提醒」等个人列表,跳过纯工作事项,例如
内部项目:接口切换。
在 ~/code/*/ 中查找名为 rss-agent 的仓库,再读取其中 output/daily/ 下由 AI
筛选的每日摘要。未找到仓库时跳过此来源,不再尝试旧的嵌套仓库路径。
读取日期范围内存在的 YYYY-MM-DD.md。每份摘要包含:
提取分数不低于 70 的文章,作为本期阅读精选。按 URL 与 Pinboard 书签和 Telegram 频道分享去重;相同 URL 只保留一条。
plrom 仓库 ~/code/plrom/ 是独立 Git 仓库,记录用户关注的
「人 × 社区 × 物」,并通过 GitHub Actions 自动同步到博客。
检查周期内的变更:
cd ~/code/plrom
git log --since="{start_date}" --until="{end_date}" --oneline
# If there are commits, get the diff
FIRST_COMMIT=$(git log --since="{start_date}" --format="%H" --reverse | head -1)
if [ -n "$FIRST_COMMIT" ]; then
git diff "$FIRST_COMMIT"^..HEAD -- README.md
fi
存在变更时,整理新增和移除内容:
plrom 页面包含「人(技术博主、作家、漫画家、导演、UP 主、TG 芳邻、播客、歌手、 淘宝店主)」「组织或社区」「物(软件、硬件、游戏)」三个部分,用于记录兴趣变化和发现。
数据收集完成后,将素材整理到步骤 1 创建的骨架文件中。
生活事件:合并日记、Calendar 日程和已完成提醒,按时间顺序形成叙述骨架。 旅行连续数日等相关事件应归为一组。
作品表格:合并豆瓣条目和日记 TIL 中提到的作品,按标题去重,并尽量保留用户原话。
文章章节:合并 Pinboard 书签、RSS 摘要精选和 Telegram 分享,按 URL 去重。 优先保留包含用户描述的 Pinboard 条目,格式沿用历史周记:
- [标题](url) - 用户的一句话评论或 AI 摘要
plrom diff:作为「新发现」小节展示新增内容。
照片:收集日记中的 ![[image]] 和  引用,连同上下文列出,供用户选择。
展示收集结果摘要:
素材收集完成!以下是各来源的数量统计:
📔 日记条目: 12 天有内容
📌 Pinboard 书签: 8 条
🎬 豆瓣动态: 3 部作品
📱 Telegram 分享: 15 条
📅 日历事件: 6 个
✅ 完成的提醒: 9 项
📰 RSS 精选: 22 篇(去重后 17 篇)
🔄 plrom 变更: +3 新增, -1 移除
已写入文件:Areas/生活(Life)/月记(Monthly)/202603-title.md
你可以在 Obsidian 中打开这个文件,在素材基础上写你的周记。
询问是否需要:
将确认后的结构化素材写入文件。
| 不可用的数据源 | 处理方式 |
|---|---|
| 部分日期缺少日记 | 使用已有日期,并标记缺口 |
| 未设置 Pinboard token | 跳过,并标记「Pinboard 数据未获取」 |
| 豆瓣订阅源为空或被阻止 | 尝试 RSSHub;仍为空时保留表格供手工填写 |
| Telegram RSS 无法访问 | 跳过并标记 |
| Calendar 访问被拒绝 | 用 icalBuddy calendars 测试,并建议运行 tccutil reset Calendar |
| 缺少 rss-agent 输出 | 跳过,并标记「RSS 精选未找到」 |
| 未找到 plrom 仓库 | 跳过 plrom diff |
| 问题 | 处理方式 |
|---|---|
| 豆瓣 RSS 为空 | 豆瓣可能阻止直接 RSS,改用 https://rsshub.app/douban/people/niracler/interests |
| icalBuddy 日历名称不匹配 | 运行 icalBuddy calendars 获取准确名称,并调整 -ic 过滤条件 |
| Pinboard 结果过多 | 增加标签过滤或提高 fromdt 精度 |
| plrom 在周期内没有 commit | 属于正常情况,plrom 更新频率较低 |
| Telegram RSS 没有日期过滤 | 获取全部条目,再按 pubDate 过滤日期范围 |
| 文件已经存在 | 询问覆盖、追加或改用其他名称 |
| 周记与月记输出路径不同 | 用户可能使用 月记(Monthly)/,询问或采用用户直接指定的路径 |
npx claudepluginhub niracler/skill --plugin personal仅适用于 macOS。用于生成结构化的软件研发周报,适用于「周报」「软件研发周报」 「本周工作总结」「写周报」、weekly report、end-of-week summary,以及需要向主管或 团队提交工作总结的情况。不用于个人日记、月度回顾、OKR 总结、会议记录或季度回顾。
Runs a structured weekly review and planning process: close workday evidence, select one outcome per lane, schedule protected blocks, and prepare writing and teaching actions.
Run the daily content pipeline to fetch signals, analyze relevance, draft output, edit for voice fidelity, and deliver the brief