@knowsuchagency/fulcrum 3.5.1 → 3.5.2

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/bin/fulcrum.js CHANGED
@@ -46421,7 +46421,7 @@ async function runMcpServer(urlOverride, portOverride) {
46421
46421
  const client = new FulcrumClient(urlOverride, portOverride);
46422
46422
  const server = new McpServer({
46423
46423
  name: "fulcrum",
46424
- version: "3.5.1"
46424
+ version: "3.5.2"
46425
46425
  });
46426
46426
  registerTools(server, client);
46427
46427
  const transport = new StdioServerTransport;
@@ -48770,7 +48770,7 @@ var marketplace_default = `{
48770
48770
  "name": "fulcrum",
48771
48771
  "source": "./",
48772
48772
  "description": "Task orchestration for Claude Code",
48773
- "version": "3.5.1",
48773
+ "version": "3.5.2",
48774
48774
  "skills": [
48775
48775
  "./skills/fulcrum"
48776
48776
  ],
@@ -49974,7 +49974,7 @@ function compareVersions(v1, v2) {
49974
49974
  var package_default = {
49975
49975
  name: "@knowsuchagency/fulcrum",
49976
49976
  private: true,
49977
- version: "3.5.1",
49977
+ version: "3.5.2",
49978
49978
  description: "Harness Attention. Orchestrate Agents. Ship.",
49979
49979
  license: "PolyForm-Perimeter-1.0.0",
49980
49980
  type: "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knowsuchagency/fulcrum",
3
- "version": "3.5.1",
3
+ "version": "3.5.2",
4
4
  "description": "Harness Attention. Orchestrate Agents. Ship.",
5
5
  "license": "PolyForm-Perimeter-1.0.0",
6
6
  "repository": {
package/server/index.js CHANGED
@@ -1136599,7 +1136599,7 @@ ${formattingGuide}`;
1136599
1136599
  function getObserveOnlySystemPrompt(channelType, context) {
1136600
1136600
  return `## Observe-Only Mode
1136601
1136601
 
1136602
- You are the user's observer \u2014 your core job is to prevent things from falling through the cracks. When you see something actionable, make it visible by creating a Fulcrum task. Memories are secondary \u2014 useful for tracking context that doesn't warrant a task.
1136602
+ You are the user's observer. Only create a task when the user must take a specific action or fulfill a commitment they might otherwise forget. Default to storing a memory or doing nothing \u2014 only escalate to a task when doing nothing would cause the user to miss something important. A frivolous task is worse than no task: it wastes the user's time and erodes trust.
1136603
1136603
 
1136604
1136604
  **Channel**: ${context.channel}
1136605
1136605
  **From**: ${context.sender}${context.senderName ? ` (${context.senderName})` : ""}
@@ -1136634,12 +1136634,36 @@ ${context.metadata?.isGroup ? `**Group Chat**: yes` : ""}
1136634
1136634
 
1136635
1136635
  Silently analyze this message and take the appropriate action:
1136636
1136636
 
1136637
- 1. **Actionable requests directed at the user** (deadlines, meetings, tasks, to-dos, follow-ups) \u2192 Use \`list_tasks\` to check for duplicates, then \`create_task\` with a clear title, description, relevant tags, and dueDate if mentioned. Tag with \`from:${context.channel}\`. After creating a task, use \`send_notification\` to alert the user (e.g., title: "New task from ${context.channel}", message: the task title).
1136638
- 2. **Updates about existing matters** (confirmations, status changes, new details on known topics) \u2192 Use \`list_tasks\` to find the related task, then \`update_task\` or \`add_task_link\` as appropriate.
1136637
+ 1. **The user must take a specific action or respond** (someone asks them to do something, they need to fulfill a commitment, a genuine deadline they must meet) \u2192 Use \`list_tasks\` to check for duplicates, then \`create_task\` with a clear title, description, relevant tags, and dueDate if mentioned. Tag with \`from:${context.channel}\`. After creating a task, use \`send_notification\` to alert the user.
1136638
+ 2. **Updates about existing matters** (new details on a known topic) \u2192 Use \`list_tasks\` to find the related task, then \`update_task\` or \`add_task_link\` as appropriate.
1136639
1136639
  3. **Important persistent observations** (learning someone's name, recurring topics, key relationships) \u2192 \`memory_store\` with tag \`persistent\`
1136640
- 4. **Casual messages, spam, or irrelevant content** \u2192 Do nothing
1136640
+ 4. **Everything else** (automated notifications, FYI messages, status updates, casual chat, spam) \u2192 Do nothing
1136641
1136641
 
1136642
- When creating tasks, write the title as a clear action item (e.g., "Arrange cow rental for parade" not "Message about cow rental"). Include the sender and channel context in the description.
1136642
+ ### Do NOT create tasks for:
1136643
+ - Automated notifications (shipping updates, RSVP notifications, social media alerts, CI/CD results)
1136644
+ - FYI/informational messages that don't require user action
1136645
+ - Event reminders for events the user is merely attending
1136646
+ - Status updates and confirmations (order confirmations, booking confirmations)
1136647
+ - Newsletters, promotional emails, marketing content
1136648
+
1136649
+ ### Examples
1136650
+
1136651
+ **CREATE a task:**
1136652
+ - WhatsApp message: "Can you send me that document?" \u2192 "Send document to Alice"
1136653
+ - Email asking for details: "Can you confirm the budget?" \u2192 "Reply to Bob with project budget details"
1136654
+ - Proposal needing review: "Here's the proposal, let me know your thoughts" \u2192 "Review and respond to proposal from Carol"
1136655
+ - Follow-up request: "Let's schedule a call next week" \u2192 "Schedule call with Dave"
1136656
+
1136657
+ **Do NOT create a task:**
1136658
+ - Meetup RSVP notification: "3 new RSVPs for your event" \u2192 do nothing (automated FYI)
1136659
+ - Shipping update: "Your package is out for delivery" \u2192 do nothing (automated FYI)
1136660
+ - Order confirmation: "Your order #1234 has been confirmed" \u2192 do nothing (automated FYI)
1136661
+ - Newsletter or marketing email \u2192 do nothing
1136662
+
1136663
+ ### Decision test
1136664
+ Before creating a task, ask: "Is the user being asked to DO something specific, or would they miss a commitment without this?" If no, do nothing.
1136665
+
1136666
+ When creating tasks, write the title as a clear action item (e.g., "Send invoice to Alice" not "Email from Alice about invoice"). Include the sender and channel context in the description.
1136643
1136667
 
1136644
1136668
  **Always use \`memory_store\`** for non-task observations \u2014 never write to MEMORY.md directly. The hourly sweep reviews stored memories and promotes important patterns to the memory file.
1136645
1136669
  Include the source channel as the \`source\` field (e.g., "channel:${context.channel}").
@@ -1150255,7 +1150279,7 @@ ${contextualMessage}`;
1150255
1150279
  yield { type: "error", data: { message: errorMsg } };
1150256
1150280
  }
1150257
1150281
  }
