singu is a Bun-based CLI client for the Singularity task manager API.
Official product site: https://singularity-app.com/
This is an unofficial CLI client and is not affiliated with or endorsed by Singularity. Use of the API remains subject to Singularity's own product terms, billing model, and access controls.
Global install with Bun:
bun add -g singularity-cliThen run:
singu --helpThis repository also ships an agent skill for operating an installed singu binary in an end-user environment.
Skill location in the repo:
skills/singularity-cli
Install it with the Skills CLI:
npx skills add osovv/singularity-cli@singularity-cli -g -yThe installed skill helps an agent use singu for auth, project inspection, task capture and triage, scheduling, aliases, and focus blocks.
It is written for users who have singu on PATH and does not depend on a local repository checkout.
Current scope:
- auth is implemented
- project read flows are implemented
- task read flows are implemented
- task write flows for capture, move, and scheduling are implemented
- project write flows are not implemented yet
- block capture is implemented
Project commands are read-only for now:
singu project listsingu project get <reference>singu project alias set <name> <reference>singu project alias listsingu project alias remove <name>
Task commands available today:
singu task listsingu task list --inboxsingu task list --project <project-ref>singu task list --allsingu task get <reference>singu task add "title"singu task edit <reference> --title "new title"singu task move <reference> --project <project-ref>singu task move <reference> --inboxsingu task schedule <reference> --start <when>singu task unschedule <reference>singu task rm <reference>singu task do <reference>singu task undo <reference>singu task alias set <name> <reference>singu task alias listsingu task alias remove <name>singu block <duration> "title"
Not implemented yet:
project createproject updateproject deletetask delete
- Bun
- TypeScript
- citty
- Kubb
- GRACE workflow and docs
Install dependencies:
bun installRefresh the local OpenAPI snapshot:
bun run spec:syncRegenerate the SDK from the local snapshot:
bun run codegenRun both in sequence:
bun run api:refreshType-check:
bun run checkRun tests:
bun run testRun the CLI directly:
bun run cli --helpBuild the standalone binary:
bun run buildThis produces ./singu.
Auth uses a single bearer token.
Commands:
singu auth loginsingu auth statussingu auth logout
Rules:
SINGULARITY_TOKENoverrides the saved token- the saved token is stored locally in config storage
auth loginvalidates the token against the API by default
Examples:
singu auth login --token "<token>"
singu auth status
singu auth status --check
singu auth logoutProject commands accept three kinds of references:
- raw Singularity id
- short id from the last
project list, for example1 - alias, for example
@inbox
Examples:
singu project list
singu project get 1
singu project get @inbox
singu project get id:raw-project-idTask commands accept the same three kinds of references:
- raw Singularity id
- short id from the last
task list, for example1 - alias, for example
@today
Examples:
singu task list
singu task list --inbox
singu task list --project @work
singu task list --all
singu task add "Call Peter"
singu task edit 1 --title "Call Peter about the release"
singu task move 1 --project @work
singu task move 1 --inbox
singu task schedule 1 --start tomorrow
singu task schedule 1 --start 2026-04-03T09:00:00.000Z --deadline 2026-04-03T10:00:00.000Z
singu task unschedule 1
singu task get 1
singu task get @today
singu task do 1
singu task undo 1
singu task rm 1
singu block 1h "Deep work on pet project"
singu task get id:raw-task-idDefault task list is an actionable view, not a raw dump.
By default it shows open tasks that are:
- scheduled for today
- scheduled earlier than today and still not completed
Default actionable output is sorted by start asc.
Useful task list modes:
singu task listfor the default actionable viewsingu task list --inboxfor unscheduled tasks without a projectsingu task list --project <project-ref>to narrow the view to one projectsingu task list --allfor the raw list without smart filtering
singu project list prints numeric SID values and saves the latest list context locally.
That allows follow-up commands like:
singu project get 1Short IDs are contextual:
- they come from the most recent
project list - they are scoped to the active auth token fingerprint
- they are not stable permanent ids
Aliases are stable local names that point to raw project ids.
Examples:
singu project alias set inbox 1
singu project alias list
singu project get @inbox
singu project alias remove inboxAlias behavior:
- aliases are stored locally
- aliases are scoped to the active auth token fingerprint
- aliases do not depend on the last-list SID cache once saved
Task aliases work the same way:
singu task alias set today 1
singu task alias list
singu task get @today
singu task alias remove todayBy default:
- config lives in
$XDG_CONFIG_HOME/singuor~/.config/singu - cache lives in
$XDG_CACHE_HOME/singuor~/.cache/singu
Used files:
config.jsonfor the saved tokenaliases.jsonfor project aliasesproject-last-list.jsonfor project SID cachetask-last-list.jsonfor task SID cache
If SINGU_HOME is set, everything is stored under that root instead:
config.jsonaliases.jsoncache/project-last-list.jsoncache/task-last-list.json
The CLI does not generate from a live remote OpenAPI URL during codegen.
Workflow:
bun run spec:syncfetches the upstream Swagger UI bootstrap- it extracts the embedded
swaggerDoc - it writes
openapi/swagger.json bun run codegengenerates the SDK from that local file
Generated code lives in:
src/api/generated
Top-level commands:
singu authsingu projectsingu tasksingu block
Project subcommands today:
listgetalias setalias listalias remove
Task subcommands today:
listgetaddeditmovescheduleunschedulermdoundoalias setalias listalias remove
The README should stay aligned with the actual implemented command surface.