Skip to content
dsh.fish
Bundle

dsh-ticktick

TickTick / Dida365 (滴答清单) sync for DeepSeek Harness: official OAuth 2.0 Open API integration to pull tasks across lists, create, update, complete, delete tasks, and one-shot dedupe sync — with a web settings panel

Source
zhengjy01
stars
1 stars
License
MIT
Updated
Updated 14 days ago

Readme

# dsh-ticktick

> **English** | [**中文**](README.zh.md)

Two-way task sync with [TickTick](https://ticktick.com) / [Dida365](https://dida365.com) (滴答清单) for DeepSeek Harness, built on the official OAuth 2.0 Open API. Pull tasks across every list, create / update / complete / delete tasks, and run a one-shot dedupe sync — from the agent or the web settings panel.

## Features

- **Official Open API** — OAuth 2.0 authorization-code flow against the TickTick / Dida365 open platform (`/open/v1`), with automatic token refresh on 401.
- **Both regions** — Dida365 (CN, default) and TickTick (international), selectable in the settings panel or via `ticktick_config`.
- **Pull** — `ticktick_tasks` / `ticktick_sync` list incomplete (or completed) tasks across all lists, sorted by due date, with list names.
- **Push** — `ticktick_add` creates one or more tasks (title, list by id or name, due date in ISO 8601 or bare `YYYY-MM-DD`, priority 0-5 or none/low/medium/high, tags, content).
- **One-shot sync** — `ticktick_sync` with `direction=pull` (grouped summary) or `direction=push` (creates missing tasks, dedupes by title within a list — re-running never duplicates).
- **Maintenance** — `ticktick_update`, `ticktick_complete`, `ticktick_delete` (project id optional; auto-resolved).
- **Settings panel** — Settings → TickTick: configure credentials, run the authorize flow (popup + manual code paste), refresh tokens, quick-add a task, and complete today's tasks in place.
- Credentials and tokens persist to `~/.dsh/dsh-ticktick.json` with mode `0600`; `ticktick_status` never echoes secrets.
- System-prompt announcement so agents know when to use the plugin.

## Install

```sh
# after publishing to GitHub (repo tagged with the `dsh-plugin` topic)
dsh plugin --profile web add github:zhengjy01/dsh-ticktick

# or from npm (prebuilt install, no build approval needed)
dsh plugin --profile web add dsh-ticktick

# local development
dsh plugin --profile web add link:/path/to/dsh-ticktick
```

Restart `dsh web`. The plugin needs no build step — `lib/index.js` is plain ESM.

## Configuration

1. Create an app in the open platform console: <https://developer.dida365.com/docs#/openapi> (CN) or <https://developer.ticktick.com/manage/> (international), and register the redirect URI:

   ```
   http://127.0.0.1:3080/api/dsh-ticktick/oauth/callback
   ```

   (use your actual `dsh web` port, or set a custom `redirectUri` — it must match exactly.)

2. Give the plugin your `client_id` / `client_secret`, either in the settings panel (Settings → TickTick) or by asking the agent:

   ```text
   帮我配置滴答清单,client_id 是 xxx,client_secret 是 yyy,区域用国内版 Dida365
   ```

   The agent calls `ticktick_config` and persists the credentials.

3. Authorize: click **开始授权** in the panel (or `ticktick_oauth_start`) and log in. The callback completes automatically; if it doesn't, paste the code back and call `ticktick_oauth_finish`.

From then on:

```text
把今天滴答清单里没做完的任务同步给我          → ticktick_sync (pull)
帮我把这些任务同步到滴答清单:买牛奶、写周报   → ticktick_sync (push, dedupes)
明天下午3点提醒我开会,加到「工作」清单       → ticktick_add
```

> The `client_secret` and OAuth tokens are credentials: anyone holding them can read and change your tasks. They stay in `~/.dsh/dsh-ticktick.json` (mode `0600`); use `ticktick_config(reset: true)` to clear them if they leak.

## API surface

| Tool | Purpose |
| --- | --- |
| `ticktick_status` | connection & authorization status |
| `ticktick_config` | set / clear `clientId`, `clientSecret`, `region` (`cn`/`intl`), `redirectUri` |
| `ticktick_oauth_start` | build the authorize URL |
| `ticktick_oauth_finish` | exchange a pasted `code` / redirect URL for tokens |
| `ticktick_lists` | list all lists (id + name) |
| `ticktick_tasks` | pull tasks (by list, completed flag, limit) |
| `ticktick_add` | create tasks |
| `ticktick_update` | update a task |
| `ticktick_complete` | complete a task |
| `ticktick_delete` | delete a task |
| `ticktick_sync` | pull summary / push with title dedupe |

## Notes

- Uses Node's built-in `fetch` (Node 22+) and `crypto` — zero runtime dependencies.
- The OAuth callback route is loopback-only and verifies the OAuth `state`; the remaining `/api/dsh-ticktick/*` routes are loopback + same-origin only.
- Not covered by the open API: smart-list filters and time-triggered reminders (`reminders`/`repeatFlag` are passed through when present, but not modeled as tool parameters).
- The web settings panel talks to the host through the loopback-only `/api/dsh-ticktick` route family.

## License

MIT

Install

dsh plugin --profile web add github:zhengjy01/dsh-ticktick

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source