REST API client for Singularity App -- task management, projects, habits, kanban boards, notes, time tracking (56 tools)
Install
npx skillscat add theblackhaired/singularity-skill Install via the SkillsCat registry.
Project Cache
A project tree with IDs is available at projects_cache.md in this skill directory.
Always check it first before calling project_list to save context tokens.
The cache is auto-managed:
- On first use (cache missing) it is built automatically
- Refreshed silently every 7 days before any
--callinvocation - Refresh messages go to stderr and do not pollute JSON output
Manual refresh:
python cli.py --refresh-cacheCache location: projects_cache.md (next to cli.py).
Last update timestamp stored in config.json as "cache_updated": "2026-02-19T16:30:00".
Singularity App Skill
Direct REST API v2 client for Singularity App. No external dependencies -- uses Python stdlib only (urllib, json, ssl). Bearer token auth via config.json.
Quick Router
| User wants to... | Tools to use |
|---|---|
| See all projects | project_list |
| Create a task | task_group_list (find group) then task_create |
| Complete a task | task_update with checked: true |
| Add checklist to task | checklist_create |
| Manage kanban board | kanban_status_list, kanban_task_status_create |
| Track a habit | habit_create, then habit_progress_create daily |
| Add a note to project/task | note_create |
| Track time | time_stat_create |
| Organize with tags | tag_list, tag_create |
| Find tasks in project | task_list with project_id |
| Create a notebook | project_create with isNotebook: true |
| Add note to notebook | task_create with isNote: true in notebook's task group |
Available Tools (56)
Projects (5 tools)
| Tool | Description |
|---|---|
project_list |
List projects (params: max_count, offset, include_removed, include_archived) |
project_get |
Get project by ID |
project_create |
Create project (title, note, start, end, emoji, color, parent, isNotebook, tags...) |
project_update |
Update project |
project_delete |
Delete project |
Task Groups (5 tools)
| Tool | Description |
|---|---|
task_group_list |
List task groups (params: max_count, offset, include_removed, parent) |
task_group_get |
Get task group by ID |
task_group_create |
Create task group (title, parent required as P-uuid) |
task_group_update |
Update task group |
task_group_delete |
Delete task group |
Tasks (5 tools)
| Tool | Description |
|---|---|
task_list |
List tasks (params: max_count, offset, project_id, parent, start_date_from/to, include_removed/archived) |
task_get |
Get task by ID |
task_create |
Create task (title, parent required; note, priority, start, deadline, tags, recurrence...) |
task_update |
Update task |
task_delete |
Delete task |
Notes (5 tools)
| Tool | Description |
|---|---|
note_list |
List notes (params: max_count, offset, container_id) |
note_get |
Get note by ID |
note_create |
Create note (containerId, content as Delta array, contentType="delta") |
note_update |
Update note |
note_delete |
Delete note |
Kanban Statuses (5 tools)
| Tool | Description |
|---|---|
kanban_status_list |
List kanban statuses (params: max_count, offset, project_id) |
kanban_status_get |
Get kanban status by ID |
kanban_status_create |
Create kanban status (name, projectId required) |
kanban_status_update |
Update kanban status |
kanban_status_delete |
Delete kanban status |
Kanban Task Statuses (5 tools)
| Tool | Description |
|---|---|
kanban_task_status_list |
List kanban task statuses (params: task_id, status_id) |
kanban_task_status_get |
Get kanban task status by ID |
kanban_task_status_create |
Create kanban task status (taskId, statusId required) |
kanban_task_status_update |
Update kanban task status |
kanban_task_status_delete |
Delete kanban task status |
Habits (5 tools)
| Tool | Description |
|---|---|
habit_list |
List habits |
habit_get |
Get habit by ID |
habit_create |
Create habit (title; color, status, description, order) |
habit_update |
Update habit |
habit_delete |
Delete habit |
Habit Progress (5 tools)
| Tool | Description |
|---|---|
habit_progress_list |
List habit progress (params: habit, start_date, end_date) |
habit_progress_get |
Get habit progress entry by ID |
habit_progress_create |
Create progress entry (habit, date, progress required) |
habit_progress_update |
Update progress entry |
habit_progress_delete |
Delete progress entry |
Checklist Items (5 tools)
| Tool | Description |
|---|---|
checklist_list |
List checklist items (params: parent task ID) |
checklist_get |
Get checklist item by ID |
checklist_create |
Create checklist item (parent task ID, title required) |
checklist_update |
Update checklist item |
checklist_delete |
Delete checklist item |
Tags (5 tools)
| Tool | Description |
|---|---|
tag_list |
List tags (params: parent tag ID) |
tag_get |
Get tag by ID |
tag_create |
Create tag (title required; color, hotkey, parent) |
tag_update |
Update tag |
tag_delete |
Delete tag |
Time Stats (6 tools)
| Tool | Description |
|---|---|
time_stat_list |
List time entries (params: date_from, date_to, related_task_id) |
time_stat_get |
Get time entry by ID |
time_stat_create |
Create time entry (start ISO, secondsPassed required; relatedTaskId, source) |
time_stat_update |
Update time entry |
time_stat_delete |
Delete time entry |
time_stat_bulk_delete |
Bulk delete time entries by filter (date_from, date_to, related_task_id) |
Usage
Step 1: Identify the right tool
Step 2: Build the call JSON
{"tool": "tool_name", "arguments": {"param1": "value1"}}Step 3: Execute
python cli.py --call '{"tool": "tool_name", "arguments": {...}}'Getting tool details
python cli.py --describe tool_nameConfiguration
Create config.json in the skill directory:
{
"base_url": "https://api.singularity-app.com",
"token": "YOUR_API_TOKEN",
"read_only": false
}Set "read_only": true to block all write operations. Read tools work normally.
Data Format Notes
Task defaults
- Default priority = 1 (set explicitly if needed)
- Add tasks to the base task group of the project unless user specifies otherwise
- To find the base task group:
task_group_listwithparent= project ID inP-{uuid}format
Task creation checklist
When creating a task, always provide:
title— заголовок задачиprojectId— ID проекта (P-{uuid}). Обязательно указывать, даже если задача — подзадачаparent— только для подзадач: ID родительской задачи (T-{uuid}). Для задач в корне проекта — НЕ указыватьparent, достаточноprojectId.Q-...(task group) не работает как parentstart— дата задачи (не deadline!). Формат:"2026-02-20"для даты, ISO для времениuseTime: false— если нужна только дата, без конкретного времени- НЕ ставить
deadline, если пользователь просит дату — этоstart
After task creation:
- Структурированные пункты →
checklist_create(не текстом в описание) - Описание (
note) оставлять пустым, если вся информация уже в заголовке + чеклисте - Если нужно описание — использовать
task_updateсnote(строка), неnote_create(Delta format часто ломается)
Emoji format
- Hex Unicode code without prefix:
"1f49e"(not"U+1F49E"or"\u1f49e")
Note content (Delta format)
- Content must be a flat Delta array:
[{"insert": "text"}, {"insert": "\n"}] - NOT the Quill format
{"ops": [...]} - Last insert must end with a newline character
\n
Example:
{
"containerId": "task-uuid",
"content": [
{"insert": "Hello "},
{"insert": "world", "attributes": {"bold": true}},
{"insert": "\n"}
],
"contentType": "delta"
}Habit colors (string enum)
red | pink | purple | deepPurple | indigo | lightBlue | cyan | teal | green | lightGreen | lime | yellow | amber | orange | deepOrange | brown | grey | blueGrey
Habit status
0= active1= paused2= completed3= archived
Time and timezone
useTime: false= date-only task (no specific time)useTime: true= real time, timezone is GMT+3 (Moscow)- All ISO datetime strings should account for this timezone
Notebooks and notes-in-notebooks
- A notebook is a project with
isNotebook: true - A note inside a notebook is a task with
isNote: truein that notebook's task group
Notifications
- Set
notifies: [60, 15]for notifications at 60 and 15 minutes before - Set
notify: 1to enable notifications alarmNotify: trueorfalsefor alarm-style notification
showInBasket
- Do not set
showInBasketunless the user explicitly asks for it
Time tracking source
source: 0= pomodoro timersource: 1= stopwatch
Pagination
- All list endpoints support
maxCount(max 1000) andoffset - Default
maxCountis 100
Examples
List all projects
python cli.py --call '{"tool": "project_list", "arguments": {}}'Create a project with emoji
python cli.py --call '{"tool": "project_create", "arguments": {"title": "My Project", "emoji": "1f680"}}'Create a task in a project
# 1. Find the base task group
python cli.py --call '{"tool": "task_group_list", "arguments": {"parent": "P-<project-uuid>"}}'
# 2. Create the task in that group
python cli.py --call '{"tool": "task_create", "arguments": {"title": "Buy groceries", "parent": "<task-group-id>", "priority": 1}}'Add a checklist to a task
python cli.py --call '{"tool": "checklist_create", "arguments": {"parent": "<task-id>", "title": "Step 1: Do X"}}'
python cli.py --call '{"tool": "checklist_create", "arguments": {"parent": "<task-id>", "title": "Step 2: Do Y"}}'Create a habit and log progress
python cli.py --call '{"tool": "habit_create", "arguments": {"title": "Morning run", "color": "green", "status": 0}}'
python cli.py --call '{"tool": "habit_progress_create", "arguments": {"habit": "<habit-id>", "date": "2025-01-15", "progress": 1}}'Create a note on a task
python cli.py --call '{"tool": "note_create", "arguments": {"containerId": "<task-id>", "content": [{"insert": "Meeting notes here\n"}], "contentType": "delta"}}'Track time on a task
python cli.py --call '{"tool": "time_stat_create", "arguments": {"start": "2025-01-15T10:00:00.000+03:00", "secondsPassed": 1800, "relatedTaskId": "<task-id>", "source": 1}}'Set up kanban board
# Create statuses
python cli.py --call '{"tool": "kanban_status_create", "arguments": {"name": "To Do", "projectId": "<project-id>", "kanbanOrder": 0}}'
python cli.py --call '{"tool": "kanban_status_create", "arguments": {"name": "In Progress", "projectId": "<project-id>", "kanbanOrder": 1}}'
python cli.py --call '{"tool": "kanban_status_create", "arguments": {"name": "Done", "projectId": "<project-id>", "kanbanOrder": 2}}'
# Assign task to status
python cli.py --call '{"tool": "kanban_task_status_create", "arguments": {"taskId": "<task-id>", "statusId": "<status-id>"}}'Direct REST API client for Singularity App.
No pip dependencies. Python 3.8+ stdlib only.