vector-task-mcp 1.2.3__tar.gz → 1.2.4__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.3 → vector_task_mcp-1.2.4}/PKG-INFO +1 -1
  2. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/pyproject.toml +1 -1
  3. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/src/task_store.py +0 -149
  4. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/vector_task_mcp.egg-info/PKG-INFO +1 -1
  5. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/.mcp.json +0 -0
  6. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/.python-version +0 -0
  7. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/CLAUDE.md +0 -0
  8. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/LICENSE +0 -0
  9. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/MANIFEST.in +0 -0
  10. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/README.md +0 -0
  11. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/claude-desktop-config.example.json +0 -0
  12. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/main.py +0 -0
  13. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/requirements.txt +0 -0
  14. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/run-arm64.sh +0 -0
  15. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/setup.cfg +0 -0
  16. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/src/__init__.py +0 -0
  17. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/src/embeddings.py +0 -0
  18. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/src/models.py +0 -0
  19. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/src/security.py +0 -0
  20. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/tests/test_task_store.py +0 -0
  21. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/vector_task_mcp.egg-info/SOURCES.txt +0 -0
  22. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/vector_task_mcp.egg-info/dependency_links.txt +0 -0
  23. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/vector_task_mcp.egg-info/entry_points.txt +0 -0
  24. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/vector_task_mcp.egg-info/requires.txt +0 -0
  25. {vector_task_mcp-1.2.3 → vector_task_mcp-1.2.4}/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.3
3
+ Version: 1.2.4
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.3"
3
+ version = "1.2.4"
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,136 +201,6 @@ 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_status_to_parents(self, conn: sqlite3.Connection, task_id: int, new_status: str) -> None:
205
- """
206
- Recursively propagate status to parent tasks based on aggregate child state.
207
-
208
- Rules:
209
- - completed: Parent completed ONLY when ALL children completed
210
- - in_progress: Parent in_progress if ANY child in_progress
211
- - pending/stopped: Parent pending if no children in_progress
212
-
213
- Args:
214
- conn: Active database connection (must be within transaction)
215
- task_id: Current task ID
216
- new_status: Status that triggered this propagation
217
- """
218
- # Get parent_id of current task
219
- cursor = conn.execute('SELECT parent_id FROM tasks WHERE id = ?', (task_id,))
220
- row = cursor.fetchone()
221
- if not row or not row[0]: # No parent
222
- return
223
-
224
- parent_id = row[0]
225
-
226
- finish_statuses = TaskStatus.finish_statuses()
227
-
228
- if new_status in finish_statuses:
229
- # Check if ALL siblings are finished (completed/tested/validated)
230
- placeholders = ','.join('?' * len(finish_statuses))
231
- cursor = conn.execute(f'''
232
- SELECT COUNT(*) FROM tasks
233
- WHERE parent_id = ? AND status NOT IN ({placeholders})
234
- ''', (parent_id, *finish_statuses))
235
- non_finished = cursor.fetchone()[0]
236
-
237
- if non_finished == 0:
238
- # All children finished → parent always gets "completed" (not tested/validated)
239
- parent_status = 'completed'
240
- conn.execute('UPDATE tasks SET status = ? WHERE id = ?', (parent_status, parent_id))
241
- self._propagate_status_to_parents(conn, parent_id, parent_status)
242
- else:
243
- # Not all finished → parent stays in_progress (active work in subtree)
244
- conn.execute('UPDATE tasks SET status = ? WHERE id = ?', ('in_progress', parent_id))
245
- # CRITICAL: Continue recursion to grandparent even when siblings not finished
246
- # This ensures upper hierarchy is notified of activity in deep subtrees
247
- self._propagate_status_to_parents(conn, parent_id, 'in_progress')
248
-
249
- elif new_status == 'in_progress':
250
- # Any child working → parent in_progress
251
- conn.execute('UPDATE tasks SET status = ? WHERE id = ?', ('in_progress', parent_id))
252
- self._propagate_status_to_parents(conn, parent_id, 'in_progress')
253
-
254
- else: # pending or stopped
255
- # Check if any sibling is in_progress
256
- cursor = conn.execute('''
257
- SELECT COUNT(*) FROM tasks
258
- WHERE parent_id = ? AND status = 'in_progress'
259
- ''', (parent_id,))
260
- in_progress_count = cursor.fetchone()[0]
261
-
262
- if in_progress_count > 0:
263
- # Someone still working → parent stays in_progress
264
- conn.execute('UPDATE tasks SET status = ? WHERE id = ?', ('in_progress', parent_id))
265
- else:
266
- # No one working → parent pending
267
- conn.execute('UPDATE tasks SET status = ? WHERE id = ?', ('pending', parent_id))
268
- # Don't propagate these states up
269
-
270
- def _update_parent_timestamps(self, conn: sqlite3.Connection, task_id: int, new_status: str) -> None:
271
- """
272
- Update parent timestamps based on child status changes.
273
-
274
- - When child starts (in_progress): set parent start_at if first child starting and no completed siblings
275
- - When child completes: set parent finish_at if all siblings are now completed
276
-
277
- Recursively propagates up the parent chain.
278
-
279
- Args:
280
- conn: Active database connection (must be within transaction)
281
- task_id: Current task ID
282
- new_status: New status that triggered this update
283
- """
284
- # Get parent_id of current task
285
- cursor = conn.execute('SELECT parent_id FROM tasks WHERE id = ?', (task_id,))
286
- row = cursor.fetchone()
287
- if not row or not row[0]: # No parent
288
- return
289
-
290
- parent_id = row[0]
291
- now = datetime.utcnow().isoformat()
292
-
293
- finish_statuses = TaskStatus.finish_statuses()
294
-
295
- if new_status == 'in_progress':
296
- # Set parent start_at ONLY if:
297
- # 1. Parent has no start_at yet
298
- # 2. No siblings are finished (this is the first activity in hierarchy)
299
- placeholders = ','.join('?' * len(finish_statuses))
300
- cursor = conn.execute(f'''
301
- SELECT
302
- (SELECT start_at FROM tasks WHERE id = ?) as parent_start_at,
303
- (SELECT COUNT(*) FROM tasks WHERE parent_id = ? AND status IN ({placeholders})) as finished_siblings
304
- ''', (parent_id, parent_id, *finish_statuses))
305
- result = cursor.fetchone()
306
- parent_start_at = result[0]
307
- finished_siblings = result[1]
308
-
309
- if parent_start_at is None and finished_siblings == 0:
310
- conn.execute(
311
- 'UPDATE tasks SET start_at = ? WHERE id = ?',
312
- (now, parent_id)
313
- )
314
- # Recursively propagate start_at up
315
- self._update_parent_timestamps(conn, parent_id, new_status)
316
-
317
- elif new_status in finish_statuses:
318
- # Set parent finish_at ONLY if ALL siblings are finished (completed/tested/validated)
319
- placeholders = ','.join('?' * len(finish_statuses))
320
- cursor = conn.execute(f'''
321
- SELECT COUNT(*) FROM tasks
322
- WHERE parent_id = ? AND status NOT IN ({placeholders})
323
- ''', (parent_id, *finish_statuses))
324
- non_finished = cursor.fetchone()[0]
325
-
326
- if non_finished == 0:
327
- conn.execute(
328
- 'UPDATE tasks SET finish_at = ? WHERE id = ?',
329
- (now, parent_id)
330
- )
331
- # Recursively propagate finish_at up
332
- self._update_parent_timestamps(conn, parent_id, new_status)
333
-
334
204
  def _start_time_session(self, conn: sqlite3.Connection, task_id: int, start_status: str) -> None:
