superproductivity-mcp 1.2.6.dev7__tar.gz → 1.2.6.dev9__tar.gz
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.
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/PKG-INFO +1 -1
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/plugin/manifest.json +1 -1
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/plugin/plugin.js +49 -13
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/pyproject.toml +1 -1
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/build.yml +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/publish-dev.yml +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/publish.yml +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/release.yml +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/version-gate.yml +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.gitignore +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.mcp.json.example +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.mise.toml +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/LICENSE.txt +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/README.md +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/build-plugin.sh +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/docs/superpowers/plans/2026-04-29-packaging-distribution.md +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/docs/superpowers/plans/2026-04-30-gitflow-ci.md +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/docs/superpowers/specs/2026-04-29-gitflow-ci-design.md +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/docs/superpowers/specs/2026-04-29-packaging-distribution-design.md +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/plugin/index.html +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/src/superproductivity_mcp/__init__.py +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/src/superproductivity_mcp/__main__.py +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/src/superproductivity_mcp/server.py +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/tests/__init__.py +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/tests/test_mcp_logic.py +0 -0
- {superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superproductivity-mcp
|
|
3
|
-
Version: 1.2.6.
|
|
3
|
+
Version: 1.2.6.dev9
|
|
4
4
|
Summary: Super Productivity MCP server for Claude Desktop integration
|
|
5
5
|
Project-URL: Homepage, https://github.com/ben-elliot-nice/superproductivity-mcp
|
|
6
6
|
License-File: LICENSE.txt
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "sp-mcp-bridge",
|
|
3
3
|
"name": "MCP Bridge",
|
|
4
4
|
"description": "Bridge between Super Productivity and MCP (Model Context Protocol) servers for Claude Desktop integration",
|
|
5
|
-
"version": "1.2.6.
|
|
5
|
+
"version": "1.2.6.dev9",
|
|
6
6
|
"manifestVersion": 1,
|
|
7
7
|
"author": "Super Productivity Team",
|
|
8
8
|
"homepage": "https://github.com/johannesjo/super-productivity",
|
|
@@ -525,26 +525,62 @@ class MCPBridgePlugin {
|
|
|
525
525
|
const allTasks = await PluginAPI.getTasks();
|
|
526
526
|
const taskMap = new Map(allTasks.map(t => [t.id, t]));
|
|
527
527
|
const fixes = [];
|
|
528
|
+
const errors = [];
|
|
529
|
+
|
|
530
|
+
// Build a map of parentId → [childIds that have parentId set but are missing from parent's subTaskIds]
|
|
531
|
+
// Root cause: concurrent create_tasks calls race on subTaskIds updates — last write wins,
|
|
532
|
+
// leaving orphaned children with parentId set but not in parent's subTaskIds array.
|
|
533
|
+
const missingFromParent = new Map(); // parentId → Set of childIds to add
|
|
528
534
|
for (const task of allTasks) {
|
|
529
|
-
// Fix 1: child is in parent's subTaskIds but has no parentId set
|
|
530
|
-
for (const childId of (task.subTaskIds || [])) {
|
|
531
|
-
const child = taskMap.get(childId);
|
|
532
|
-
if (child && !child.parentId) {
|
|
533
|
-
await PluginAPI.updateTask(childId, { parentId: task.id });
|
|
534
|
-
fixes.push(`set parentId on "${child.title}" → parent "${task.title}"`);
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
// Fix 2: child has parentId set but is missing from parent's subTaskIds
|
|
538
535
|
if (task.parentId) {
|
|
539
536
|
const parent = taskMap.get(task.parentId);
|
|
540
537
|
if (parent && !(parent.subTaskIds || []).includes(task.id)) {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
538
|
+
if (!missingFromParent.has(task.parentId)) {
|
|
539
|
+
missingFromParent.set(task.parentId, new Set());
|
|
540
|
+
}
|
|
541
|
+
missingFromParent.get(task.parentId).add(task.id);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// Step 1: For each parent, add ALL missing children to subTaskIds in one update
|
|
547
|
+
for (const [parentId, missingIds] of missingFromParent) {
|
|
548
|
+
const parent = taskMap.get(parentId);
|
|
549
|
+
try {
|
|
550
|
+
const updated = [...(parent.subTaskIds || []), ...missingIds];
|
|
551
|
+
await PluginAPI.updateTask(parentId, { subTaskIds: updated });
|
|
552
|
+
const childTitles = [...missingIds].map(id => taskMap.get(id)?.title || id);
|
|
553
|
+
fixes.push(`subTaskIds: added ${missingIds.size} children to "${parent.title}"`);
|
|
554
|
+
} catch (e) {
|
|
555
|
+
errors.push(`failed to fix subTaskIds for "${taskMap.get(parentId)?.title}": ${e.message}`);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// Step 2: Remove subtasks from project taskIds — tasks created without parentId
|
|
560
|
+
// get added to project.taskIds by SP; later setting parentId doesn't remove them,
|
|
561
|
+
// causing double-display (root AND nested). Fix: remove any task with parentId from
|
|
562
|
+
// its project's taskIds, grouped by project to avoid multiple updates per project.
|
|
563
|
+
const projects = await PluginAPI.getAllProjects();
|
|
564
|
+
for (const project of projects) {
|
|
565
|
+
const subtaskIdsInProject = (project.taskIds || []).filter(id => {
|
|
566
|
+
const t = taskMap.get(id);
|
|
567
|
+
return t && t.parentId;
|
|
568
|
+
});
|
|
569
|
+
if (subtaskIdsInProject.length > 0) {
|
|
570
|
+
try {
|
|
571
|
+
const cleaned = (project.taskIds || []).filter(id => {
|
|
572
|
+
const t = taskMap.get(id);
|
|
573
|
+
return !t || !t.parentId;
|
|
574
|
+
});
|
|
575
|
+
await PluginAPI.updateProject(project.id, { taskIds: cleaned });
|
|
576
|
+
fixes.push(`project taskIds: removed ${subtaskIdsInProject.length} subtasks from "${project.title}"`);
|
|
577
|
+
} catch (e) {
|
|
578
|
+
errors.push(`failed to fix taskIds for project "${project.title}": ${e.message}`);
|
|
544
579
|
}
|
|
545
580
|
}
|
|
546
581
|
}
|
|
547
|
-
|
|
582
|
+
|
|
583
|
+
result = { fixed: fixes.length, fixes, errors };
|
|
548
584
|
break;
|
|
549
585
|
}
|
|
550
586
|
|
{superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/build.yml
RENAMED
|
File without changes
|
|
File without changes
|
{superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/publish.yml
RENAMED
|
File without changes
|
{superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/.github/workflows/release.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{superproductivity_mcp-1.2.6.dev7 → superproductivity_mcp-1.2.6.dev9}/tests/test_mcp_logic.py
RENAMED
|
File without changes
|
|
File without changes
|