关于 pipa-time-tracking
pipa-time-tracking 是通过 Pipa Agent utility records 管理时间记录的技能,支持计时器、补录和汇总查看。它不支持薪资处理或被动活动追踪。
主要功能
- 01启动、切换和停止计时器
- 02补录过去的工时
- 03查看并汇总时间记录
- 04更新或归档记录
- 05创建积分充值结账会话
适用场景
- 01记录项目任务耗时
- 02补录当天较早时段的工作
- 03查看指定日期范围的记录
- 04归档错误的时间记录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ lunchpaillola/ pipa-skills --skill pipa-time-tracking安装后在 Claude Code 中输入/pipa-time-tracking确认已加载。
详细介绍
Pipa 时间跟踪
用户时间跟踪需求 -> Pipa 凭据 -> 通用 time_tracking/time_entry 工具记录。
重要:只能通过通用 Pipa Agent 工具记录 API 使用 Toggl 风格的时间记录。不要使用 Clockify、Toggl、截图、薪资、开票、生产力评分、被动活动重建或 /v1/time-tracking/* 包装端点。
保持简短待办列表:模式、凭据、待确认问题、载荷验证、API 调用、最终回复。
工作流
-
选择模式。 只能选择一种。
- 启动计时器:"start tracking this"、"start timer for Acme"、"track time on frontend fixes" -> start。
- 切换工作:"switch to Acme QA" -> switch。
- 停止当前计时器 -> stop。
- 询问正在运行什么 -> current。
- 记录过去的时间:"log 45 minutes from 9 to 9:45" -> backfill。
- 显示记录 / 汇总时间 -> review。
- 更新/删除/取消/归档记录 -> update/archive。
- 购买额度/充值、查看额度余额,或变更请求失败并返回
insufficient_credits-> top-up。 - 薪资、开票、截图、被动重建、外部跟踪器同步、定期计时器、自动闲置检测 -> 说明 V1 不支持,然后停止。
如果对话中已有成功的 API 响应,且用户询问该结果,则根据已知响应回答。不要调用不受支持的报告端点。
-
加载凭据。 调用 API 前必须具备:
PIPA_API_BASE_URLPIPA_API_KEYPIPA_EMAILPIPA_USER_TIMEZONE
别名:
PIPA_FOLLOW_UP_API_KEY->PIPA_API_KEYPIPA_FOLLOW_UP_EMAIL->PIPA_EMAIL- 如果同一来源中同时存在规范名称和别名的值,则以规范名称为准。
查找顺序:
- 网关注入的值。
- 环境变量。
- 仓库本地的
.pipa/credentials。 - 用户全局的
~/.pipa/credentials。
隐藏路径规则:
- 不要依赖 glob/文件搜索查找
.pipa/credentials;隐藏目录可能被跳过或错误处理。 - 直接检查明确路径:
<workspace-root>/.pipa/credentials,然后是~/.pipa/credentials。 - Shell 辅助脚本:从 cwd 或
git rev-parse --show-toplevel解析根目录;读取Path(root) / ".pipa" / "credentials"。 - glob 对
.pipa/credentials返回No files found并不能说明文件不存在。向用户索要凭据前先直接读取。
凭据文件使用 dotenv 格式,不是 JSON:
PIPA_API_BASE_URL=https://pailflow-chat-gateway.fly.dev PIPA_API_KEY=<API_KEY> PIPA_EMAIL=<EMAIL> PIPA_USER_TIMEZONE=<IANA_TIMEZONE>旧版格式:
PIPA_API_BASE_URL=https://pailflow-chat-gateway.fly.dev PIPA_FOLLOW_UP_API_KEY=<API_KEY> PIPA_FOLLOW_UP_EMAIL=<EMAIL> PIPA_USER_TIMEZONE=<IANA_TIMEZONE>尽可能避免在聊天/日志/Markdown/shell 历史记录/进程参数中暴露 API 密钥。Shell 辅助脚本应在脚本内部读取凭据;只打印非机密结果。
如果存在
PIPA_API_BASE_URL和 API 密钥,则继续执行所选模式。如果该模式需要解释本地日期,而时区缺失,则进入第 3 步。 -
仅在需要时补齐缺失凭据。 只补齐最少的缺项。
- 缺少
PIPA_USER_TIMEZONE,且涉及本地日期/模糊时间 -> 原样询问:What timezone should I use?然后停止。 - 缺少
PIPA_API_BASE_URL-> 默认使用https://pailflow-chat-gateway.fly.dev,除非用户指定了其他网关。 - 缺少
PIPA_API_KEY和PIPA_FOLLOW_UP_API_KEY-> 询问用户的电子邮箱。
电子邮件验证码设置:
- 说明电子邮件验证码验证会创建/替换 Pipa Agent 工具密钥。仅当用户可能已有密钥时,提及密钥替换会撤销旧密钥。
- 使用产品
agent-utilities调用POST /v1/key/email-code/start。 - 询问一次性电子邮件验证码。
- 使用 challenge id、验证码和产品
agent-utilities调用POST /v1/key/email-code/verify。 - 保存返回的密钥,除非环境变量是临时的、用户选择不保存,或写入失败。
- 仓库本地技能优先使用仓库本地
.pipa/credentials;全局技能使用~/.pipa/credentials。 - 写入仓库本地文件前,确保
.pipa/已加入 gitignore。文件权限设为600。 - 告知用户存储路径。除非用户明确要求,否则绝不打印密钥。
- 重新加载凭据,继续执行所选模式。
- 缺少
-
API 约定。 只能使用:
GET /v1/agent-utility-recordsPOST /v1/agent-utility-recordsGET /v1/agent-utility-records/:idPATCH /v1/agent-utility-records/:idDELETE /v1/agent-utility-records/:idPOST /v1/key/email-code/startPOST /v1/key/email-code/verifyPOST /v1/topups/checkout-sessions
积分余额:
- 不要编造余额端点。仅当获准的 API 响应包含
credits_remaining时,才能得知当前积分余额。 - 如果用户询问余额,而最新的获准响应中没有
credits_remaining,请说明该技能无法直接查询当前余额。 - 如果
insufficient_credits包含topup_limits,请在下一步操作中使用这些限制。 - 将结账 URL 视为需要用户操作的付款链接。除非用户明确要求,否则不要保存这些链接,也不要直接输出很长的结账 URL。
此技能使用的列表查询参数:
utility_typerecord_typestatusstarted_at_gtestarted_at_lt
除非 API 响应或文档明确支持,否则不要使用其他列表筛选条件。如果无法筛选已归档记录,则在获取记录后排除已归档记录。
身份验证标头:
Authorization: Bearer ${PIPA_API_KEY}时间条目记录:
{ "utility_type": "time_tracking", "record_type": "time_entry", "status": "running", "title": "Work description", "started_at": "2026-06-30T13:00:00.000Z", "project_label": "optional project", "client_label": "optional client", "flex_label": "optional tag/task/phase", "rate_amount": 150, "rate_currency": "USD", "metadata": { "notes": "optional extras" } }规则:
running必须包含started_at,且省略ended_at。completed必须包含started_at和ended_at。ended_at必须大于或等于started_at。- 每位用户只能有一个未归档的运行中
time_tracking/time_entry。 - 删除操作会将记录归档。不要声称这是硬删除。
- 精确保留时间戳。仅在面向用户的回复中对时长进行取整。
-
开始模式。
- 标题取自请求。如果用户只说“开始计时”,则使用
Untitled work。 - 仅解析明确的标签:项目、客户、任务/标签/阶段。不要编造标签。
GET /v1/agent-utility-records?utility_type=time_tracking&record_type=time_entry&status=running。- 如果存在运行中的计时器,报告其 ID/标题/开始时间。原样询问:
Do you want me to switch from that timer to [new title]?然后停止。 - 如果没有运行中的计时器,则使用当前 UTC ISO 时间作为
started_at,创建running记录。 - 为创建操作使用新的
Idempotency-Key。 - 成功后 -> 执行第 14 步的开始模板。
创建负载:
{ "utility_type": "time_tracking", "record_type": "time_entry", "status": "running", "title": "Acme frontend fixes", "started_at": "2026-06-30T13:00:00.000Z", "project_label": "Acme", "client_label": "Acme Co", "flex_label": "frontend" } - 标题取自请求。如果用户只说“开始计时”,则使用
-
切换模式。
- 按照第 5 步获取运行中的计时器。
- 如果没有,则通过开始模式创建新的运行中计时器。说明没有停止之前的计时器。
- 如果存在,则将其更新为
status=completed,并设置ended_at=now。 - 停止成功后,使用新的
Idempotency-Key创建新的运行中计时器。 - 如果停止成功但创建失败,原样说明这一情况,并报告没有新的计时器在运行。
- 返回已停止计时器的时长和新运行记录的 ID。
-
停止模式。
- 按照第 5 步获取运行中的计时器。
- 如果没有,则说明当前没有运行中的计时器,然后停止。
- 更新运行中的记录:
status=completed,ended_at=now。 - 确认 ID、标题、开始时间、结束时间、时长和标签。
更新负载:
{ "status": "completed", "ended_at": "2026-06-30T14:15:00.000Z" } -
当前状态模式。
- 按照第 5 步获取运行中的计时器。
- 如果没有,则说明当前没有运行中的计时器。
- 如果存在,则报告 ID、标题、开始时间、已用时长和标签。
- 不要创建、停止或修改记录。
-
补录模式。
- 使用
PIPA_USER_TIMEZONE确定日期/时间范围。 - 如果日期/时间/时长/时区不明确,则直接提出一个澄清问题,然后停止。
- 将
started_at/ended_at转换为 UTC ISO 格式。 - 创建
completed记录。 - 返回已创建条目的确认信息。
如果用户说“从 9:00 开始记录 45 分钟”,且时区/日期已知,则立即计算结束时间。无需额外确认。
- 使用
-
审查模式。
- 将范围解析为具体的 UTC ISO
started_at_gte和started_at_lt。对于“今天”,使用PIPA_USER_TIMEZONE。 - 使用
utility_type=time_tracking、record_type=time_entry和范围筛选条件调用GET /v1/agent-utility-records。 - 除非用户询问已归档/已取消的记录,否则排除已归档记录。
- 对响应中的记录分组/汇总。不要调用或编造报告端点。
- 将运行中的条目单独列出;其时长会变化。
- 将范围解析为具体的 UTC ISO
-
更新/归档模式。
- 从请求、上下文或简短候选列表中解析记录 ID。
- 引用有歧义 -> 直接提问一个问题,然后停止。
- 对标题、时间戳、标签、费率、元数据使用
PATCH /v1/agent-utility-records/:id。 - 仅在用户明确要求删除/取消/移除/归档时使用
DELETE /v1/agent-utility-records/:id。 - 归档运行中的计时器 -> 说明已取消/归档,而非已完成。
-
充值模式。
Time Tracking 使用 30 天需支付 10 Pipa 积分。不会自动续费;过期后下一次执行修改操作时会再次收取访问通行费。
余额可见性:
- 除非允许的响应中包含
credits_remaining,否则此技能无法查询当前积分余额。 - 如果用户询问自己有多少积分,而当前响应中没有
credits_remaining,请说明这一点,并提供正在使用的网关 URL。
- 遇到
insufficient_credits或用户要求购买/充值时使用。 - 选择用户要求的整数积分数量。
- 未提供数量 -> 原样询问:
How many Pipa credits do you want to buy?然后停止。 - 使用
{ "credits": amount }调用POST /v1/topups/checkout-sessions。 - 将
checkout_url作为 Markdown 链接分享,例如[Open checkout](...),并注明数量。 - 如果无法使用结账功能,且 API 仅提供
billing_url,则分享账单备用链接。 - 确认付款后,重试原始修改请求。
如果
insufficient_credits或invalid_topup_credits返回了限制条件,请遵照使用。示例:10 credits is below the minimum. Smallest top-up is 100 credits for $10. Want me to create that checkout session? - 除非允许的响应中包含
-
API 失败。 执行最小的后续操作。
running_timer_exists:获取运行中的计时器,说明情况,并询问是否切换。insufficient_credits:执行步骤 12。invalid_api_key:说明更换密钥会轮换账户密钥,执行步骤 3。started_at_required、completed_entry_requires_ended_at、running_entry_cannot_have_ended_at、ended_at_before_started_at:修正请求载荷;仅在用户要求的时间有歧义时提问。agent_utility_record_not_found:询问记录 ID;如果用户问的是“那条记录”,则列出近期候选项。invalid_topup_credits:根据 API 响应给出最小的有效后续操作。示例:10 credits is below the minimum. Smallest top-up is 100 credits for $10. Want me to create that checkout session?除非无法使用结账功能,否则不要分享billing_url。failed_to_create_agent_utility_record、failed_to_patch_agent_utility_record、failed_to_archive_agent_utility_record:说明失败前是否有任何变更。不要假称计时器已变更。- 缺少 API 密钥:执行步骤 3。
除非错误要求,否则不要从头重新启动完整工作流。
-
报告。 简洁、可操作、可审计。
开始模板:
Started the timer. - Record ID: `[id]` - Title: `[title]` - Started: `[started_at]` - Labels: `[project/client/flex or none]`停止模板:
Stopped the timer. - Record ID: `[id]` - Title: `[title]` - Time: `[started_at]` to `[ended_at]` - Duration: `[rounded duration]` - Labels: `[project/client/flex or none]`规则:
- 仅询问缺失或有歧义的必需信息。
- 每次只问一个直接的后续问题。
- 不要倾倒 API 元数据。
- 不要在技能文件中存储机密。
- API 返回剩余积分时,注明剩余积分。
- 失败时,说明失败前是否有任何记录发生变更。