Skip to main content

Super Productivity

@kneel/super-productivityv2026.07.18.1beta· 3mo agoBEHAVIORSSKILLS
01README

Make Super Productivity a node in the swamp automation graph — headless task/project/tag reads and writes over a signed file-IPC bridge to a first-party SP plugin, with an HMAC auth layer the community bridges lack. The swamp model is the "server" half: an ephemeral method writes a signed command file and polls for the signed response; the long-lived plugin (single-writer .bridge_lock) verifies-before-parse, dedups on execute, and rejects (never defers) over-budget commands.

Not a clone of the SP-MCP tool surface — this exposes SP as CEL-referenceable swamp resources (tasks, projects, tags, currentTask, worklog, batchResult) so workflows and other models can wire into your task manager.

Methods

  • provision — write the plugin's 0600 .auth_token copy of {v,secret,instance} from the vault; create the bridge dirs. Idempotent.
  • sync — Rule-6 fan-out: ONE execution pulls tasks+projects+tags and writes all three as separate CEL-referenceable resources (avoids lock contention).
  • get_tasks / get_current_task / get_worklog — reads (privacy-filtered).
  • create_task — addTask; supports parentId for single-call subtask creation (SP inherits the parent's project/tags), plus addToToday/dueDay.
  • update_task / complete_task — patch fields / mark done.
  • log_time — log/adjust time on a task for a day by writing SP's canonical timeSpentOnDay via updateTask (derived timeSpent recomputes; child→parent rollup is automatic). mode: add|set; durations in milliseconds.
  • plan_for_today / remove_from_today — SP's real Today mechanism (dueDay + the TODAY tag's ordered taskIds), with subtask→parent anchoring.
  • batch — Rule-6 fan-out over batchUpdateForProject: N create/update/delete/ reorder ops in ONE dispatch, surfacing {createdTaskIds, errors} as batchResult.
  • delete_task — permanently delete a task (destructive; verify the id first).
  • create_tag / update_tag / create_project / update_project — structure.
  • notify — fire a native OS notification via SP (workflow primitive).

Quickstart

# 1. store the HMAC secret + instance uuid in a vault, then:
swamp model create @kneel/super-productivity sp \
  --global-arg dataDir=/path/to/super-productivity-swamp \
  --global-arg authSecret='${{ vault.get(super-productivity, secret) }}' \
  --global-arg authInstance='${{ vault.get(super-productivity, instance) }}'
swamp model method run sp provision      # write the plugin's token copy
# 2. import plugin/sp-swamp-plugin.zip into Super Productivity, enable it, restart SP
swamp model method run sp sync           # tasks-main / projects-main / tags-main

Reference the data with CEL (prefer data.latest(...); 2nd arg is the instance):

data.latest("sp", "tasks-main").attributes.tasks

The signed-bridge plugin (plugin/, importable zip plugin/sp-swamp-plugin.zip) and the full design/security docs (docs/) travel with this extension. Bridge wire contract and hardening are documented in docs/super-productivity-plan.md. Full docs: https://github.com/NeilHanlon/swamp-superproductivity

02Behaviors1
@kneel/super-productivityv2026.07.18.1super_productivity.ts

Global Arguments

