# Dida Workflow

> 管理日常工作任务的待办和时间分配（基于滴答清单 CLI，需先装 @suibiji/dida-cli）。会话开始拉未完成清单当 to-do bar；任务 content 只记产出点与下一步计划；按前缀分组统计指定期间的工时（1 人天 = 7h）。

- Skill: `duanj0825/dida-workflow` (Agent Skill)
- Install (CLI): `npx skillmds@latest add duanj0825/dida-workflow`
- Raw SKILL.md: https://api.skillmd.com/api/skills/duanj0825/dida-workflow/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: duanj0825 (https://skillmd.com/u/duanj0825)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/duanj0825/dida-workflow

---


# Dida Workflow — 滴答清单工作流

用滴答清单管理日常工作任务：**待办清单** + **计划工时**。

> **首次使用先看 §前置：安装 dida CLI**。skill 依赖 `@suibiji/dida-cli`，未装则一切命令都跑不通。

## 前置：安装 dida CLI（首次使用）

本 skill 依赖官方 `@suibiji/dida-cli`。若终端里跑 `dida --version` 报 command not found，先装：

**1. 装 Node.js**（LTS 版本，https://nodejs.org）

**2. 全局安装 CLI**：
```bash
npm install -g @suibiji/dida-cli
dida --version   # 验证
```

**3. 登录**（二选一）：
```bash
# 方式 A：浏览器 OAuth（推荐）
dida auth login

# 方式 B：手动 token（无法开浏览器时用）
# 网页版滴答清单 → 头像 → 设置 → 账户与安全 → API 口令，创建后复制
dida auth token <YOUR_TOKEN>
```

**4. 确认**：`dida auth status`

**PATH 问题**：`npm install -g` 后仍然 `dida: command not found`，跑 `npm bin -g` 拿全局 bin 路径，加到 shell rc（`.zshrc` / `.bashrc`）或 Windows 环境变量。

**官方文档**：https://help.dida365.com/articles/7464976698707017728

## 何时启动

以下任一条件命中就走本 skill：

- 用户提到 TickTick / 滴答清单 / dida
- 用户说"开始 XX 任务" / "完成 XX" / "新建任务" / "查看今日待办"
- 用户说"统计工时" / "本周工时" / "上周工时" / "本月工时" / 具体日期区间
- 会话开始时用户表明进入工作模式（如"开始今天的工作"）

## 前置检查（每次会话首次调用）

CLI 已装、账号已登录的前提下，每个新会话首次触发本 skill 时跑一次：

```bash
dida auth status
```

- `command not found` → 引用户看 §前置：安装 dida CLI
- 未登录/过期 → 提示用户跑 `dida auth login`（**不代跑**，OAuth 交互只能用户自己做）

**projectId 获取**：
- 如果用户在本会话或项目 CLAUDE.md 中已告知 projectId，直接用
- 未告知则跑 `dida project list --json`，让用户挑一个（或默认"收件箱"）
- 记住这次会话选的 projectId，后续复用

## 核心规则

### 1. TickTick 只当任务状态机
TickTick 记录**任务标题、截止、状态、一行指针**。规划、根因、讨论、猜想**不进** TickTick—— 那些属于 doc / commit message / 聊天。

### 2. 任务 content 只记两类东西
- ✅ **实际产出点**：做了 XX / 交付 XX / commit XX / 部署到 XX
- ✅ **下一步计划**：后续要做 XX / 待跟进 YY / 阻塞在 ZZ
- ❌ 规划过程、根因分析、讨论记录、猜想（这些进 doc / commit message / 聊天）

**content 超过 5 行的信号**：说明该信息应该挪到 doc 里，TickTick 里只留指针（"详见 doc/xxx.md"）。

### 3. 会话开始主动拉一次未完成清单
用户进入工作模式时，拉当前 projectId 的未完成任务当 to-do bar：

```bash
dida task filter --projects <id> --status 0 --json
```

**只拉标题层**，别把每条 content 都读进上下文——按需 `dida task get` 拉详情。

## CLI 速查

```bash
# 清单
dida project list --json                                  # 所有清单
dida task filter --projects <id> --status 0 --json        # 未完成
dida task filter --projects <id> --status 2 --json        # 已完成
dida task filter --projects <id> --status 0,2 \
    --start-date YYYY-MM-DD --end-date YYYY-MM-DD --json  # 按截止日区间过滤

# 单条
dida task get <projectId> <taskId>                        # 详情（含 startDate/dueDate/completedTime）

# 创建
dida task create --project <id> --title "..."             # 新建
dida task create --project <id> --parent-id <pid> \
    --title "..."                                         # 子任务

# 更新
dida task update <taskId> --id <taskId> --project <id> \
    --title "..." --content "..."                         # 注意:同时要位置参数和 --id

# 完成
dida task complete <projectId> <taskId>
```

## 工时统计

### 触发词
"统计工时" / "本周工时" / "上周工时" / "本月工时" / "统计 YYYY-MM-DD ~ YYYY-MM-DD 工时"

### 口径
- **计划工时** = `dueDate - startDate`（不用实际完成时间，稳定）
- **1 人天 = 7h**（若有加班一周 > 5 人天，实报即可）
- **只统计已完成任务**
- **前缀分组**：正则抽 `【XXX】`，无前缀归"无前缀"组
- **分组顺序**：工时降序

### 执行

```bash
python <skill 目录>/scripts/worktime_report.py \
    --project <id> --start YYYY-MM-DD --end YYYY-MM-DD
```

脚本输出 markdown 报告到 stdout，直接贴给用户。**日期区间的语义是"截止日 dueDate 落在 [start, end] 内"**（含首尾）。

### 未完成任务的追问
脚本会在报告尾部列出**同区间内未完成的任务**。skill 侧根据用户回复决定：
- `y` → 循环 `dida task complete <projectId> <taskId>` 后**重跑脚本**
- `n` → 保持现状，报告已出完
- 具体 taskId → 只对这几条 complete，然后重跑

### 异常
脚本会单列以下情况（**不计入主统计**，只做提示）：
- 缺 `startDate` 的任务
- `startDate` 与 `dueDate` 不在同一天的任务（跨天）

## 反模式

- ❌ 代跑 `dida auth login`（OAuth 只能用户操作）
- ❌ 用 TickTick comment 当工作日志（commit message 是工作日志）
- ❌ 假设 TickTick 状态实时——`update` / `complete` 前必要时先 `get` 一次防冲突
- ❌ 把根因分析、设计决策、猜想塞进 task content
- ❌ 手动累加工时——总用脚本，避免人肉出错
- ❌ 把已完成任务的 close 当"项目记账"（真账本是 commit / doc / 修正库）

## token 过期处理

```bash
dida auth status
```

过期就让用户跑 `dida auth login`，Claude 不尝试任何认证操作。

