关于 cawplan-my-work
用于查询和整理个人 CawPlan 工作项的技能,适合需要查看待办、关键问题及工单状态变化的用户。它支持按项目范围筛选,并规定了状态变更、重开记录和关联代码链接的核验流程。
主要功能
- 01按产品线、产品和版本分组待办
- 02查看个人关键问题
- 03按状态类别筛选未完成工单
- 04核验工单状态变更与重开记录
- 05查找工单关联的 PR 和 commit
适用场景
- 01查看个人待办并缩小到指定版本
- 02按优先级整理未完成工单
- 03汇总某日的工单状态变化
- 04查找已有 PR 或 commit 但状态未更新的工单
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cawcut/ skill-cawplan --skill cawplan-my-work安装后在 Claude Code 中输入/cawplan-my-work确认已加载。
附带文件references/QUERY_RESILIENCE.md
详细介绍
CawPlan 我的工作
初始化
cawplan skill check
工作流
-
解析你自己的
user_id——它从本地访问令牌中解码,无需网络调用:cawplan auth status读取输出中的
User ID:行。如果缺失,请重新进行身份验证(运行cawplan auth login,向用户显示打印出的 URL;用户批准后,再运行cawplan auth login --device-auth --complete),不要改用cawplan users query --email——那会为了解析一个auth status本应已提供的信息而消耗一次网络调用。 -
获取你的待办事项:
cawplan todos user <user_id>返回的数据包括
tickets(按product_line→product→version分组)、critical_issues(按product_line→product分组)和summary。默认不应用状态筛选——响应包含所有分配给你的事项,而不仅是未完成事项。 -
如果用户指定了某个项目/版本,将
tickets缩小到对应的确切product→version叶节点。critical_issues没有版本维度(仅按product_line→product分组),因此无法缩小到相同粒度——如果用户指定了版本,只将critical_issues缩小到匹配的 product,并明确说明这些严重问题适用于整个产品,尚未确认与指定版本有关。如果指定的项目/版本在tickets中完全没有出现,请明确说明(“你在 下没有找到工单”),而不要退而展示所有内容。 -
如果用户只要未完成事项,需要解析响应中每个不同产品线的状态类别,并正确筛选——这是你自己的工作,实际涉及的产品线只有几条,不值得走捷径:
cawplan product-lines statuses <product_line_id> # once per distinct product line in the response排除状态键对应类别为
COMPLETE或CANCELED的工单。只有当需要解析的产品线数量确实过多(一个人自己的工作中很少出现)时,才改为“清楚列出每项的状态,让用户自行判断”;如果这样做,请明确说明,而不要默默展示未筛选的列表,假装已经筛选过。 -
按优先级排序的平铺列表(仅当用户要求“按优先级列出我的未完成工单”或类似的按优先级排序格式,而非按项目/版本分类时):将所有产品线/产品/版本中的
tickets平铺为一个列表。即使用户没有明确说明,这种表达也意味着只显示未完成事项——请执行步骤 4 的筛选。然后按CRITICAL→HIGH→MEDIUM→LOW排序。每一行仍须显示工单所属的产品/版本——为排序而平铺分组,不代表可以省略该上下文。
5a. 我的某一天或某个时间段内的任务完成/状态变更摘要(仅当用户要求“帮我总结今天的任务完成情况”“今天哪些任务状态变更了”或类似内容时):这不是步骤 2 中的当前待办事项视图。默认时间范围为今天;如果用户明确指定日期/范围,则按其指定执行。
cawplan tickets search --assignees <user_id> --start_date 2000-01-01 --end_date <today> --updated_start_date <window_start> --updated_end_date <today> --page_size 100 --page_num 1
使用 total 完整翻页。updated_at 时间范围只用于筛选候选项:子工单发生变化时,父工单可能会刷新,即使父工单自身的状态并未改变。
然后批量获取候选项的状态变更,每次最多 50 个 ID:
cawplan tickets changes --unique_ids <candidate_ids_csv> --fields status --start_date <window_start> --end_date <window_end>
返回的每个事件都是时间范围内真实发生的状态变更(at、old → new、new_category)。只有至少有一个事件的工单才应保留。不要将 updated_at 用作最终依据。每个工单只报告一次,并使用其时间范围内最新的事件;未发生状态变化的父工单没有事件,应予以排除,即使其记录因子工单的状态变更而刷新。
回退方案(仅当 tickets changes 不可用时,参见 references/QUERY_RESILIENCE.md):
对每个候选项,获取 cawplan tickets history <product_id> <version_id> <ticket_id>,只有当某条 UPDATED 记录包含 changed_fields.status(新状态字符串或 {old, new} 对象),且其 created_at 位于时间范围内时,才保留该工单。CREATED 不属于状态变更。
6. 我重新打开的工单(仅当用户询问重新打开的工单/工单为何被重新打开时):没有 REOPENED 状态类别(只有 UNSTARTED/STARTED/TESTING/COMPLETE/CANCELED)——重新打开会显示为名称表明这一点的状态键,或显示为从终止类别向后转换的历史记录。扫描历史记录(要点 2)始终是事实依据;检查状态键(要点 1)只是常见情形下的快捷方式,即工单当前处于重新打开状态时使用——它不能取代扫描历史记录。
- 使用
references/QUERY_RESILIENCE.md(“Reopens”)中定义的通用规则和命令查找重新打开的工单,无论工单当前状态如何,都要检查你名下的每一张工单:使用--unique_ids <ticket_ids_csv>限定调用范围(每次调用最多 50 个 ID),并默认查询最近 90 天(--start_date <today-89d> --end_date <today>)——请说明这一点;只有用户询问更早的重新打开记录时,才添加更早的 90 天时间段。如果用户询问某张变更无法分类的特定工单,请在不使用这两个类别过滤条件的情况下重新运行,并按顺序查看其事件。如果无法使用tickets changes,则回退为:对每张工单分别运行cawplan tickets history <product_id> <version_id> <ticket_id>。 - 仅将解析每个不同产品线的状态(
cawplan product-lines statuses <product_line_id>)作为辅助标记,检查重新打开转换后工单的状态是否在display_name中包含“reopen”——如果包含,可以在报告中将其称为“重新打开”;如果不包含(例如工单直接回到in_progress或TESTING),根据历史转换,它仍属于重新打开,只需报告实际状态名称,不要假定存在专门的标签。 - 对于每次重新打开事件,如果历史记录中有时间戳和操作者,请一并报告原因:如果 API 在状态变更事件中返回了历史记录自身的评论,且该评论很可能与这次特定转换有关,请使用该评论(不要把与转换无关的通用自由文本评论说成是重新打开原因);否则回退使用工单的
progress_comment,并明确标注为“最新进度备注,不一定是重新打开的原因”,不要把它说成是直接解释重新打开的原因。如果两者都不存在,请说明未记录原因——不要根据工单标题或描述推断原因。如果某张工单的变更查询失败,请将其列为“未检查”(这是部分结果,见references/QUERY_RESILIENCE.md),不要说成“未发现重新打开”,也不要据此认定原因缺失。
-
我负责的 ticket 关联的仓库 PR/commit(仅在用户询问时——“今天的 tickets 及其 PR/commit”、“整理我当天任务涉及的 tickets 和 PR/commit”):ticket 带有一个
links[]数组,其中可以包含 GitHub PR/commit URL(字段格式见references/CAWPLAN_OPEN_API.md中的“VersionTicket fields of note”)——todos/poll不会返回此字段,只有完整的 ticket 记录才会返回,因此此步骤使用tickets search,而不是步骤 1-6 中的todos调用。cawplan tickets search --assignees <user_id> --start_date 2000-01-01 --end_date <today> --updated_start_date <date> --updated_end_date <date> --page_size 100 --page_num 1除非用户要求其他日期/范围,否则将
<date>-<date>默认设为今天,用于--updated_start_date/--updated_end_date;除非结果集能证明并非如此,否则将结束日期视为包含当天全天。对于“今天的 tickets”,使用--updated_start_date/--updated_end_date,而非--start_date/--end_date——后者筛选的是 ticket 的创建时间(已通过example-backend的 DAO 确认,见references/CAWPLAN_OPEN_API.md),因此上周创建、今天仍在处理的 ticket 会被悄然漏掉。仍必须传入--start_date/--end_date(该端点要求提供created_at时间窗口或--time_range)——将其设为最大窗口变通范围(2000-01-01至今天),以免它本身缩小结果范围。 链接上的platform不是可靠的固定值——同一个手动添加的 GitHub 链接可能显示为platform: "LINK"——因此应根据url本身分类:包含/pull/→ PR,包含/commit/→ commit,否则将其作为普通链接并报告其title。links数组为空的 ticket 没有仓库链接;应明确说明,而不是从报告中省略。 根据响应中的total/page_num/page_size字段翻页(当page_num * page_size < total时继续获取),而不要假定 100 条的一页就能覆盖所有结果。 -
Ticket 已关联 PR/commit,但状态尚未更新(仅在用户询问时——“哪些 ticket 已经有 PR/commit 但状态还没更新”):复用步骤 7 的获取机制和分页规则,并添加
--status_categories UNSTARTED,STARTED。范围:如果用户指定了产品/版本,则使用--product_ids/--version_ids,而不是--assignees;如果用户明确说“我”/“自己的”,则使用--assignees <user_id>。如果两者都未指定,默认查询你自己的 tickets(--assignees <user_id>),并说明这一点。使用--start_date 2000-01-01 --end_date <today>,因为过期的 tickets 可能不是最近创建的。- 当某个 ticket 的任意
links中有url包含/pull/或/commit/时,即视为“有 PR/commit”——两者都算,因为未合并为 commit 引用的开放 PR,也和单独的 commit 链接一样,能表明代码工作正在进行。 - 对每个符合条件的 ticket,报告找到的 PR/commit 链接(并标明各自是 PR 还是 commit,分类方式同步骤 7)及其当前状态,以便用户判断该 ticket 是否确实需要更新状态。
- 当某个 ticket 的任意
输出
- 按产品线 → 产品 → 版本分组,与 API 自身的分组方式一致;不要将其重新扁平化为一个不加区分的列表,除非已执行步骤 5,此时应改为呈现按优先级排序的单一列表(每行仍显示产品/版本)。
- 对于每个工单:显示 ID、类型、优先级、状态和单行标题。
- 严重问题:单独设立章节,按产品线 → 产品分组,并显示严重程度/状态。
- 如果响应中包含
summary,且步骤 3 未缩小范围,则将其置于开头 —summary描述的是未经缩小范围的完整响应,因此将其与缩小范围后的列表一同展示会造成内容矛盾。缩小范围后,应改为说明该范围内的数量(例如:“UniFi Access 4.1.10 有 1 个工单、1 个产品级严重问题”)。 - 如果步骤 3 缩小了范围,应在列出结果前说明缩小后的范围。
- 如果确实没有分配给你的内容,请直接说明,而不是返回没有任何说明的空章节。
- 如果任何查询、分页或批次未能完成,请在列表前说明已核实和未核实的内容(
references/QUERY_RESILIENCE.md)。按照references/QUERY_RESILIENCE.md§5 的规则撰写答案:不要包含 CLI 命令、内部字段名或推理文本。 - 如果已执行步骤 6:每个重新打开的工单列一项(显示 ID、标题、重新打开时间、重新打开者(如已知)、原因或“未记录”)。如果没有你的工单被重新打开,请明确说明,而不是显示空列表。
- 如果已执行步骤 7:对获取时间范围内的每个工单列一项,并列出其 PR/提交/其他链接(或“没有代码仓库链接”);日期字段的假设只需说明一次,无需逐个工单说明。
- 如果已执行步骤 8:每个符合条件的工单列一项 — 显示 ID、标题、当前状态,以及触发标记的 PR/提交链接。如果没有符合条件的工单,请明确说明。
- 如果已执行步骤 5a:仅列出经历史记录核实的状态变更,并显示 ID、标题、可用时的旧状态 → 新状态、变更时间戳,以及新状态是否为终结状态。说明未发生变化的父工单会被有意排除。
参考资料
references/CAWPLAN_OPEN_API.mdreferences/QUERY_RESILIENCE.md