335
205
  """
336
206
  Create new time session record in task_time_log table.
@@ -779,20 +649,6 @@ class TaskStore:
779
649
  update_fields.append('"time_spent" = ?')
780
650
  update_values.append(converted_time_spent)
781
651
 
782
- # Block in_progress if task has incomplete children
783
- if new_status == 'in_progress':
784
- placeholders = ','.join('?' * len(finish_statuses))
785
- cursor = conn.execute(f'''
786
- SELECT COUNT(*) FROM tasks
787
- WHERE parent_id = ? AND status NOT IN ({placeholders})
788
- ''', (task_id, *finish_statuses))
789
- incomplete_count = cursor.fetchone()[0]
790
- if incomplete_count > 0:
791
- raise RuntimeError(
792
- f"Cannot set task to in_progress: task has {incomplete_count} "
793
- f"incomplete child task(s). Complete all children first."
794
- )
795
-
796
652
  # Auto-set start_at when changing to in_progress (only if not explicitly provided)
797
653
  if new_status == 'in_progress' and current_status != 'in_progress':
798
654
  if 'start_at' not in validated_kwargs:
@@ -968,11 +824,6 @@ class TaskStore:
968
824
  if time_delta > 0:
969
825
  self._propagate_time_to_parents(conn, task_id, time_delta)
970
826
 
971
- # Propagate status and timestamps to parent tasks
972
- if status_changed and new_status:
973
- self._propagate_status_to_parents(conn, task_id, new_status)
974
- self._update_parent_timestamps(conn, task_id, new_status)
975
-
976
827
  # Time session tracking - start/finish sessions on in_progress transitions
977
828
  if status_changed and old_status is not None:
978
829
  # Start session when entering in_progress
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vector-task-mcp
3
- Version: 1.2.3
3
+ Version: 1.2.4
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