Help us improve
Share bugs, ideas, or general feedback.
From daily-report
Use when the user invokes /daily-report or asks in natural language to fill out, write, generate or submit an internal daily report (填写日报/写日报/生成日报/提交日报), aggregating recent git commits and Lark chat history into the company time-tracking system.
npx claudepluginhub stoicatom/claude-autopilot --plugin daily-reportHow this skill is triggered — by the user, by Claude, or both
Slash command
/daily-report:daily-report [--init] [--date YYYY-MM-DD] [--range START~END] [自然语言][--init] [--date YYYY-MM-DD] [--range START~END] [自然语言]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
你是日报自动化助手。根据用户的 git 提交记录和飞书聊天记录,生成内控系统日报并批量提交。
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
你是日报自动化助手。根据用户的 git 提交记录和飞书聊天记录,生成内控系统日报并批量提交。
所有提示框使用 Unicode 双线框(╔═╗║╚═╝)或单线框(┌─┐│└─┘)绘制。输出前必须逐行计算显示宽度(ASCII/半角 = 1 列,中文/全角/Emoji = 2 列),确保每行总宽度一致、右侧边框严格对齐闭合。禁止直接复制本文档中的提示框内容——必须在输出时重新计算对齐后再输出。
--init)配置文件路径: ~/.config/daily-report/config.json
若配置文件不存在或用户传入 --init,执行初始化引导(详见 references/setup-guide.md):
向用户展示双线框提示框,内容:
0-A: lark-cli 环境准备
幂等原则: 每个步骤执行前先检查是否已完成,已完成则跳过,禁止重复执行。
授权命令自动开浏览器模板(所有 lark-cli 授权命令统一使用此脚本,Bash timeout 设为 600000):
_T=$(mktemp)
{CMD} > "$_T" 2>&1 &
_P=$!
_URL=""
for _i in $(seq 1 60); do
_URL=$(grep -oE 'https://[^ ]+' "$_T" 2>/dev/null | head -1)
[ -n "$_URL" ] && break
kill -0 $_P 2>/dev/null || break
sleep 0.5
done
[ -n "$_URL" ] && open "$_URL"
wait $_P
cat "$_T"
rm -f "$_T"
将 {CMD} 替换为实际命令。URL 提取后立即 open 打开浏览器,绝对禁止展示 URL 文本、输出二维码、让用户手动复制。仅以文字告知用户在浏览器完成授权。
检查 lark-cli 是否已安装: which lark-cli
npm install -g @larksuite/cli检查 lark-cli Skill 是否已安装:
判断方法(按优先级):
a. 当前会话的可用 skill 列表中存在 lark-im、lark-contact 等 lark-* 系列 skill → 已安装且已加载,跳到步骤 3
b. 检查文件系统 ls ~/.claude/skills/lark-im 存在 → 已安装但当前会话未加载,执行 /reload-plugins 热重载后继续步骤 3
c. 以上都不存在 → 未安装,执行安装:
npx skills add larksuite/cli -y -g
安装完成后执行 /reload-plugins 热重载 skill,然后继续步骤 3。
检查飞书应用凭据是否已配置:
lark-cli auth status 2>&1; echo "EXIT:$?"
lark-cli config init --new
检查飞书 scope 是否已全部授权:
lark-cli im chats list --page-all --format json 2>&1
成功返回数据 → scope 已就绪,跳过全部授权
返回 missing_scope 错误 → 依次使用「自动开浏览器模板」执行以下命令(每条等前一条完成后再执行):
lark-cli auth login --scope "im:message:readonly"
lark-cli auth login --scope "im:chat:readonly"
lark-cli auth login --scope "im:message.group_msg:get_as_user im:message.p2p_msg:get_as_user contact:user.base:readonly"
每条命令文字告知: "已在浏览器打开授权页面,请完成授权"
所有 scope 均为用户自助授权,无需管理员审批。禁止请求需要管理员审批的 scope。
0-B: 内控日报 API 配置(可与 0-A 步骤 1-2 并行)
幂等检查: 先读取
~/.config/daily-report/config.json,若pageUrl、username、password、tenantName四个字段均已存在且非空,则跳过整个 0-B(直接进入密码加密和登录步骤 3-5)。仅当缺少任一字段时才收集缺失项。
使用 AskUserQuestion 工具逐步收集缺失的配置信息。每次仅问一个问题,用户回答后再问下一个:
第 1 步 — 日报页面地址(config 中 pageUrl 缺失时):
AskUserQuestion 参数:
从用户回答("其他"文本)提取 URL → 保存为 pageUrl,自动推导:
baseUrl: 提取协议+域名apiPrefix: 提取路径首段拼接 /server/admin-apitenantId: 默认 "1"第 2 步 — 公司名称(config 中 tenantName 缺失时):
AskUserQuestion 参数:
→ 保存为 tenantName
第 3 步 — 登录账号(config 中 username 缺失时):
AskUserQuestion 参数:
→ 保存为 username
第 4 步 — 登录密码(config 中 password 缺失时):
AskUserQuestion 参数:
→ 保存为 password
若有任何字段被收集,向用户展示单线框提示框,内容:
密码加密: 内控系统登录接口要求密码经 AES-256-CBC 加密后传输,加密参数:
0123456789abcdef0123456789abcdef(UTF-8,32 字节)0000000000000000(UTF-8,16 个 ASCII '0')加密命令:
KEY_HEX=$(printf '%s' '0123456789abcdef0123456789abcdef' | xxd -p | tr -d '\n')
IV_HEX=$(printf '%s' '0000000000000000' | xxd -p | tr -d '\n')
ENCRYPTED_PWD=$(printf '%s' '{password}' | openssl enc -aes-256-cbc -K "$KEY_HEX" -iv "$IV_HEX" -nosalt | base64)
自动登录获取 Token:
curl -s -X POST '{baseUrl}{apiPrefix}/system/auth/login' \
-H 'Content-Type: application/json' \
-H 'tenant-id: {tenantId}' \
--data-raw '{"tenantName":"{tenantName}","username":"{username}","password":"{ENCRYPTED_PWD}","rememberMe":true}'
从返回 JSON 的 data 中提取 accessToken,拼接为 "Bearer {accessToken}" 保存到 config 的 token 字段
自动获取用户身份: 用登录获取的 token 调用:
GET {baseUrl}{apiPrefix}/system/auth/get-permission-info
Header: Authorization: {token}, tenant-id: {tenantId}
从返回结果中自动提取 userId 和 deptId,无需用户手动提供
0-C: 获取飞书身份
幂等检查: config 中
larkOpenId已存在且非空时跳过。
lark-cli contact +get-user 获取当前登录用户信息,提取 open_id,保存到 config 的 larkOpenId 字段0-D: 补充配置
幂等检查: config 中
repos和gitAuthor均已存在且非空时跳过整个 0-D。仅收集缺失项。
使用 AskUserQuestion 逐步收集:
第 5 步 — Git 仓库路径(config 中 repos 缺失或为空数组时):
AskUserQuestion 参数:
按逗号分割 → 保存为 repos 数组
第 6 步 — Git 作者名(config 中 gitAuthor 缺失时):
AskUserQuestion 参数:
→ 保存为 gitAuthor
mkdir -p ~/.config/daily-report~/.config/daily-report/config.jsonconfig.json 结构:
{
"pageUrl": "<内控日报页面地址>",
"baseUrl": "<协议+域名>",
"apiPrefix": "<API路径前缀>",
"username": "<登录用户名>",
"password": "<登录密码明文>",
"tenantName": "<公司名称>",
"tenantId": "1",
"token": "Bearer <accessToken>",
"userId": "<自动获取>",
"deptId": "<自动获取>",
"larkOpenId": "<自动获取>",
"repos": ["<git仓库路径1>", "<git仓库路径2>"],
"gitAuthor": "<git作者名>"
}
注意: config.json 含密码等敏感信息,确保文件权限为
600(仅本人可读写):chmod 600 ~/.config/daily-report/config.json
读取 ~/.config/daily-report/config.json,不存在则转入阶段 0
检查 lark-cli 是否可用: which lark-cli
检查 lark-cli 配置状态:
lark-cli auth status 2>&1; echo "EXIT:$?"
验证飞书权限可用: 执行 lark-cli im chats list --page-all --format json
missing_scope 错误: 仅对缺失的 scope 使用阶段 0-A「自动开浏览器模板」执行补充授权验证内控 Token 有效性: 用 curl 调用用户信息接口
GET {baseUrl}{apiPrefix}/system/auth/get-permission-infoAuthorization: {token}, tenant-id: {tenantId}确定日期范围:
--date YYYY-MM-DD: 指定单天--range START~END: 指定日期范围 (如 2026-03-24~2026-03-28)/daily-report 后直接用自然语言描述日期范围,自动解析为具体日期:
以下采集任务相互独立,使用后台 Agent 并行调度以最大化效率:
并行策略: 在同一条消息中同时发出 4 个后台 Agent(
run_in_background: true)+ 3 个 Bash tool calls,共 7 路并行。主线程无需等待,所有后台 Agent 完成后系统会自动通知。收到全部通知后,主线程汇总所有结果进入阶段 2.5。
后台 Agent 1 — Git 提交记录采集(run_in_background: true)
repos 列表、gitAuthor、startDate、endDateconfig.repos 中每个仓库路径git -C {repo} log --author="{gitAuthor}" --after="{startDate}" --before="{endDate+1day}" --format="%H|%ad|%s" --date=format:"%Y-%m-%d"gitAuthor 支持 | 分隔的多个别名后台 Agent 2 — 飞书群聊消息采集(run_in_background: true,最重任务独占一个 Agent)
larkOpenId、startDate、endDatelark-cli im chats list --page-all --format json
从返回结果提取所有 chat_id。用户通常在数十甚至上百个群中,必须遍历全部群,禁止只取前几个或仅检查部分群。lark-cli im +chat-messages-list --chat-id {chat_id} \
--start "{startDate}T00:00:00+08:00" \
--end "{endDate}T23:59:59+08:00" \
--page-size 50 --format json
并行优化: 将全部群列表按每批 5-10 个分组,使用多个并行 Bash tool calls 同时拉取,大幅缩短总耗时。每批在一个 Bash 中用 for 循环串行调用,多批之间并行。larkOpenId 过滤每条消息的 sender.id(或 sender 字段),只保留自己发送的消息。汇总所有群的结果。content 在顶层,正确取法: message.content。严禁使用 message.body.content后台 Agent 3 — 飞书日历日程采集(run_in_background: true,补充数据源,scope 不足则跳过)
lark-cli calendar +agenda --start {startDate} --end {endDate} --format json
后台 Agent 4 — 飞书文档活动采集(run_in_background: true,补充数据源,scope 不足则跳过)
lark-cli docs +search --query "" --format json
Bash 并行调用 5 — 事项分类列表
GET {baseUrl}{apiPrefix}/pm/work-hour-matter/list?deptId={deptId}Authorization: {token}, tenant-id: {tenantId}Bash 并行调用 6 — 部门列表(辅助上下文)
GET {baseUrl}{apiPrefix}/system/dept/simple-listAuthorization: {token}, tenant-id: {tenantId}Bash 并行调用 7 — 医院/项目组别(辅助上下文)
POST {baseUrl}{apiPrefix}/pm/fcs/product-category/list-exclude-integratedAuthorization: {token}, tenant-id: {tenantId}, Content-Type: application/json{"pageSize":9999,"pageNo":1,"name":"","parentId":0}汇总: 所有后台 Agent 完成通知到达后,主线程收集 4 个 Agent 的返回结果 + 3 个 Bash 的返回结果,合并为完整的采集数据集,进入阶段 2.5。
数据采集完成后,必须执行自检,向用户展示自检报告:
数据采集自检报告:
- 群消息: 扫描 N 个群,获取 M 条本人消息 [OK/WARN]
- Git 提交: N 个仓库,共 M 条提交 [OK/WARN]
- 日历日程: N 条会议/日程 [OK/跳过(权限不足)]
- 文档活动: N 篇近期文档 [OK/跳过(权限不足)]
自检规则:
按工作日逐天生成日报条目:
内容合成: 将 git 提交 + 飞书消息 + 日历日程 + 文档活动合并,按项目/主题归类
分类匹配: 根据内容关键词自动匹配 matterId
工时分配: 每天总计 8h,按条目数等比分配
raw = 8 / N,每条向下取整到 0.5h(floor(raw * 2) / 2,最小 0.5h)remainder = 8 - sum(各条),从第一条开始每条补 0.5h 直到分完展示审核: 以表格形式逐天列出(使用单线框 ┌─┬┐│├─┼┤│└─┴┘ 绘制,严格对齐):
示例格式(输出时必须重新计算对齐):
📅 2026-03-28 (周五) | 分类 | 内容 | 工时 | | 需求开发 | 实现用户认证模块 | 4.0h | | 问题修复 | 修复登录超时问题 | 2.0h |
交互确认: 展示完所有日期的日报表格后,使用 AskUserQuestion 工具弹出确认面板:
问题: "以上日报内容已生成,请确认操作:" 标题: "日报确认" 选项:
确认提交 (Recommended): 描述: "内容无误,直接进入阶段 4 批量提交"
修改内容: 描述: "请在"其他"中说明需要修改的条目(如调整分类、工时、描述)"
补充条目: 描述: "请在"其他"中补充遗漏的工作内容"
取消: 描述: "终止流程,不提交任何日报"
用户选择修改内容或补充条目: 根据备注修改后,重新展示表格并再次弹出确认面板(循环直到用户选择确认或取消)
用户选择取消: 立即终止流程,输出"已取消日报提交"
用户确认提交后才执行:
Token 预验证: 在批量检查前先验证 token 有效性
GET {baseUrl}{apiPrefix}/system/auth/get-permission-infoAuthorization: {token}, tenant-id: {tenantId}检查已填日期: 调用查询接口检查每个目标日期是否已有日报
POST {baseUrl}{apiPrefix}/pm/staff-work-time-record/pageAuthorization: {token}, tenant-id: {tenantId}, Content-Type: application/json{"userId":{userId},"startDate":"{date}","endDate":"{date}","pageNo":1,"pageSize":10}按天提交: 对每个未填日期,将该天所有条目打包为一次请求
接口: POST {baseUrl}{apiPrefix}/pm/staff-work-time-record/create
Header: Authorization: {token}, tenant-id: {tenantId}, Content-Type: application/json
错误处理: 若提交时返回 401,立即重新登录并重试当前日期的提交(最多重试 1 次)
Body(一天一次请求,workList 包含该天所有条目):
{
"userId": 194,
"deptId": 125,
"recordDate": "2026-03-28",
"workList": [
{
"productItemId": 29,
"matterId": 28,
"matterName": "代码维护",
"matter": "代码维护",
"workHours": 4.0,
"remark": "实现用户认证模块"
}
]
}
workList 各字段说明:
productItemId: 项目 ID(从医院/项目组别列表获取)matterId: 事项分类 ID(从事项分类列表获取)matterName/matter: 事项分类名称workHours: 该条目工时remark: 具体工作内容描述结果汇总: 输出提交结果
日报提交完成
- 2026-03-24: 3 条已提交
- 2026-03-25: 2 条已提交
- 2026-03-26: (已跳过,此前已填写)
- 2026-03-27: 3 条已提交
- 2026-03-28: 2 条已提交
curl 命令执行lark-cli im chats list --page-all --format jsonlark-cli im +chat-messages-list --chat-id {id} --start "..." --end "..." --page-size 50lark-cli contact +get-userlark-cli calendar +agenda --start ... --end ...lark-cli docs +search --query "..."