- API functions now use
req_error()from httr2 for proper HTTP error handling unarchive_project()no longer accepts unusedproject_nameparameter- Removed unused
httrdependency (fully migrated to httr2)
add_label(): Create a new labelget_label(): Get a single label by IDget_all_labels(): Get all labelsget_label_id(): Get label ID by nameupdate_label(): Update an existing labeldelete_label(): Delete a labelget_shared_labels(): Get all shared labelsrename_shared_label(): Rename a shared labelremove_shared_label(): Remove a shared label
add_comment(): Add a comment to a task or projectget_comment(): Get a single comment by IDget_comments(): Get all comments for a task or projectupdate_comment(): Update an existing commentdelete_comment(): Delete a comment
add_filter(): Create a new filterget_filter(): Get a single filter by IDget_all_filters(): Get all filtersget_filter_id(): Get filter ID by nameupdate_filter(): Update an existing filterdelete_filter(): Delete a filter
add_reminder(): Add a reminder to a taskget_all_reminders(): Get all remindersupdate_reminder(): Update an existing reminderdelete_reminder(): Delete a reminder
get_all_workspaces(): Get all workspacesget_workspace_users(): Get users in a workspaceupdate_workspace(): Update workspace settingsinvite_to_workspace(): Invite a user to a workspaceleave_workspace(): Leave a workspace
get_activity_logs(): Get activity logsget_productivity_stats(): Get user productivity statisticsget_user_info(): Get current user information
get_backups(): List available backupsdownload_backup(): Download a backup file
export_template(): Export a project as templateimport_template(): Import a template into a project
upload_file(): Upload a file attachmentdelete_upload(): Delete an uploaded file
get_project(): Get a single project by IDupdate_project(): Update project name, color, favorite status, or view styledelete_project(): Delete a projectarchive_project(): Archive a projectunarchive_project(): Unarchive a projectget_archived_projects(): Get all archived projects
get_section(): Get a single section by IDget_all_sections(): Get all sections across projectsupdate_section(): Rename a sectiondelete_section(): Delete a sectionmove_section(): Move a section to another projectarchive_section(): Archive a sectionunarchive_section(): Unarchive a section
get_task(): Get a single task by IDupdate_task(): Update task content, due date, priority, labels, or descriptiondelete_task(): Delete a taskclose_task(): Mark a task as completereopen_task(): Reopen a completed taskmove_task(): Move a task to another project, section, or parentget_completed_tasks(): Get completed tasks with date filteringget_tasks_by_filter(): Get tasks using a filter queryquick_add_task(): Quick add a task with natural language parsing
delete_collaborator(): Remove a collaborator from a projectaccept_invitation(): Accept a project invitationreject_invitation(): Reject a project invitationdelete_invitation(): Delete a pending invitation
- Added
escape_json()to all Sync API commands for proper JSON escaping - Added token validation in
call_api()andcall_api_rest()with clear error messages - API base URLs now defined as package constants (
TODOIST_SYNC_URL,TODOIST_REST_URL) - Empty data.frames now return consistent column structure with non-empty results
- Standardized error handling with
req_error()across all REST endpoints - Replaced
print()withmessage()for user-facing output (CRAN compliance) - Updated GitHub Actions workflow to use modern action versions (v2/v4)
- Removed debug message from
call_api()function - Added comprehensive test coverage for all new modules
- Added
skip_if_test_project_missing()helper for more robust integration tests
- Fixed
move_task()to properly escape IDs preventing JSON injection - Fixed templates export/import functions failing due to glue object type issue
- Fixed
get_comments()empty result missingtask_idandproject_idcolumns - Fixed
get_all_reminders()empty result missingdue_dateandminute_offsetcolumns - Fixed
get_activity_logs()empty result missinginitiator_id,parent_project_id,parent_item_idcolumns - Fixed
get_tasks_by_filter()empty result missingdue_datecolumn - Fixed
get_archived_projects()empty result missingcolorandis_favoritecolumns - Fixed
get_all_sections()empty result missingordercolumn - Fixed
get_all_workspaces()empty result missingis_defaultcolumn - Fixed
get_workspace_users()empty result missingrolecolumn - Fixed
quick_add_task()using hardcoded URL instead ofTODOIST_REST_URL - Added missing
req_error()toquick_add_task()andupload_file()
- Removed unused
httptest2andmockeryfrom Suggests - Removed unused
lubridatefrom Suggests - Cleaned up mocking test infrastructure
- Added
@returntags to all exported functions for CRAN compliance
- Added pagination support for REST API endpoints
- Fixed JSON escaping for special characters
- Fixed string ID handling for API v1 compatibility
- Added comprehensive testthat test suite
- Migration to Todoist API v1
- Moved from httr to httr2
- Initial CRAN release
- Projects, tasks, sections management
- User collaboration features
- Secure token storage via keyring