Repository navigation
v0.7.0
things-cli v0.7.0 — a config file, tag creation, and output an agent can trust
A TOML config file for persistent defaults, tag creation from the CLI, a things show --agent hand-off format, a repeating view, machine-readable --json errors, and fixes to what lookups and views return.
Settings live in a file now
~/.config/things-cli/config.tomlsupplies defaults forjson,color,db,no_verify,strict_tags,create_tags,assume_yesandhints. Flags still win per run.--config PATHorTHINGS_CLI_CONFIGpoint at another file,$XDG_CONFIG_HOMEis honoured, and the file is optional: without one,thingsruns on its built-in defaults.things config path,config showandconfig init(writes a commented template) round it out. Unknown keys and malformed TOML fail with one line naming the file. Full reference at https://things.rlew.io/configuration/. (#159, #160)assume_yesis scoped tocompleteandcancel; it cannot reachskill uninstall, whose--yesmeans delete. (#158, #169)
Tags can be created from the CLI
things tag add <name>...creates tags over AppleScript, skipping names that already exist (case-insensitive) and reading the tag list back to confirm.--create-tagsonadd,edit,project add,project editandimportcreates the unknown tags before the write instead of warning.--create-tagswith--strict-tagsis rejected. Tag names are escaped for AppleScript. (#144, #150)
Handing a to-do to an agent
things show <ref> --agentprints a self-contained Markdown brief: the to-do, its notes and checklist, and the exact UUID-based commands to close it out, ready forthings show 3 --agent | claude -p "action this". Plainlistandsearchoutput on a terminal ends with a one-line hint;--no-hintsorhints = falseturns it off. Notes are fenced and labelled as content so a to-do cannot forge the closing-out section. (#153, #172)--jsonis now non-interactive and its errors are JSON. An ambiguous or missing ref no longer opens the picker or prints help text to stdout; you get one object with a stableerrortoken (ambiguous task,not found,import refused,import partially applied, orerror), the message, the query and the candidates or per-item details. Exit codes match the plain path. (#152, #157, #161, #166, #164, #168)--yes/-yoncompleteandcancelskips the project confirmation, sothings --json complete <project> --yesworks from a script. (#158, #169)
Lookups and views return what they claim
- Project headings never come back as tasks from
show,edit,complete,cancel,open,searchor the numeric index cache. A heading with the same title as a to-do no longer makes the lookup ambiguous. (#146, #149) - Repeating templates have their own view.
things repeatinglists to-do and project templates (projects marked(project)), and they are gone fromsomeday, the catch-all project view andthings projects. Generated instances were never affected and still list in today and upcoming. (#147, #154, #165, #170) - A title shared by a template and its generated to-do resolves to the to-do, so
things complete "Water plants"no longer hits the repeating refusal while an actionable instance exists. The template is still reachable by UUID or fromthings repeating. (#156, #163) - To-dos under a trashed project are hidden in inbox, today, upcoming, anytime, someday and deadlines, not just the filtered views.
trashandlogbookstill show them. (#155, #162) - To-dos inside a repeating project template are hidden from the same views, since the app only shows the generated copies. (#171, #173)
importwithoperation: updategoes through the repeating check and the read-back. A payload that sets when, deadline, completed or canceled on a repeating item is refused whole, with the path of each offending item, before anything is sent. Status changes are read back after the write with one shared timeout.completed: falseandcanceled: falsecount as status changes, andcanceledtakes priority overcompleted, as the Things docs specify. (#145, #151)- The
things tag addsuggestion printed for unknown tags is now shell-quoted, and--json=1,-jvand other flag spellings render parse errors as JSON. (#164, #168)
Also
- Import checks resolve every item in one query per round instead of one per item. (#167, #175)
- The bundled agent skill was reorganised and audited against every
--help;openis no longer described as a write, and theskill,configandtagcommands are covered. Runthings skill installagain to pick it up. (#176)
Requirements
macOS with Things3 installed. Binaries for Apple Silicon (darwin_arm64) and Intel (darwin_amd64).
What's Changed
Other Changes
- fix(db): exclude project headings from task lookups by @ryanlewis in #149
- fix(views): keep repeating templates out of someday, add repeating view by @ryanlewis in #154
- feat(tags): create tags from the CLI by @ryanlewis in #150
- fix(cli): make --json non-interactive and emit errors as JSON by @ryanlewis in #157
- fix(import): apply the repeating check and status read-back to update items by @ryanlewis in #151
- feat(config): add a TOML config file for persistent flag defaults by @ryanlewis in #160
- fix(views): hide to-dos whose project is in the trash by @ryanlewis in #162
- fix(db): resolve a shared title to the to-do, not the repeating template by @ryanlewis in #163
- feat(json): add per-item details to import failures under --json by @ryanlewis in #166
- fix(views): list repeating project templates, hide them from things projects by @ryanlewis in #170
- fix(cli): correct --json parse-failure handling and the tag hint's quoting by @ryanlewis in #168
- feat(complete): add --yes to complete and cancel so projects work non-interactively by @ryanlewis in #169
- fix(views): hide the to-dos inside a repeating project template by @ryanlewis in #173
- feat(show): hand a to-do to an agent with
things show <ref> --agentby @ryanlewis in #172 - perf(db): batch the per-item uuid lookups in the import checks by @ryanlewis in #175
- docs(skill): reorder the bundled skill around what an agent needs first by @ryanlewis in #176
- docs: give configuration its own page on the docs site by @ryanlewis in #178
- fix(config): keep the config diagnostics working when the file is unusable by @ryanlewis in #180
- docs(site): add configuration tab to locale by @ryanlewis in #181
- docs(config): describe the config file as optional by @ryanlewis in #182
- docs(release): add v0.7.0 release notes header by @ryanlewis in #177
Full Changelog: v0.6.0...v0.7.0