关于 agentic-productivity-setup
这是一份构建注重隐私的 macOS 系统的规范,用于统计编码活动汇总数据,并每天通过 Discord 发送含三张图表的报告。它指导 Agent 明确需求、设计架构、实现功能并验证结果。
主要功能
- 01定义三项独立活动指标
- 02通过只读适配器在本地采集
- 03在 SQLite 中存储汇总数据
- 04在本地生成三张图表
- 05定时发送 Discord 日报
- 06验证隐私与投递行为
适用场景
- 01构建 Agent 生产力追踪项目
- 02比较每日提交、会话与提示词数量
- 03设置私密的定时活动报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davidondrej/ skills --skill agentic-productivity-setup安装后在 Claude Code 中输入/agentic-productivity-setup确认已加载。
附带文件agents/openai.yaml
详细介绍
Agentic Productivity Setup
构建一个确定性系统,衡量 AI Agent 是否能随着时间推移提高个人产出。数据收集保留在本地。每天早晨向私密 Discord 发送一份报告,且报告中恰好包含三张汇总图表。
隐私规则
以下要求必须严格遵守:
- 使用全新实现。绝不复制其他安装中的内容、运行时数据库、日志、会话存储、凭据、机器路径、仓库列表或私有配置。
- 绝不持久化或传输提示词文本、回复、工具输出、仓库名称、文件路径、身份信息、原始会话 ID 或提交消息。
- 读取 Agent 原生存储时只能用于计数事件。临时标识符仅保存在内存中,随后丢弃。只有当采集器需要跨运行基线时,才持久化单向哈希。
- 默认在本地渲染图表。每天的总数和图表图片只能发送至 Discord。启用任何可选远程图表服务前,说明确切的数据流向。
- 将 Discord webhook 存储在当前用户的 macOS 钥匙串中。绝不能将其放入源代码、命令参数、环境文件、数据库、日志、测试或调度器定义中。
- 测试中使用合成测试数据。绝不使用复制的会话数据、真实提示词、真实仓库元数据或有效凭据。
- 以只读方式打开原生数据库。采集器不得修改 Agent 状态。
- 将缺失、无法读取或不受支持的数据源报告为覆盖问题。绝不将采集失败静默转换为零。
确认范围
首先确定用户想要的是说明、新项目还是安装。若用户只是询问其工作原理,则不要创建或安装任何内容。
若要构建,请确认或安全地采用以下默认值:
- 平台:macOS。要适配其他操作系统前,先询问用户。
- 代码根目录:
$HOME/code。 - 时区:Mac 当前配置的时区。
- 报告时间:本地时间 08:00。
- 报告窗口:截至昨天的 90 天。
- Agent 执行环境:仅包含用户希望衡量的工具。
- 项目位置和反向 DNS 格式的 LaunchAgent 标签。
不要让用户将 webhook 粘贴到聊天中。应用构建完成后,通过安全的终端输入进行配置。
更改指标定义、存储边界、报告目标位置或从 Mac 发出的数据之前,先征求用户同意。在生成的项目中用简短的 ADR 记录重要决策。
架构
使用以下数据流:
Git reflogs + native agent registries
-> read-only collectors
-> daily aggregate counts
-> local SQLite database
-> local chart renderer
-> one Discord webhook request
将源代码检出目录与已安装的运行时分开:
- 将应用代码复制到
~/Library/Application Support/<app>/app/。 - 在其旁边的
metrics.sqlite3中存储汇总状态。 - 将日志存储在
~/Library/Logs/<app>/。 - 将 plist 安装到
~/Library/LaunchAgents/。 - 目录权限设为
0700,敏感文件权限设为0600。 - 重新安装和正常卸载时保留汇总状态。
指标约定
实现三个相互独立的指标。不要创建综合生产力评分。
唯一的本地提交
- 在配置的代码根目录下递归发现 Git 仓库。
- 按 Git 公共目录对主检出和关联工作树去重。
- 读取所请求日期范围内 reflog 中的本地创建事件。
- 仅纳入作者或提交者电子邮件与该仓库中配置的身份相匹配的提交。
- 在所有引用和工作树中,每个提交哈希只计数一次。
- 排除仅因获取提交、推送或分支移动而产生的记录。
- 哈希仅保存在内存中。只存储每日最终计数。
活跃 Agent 会话
- 在原生注册表记录活动的每个本地日历日,将该会话计数一次。
- 纳入 GUI、CLI、无头、恢复、父级、子 Agent、委派和自动化会话。
- 使用执行环境的原生会话身份在内存中去重。
- 在存储和报告中分别保留各执行环境的数据。
包含指令的提示词
- 统计存储的用户、系统和开发者输入中包含指令的数量。
- 包括人工提示词、自动化内容、设置上下文、委派内容和子 Agent 指令。
- 排除助手回复、工具结果、空输入和重复存储的副本。
- 仅检查内容以判断事件类别。绝不存储或记录内容。
在分配日期前,将每个时间戳转换为配置的时区。
收集器设计
每种运行环境使用一个适配器。优先使用原生注册表,而非进程检查、Shell 历史记录、窗口标题或猜测的文件时间戳。
支持常见的数据源格式:
- JSON 或 JSONL 会话记录。
- 只读 SQLite 注册表。
- 编辑器全局或工作区状态数据库。
- 如果没有可读取的本地注册表,则使用经过身份验证的原生 CLI 导出。
每个适配器必须返回:
- 内存中的每日唯一会话标识;
- 每日提示词计数;
full、partial、unavailable、absent或error覆盖状态;- 包含计数和限制的简短详情字符串,绝不包含私密数据。
某些存储仅提供会话总数,不提供每轮对话的时间戳。对于这些存储,保存经过哈希处理的源键和总数,然后只统计本地基线之后观测到的正向增量。将更早的归因标记为部分归因。
在运行时发现已安装的运行环境。将不受支持的工具从图表中省略,不要错误地标记为零活动量。
聚合数据库
使用 WAL 模式的 SQLite。保持架构精简:
daily_metrics:日期、指标、运行环境、计数、收集时间。collector_health:每种运行环境的安装和覆盖状态。source_snapshots:经过哈希处理的源键、上次总数、观测时间。collector_baselines:每种运行环境的首次可靠观测。deliveries:报告日期、发送状态、发送时间和简短的安全错误信息。
对每日计数使用单调递增的 upsert。后续不完整的扫描不得抹去已存储的较高值。
绝不为原始事件、消息、提示词、回复、仓库名称、路径或标识创建表。
报告和 Discord 投递
为所选时间范围准确生成三张图表:
- 每日唯一提交数,使用折线和面积图。
- 每日活跃会话数,使用按运行环境分组的堆叠柱状图。
- 每日指令提示词数,使用按运行环境分组的堆叠柱状图。
为每张图表添加直线普通最小二乘趋势线。会话和提示词的趋势线使用每日总数。使用固定版本的图表依赖项在本地渲染 PNG 文件。绝不静默回退到网络渲染器。
Discord 消息只能包含:
- 报告日期;
- 昨日的三项总数;
- 简短的收集器覆盖情况摘要;
- 三个 PNG 附件。
发送一个 multipart POST。禁用允许提及功能。仅接受有效的 Discord webhook 主机。使用较短的超时时间。绝不记录请求 URL 或请求正文。
在进行网络操作前,先在 SQLite 中认领报告日期。仅在 Discord 成功响应后将其标记为已发送。正常运行时,每个报告日期只发送一次。重新发送必须使用显式的强制选项。
调度
使用用户级 LaunchAgent。不要按计划运行 LLM。
配置:
- 使用
StartCalendarInterval设置所选的每日报告时间。 - 如果收集器需要提示词增量,则将
StartInterval设为 300 秒。 - 使用
RunAtLoad进行登录和唤醒补收。 - 将
ProcessType设为Background。 - 启用
LowPriorityIO。 - 使用限制严格的
077umask,并在 plist 中表示为十进制63。 - 将 stdout 和 stderr 路径设在私有日志目录中。
每个时间间隔都可以观测仅提供增量的数据源。报告时间之前,在完成本地观测后停止。报告时间或之后,收集昨日数据、构建完整时间范围,并且仅当该日期尚未标记为已发送时才发送。
安装程序必须将绝对运行时路径写入 plist,使用 plutil 验证 plist,安全地替换现有任务并启动该任务。不要将凭据写入 plist。
项目结构
采用小巧、易读的项目结构:
agentic_productivity/
cli.py
collectors.py
database.py
model.py
reporting.py
bin/
agentic-productivity
launchd/
<label>.plist.in
scripts/
install.sh
uninstall.sh
test.sh
tests/
docs/adr/
除非用户选择其他简单、易维护的技术栈,否则使用 Python 3.11 或更高版本。保持采集器模块化。定时命令应具有确定性且无需交互。
提供以下命令:
doctor:检查前置条件、路径、凭据是否存在、数据库和采集器覆盖情况,且不暴露机密。collect:采集并存储聚合数据,不进行交付。mock:运行采集、报告生成、图表渲染和多部分组装,不访问网络,也不改变交付状态。run:执行定时观测并生成幂等报告。status:显示安全的采集和交付状态。configure-webhook:从标准输入读取 webhook,并将其存储在 macOS Keychain 中。
安全的 webhook 配置
实现后,使用如下交互式 shell 模式:
read -r -s REPORT_WEBHOOK
printf '%s\n' "$REPORT_WEBHOOK" | ./bin/agentic-productivity configure-webhook
unset REPORT_WEBHOOK
该命令只能输出配置是否成功,绝不能回显机密。
验证门槛
只有通过所有检查后,才能报告成功:
- 使用合成的原生存储数据测试每个采集器。
- 测试去重、时区边界、提示词角色筛选、单调递增的 upsert、覆盖失败和幂等交付。
- 测试报告仅包含聚合数据,且附件恰好有 3 个。
- 运行完整测试套件和无需网络的
mock命令。 - 先安装到临时主目录。确认运行不需要源代码检出目录或运行时状态。
- 验证渲染后的 plist 不包含任何凭据或私有源数据。
- 验证受跟踪的文件不包含数据库、日志、会话导出、提示词数据样本、凭据、特定于机器的绝对路径或真实身份信息。
- 运行
doctor,加载 LaunchAgent,并确认其上次退出状态为 0。 - 只有获得用户许可,才发送实时测试报告。
如果任何隐私检查存在不确定之处,请停止发布该文件。不要放宽检查。
完成报告
告知用户:
- 源代码、已安装应用、聚合数据库、plist 和日志的位置;
- 已启用的指标和运行环境;
- 时区、报告时间和时间窗口;
- webhook 是否已配置,但不要显示其内容;
- 运行了哪些测试,以及 LaunchAgent 是否运行正常;
- 仍需关注的所有部分可用或不可用的采集器。