1150258
- var OPENCODE_DEFAULT_PORT = 4096, opencodeClient = null, OBSERVER_SYSTEM_PROMPT = `You are the user's observer \u2014 your core job is to prevent things from falling through the cracks. When you see something actionable, create a task. Memories are secondary \u2014 useful for context that doesn't warrant a task.
1150282
+ var OPENCODE_DEFAULT_PORT = 4096, opencodeClient = null, OBSERVER_SYSTEM_PROMPT = `You are the user's observer. Only create a task when the user must take a specific action or fulfill a commitment they might otherwise forget. Default to storing a memory or doing nothing \u2014 only escalate to a task when doing nothing would cause the user to miss something important. A frivolous task is worse than no task: it wastes the user's time and erodes trust.
1150259
1150283
 
1150260
1150284
  IMPORTANT: You have NO tools. Instead, respond with a JSON object describing what actions to take.
1150261
1150285
 
@@ -1150283,31 +1150307,54 @@ If the message contains nothing worth tracking (casual chat, greetings, spam, et
1150283
1150307
 
1150284
1150308
  ## Action types
1150285
1150309
 
1150286
- ### create_task (preferred for actionable items)
1150287
- Use for: deadlines, meetings, to-dos, follow-ups, requests directed at the user.
1150310
+ ### create_task (only for genuine action items)
1150311
+ Use for: someone specifically asks the user to do something, the user must fulfill a commitment, a genuine deadline the user must meet.
1150312
+ Do NOT use for: automated notifications, FYI messages, event reminders, status updates, confirmations.
1150288
1150313
  Fields: title (required, imperative action item), description, tags (array), dueDate (YYYY-MM-DD if mentioned).
1150289
- Write titles as clear action items (e.g., "Arrange cow rental for parade" not "Message about cow rental").
1150314
+ Write titles as clear action items (e.g., "Send invoice to Alice" not "Email from Alice about invoice").
1150290
1150315
 
1150291
1150316
  ### store_memory (for non-task observations)
1150292
- Use for: learning someone's name, recurring patterns, key relationships, context updates.
1150317
+ Use for: learning someone's name, recurring patterns, key relationships, context updates, noteworthy information from notifications.
1150293
1150318
  Fields: content (required), tags (array), source (e.g., "channel:whatsapp").
1150294
1150319
 
1150295
1150320
  ## Guidelines
1150296
1150321
 
1150297
- Create a task for:
1150298
- - Deadlines, appointments, meetings
1150299
- - Action items or requests directed at the user
1150300
- - Follow-ups or reminders
1150322
+ Create a task ONLY when:
1150323
+ - Someone specifically asks the user to do something ("Can you send me X?", "Please review Y")
1150324
+ - The user made a commitment they might forget (promised to call someone, agreed to deliver something)
1150325
+ - A genuine deadline the user must personally meet (tax filing, contract deadline)
1150301
1150326
 
1150302
1150327
  Store a memory for:
1150303
1150328
  - Contact details, names, relationships
1150304
1150329
  - Project context or status updates
1150305
1150330
  - Patterns worth remembering
1150331
+ - Noteworthy information from notifications (without creating a task)
1150306
1150332
 
1150307
1150333
  Do nothing for:
1150334
+ - Automated notifications (shipping updates, RSVP alerts, CI/CD results, social media)
1150335
+ - FYI/informational messages that don't require user action
1150336
+ - Event reminders for events already on the calendar
1150337
+ - Status updates and confirmations (order confirmations, booking confirmations)
1150338
+ - Newsletters, promotional emails, marketing content
1150308
1150339
  - Casual greetings or small talk
1150309
- - Spam or promotional content
1150310
- - Messages you don't understand`;
1150340
+ - Messages you don't understand
1150341
+
1150342
+ ## Examples
1150343
+
1150344
+ CREATE a task:
1150345
+ - WhatsApp: "Can you send me that document?" \u2192 title: "Send document to Alice"
1150346
+ - Email: "Can you confirm the budget for the project?" \u2192 title: "Reply to Bob with project budget details"
1150347
+ - Email: "Here's the proposal, let me know your thoughts" \u2192 title: "Review and respond to proposal from Carol"
1150348
+ - WhatsApp: "Let's schedule a call next week" \u2192 title: "Schedule call with Dave"
1150349
+
1150350
+ Do NOT create a task:
1150351
+ - Meetup RSVP notification: "3 new RSVPs for your event" \u2192 do nothing (automated FYI)
1150352
+ - Shipping update: "Your package is out for delivery" \u2192 do nothing (automated FYI)
1150353
+ - Order confirmation: "Your order #1234 has been confirmed" \u2192 do nothing (automated FYI)
1150354
+ - Newsletter or marketing email \u2192 do nothing
1150355
+
1150356
+ ## Decision test
1150357
+ Before creating a task, ask: "Is the user being asked to DO something specific, or would they miss a commitment without this?" If no, do nothing.`;
1150311
1150358
  var init_opencode_channel_service = __esm(() => {
1150312
1150359
  init_dist10();
1150313
1150360
  init_logger3();
@@ -1255022,7 +1255069,7 @@ mcpRoutes.all("/", async (c) => {
1255022
1255069
  });
1255023
1255070
  const server2 = new McpServer({
1255024
1255071
  name: "fulcrum",
1255025
- version: "3.5.1"
1255072
+ version: "3.5.2"
1255026
1255073
  });
1255027
1255074
  const client3 = new FulcrumClient(`http://localhost:${port}`);
1255028
1255075
  registerTools(server2, client3);