@knowsuchagency/fulcrum 3.5.2 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@ Fulcrum doesn't replace your tools—it gives you leverage over them. You config
17
17
  - **Claude Code Ecosystem** — Deep integration with Claude Code. Connect via messaging channels, manage tasks, deploy from one dashboard.
18
18
  - **Proactive AI Concierge** — Your assistant monitors messages, stores important observations as memories, creates daily plans, and sends morning/evening briefings automatically.
19
19
  - **Work From Anywhere** — Run Fulcrum on a remote server. Close your laptop, agents keep working.
20
- - **Project Management** — Tasks with dependencies, due dates, labels, and attachments. Visual kanban boards.
20
+ - **Project Management** — Tasks with dependencies, due dates, recurrence, labels, and attachments. Visual kanban boards.
21
21
  - **Production Deployment** — Docker Compose with automatic Traefik routing and Cloudflare DNS/tunnels.
22
22
  - **Agent Memory** — Persistent knowledge store with full-text search. Agents remember across sessions.
23
23
  - **MCP-First Architecture** — 60+ tools exposed via Model Context Protocol. Agents discover what they need.
@@ -42,7 +42,7 @@ Fulcrum's AI assistant doesn't just respond—it actively monitors and manages y
42
42
 
43
43
  When messages arrive via Email, WhatsApp, Discord, Telegram, or Slack:
44
44
 
45
- - **Actionable requests** (deadlines, meetings, tasks) → Stored as memories with `actionable` tag, optionally creates tasks
45
+ - **Actionable requests** (deadlines, meetings, tasks) → Creates Fulcrum tasks and stores as memories with `actionable` tag
46
46
  - **Casual conversations** → Responded to naturally, no tracking overhead
47
47
  - **Spam/newsletters** → Silently ignored
48
48
 
@@ -120,7 +120,7 @@ claude plugin install fulcrum@fulcrum --scope user
120
120
 
121
121
  ### Kanban Board & AI Assistant
122
122
 
123
- Track tasks from planning to done. The built-in AI assistant has full context of everything you're tracking—tasks, projects, apps—and can help with planning, documentation, or running MCP tools.
123
+ Track tasks from planning to done. Set up recurring tasks that auto-create the next occurrence when completed. The built-in AI assistant has full context of everything you're tracking—tasks, projects, apps—and can help with planning, documentation, or running MCP tools.
124
124
 
