# Changelog All notable user-visible changes are recorded here. The project is released through pinned GitHub tags and does not publish to npm. ## [Unreleased] ## [0.9.1] - 2026-10-09 ### Changed - 为上架 DSH Hub(只校验仓库根 `package.json` 的 `dsh.bundle`),仓库根清单同时声明 dsh 组合包;删除 `dsh-plugin/package.json`,dsh 包名改为 `dida-todo`,安装地址简化为 `github:ztllll/dida-todo#v0.9.1`。Pi 安装方式与行为不变。 - GitHub 仓库新增 `dsh-plugin`、`dsh`、`deepseek-harness` topic,供 DSH Hub 自动收录。 ## [0.9.0] - 2026-10-09 ### Changed - dsh 版改为标准组合包 `dida-todo-dsh`(仓库 `dsh-plugin/` 目录,`package.json` 声明 `dsh.bundle`),用 `dsh plugin add` 或插件页「添加插件」安装,出现在插件页「已安装」中,可停用、可卸载。配置层只 `insert` 一行插件,不覆盖或禁用 dsh 自带的 `todo_write`、goal、任务面板;卸载后整层移除,dsh 恢复原样。dida CLI 作为组合包自身依赖安装,不再需要软链 Pi 的安装目录。 - 依赖 `@suibiji/dida-cli` 升级到 ^0.1.14。 ### Fixed - dsh 重启或崩溃后恢复会话时,dsh 在插件监听之前补写 `turn/end: interrupted`,插件收不到;现在接管会话时检查最后一个回合,30 分钟内中断且仍有未完成工作的会续跑。 ### Verification - 隔离 profile 中 `dsh plugin add` 本地 tarball:bundle 列表新增 `dida-todo-dsh`,`--dump-config` 出现 `dida-todo` 行;`dsh plugin remove` 后该行消失,`tool-todo`(dsh 自带 todo_write)始终保留。 - hbhy 生产 web profile 用 `dsh plugin add` 安装,替换此前手工 `~/.dsh/cordis.patch.yml` 挂载;重启后插件加载并绑定会话。 ## [0.8.1] - 2026-10-09 ### Added - dsh 界面显示滴答 Checklist:`todo` 每次调用及每个新回合开始时,把当前滴答工作的步骤写成 dsh `todo/write`,由 dsh 自带的输入框上方“任务”面板展示(完成 / 进行中 / 待办),效果与 Pi 的 Todo 面板一致;skipped 显示为已完成。 - dsh 已绑定滴答的会话注入一段系统提示,让 agent 对多步工作使用 `todo`(同步滴答 + 面板)而非 dsh 自带 `todo_write`;未绑定会话不注入。 ### Verification - hbhy 真实 dsh-web(Chrome 浏览器):新建工作区会话下达三步任务,agent 自行调用 `todo create/update`;任务面板依次显示「2 已完成 · 1 进行中」到「3 已完成」并列出三个步骤;滴答侧顶层任务自动完成并生成待验收(+3/+6 分钟提醒)。 ## [0.8.0] - 2026-10-09 ### Added - dsh(DeepSeek Harness)插件:`npm run build:dsh` 生成单文件 `dist/dsh/dida-todo.mjs`,经 `~/.dsh/cordis.patch.yml` 挂载。复用与 Pi 相同的核心:cwd 绑定、`todo` / `todo_work`、全部子项完成后自动收口与待验收、`wait_for_human`。 - dsh 会话中断自动续跑:回合以 `error`(content_filter / 429 / Overloaded)或 `interrupted`(崩溃)结束且会话有未完成工作(本会话推进的滴答工作、未完成 goal、未完成 `todo_write`)时,按 30s/1m/2m/5m/10m 退避自动续跑;被官方驱动器解除的 goal 先重新激活;连续 5 次失败后在滴答建 `🙋` 提醒。人类消息会撤销待发续跑。 - `repository.createHumanReminder`:没有滴答工作可挂起时,直接在绑定清单建 `🙋` 提醒。 ### Changed - 核心模块去掉对 Pi 运行时的静态依赖(`withMutationQueue`、本地 `StringEnum`、`CommandRunner`、TUI `Text` 由 Pi 入口注入),Pi 行为不变。 ### Verification - 真实 dsh 0.2.0-rc.2(隔离 `DSH_HOME`、sdk profile、`llm/stream` 注入故障)端到端:content_filter 中断后 1 次续跑完成全部 `todo_write` 项;持续 429 时续跑 2 次后在真实滴答生成 `🙋` 提醒;无故障时子项全完成后顶层自动完成并生成待验收。 - hbhy 生产数据:windows-image-project 会话 116 轮里 41 轮非正常结束(34 次 content_filter),全部靠人工输入“继续”恢复,最长中断 7 小时。 ## [0.7.0] - 2026-10-09 ### Added - `todo_work wait_for_human`:任务必须由人确认/授权/决策才能继续时挂起。滴答优先级清零(轮询不再领取、不再每 10 分钟刷屏),新建 `🙋 需要你处理` 提醒(+3/+6 分钟两次),写原因评论,任务保持未完成。用户在滴答改回优先级(同步时自动识别)或让 Agent `resume` 即恢复,提醒自动完成。 - 轮询兜底:队列自上次唤醒后没有任何变化(无进展、无用户编辑、无新实例)时不再重复唤醒 Agent。 ### Fixed - Checklist 子项全部完成后顶层任务一直挂着:以前只有 `in_progress` 会接管当前实例,Agent 直接把子项标 completed 时,循环任务的新实例、以及先无优先级后补设优先级的任务都不具备收口资格。现在 completed/skipped 也会接管当前实例,草稿补设优先级后可重新接管,顶层任务与待验收照常自动生成。 ### Changed - `todo` create/update 的返回结果附带当前 Checklist 和剩余未完成项,防止 Agent 把首项重复写进 `items` 后漏勾、导致顶层任务挂着;`items` 参数说明明确只放第 2..N 项。 - `todo` 工具说明改为可判定的建表条件:用户要求追踪、3 个及以上交付步骤、跨轮/跨会话、后台执行需验收;并明确顶层任务自动收口、阻塞时用 `wait_for_human`。 - 文档合并:`AGENTS.md` 作为唯一开发/Agent 规范(领域词汇、模块地图、宿主模式、规则、发布流程);README 精简为用户文档。删除 `CONTEXT.md`、`DEVELOPMENT.md`、`CONTRIBUTING.md`、`extensions/dida-todo/README.md` 和整个 `docs/`(含暂缓的多 CLI 研究)。 ### Verification - 在 Pi 1.1.0 TUI + 一次性滴答清单上实测:轮询领取阻塞任务后 Agent 自行调用 `wait_for_human`(优先级清零、🙋 两次提醒、任务未完成);滴答改回优先级后自动恢复并完成提醒;子项直接标完成时顶层自动完成并生成待验收;简单问答不建 Todo;多步骤请求 Agent 主动建 Checklist 并收口。 ## [0.6.40] - 2026-10-03 ### Fixed - Web/RPC 宿主恢复挂载 Todo 面板:`session_start` 此前在 `mode !== "tui"` 时无条件走被动分支,导致 pi-web 等 RPC 宿主完全不渲染 Checklist。现在 TUI 与 Web/RPC 都会挂载 Overlay 并同步滴答;Print/JSON(`hasUI=false`)保持被动,未绑定目录仍不访问滴答,RPC 也不再解析 tmux binding。 ### Changed - 自动轮询仍只在 TUI 会话启动。RPC 宿主没有真实空闲信号(Pi 在 RPC 下 `ctx.isIdle()` 恒为 true),在那里启动会让每个浏览器会话周期性自动领取并执行队列。 ### Verification - 新增回归测试覆盖已绑定 Web/RPC 启动必须调用 `setWidget`;撤掉修复后该测试失败、其余 6 项通过,确认可红。 - 224 项测试通过(223 passed + 1 opt-in real-Dida gate skipped);typecheck、包结构、dry-run 打包、凭据扫描均通过。 ### Notes - 宿主:Pi(TUI 与 RPC/Web);在 Pi 1.0.1 + `@agegr/pi-web` 0.8.9 上验证。 - 已知降级:Pi 自带 `--mode rpc` 的 CLI 客户端会忽略组件工厂(只接受 `string[]`),这些宿主仍看不到面板;pi-web 自行实现了工厂渲染,不受影响。 - 升级后需重启会话或 `/reload` 才会挂载面板。 ## [0.6.39] - 2026-09-10 ### Changed - 收紧 Todo 判定标准:只有工作需要存活到本次对话之外(明确要求追踪、跨轮/跨会话实施、后台执行后验收)才建 Todo;安装 skill/依赖、跑命令、单文件小修等几分钟内可完成并验证的轻量任务,直接执行并报告,禁止建 todo。 ### Added - 结果上清单:完成步骤时 `metadata.resolution`(改了什么、关键文件、如何验证)作为步骤评论写入滴答;工作收口时自动追加一条逐步骤汇总评论(完成/跳过 + 结果),手机端不开终端即可阅读全部交付结果。 ## [0.6.38] - 2026-09-10 ### Added - `/reload` 不再失忆:会话启动(含 reload)在没有 previousSessionFile 时从当前会话文件重放最后一条 Todo 快照,面板与选中工作跨 reload 保留。 ## [0.6.37] - 2026-09-10 ### Added - 会话启动韧性:TUI 会话无条件挂载 Todo 面板(不再依赖滴答同步成败);绑定会话在首次同步前先从上一个会话 JSONL 重放最后一条 Todo 快照,面板和工具立即可用;首次同步失败时面板显示本地状态、Poller 继续周期重试自愈,选中工作在重同步后保留。 ### Changed - 绑定会话内 LLM 对 `todo` 工具拥有完全调用权限:撤销逐轮 `trackingReason` 正则授权门(此前合法请求会被“允许值=none”拒绝);仅凭 `subject` 即可创建新工作,默认 `workType=checklist`、`workPriority=medium(3)`;`workTitle` 缺省时以 `subject` 兼作汇总标题;`trackingReason` 降级为可选审计 metadata。未绑定会话拒绝并引导 `/dida-bind`。队列扫描门不变:精确口令 `检查todo` 与可信 Poller 依旧唯一授权整队列,优先级策略原样保留。 ## [0.6.36] - 2026-09-07 ### Added - `todo create` 新增 `items[]` 参数:一次调用即可建立完整多层级 Checklist 工作(`workTitle` 顶层 + `subject`/`items[]` 按顺序成为可勾选 Item),LLM 不再需要多次调用逐步搭建层级;schema 描述同步明确 `workType`/`workPriority`/`workTitle` 的必填性,promptGuidelines 新增正向创建示例。 ## [0.6.35] - 2026-08-20 ### Fixed - Make Dida optional at session startup. Unbound directories and every Web/RPC/Print session now enter passive mode without Dida CLI calls, binding dialogs, project creation, or Poller startup. Bound TUI sessions continue to synchronize asynchronously; Dida failures only show a warning and never block Pi startup. ### Added - Add `/dida-bind [分组名称]` as the explicit binding entrypoint. It prompts for a name when omitted, binds one unique exact match, or creates only the exact user-entered name after login. ## [0.6.34] - 2026-08-20 ### Fixed - Make clear Dida direct tasks without Checklist take a single-step completion path: create one visible step that directly carries out the top-level objective, complete it immediately, and automatically close the source task. The queue contract now forbids unnecessary investigation, diagnosis, task splitting, or test-work creation for these direct actions. ## [0.6.33] - 2026-08-20 ### Fixed - Prompt Interactive/TUI users to start Dida OAuth when no login is available, then immediately continue to the required user-named group bind/create flow. Login failure now reports an authorization error instead of exposing an uninitialized Todo runtime as a queue failure. ## [0.6.32] - 2026-08-20 ### Changed - Remove all automatic Dida project-name derivation and automatic project creation paths. An unbound Interactive/TUI session now prompts for a group name; it binds one unique exact match or creates only that exact user-entered name. Cancelled input creates nothing, and duplicate names require an explicit project ID. ## [0.6.31] - 2026-08-16 ### Fixed - Stop automatic Dida project creation by default. Unbound cwd and tmux targets now remain unbound until the user explicitly provisions or binds them, preventing temporary directories and extra panes from creating unrelated lists. - When explicitly enabled, automatic provisioning requires one unique tmuxbot binding and derives the project identity from hostname, IM channel, and route name. Bindings are read from the standard tmuxbot YAML file, so Telegram and Feishu routes named alike cannot share a Dida list or create guessed duplicates. ## [0.6.30] - 2026-08-16 ### Fixed - Automatically complete the top-level Dida task once every visible Direct Work or Checklist step is completed or intentionally skipped. The same rule now applies during mutation, synchronization, and Agent settlement, preventing completed work from being claimed repeatedly by the Poller. `keepOpen` remains the explicit opt-out when the user requires the top-level task to stay open. ## [0.6.29] - 2026-08-15 ### Fixed - Treat Dida title, description, and body as the current semantic source of truth on every synchronization. When the user edits that top-level content, clear stale local `skipped` and `keepOpen` decisions, reopen the affected unchecked Items, and inject the latest complete task into the next authorized queue check. - Persist a compact semantic snapshot for Dida-origin work so extension-authored Checklist description normalization does not falsely reopen intentionally skipped Items when the user has not changed the task. ## [0.6.28] - 2026-08-15 ### Fixed - Add an explicit local `keepOpen` delivery policy for tasks whose user requires the top-level Dida task to remain incomplete after selected Items are delivered. `skipped` Items stay unchecked, the Poller treats the work as settled, and settlement/startup repair no longer creates acceptance or completes the source until the user explicitly requests whole-work completion. - Explicit `finish_current` clears `keepOpen`, so a previously held-open task can still enter the normal acceptance flow later without changing its user-authored Checklist text. ## [0.6.27] - 2026-08-15 ### Fixed - Reconcile multiple Checklist Items with the same title one-to-one when Dida rewrites every Item ID. A single completed remote Item can no longer mark every same-title local step complete or duplicate the remaining Items. - Persist the final server-assigned Item IDs after adoption, creation, rework creation, and every Checklist mutation. Queue synchronization also repairs historical expanded local state from the authoritative remote Checklist without rewriting user-authored text. ## [0.6.26] - 2026-08-15 ### Fixed - Keep Print/RPC child sessions from inheriting an Interactive pane's `TMUX_PANE`, provisioning during startup, overwriting the production tmux binding, or starting a background Poller. They now initialize only a passive cwd-bound Runtime with no startup Dida sync; exact `检查todo` and explicit setup remain available without borrowing the parent TUI's tmux identity. - Validate configured project IDs against the current Dida project list before choosing a binding. If an exact tmux binding points to a deleted project while the same cwd still has a valid binding, automatically fall back to that project and persistently repair the tmux alias instead of silently polling an empty normalized response. ## [0.6.25] - 2026-08-15 ### Fixed - Persist a recovered original user description into local work metadata on the next Checklist mutation, and use the same recovery during final acceptance-result updates. Historical tasks no longer lose their original description after final-response materialization, while the task body still appears exactly once and abandoned progress blocks remain removed. ## [0.6.24] - 2026-08-15 ### Fixed - Reuse one Human Task Surface normalization path for Checklist mutations and acceptance creation. Historical combined descriptions now contribute only the original user description, while the task body appears exactly once in the acceptance report; abandoned live-progress blocks and accumulated body copies no longer leak into human-facing acceptance text. ## [0.6.23] - 2026-08-15 ### Fixed - Normalize empty Dida project responses at the CLI Gateway boundary. Missing or `null` `tasks`/`columns` now become empty arrays and a missing `project` becomes a minimal project keyed by the requested ID, preventing Pi startup/reload from failing with `data.tasks is not iterable` on empty bound lists. ## [0.6.22] - 2026-08-15 ### Fixed - Clean historical descriptions produced by the abandoned live-progress experiment: remove its exact `当前进展` / `已处理 n/m 项` block, then collapse all duplicated trailing task body copies to one on the next Pi mutation. Normal stored user descriptions remain authoritative. ## [0.6.21] - 2026-08-15 ### Fixed - Keep Pi Checklist descriptions idempotent across repeated create/update mutations: persist the original user description locally, append the task body exactly once, and automatically collapse historical trailing duplicates on the next mutation. ## [0.6.20] - 2026-08-14 ### Added - Add a local `skipped` terminal state for Checklist Items that the user explicitly wants left unchecked or that are not applicable. Skipped Items remain unchecked in Dida, count as settled for queue/finalization purposes, carry a human-readable resolution, and no longer cause the Poller to repeatedly reclaim an already-delivered visual state. ## [0.6.19] - 2026-08-14 ### Changed - Keep Dida-visible titles, descriptions, bodies, Checklist Items, resolutions, progress comments, and acceptance reports strictly human-readable. Agent guidance now forbids chain-of-thought, investigation narration, test scaffolding, prompts, managed JSON, runtime IDs, and lifecycle fields in user-facing task text. - Move work metadata and acceptance/source/rework links into an atomic same-host JSON state store. Legacy managed blocks in Dida `content`/`desc` remain readable as migration input and are removed from the remote task on synchronization while preserving the user's original description and body. - Persist promoted Checklist body text as clean human-readable Dida description content, because Dida clears Checklist `content`; the structured original fields remain recoverable from local state without exposing machine data. - Generate each acceptance report from that source task's own objective and completed results instead of copying the whole queue's final conversation into every acceptance. Legacy acceptances with visible source IDs are migrated to concise per-task reports. ## [0.6.18] - 2026-08-14 ### Fixed - Persist managed metadata for Checklist work in Dida `desc` instead of `content`, because Dida asynchronously clears `content` when a TEXT task is promoted to CHECKLIST. This keeps promoted work readable and completable after server normalization. - Reconcile Checklist Item IDs from the persisted task after Dida rewrites IDs, while preserving the user's original title, description, body, and Checklist text. Existing content-based managed Checklist work remains readable and migrates on its next mutation. ## [0.6.17] - 2026-08-14 ### Changed - Make the claimed-task contract explicit: every user-created Dida task must expose at least one visible Checklist Item before formal LLM execution, even for a one-step plan. Queue payloads now mark Dida-origin Direct Work with `mustCreateVisibleChecklistStep`, while Pi-origin Direct Work keeps its internal execution-step semantics. - Document the normalization model: the LLM derives precise actionable Items from the user's top-level title, description, body, and existing Checklist; user-authored Item text is immutable, and LLM-authored Items are appended to the same top-level task. ## [0.6.16] - 2026-08-14 ### Fixed - Promote user-created Dida Direct Work to Checklist Work as soon as the LLM adds execution steps, and migrate previously decomposed active Direct Work on its next mutation. This keeps Dida `items[]` aligned with the TUI instead of hiding the visible step list only inside managed metadata. ## [0.6.15] - 2026-08-14 ### Fixed - Preserve the Poller-issued `current_work_step` tracking grant when its trusted extension follow-up enters the input pipeline, so automatically claimed Direct Work can create execution steps and complete normally. ## [0.6.14] - 2026-08-13 ### Changed - Restore idle automatic claiming for due, unfinished Dida work with priority low/medium/high. The trusted Poller checks immediately on binding activation and every 10 minutes by default, stays silent while Pi is busy or messages are pending, grants only its generated follow-up turn queue access, and continues to skip priority-0 drafts, acceptance-only queues, future work, and expired occurrences. - Keep exact `检查todo` as the immediate manual trigger while preserving the authorization barrier against LLM-initiated scans, ordinary Todo mutations, and near-match phrases. ### Documentation - Add a first-party feasibility study for OpenClaw, Claude Code, and Codex CLI. Record the decision to keep the accepted Pi adapter isolated while introducing a future host-neutral Todo Engine, per-host packages, one-time host-scoped Turn Grants, and default per-adapter project namespaces. No non-Pi adapter is implemented or deployed. - Add `DEVELOPMENT.md` and an executable multi-CLI adapter development guide with repository entry order, module map, target interfaces, per-host hook mappings, TDD phases, security gates, test matrix, issue/PR/handoff templates, and Definition of Done so another LLM can start from verified constraints instead of repeating the research. - Clarify recurring task scheduling: synchronization can observe a future occurrence, but priority never bypasses the task-local date/time gate. Timed tasks execute only on the scheduled day at or after `startDate` (falling back to `dueDate`); all-day tasks use only the calendar-date gate. - Document the safe live-upgrade boundary: installing a Git package replaces the shared checkout and dependencies but does not reload existing Pi processes. Busy sessions must become idle before installation and then use `/reload` or a new process. ## [0.6.13] - 2026-08-13 ### Fixed - Scope foreground queue synchronization to the input event's session Runtime instead of whichever TUI session is currently active. - Restore exact `检查todo` injection for print/RPC and multi-session use without weakening the exact-phrase authorization gate. ### Verification - 178 default tests passed; one isolated real-Dida candidate test remains opt-in. - TypeScript, package structure, dry-run packaging, credential scanning, and production dependency audit passed. ## [0.6.12] - 2026-08-13 ### Changed - Require the trimmed user input to equal `检查todo` before scanning or switching the top-level queue. - Add a second authorization gate to `todo_work list/switch/next/refresh`; Todo mutations and unprivileged `finish_current` no longer scan or switch unrelated work. - Make the legacy background Poller permanently silent. - Batch related requirements from one user request into one top-level work, one final response, and one human-acceptance task. Appending a new Item revokes stale ready-for-acceptance state. - Separate Direct and Checklist title semantics and remove duplicate title/description rendering from the Overlay and `/todos`. - Require every Pi-created top-level work to choose low/medium/high priority (1/3/5). Reserve priority 0 for user drafts and migrate historical Pi priority-0 work to low under the same-host lock. - Preserve task text links as untrusted input and document that Dida's public OpenAPI has no native attachment upload/download surface; use the active Telegram/Feishu transport for files. ### Verification - Real isolated Pi runs confirmed that Todo mutations do not invoke `todo_work`, near-match phrases do not scan, exact `检查todo` injects the queue, and a new Direct work is stored as priority 1 and kind `TEXT`. ## [0.6.11] - 2026-08-12 ### Changed - Namespace newly provisioned Dida projects by hostname and exact IM route when tmuxbot inventory can identify it safely. - Preserve existing exact bindings without migration or duplicate creation. ## [0.6.10] - 2026-08-12 ### Changed - Separate Direct Work from Checklist Work completion semantics. - Before completing a Checklist top-level task, reread, complete, and verify all remote Items. ## [0.6.9] - 2026-08-12 ### Changed - Introduce explicit `direct | checklist` work types. - Keep Direct execution steps in managed metadata instead of remote Dida Checklist Items. ## [0.6.8] - 2026-08-12 ### Changed - Require a durable tracking reason before `todo create` can write remote state. ## [0.6.7] - 2026-08-12 ### Fixed - Move finalization to the settled boundary so additional same-request Items cancel premature acceptance. ## [0.6.6] - 2026-08-12 ### Changed - Allow Pi to append steps to one user Checklist while protecting the user's original Item text and structure. - Rank executable work high to low while preserving Dida order within the same priority. ## [0.6.5] - 2026-08-12 ### Changed - Materialize acceptance results in two phases and backfill the exact final user-visible response after the agent settles. ## [0.6.4] - 2026-08-12 ### Changed - Gate automatic rework on the Dida comment `userId` matching the system guidance comment author. ## [0.6.3] - 2026-08-12 ### Changed - Use two human-acceptance reminders at completion +3 and +6 minutes. ## [0.6.2] - 2026-08-11 ### Fixed - Inject and display complete top-level title, description, body, and Checklist data instead of reading Item titles alone. ## [0.6.1] - 2026-08-11 ### Changed - Keep the active work's complete Checklist visible in the Overlay until another work or session replaces it. ## [0.6.0] - 2026-08-11 ### Changed - Introduce lifecycle-aware metadata, occurrence-safe finalization, mandatory acceptance, same-host cross-process locks, and real-Dida release validation. [Unreleased]: https://github.com/ztllll/dida-todo/compare/v0.9.1...HEAD [0.9.1]: https://github.com/ztllll/dida-todo/tree/v0.9.1 [0.9.0]: https://github.com/ztllll/dida-todo/tree/v0.9.0 [0.8.1]: https://github.com/ztllll/dida-todo/tree/v0.8.1 [0.8.0]: https://github.com/ztllll/dida-todo/tree/v0.8.0 [0.7.0]: https://github.com/ztllll/dida-todo/tree/v0.7.0 [0.6.28]: https://github.com/ztllll/dida-todo/tree/v0.6.28 [0.6.27]: https://github.com/ztllll/dida-todo/tree/v0.6.27 [0.6.26]: https://github.com/ztllll/dida-todo/tree/v0.6.26 [0.6.25]: https://github.com/ztllll/dida-todo/tree/v0.6.25 [0.6.24]: https://github.com/ztllll/dida-todo/tree/v0.6.24 [0.6.23]: https://github.com/ztllll/dida-todo/tree/v0.6.23 [0.6.22]: https://github.com/ztllll/dida-todo/tree/v0.6.22 [0.6.21]: https://github.com/ztllll/dida-todo/tree/v0.6.21 [0.6.20]: https://github.com/ztllll/dida-todo/tree/v0.6.20 [0.6.19]: https://github.com/ztllll/dida-todo/tree/v0.6.19 [0.6.18]: https://github.com/ztllll/dida-todo/tree/v0.6.18 [0.6.17]: https://github.com/ztllll/dida-todo/tree/v0.6.17 [0.6.16]: https://github.com/ztllll/dida-todo/tree/v0.6.16 [0.6.15]: https://github.com/ztllll/dida-todo/tree/v0.6.15 [0.6.14]: https://github.com/ztllll/dida-todo/tree/v0.6.14 [0.6.13]: https://github.com/ztllll/dida-todo/tree/v0.6.13 [0.6.12]: https://github.com/ztllll/dida-todo/tree/v0.6.12 [0.6.11]: https://github.com/ztllll/dida-todo/tree/v0.6.11 [0.6.10]: https://github.com/ztllll/dida-todo/tree/v0.6.10 [0.6.9]: https://github.com/ztllll/dida-todo/tree/v0.6.9 [0.6.8]: https://github.com/ztllll/dida-todo/tree/v0.6.8 [0.6.7]: https://github.com/ztllll/dida-todo/tree/v0.6.7 [0.6.6]: https://github.com/ztllll/dida-todo/tree/v0.6.6 [0.6.5]: https://github.com/ztllll/dida-todo/tree/v0.6.5 [0.6.4]: https://github.com/ztllll/dida-todo/tree/v0.6.4 [0.6.3]: https://github.com/ztllll/dida-todo/tree/v0.6.3 [0.6.2]: https://github.com/ztllll/dida-todo/tree/v0.6.2 [0.6.1]: https://github.com/ztllll/dida-todo/tree/v0.6.1 [0.6.0]: https://github.com/ztllll/dida-todo/tree/v0.6.0