ArgumentTypeDescription
dataDirstringThe SP bridge/rendezvous directory (holds plugin_commands/ + plugin_responses/).
authSecretstringThe 32-byte HMAC secret as hex. Wire to the vault of record:
authInstancestringThe provisioned instance uuid (bound into every payload as `aud`).
commandTimeoutSnumberHow long to poll for a signed response before failing the command.
pollIntervalMsnumberResponse-directory poll cadence.
excludeTagsarrayPrivacy filter: task tags to strip from read results (mirrors SP_MCP_EXCLUDE_TAGS).
metadatarecord
fn provision()
Create the bridge dirs and write the plugin's 0600 .auth_token copy of {v,secret,instance}
fn sync()
Rule-6 fan-out: ONE execution pulls tasks+projects+tags from the plugin and writes all three CEL-referenceable resources (instance 'main'). Avoids per-model lock contention.
fn get_tasks(includeArchived: boolean)
Fetch tasks from SP and persist the `tasks` snapshot (privacy-filtered).
ArgumentTypeDescription
includeArchivedbooleanInclude archived tasks.
fn get_current_task()
Fetch the currently-selected SP task and persist `currentTask`.
fn get_worklog()
Fetch time-tracking / worklog data and persist the `worklog` snapshot.
fn create_task(title: string, projectId?: string, tagIds?: array, parentId?: string, notes?: string, timeEstimate?: number, addToToday: boolean, dueDay?: string)
Create a task in SP (addTask). Returns the new task id via a refreshed `tasks` snapshot.
ArgumentTypeDescription
titlestringTask title (SP @/#/+ syntax supported by the plugin).
projectId?stringTarget project id. Ignored when parentId is set (subtasks inherit the parent's project).
tagIds?arrayTag ids to attach (NOT 'TODAY' — use addToToday). Ignored when parentId is set (subtasks inherit the parent's tags).
parentId?stringCreate as a subtask of this EXISTING task id (SP routes it through addSubTask; the subtask
notes?string
timeEstimate?numberEstimate in ms.
addToTodaybooleanAlso place the new task on SP's Today list (sets dueDay + TODAY tag order). Default false.
dueDay?stringYYYY-MM-DD for Today placement; defaults to the plugin host's today.
fn update_task(taskId: string, title?: string, notes?: string, projectId?: string, tagIds?: array, timeEstimate?: number, isDone?: boolean, dueDay?: string)
Update fields on an existing SP task (updateTask).
ArgumentTypeDescription
taskIdstring
title?string
notes?string
projectId?string
tagIds?arrayReplaces the task's tags. 'TODAY' here is auto-routed to the Today mechanism (dueDay + tag order),
timeEstimate?number
isDone?boolean
dueDay?stringYYYY-MM-DD; sets the planned day (Today = today's date).
fn plan_for_today(taskIds: array, dueDay?: string)
Add task(s) to SP's Today list the way SP itself does: set dueDay=today AND prepend to the TODAY
ArgumentTypeDescription
taskIdsarrayTask ids to plan for today.
dueDay?stringYYYY-MM-DD; defaults to the plugin host's today.
fn remove_from_today(taskIds: array, clearDueDay: boolean)
Remove task(s) from SP's Today list (drop from the TODAY tag's taskIds; optionally clear dueDay).
ArgumentTypeDescription
taskIdsarray
clearDueDaybooleanAlso null out dueDay (fully unschedule). Default false.
fn complete_task(taskId: string)
Mark an SP task done (updateTask isDone:true).
ArgumentTypeDescription
taskIdstring
fn log_time(taskId: string, durationMs: number, date?: string, mode: enum)
Log/adjust time spent on a task for a given day by writing SP's canonical
ArgumentTypeDescription
taskIdstring
durationMsnumberMilliseconds. mode:add → delta added to the day (may be negative to correct);
date?stringYYYY-MM-DD. Omit ⇒ the plugin's local today (SP's _todayStr()).
modeenum
fn notify(title: string, body: string)
Fire a native OS notification via SP (PluginAPI.notify) — a workflow primitive.
ArgumentTypeDescription
titlestring
bodystring
fn batch(projectId: string, operations: array)
Apply N structural operations to ONE project in a single plugin dispatch
ArgumentTypeDescription
projectIdstringThe project all operations apply within.
operationsarrayOrdered batch operations.
fn delete_task(taskId: string)
Permanently delete an SP task (PluginAPI.deleteTask). Destructive — verify the
ArgumentTypeDescription
taskIdstring
fn create_tag(title: string, color?: string, icon?: string)
Create an SP tag (PluginAPI.addTag). Refreshes snapshots via sync so the new tag id is CEL-referenceable.
ArgumentTypeDescription
titlestring
color?stringHex color, e.g. '#2196f3'.
icon?stringMaterial icon name.
fn update_tag(tagId: string, title?: string, color?: string, icon?: string)
Update fields on an existing SP tag (PluginAPI.updateTag). Refreshes snapshots via sync.
ArgumentTypeDescription
tagIdstring
title?string
color?string
icon?string
fn create_project(title: string)
Create an SP project (PluginAPI.addProject). Refreshes snapshots via sync so the new project id is CEL-referenceable.
ArgumentTypeDescription
titlestring
fn update_project(projectId: string, title?: string, isArchived?: boolean, isHiddenFromMenu?: boolean)
Update fields on an existing SP project (PluginAPI.updateProject). Refreshes snapshots via sync.
ArgumentTypeDescription
projectIdstring
title?string
isArchived?boolean
isHiddenFromMenu?boolean
fn plugin_status()
Query the running plugin loop's self-report (version, ownership, lock
fn build_plugin(pluginDir: string, outZip: string)
Stamp plugin/manifest.json's version into plugin.js's __PLUGIN_VERSION__
ArgumentTypeDescription
pluginDirstringDir holding manifest.json + plugin.js + index.html. Relative paths resolve
outZipstringOutput path for the canonical zip (the manifest.yaml `binaries` entry).

Resources

tasks(5m)— Snapshot of SP tasks (privacy-filtered). Short-lived — treat >5m as stale.
projects(5m)— Snapshot of SP projects.
tags(5m)— Snapshot of SP tags.
currentTask(5m)— The currently-selected SP task (or null).
worklog(5m)— Time-tracking / worklog snapshot.
batchResult(5m)— Result of the last `batch` run: tempId→realId map + per-op errors. CEL-referenceable for chaining.
pluginStatus(5m)— The running plugin loop's self-report (version, ownership, lock freshness).
03Skills1
super-productivity5 files
04Previous Versions3
2026.07.17.1

WS7a: signed meta-command channel (plugin_status, read-only) over the same signed §3/§4 envelope, routed to plugin loop state; reusable build_plugin method that stamps manifest.json's version into the canonical zip (fflate); pluginStatus resource. Adversarially reviewed (2 lenses, 0 blocking), 57 unit tests, live-verified against SP plugin v0.1.15.

Modified 1 behaviors. updated binaries

2026.07.16.5

updated binaries

2026.07.16.4
05Stats
A
93 / 100
Downloads
15
Archive size
86.0 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License1/2partial

    no SPDX license declared

  • Verified public repository2/2earned
06Platforms
07Labels