@perrylink/dsh-ticktick — renamed to dsh-dida
This package is the old scoped name of dsh-dida. It stays installable for compatibility; new releases are published under the bare name.
dsh plugin --profile <profile> add dsh-dida
Source: https://github.com/PerryLink/dsh-dida · Docs: https://perrylink.github.io/dsh-plugins/packages/dsh-dida.html
dsh-dida
Renamed from @perrylink/dsh-ticktick. The old scoped package is deprecated; install dsh-dida.
dsh plugin --profile <name> add dsh-dida
Release stamp: 0.1.13 (2026-10-04).
English | 中文 | Español | Português | हिन्दी
Package name. This project publishes to npm as dsh-dida. The bare npm name dsh-dida belongs to a different, unrelated project — installing it does not install this plugin.
TickTick / Dida365 (滴答清单) task bridge for DeepSeek Harness: a Session-header task panel (list filter, quick add, complete, delete, due dates, drag reorder), eleven curated agent tools, a configuration page on the Plugins page, and a typed Remote service — all over the official TickTick MCP endpoint.
DSH Market
Install
dsh plugin --profile web add github:PerryLink/dsh-dida
# npm (published artifact includes lib/, no build permission needed)
dsh plugin --profile web add dsh-dida
# git source (pin a commit; pnpm asks you to allow the prepare build once)
dsh plugin --profile web add "github:PerryLink/dsh-dida#<sha>"
# local development
dsh plugin --profile web add link:/path/to/dsh-dida
Restart dsh web (bundle plugins activate on restart). The ticktick action appears in the Session header; its configuration page opens from the Configure control on the TickTick row of the Plugins page.
What is dsh-dida?
TickTick / Dida365 (滴答清单) task bridge for DeepSeek Harness: a Session-header task panel (list filter, quick add, complete, delete, due dates, drag reorder), eleven curated agent tools, a configuration page on the Plugins page, and a typed Remote service — all over the official TickTick MCP endpoint.
Workflow diagram for dsh-dida: install → open panel → act.
Workflow overview: install → open panel → act. The examples below use the real command surface.
Compatibility
| Surface | Status |
|---|
| Harness | DeepSeek Harness dsh-v0.2.1-alpha.1 (GitHub tag). npm dependency line: @deepseek-ai/dsh 0.2.1-alpha.1 (peers `>=0.1.2-rc.1 <0.2.0 |
| Node | ^22.19.0 || >=24.0.0 |
Features
- Session-header panel — the
ticktick action in the Session header opens a popup: filter by list (All + every list), toggle undone/completed views, full-text search, add tasks with an optional due date, complete, delete (with confirm), set/clear due dates with overdue/today/tomorrow chips, and drag-reorder (undone, single-list views). A status dot shows the connection state; when no token is configured the panel offers one-step in-panel token setup.
- Eleven agent tools —
ticktick_status, ticktick_lists, ticktick_tasks, ticktick_add, ticktick_complete, ticktick_delete, ticktick_due, ticktick_reorder, ticktick_completed, ticktick_search, ticktick_batch_add; Code Mode gets await tools.ticktick_*(args) for free.
- Configuration page — Plugins page → the TickTick row → Configure: API token (secret), token file, MCP endpoint with CN/International presets, protected task ids (all four applied live, no restart), a Test-connection button, and a Clear-credentials button.
- Live token re-read — the Bearer token is re-read per request (card secret > token file, default
$DSH_HOME/.ticktick-token); a 401 resets the client so a rotated token activates without restart.
- Measured workarounds — the TickTick MCP server rejects
update_task for tasks inside regular projects ("Expecting value: line 1 column 1"); the bridge retries via a move-to-inbox → update → move-back detour. Lists that fail server-side validation (historical repeatFrom: '' data) are skipped and reported as warnings, never silently dropped.
- Protected ids — mutating operations refuse tasks on the protected-id list before any wire call.
- Multi-device sync — every write lands on the TickTick cloud account, so the phone/desktop/web apps see it; every read fetches current state.
Examples
These are the plugin's real entry points; install once, then call one.
Detailed example
Command
ticktick_lists
Input
{}
Output
Inbox (inbox)
Work (hex1)
Observed from plugins/dsh-dida/src/tools.ts:107-109 (renderer); fixture/assertion at plugins/dsh-dida/tests/service.spec.ts:40-46,103-108
Failure branch
Input
{"id":"t-guarded","projectId":"hex1"} (protectedTaskIds: ["t-guarded"])
Output
Error: task t-guarded is protected
Observed from plugins/dsh-dida/src/service.ts:344-349; plugins/dsh-dida/tests/service.spec.ts:158-163
Brief examples
ticktick_tasks
ticktick_add
Configuration
- Get an API 口令 (a
dp_-prefixed token) from the Dida365/TickTick web app: Profile → Settings → Account & Security → API 口令.
- Pick one of three token sources (priority order): the TickTick configuration page's secret field (Plugins page → the TickTick row → Configure), the
DIDA365_TOKEN environment variable, or a token file (default $DSH_HOME/.ticktick-token, one line). Writing the file activates the bridge without any config change.
- Use the card's Test connection button to verify the token, and Clear credentials to wipe it.
| Key | Default | Meaning |
|---|
tokenFile | '' | Path to a text file holding the token; empty resolves to $DSH_HOME/.ticktick-token |
mcpUrl | https://mcp.dida365.com | TickTick MCP endpoint (the international endpoint is unverified — see below) |
toolCallTimeoutMs | 30000 | Per tools/call deadline in milliseconds |
protectedTaskIds | [] | Task ids every mutating operation refuses |
tools.* | '' each | Raw MCP tool-name pins (projects/tasks/create/complete/remove/update/move); '' = discover by pattern |
Agent tools
| Tool | Purpose |
|---|
ticktick_status | connection state: token configured, client connected, endpoint, last error |
ticktick_lists | every list (project), the virtual Inbox included |
ticktick_tasks | undone tasks: one list or all aggregated, with per-list warnings |
ticktick_add | create a task (list, optional ISO due date) |
ticktick_complete | complete a task (task id + list id) |
ticktick_delete | delete a task (task id + list id) |
ticktick_due | set/clear a due date (omit the date to clear) |
ticktick_reorder | assign a new integer sortOrder (lists order by descending sortOrder) |
ticktick_completed | tasks completed within a window (default 30 days), optionally one list |
ticktick_search | full-text search over tasks (the official search tool) |
ticktick_batch_add | create several tasks in one call |
Architecture
browser panel ── ctx.remote.ticktick.* ──▶ TicktickService (Typert Remote)
configuration page ── ctx.configForms ──▶ profile entry "ticktick" (Volatile Config)
agent tools ─── ctx.tools (ticktick_*) ──▶ the same service
│
▼
minimal streamable-HTTP MCP client
(session id, protocol version, Retry-After)
│
▼
https://mcp.dida365.com (official TickTick MCP)
Known limitations
- The international TickTick endpoint is unverified:
mcpUrl defaults to the CN endpoint, and the international MCP URL has not been probed.
- The completed view, search, and batch add ride the MCP tools
list_completed_tasks_by_date, search, and batch_add_tasks; their wire contracts come from the published catalogue (dida365-sdk stubs) and re-verification against the live endpoint is pending — run probes/probe-queries.mjs with a real token before claiming them verified.
- The measured
update_task crash and the list-validation failure are server-side behaviors; probes/ re-verifies them against the live endpoint before a release (run with DIDA365_TOKEN exported).
- The
/api surface the panel uses is the standard harness Typert gateway; the token is stored locally (settings document or token file) and sent only to TickTick's own servers. Do not expose a dsh web instance to the public internet.
Verify the bridge against the live endpoint
# PowerShell
$env:DIDA365_TOKEN='dp_...'
node probes/probe-bootstrap.mjs # handshake + tool catalogue
node probes/probe-crud.mjs # create/complete/delete round trip
node probes/probe-due.mjs # due dates (+ detour with a PROJECT_ID)
node probes/probe-reorder.mjs # sortOrder semantics
node probes/probe-queries.mjs # P2 query-tool contract discovery
Uninstall
dsh plugin --profile web remove dsh-dida
Restart dsh web. All runtime registrations (tools, panel, configuration page, prompt section) are removed with the plugin. The only static residue is the token in the user settings document — clear it first with the Clear credentials button on the TickTick configuration page (or remove the token file / DIDA365_TOKEN variable) to detach completely. To keep the package installed but inactive, disable the row instead:
- id: ticktick
disabled: true
Install from the DSH Desktop Market
All PerryLink plugins are browsable in the built-in DSH Desktop Market: Market → Sources → add source → paste https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → select it. Installation still goes through the Market's npm-identity verification and your confirmation.
PerryLink DSH Plugin Family
This project is part of the DeepSeek Harness plugin family from PerryLink. The roster stays collapsed below so every README keeps a short first screen; expand it to see every row and its status.
Expand all plugins
License
Apache-2.0