Skip to content

Releases: nyactl/todoist-cli

v1.27.2

Choose a tag to compare

@github-actions github-actions released this 18 Oct 17:21
aa0f8ac

Board fits your terminal, non-Latin text lines up, and three fixes

  • ls -b uses your real terminal width. It used to assume 120 columns unless $COLUMNS was exported, so the board wrapped in narrower terminals and wasted space in wider ones. $COLUMNS still works as an override.
  • Umlauts, CJK and emoji no longer break alignment. Widths were counted in bytes, which shifted the due-date column and board separators, and cutting a long name could split a character in half. Text is now measured in display columns, so 日本語の勉強 lines up like Buy milk.
  • open accepts the short IDs that ls --done prints. tdc open 6hmR8gq used to fail; it now resolves the prefix through your cache.
  • --done periods are consistent. 7d, 1w and week now cover the same days (all periods start at local midnight), and malformed periods such as 1.5d or 3dd are rejected instead of silently misread.

v1.27.1

Choose a tag to compare

@github-actions github-actions released this 18 Oct 16:43

Clear message for features that need a paid plan

Some Todoist features, such as deadlines, are only available on paid plans. On a free account, add --deadline and edit --deadline used to print the raw API response. They now say what happened:

todoist: Deadlines are a premium only feature — this needs a paid Todoist plan

This release also updates the bundled SQLite driver.

v1.27.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 23:58

--json on every read command

ls (every filter, including --done), search, show, projects, sections, labels, comment ls, comment show, stats and context all take --json. Every command uses the same fields for a task, so one parser handles all of them. Empty results print [], and hints go to stderr, so stdout is always valid JSON.

tdc ls --json | jq -r '.[] | select(.priority == 4) | .content'   # urgent tasks
tdc stats --json | jq .overdue                                     # for a prompt or status bar

v1.26.2

Choose a tag to compare

@github-actions github-actions released this 17 Oct 23:43

Subtasks show up in search and JSON, and short IDs are unambiguous

  • search now finds subtasks too.
  • show --json includes a subtasks array with id, content, priority and due.
  • Short IDs in the output (show, done, ls --done, …) are now the shortest prefix that's unique in your cache, instead of always 4 characters. Tasks created close together often shared those 4 characters, so the printed ID couldn't be used. Now you can paste it straight back: tdc done 6hmR8gvj.

v1.26.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 23:04

Due dates now follow your local timezone

ls and overdue decided what "today" means using UTC rather than your local date. Depending on your timezone, tasks due today disappeared for a few hours after midnight (east of UTC), or tomorrow's tasks showed up as due in the evening (west of UTC). The "overdue Nd" count could also be one day short. Both now use your local date.

No action needed: brew upgrade nyactl/tap/todoist-cli.

v1.26.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 10:21

Context-scoped ls no longer looks account-wide

With an active cd context, ls -l <label> quietly scoped to that project and printed a bare no tasks — indistinguishable from "nothing carries this label anywhere". A label sweep could silently process a subset and still exit 0.

Empty results now name the scope

$ td ls -l waiting
no tasks in "Work" — run 'todoist-cli cd' to clear the context (or pass --global) to search all projects

The same cue now covers every context-scoped path — label and priority filters, the plain project view, and --done (which already hinted and keeps doing so).

New -g / --global flag

Ignore the active context for a single command, without disturbing your cd state — ideal for scripts that want account-wide results:

td ls -l waiting --global      # all projects, context untouched
td ls --done month --global    # completed across every project

--global applies to -l, -P and --done; combining it with --board or --recursive (which act on the active project) is rejected.

Closes #28.

v1.25.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 18:50

Recurrence pattern in show --json

show --json reported due.recurring: true but not how a task recurs. The due object now carries a string field with the pattern:

"due": {
  "date": "2026-10-02",
  "datetime": null,
  "recurring": true,
  "string": "every friday"
}

It's present whenever due is non-null (the plain date phrase for one-off tasks, e.g. "25 Dec"), and null when the API supplies none. Tooling that archives or summarises tasks can now record every friday rather than a bare true.

Closes #23.

v1.24.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 18:44

Comment workflow follow-ups

Building on comment ls/comment rm from 1.23.0, this closes the read → migrate → delete loop for cleaning up task comments.

Read a full comment body

ls only shows the first line; show prints the whole thing:

td comment show 6WQ4gpfghhc4cvP2
td comment ls "$T" | cut -f1 | xargs td comment show   # read them all

Delete several at once

td comment rm <id> <id> <id>

No more shell loop. Each deletion now echoes what it removed — id, timestamp and first line — so the terminal log is auditable (comments have no undo):

deleted: 6WQ4gpfghhc4cvP2	2024-10-18 09:12:03	Sparkasse

Clear a whole task

td comment rm --all <task>        # prompts for confirmation
td comment rm --all -f <task>     # skip the prompt

Closes #26.

v1.23.1

Choose a tag to compare

@github-actions github-actions released this 30 Sep 18:36

Fix: edit -D "" now clears the due date

edit <task> -D "" reported success but silently left the due date in place, despite --help promising an empty value clears it.

The Todoist API ignores an empty due_string (and rejects due: null); the only value it accepts as "remove the due date" is the natural-language string no date. The CLI was sending the empty string straight through, so the clear never happened. It now translates an empty --due into that clearing form, so the documented behaviour holds:

td edit "Pay rent" -D ""     # actually clears the due date now

This also brings --due in line with --deadline, whose empty-clears-it promise already worked.

Fixes #27.

v1.23.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 09:54

List and delete task comments

comment could only ever add. Now the full lifecycle is scriptable — comments pasted into a task over time can be reviewed and cleaned up from the CLI instead of the web app.

List a task's comments

td comment ls "Write up notes"

Prints one row per comment — comment ID, local timestamp, and first line — tab-separated, so the ID feeds straight into comment rm.

Delete a comment

td comment rm 6hcgHXC38fJ7vqMX

Deleting one, or clearing a whole task, is now a shell one-liner:

td comment ls "$T" | cut -f1 | xargs -n1 td comment rm

Closes #25.