vector-task-mcp 1.2.4__tar.gz → 1.2.6__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.
Files changed (25) hide show
  1. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/PKG-INFO +1 -1
  2. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/pyproject.toml +1 -1
  3. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/src/task_store.py +68 -0
  4. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/vector_task_mcp.egg-info/PKG-INFO +1 -1
  5. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/.mcp.json +0 -0
  6. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/.python-version +0 -0
  7. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/CLAUDE.md +0 -0
  8. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/LICENSE +0 -0
  9. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/MANIFEST.in +0 -0
  10. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/README.md +0 -0
  11. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/claude-desktop-config.example.json +0 -0
  12. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/main.py +0 -0
  13. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/requirements.txt +0 -0
  14. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/run-arm64.sh +0 -0
  15. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/setup.cfg +0 -0
  16. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/src/__init__.py +0 -0
  17. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/src/embeddings.py +0 -0
  18. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/src/models.py +0 -0
  19. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/src/security.py +0 -0
  20. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/tests/test_task_store.py +0 -0
  21. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/vector_task_mcp.egg-info/SOURCES.txt +0 -0
  22. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/vector_task_mcp.egg-info/dependency_links.txt +0 -0
  23. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/vector_task_mcp.egg-info/entry_points.txt +0 -0
  24. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/vector_task_mcp.egg-info/requires.txt +0 -0
  25. {vector_task_mcp-1.2.4 → vector_task_mcp-1.2.6}/vector_task_mcp.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vector-task-mcp
3
- Version: 1.2.4
3
+ Version: 1.2.6
4
4
  Summary: A secure, vector-based task management server for Claude Desktop using sqlite-vec and sentence-transformers
5
5
  Author-email: Xsaven <xsaven@gmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vector-task-mcp"
3
- version = "1.2.4"
3
+ version = "1.2.6"
4
4
  description = "A secure, vector-based task management server for Claude Desktop using sqlite-vec and sentence-transformers"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -201,6 +201,66 @@ class TaskStore:
201
201
  # Recursively propagate to grandparent
202
202
  self._propagate_time_to_parents(conn, parent_id, time_delta)
203
203
 
204
+ def _propagate_completed_to_parents(self, conn: sqlite3.Connection, task_id: int) -> None:
205
+ """
206
+ Recursively propagate 'completed' status to parent tasks when ALL children are finished.
207
+
208
+ Rules:
209
+ - Parent gets 'completed' ONLY when ALL children are in finish statuses (completed/tested/validated)
210
+ - Recursively propagates up the parent chain with same check at each level
211
+
212
+ Args:
213
+ conn: Active database connection (must be within transaction)
214
+ task_id: Current task ID whose status just changed to a finish status
215
+ """
216
+ # Get parent_id of current task
217
+ cursor = conn.execute('SELECT parent_id FROM tasks WHERE id = ?', (task_id,))
218
+ row = cursor.fetchone()
219
+ if not row or not row[0]: # No parent
220
+ return
221
+
222
+ parent_id = row[0]
223
+ finish_statuses = TaskStatus.finish_statuses()
224
+
225
+ # Check if ALL children of parent are in finish statuses
226
+ placeholders = ','.join('?' * len(finish_statuses))
227
+ cursor = conn.execute(f'''
228
+ SELECT COUNT(*) FROM tasks
229
+ WHERE parent_id = ? AND status NOT IN ({placeholders})
230
+ ''', (parent_id, *finish_statuses))
231
+ non_finished = cursor.fetchone()[0]
232
+
233
+ if non_finished == 0:
234
+ # All children finished → set parent to 'completed'
235
+ conn.execute('UPDATE tasks SET status = ? WHERE id = ?', ('completed', parent_id))
236
+ # Recursively check grandparent
237
+ self._propagate_completed_to_parents(conn, parent_id)
238
+
239
+ def _propagate_pending_to_parents(self, conn: sqlite3.Connection, task_id: int) -> None:
240
+ """
241
+ Recursively propagate 'pending' status to parent tasks when ANY child returns to pending.
242
+
243
+ Rules:
244
+ - Parent gets 'pending' when ANY child becomes 'pending'
245
+ - Recursively propagates up the parent chain
246
+
247
+ Args:
248
+ conn: Active database connection (must be within transaction)
249
+ task_id: Current task ID whose status just changed to 'pending'
250
+ """
251
+ # Get parent_id of current task
252
+ cursor = conn.execute('SELECT parent_id FROM tasks WHERE id = ?', (task_id,))
253
+ row = cursor.fetchone()
254
+ if not row or not row[0]: # No parent
255
+ return
256
+
257
+ parent_id = row[0]
258
+
259
+ # Set parent to 'pending' unconditionally
260
+ conn.execute('UPDATE tasks SET status = ? WHERE id = ?', ('pending', parent_id))
261
+ # Recursively propagate to grandparent
262
+ self._propagate_pending_to_parents(conn, parent_id)
263
+
204
264
  def _start_time_session(self, conn: sqlite3.Connection, task_id: int, start_status: str) -> None:
205
265
  """
206
266
  Create new time session record in task_time_log table.
@@ -833,6 +893,14 @@ class TaskStore:
833
893
  elif old_status == 'in_progress' and new_status != 'in_progress':
834
894
  self._finish_time_session(conn, task_id, time_delta, new_status)
835
895
 
896
+ # Propagate 'completed' status to parent when ALL children are finished
897
+ if status_changed and new_status in TaskStatus.finish_statuses():
898
+ self._propagate_completed_to_parents(conn, task_id)
899
+
900
+ # Propagate 'pending' status to parent when ANY child returns to pending
901
+ if status_changed and new_status == 'pending':
902
+ self._propagate_pending_to_parents(conn, task_id)
903
+
836
904
  conn.commit()
837
905
 
838
906
  # Fetch updated task
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vector-task-mcp
3
- Version: 1.2.4
3
+ Version: 1.2.6
4
4
  Summary: A secure, vector-based task management server for Claude Desktop using sqlite-vec and sentence-transformers
5
5
  Author-email: Xsaven <xsaven@gmail.com>
6
6
  License: MIT
File without changes
File without changes