theblackhaired

singularity

REST API client for Singularity App -- task management, projects, habits, kanban boards, notes, time tracking (56 tools)

theblackhaired 0 1 Updated 6mo ago
GitHub

Install

npx skillscat add theblackhaired/singularity-skill

Install via the SkillsCat registry.

About this skill

This skill provides a direct REST API client for the Singularity App to manage tasks, projects, habits, kanban boards, and time tracking. It enables agents to automate productivity workflows and organize complex data structures through 56 specialized tools. Developers should use it to integrate Singularity App data and functionality into automated AI workflows.

SKILL.md

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 --call invocation
  • Refresh messages go to stderr and do not pollute JSON output

Manual refresh:

python cli.py --refresh-cache

Cache 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_name

Configuration

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_list with parent = project ID in P-{uuid} format

Task creation checklist

When creating a task, always provide:

  1. title — заголовок задачи
  2. projectId — ID проекта (P-{uuid}). Обязательно указывать, даже если задача — подзадача
  3. parentтолько для подзадач: ID родительской задачи (T-{uuid}). Для задач в корне проектаНЕ указывать parent, достаточно projectId. Q-... (task group) не работает как parent
  4. start — дата задачи (не deadline!). Формат: "2026-02-20" для даты, ISO для времени
  5. useTime: false — если нужна только дата, без конкретного времени
  6. НЕ ставить 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 = active
  • 1 = paused
  • 2 = completed
  • 3 = 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: true in that notebook's task group

Notifications

  • Set notifies: [60, 15] for notifications at 60 and 15 minutes before
  • Set notify: 1 to enable notifications
  • alarmNotify: true or false for alarm-style notification

showInBasket

  • Do not set showInBasket unless the user explicitly asks for it

Time tracking source

  • source: 0 = pomodoro timer
  • source: 1 = stopwatch

Pagination

  • All list endpoints support maxCount (max 1000) and offset
  • Default maxCount is 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.