125
125
  ![Kanban Board with AI Assistant](https://raw.githubusercontent.com/knowsuchagency/fulcrum/main/screenshots/kanban-with-assistant-dark.png)
126
126
 
@@ -156,12 +156,13 @@ Create documents with live preview. Generate charts and visualizations. The assi
156
156
 
157
157
  ### Calendar Integration
158
158
 
159
- Connect multiple calendar accounts so the AI assistant knows your schedule. Calendar has its own top-level page (`/calendar`, Cmd+7) with project and tag filters.
159
+ Connect multiple calendar accounts so the AI assistant knows your schedule. Calendar has its own top-level page (`/calendar`, Cmd+7) with month and week views, project and tag filters.
160
160
 
161
161
  - **Google Calendar** — Direct Google API integration via OAuth2 (recommended)
162
162
  - **Any CalDAV server** — Nextcloud, Radicale, Baikal, iCloud
163
163
  - **Multiple accounts** — Add as many accounts as you need
164
164
  - **Automatic sync** — Each account syncs independently on a configurable interval
165
+ - **Weekly view** — Google Calendar-style week view with time axis, overlapping event layout, and current time indicator
165
166
  - **One-way event copying** — Copy events between calendars across accounts via configurable rules
166
167
  - **Due date colors** — Red (overdue), orange (today), yellow (tomorrow) visual indicators
167
168
  - **Assistant awareness** — The AI assistant uses your calendar context for planning and scheduling
@@ -245,7 +246,7 @@ Both plugins include an MCP server with 60+ tools:
245
246
 
246
247
  | Category | Description |
247
248
  |----------|-------------|
248
- | **Tasks** | Create, update, move tasks; manage links, labels, attachments, due dates |
249
+ | **Tasks** | Create, update, move tasks; manage links, labels, attachments, due dates, recurrence |
249
250
  | **Task Dependencies** | Define prerequisite tasks; visualize with dependency graph |
250
251
  | **Projects** | Manage projects with tags, notes, and file attachments |
251
252
  | **Repositories** | Add, configure, and link repositories to projects |
package/bin/fulcrum.js CHANGED
@@ -44589,7 +44589,9 @@ function registerCreateTask(server, client) {
44589
44589
  projectId: exports_external.optional(exports_external.string()).describe("Project ID to associate with"),
44590
44590
  repositoryId: exports_external.optional(exports_external.string()).describe("Repository ID (alternative to repoPath)"),
44591
44591
  tags: exports_external.optional(exports_external.array(exports_external.string())).describe("Tags to add to the task"),
44592
- dueDate: exports_external.optional(exports_external.string()).describe("Due date in YYYY-MM-DD format")
44592
+ dueDate: exports_external.optional(exports_external.string()).describe("Due date in YYYY-MM-DD format"),
44593
+ recurrenceRule: exports_external.optional(exports_external.enum(["daily", "weekly", "biweekly", "monthly", "quarterly", "yearly"])).describe("Recurrence frequency - creates a new TO_DO task when completed"),
44594
+ recurrenceEndDate: exports_external.optional(exports_external.string()).describe("Stop recurring after this date (YYYY-MM-DD). Omit for no end date.")
44593
44595
  }, async ({
44594
44596
  title,
44595
44597
  repoPath,
@@ -44600,7 +44602,9 @@ function registerCreateTask(server, client) {
44600
44602
  projectId,
44601
44603
  repositoryId,
44602
44604
  tags,
44603
- dueDate
44605
+ dueDate,
44606
+ recurrenceRule,
44607
+ recurrenceEndDate
44604
44608
  }) => {
44605
44609
  try {
44606
44610
  const repoName = repoPath ? basename2(repoPath) : null;
@@ -44617,7 +44621,9 @@ function registerCreateTask(server, client) {
44617
44621
  projectId: projectId ?? null,
44618
44622
  repositoryId: repositoryId ?? null,
44619
44623
  tags,
44620
- dueDate: dueDate ?? null
44624
+ dueDate: dueDate ?? null,
44625
+ recurrenceRule: recurrenceRule ?? null,
44626
+ recurrenceEndDate: recurrenceEndDate ?? null
44621
44627
  });
44622
44628
  if (tags && tags.length > 0) {
44623
44629
  const allTasks = await client.listTasks();
@@ -44641,17 +44647,23 @@ function registerCreateTask(server, client) {
44641
44647
  });
44642
44648
  }
44643
44649
  function registerUpdateTask(server, client) {
44644
- server.tool("update_task", "Update task metadata (title or description)", {
44650
+ server.tool("update_task", "Update task metadata (title, description, recurrence)", {
44645
44651
  id: exports_external.string().describe("Task ID"),
44646
44652
  title: exports_external.optional(exports_external.string()).describe("New title"),
44647
- description: exports_external.optional(exports_external.string()).describe("New description")
44648
- }, async ({ id, title, description }) => {
44653
+ description: exports_external.optional(exports_external.string()).describe("New description"),
44654
+ recurrenceRule: exports_external.optional(exports_external.nullable(exports_external.enum(["daily", "weekly", "biweekly", "monthly", "quarterly", "yearly"]))).describe("Recurrence frequency, or null to remove"),
44655
+ recurrenceEndDate: exports_external.optional(exports_external.nullable(exports_external.string())).describe("Stop recurring after this date (YYYY-MM-DD), or null to remove")
44656
+ }, async ({ id, title, description, recurrenceRule, recurrenceEndDate }) => {
44649
44657
  try {
44650
44658
  const updates = {};
44651
44659
  if (title !== undefined)
44652
44660
  updates.title = title;
44653
44661
  if (description !== undefined)
44654
44662
  updates.description = description;
44663
+ if (recurrenceRule !== undefined)
44664
+ updates.recurrenceRule = recurrenceRule;
44665
+ if (recurrenceEndDate !== undefined)
44666
+ updates.recurrenceEndDate = recurrenceEndDate;
44655
44667
  const task = await client.updateTask(id, updates);
44656
44668
  return formatSuccess(task);
44657
44669
  } catch (err) {
@@ -46421,7 +46433,7 @@ async function runMcpServer(urlOverride, portOverride) {
46421
46433
  const client = new FulcrumClient(urlOverride, portOverride);
46422
46434
  const server = new McpServer({
46423
46435
  name: "fulcrum",
46424
- version: "3.5.2"
46436
+ version: "3.6.0"
46425
46437
  });
46426
46438
  registerTools(server, client);
46427
46439
  const transport = new StdioServerTransport;
@@ -48770,7 +48782,7 @@ var marketplace_default = `{
48770
48782
  "name": "fulcrum",
48771
48783
  "source": "./",
48772
48784
  "description": "Task orchestration for Claude Code",
48773
- "version": "3.5.2",
48785
+ "version": "3.6.0",
48774
48786
  "skills": [
48775
48787
  "./skills/fulcrum"
48776
48788
  ],
@@ -49974,7 +49986,7 @@ function compareVersions(v1, v2) {
49974
49986
  var package_default = {
49975
49987
  name: "@knowsuchagency/fulcrum",
49976
49988
  private: true,
49977
- version: "3.5.2",
49989
+ version: "3.6.0",
49978
49990
  description: "Harness Attention. Orchestrate Agents. Ship.",
49979
49991
  license: "PolyForm-Perimeter-1.0.0",
49980
49992
  type: "module",