threadkeeper 0.18.2__tar.gz → 0.18.3__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 (269) hide show
  1. {threadkeeper-0.18.2/threadkeeper.egg-info → threadkeeper-0.18.3}/PKG-INFO +1 -1
  2. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/pyproject.toml +1 -1
  3. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_slim.py +32 -12
  4. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/spawn.py +7 -5
  5. {threadkeeper-0.18.2 → threadkeeper-0.18.3/threadkeeper.egg-info}/PKG-INFO +1 -1
  6. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/LICENSE +0 -0
  7. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/README.md +0 -0
  8. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/setup.cfg +0 -0
  9. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_adapters.py +0 -0
  10. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_agent_status.py +0 -0
  11. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_antigravity_ingest.py +0 -0
  12. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_auto_update.py +0 -0
  13. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_backup.py +0 -0
  14. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_brief_footprint.py +0 -0
  15. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_brief_sections.py +0 -0
  16. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_candidate_reviewer.py +0 -0
  17. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ci_parallel.py +0 -0
  18. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_concepts.py +0 -0
  19. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_config_settings.py +0 -0
  20. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_config_watcher.py +0 -0
  21. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_core_memory.py +0 -0
  22. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_curator.py +0 -0
  23. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_host_config.py +0 -0
  24. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_host_integration.py +0 -0
  25. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_liveness.py +0 -0
  26. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_state.py +0 -0
  27. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dashboard.py +0 -0
  28. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_compact.py +0 -0
  29. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_contention.py +0 -0
  30. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_leak_guard.py +0 -0
  31. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_migration_fts.py +0 -0
  32. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_runtime.py +0 -0
  33. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_schema.py +0 -0
  34. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_delegated_search.py +0 -0
  35. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic.py +0 -0
  36. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_feed_tools.py +0 -0
  37. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_miner.py +0 -0
  38. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_observation_resolve.py +0 -0
  39. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_recompute.py +0 -0
  40. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_tier.py +0 -0
  41. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_validator.py +0 -0
  42. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialog_fts_external.py +0 -0
  43. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_documentation_inventory.py +0 -0
  44. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_egress_policy.py +0 -0
  45. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embed_routing.py +0 -0
  46. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embedding_generation.py +0 -0
  47. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embedding_model_revision.py +0 -0
  48. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embedding_storage_dedup.py +0 -0
  49. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_error_paths.py +0 -0
  50. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_eval_harness.py +0 -0
  51. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_applier.py +0 -0
  52. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_apply_2.py +0 -0
  53. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_apply_3.py +0 -0
  54. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_daemon.py +0 -0
  55. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_extract_daemon.py +0 -0
  56. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_extract_dedup.py +0 -0
  57. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_forget.py +0 -0
  58. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_github_budget.py +0 -0
  59. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_github_safety.py +0 -0
  60. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_helpers.py +0 -0
  61. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_hook_child_guard.py +0 -0
  62. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_embed.py +0 -0
  63. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_env.py +0 -0
  64. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_main.py +0 -0
  65. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_wedged.py +0 -0
  66. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_hybrid_retrieval.py +0 -0
  67. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_i18n_multilang.py +0 -0
  68. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_identity.py +0 -0
  69. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_cursor.py +0 -0
  70. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_denylist.py +0 -0
  71. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_secret_redaction.py +0 -0
  72. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_status.py +0 -0
  73. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_transactions.py +0 -0
  74. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_lesson_violations.py +0 -0
  75. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_lessons.py +0 -0
  76. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_mcp_resources_prompts.py +0 -0
  77. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_mcp_sdk_compat.py +0 -0
  78. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_memory_eval.py +0 -0
  79. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_memory_guard.py +0 -0
  80. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_memory_guard_host.py +0 -0
  81. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_menubar_app.py +0 -0
  82. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_missed_spawns.py +0 -0
  83. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_model_catalog.py +0 -0
  84. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_notify_daemon.py +0 -0
  85. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_nudges.py +0 -0
  86. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_onnx_embeddings.py +0 -0
  87. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_panel.py +0 -0
  88. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_permissions.py +0 -0
  89. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_pickup.py +0 -0
  90. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_probe_daemon.py +0 -0
  91. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_process_health.py +0 -0
  92. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_release_workflows.py +0 -0
  93. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_retention.py +0 -0
  94. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_review_prompts.py +0 -0
  95. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_search_fts_punctuation.py +0 -0
  96. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_session_read_purity.py +0 -0
  97. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_setup.py +0 -0
  98. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_shadow_review.py +0 -0
  99. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_single_flight_prompt_prefixes.py +0 -0
  100. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_hint.py +0 -0
  101. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_passive_tier.py +0 -0
  102. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_tier.py +0 -0
  103. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_updater.py +0 -0
  104. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_use_parser.py +0 -0
  105. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_watcher.py +0 -0
  106. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skills.py +0 -0
  107. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_background_cwd.py +0 -0
  108. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_budget.py +0 -0
  109. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_child_env.py +0 -0
  110. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_codex_stdin.py +0 -0
  111. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_config.py +0 -0
  112. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_hint.py +0 -0
  113. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_permission_gate.py +0 -0
  114. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_reap.py +0 -0
  115. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_result.py +0 -0
  116. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_watchdog.py +0 -0
  117. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_worktree_isolation.py +0 -0
  118. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_wrap.py +0 -0
  119. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_capture.py +0 -0
  120. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_identity.py +0 -0
  121. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_migrate.py +0 -0
  122. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_protocol.py +0 -0
  123. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_reset_node.py +0 -0
  124. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_transport.py +0 -0
  125. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_task_retention.py +0 -0
  126. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_task_spool.py +0 -0
  127. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_thin_session.py +0 -0
  128. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_thread_janitor.py +0 -0
  129. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_threads.py +0 -0
  130. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_tool_annotations.py +0 -0
  131. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_tools_smoke.py +0 -0
  132. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_validate_threads.py +0 -0
  133. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_vec_search.py +0 -0
  134. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_verify_ingest.py +0 -0
  135. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/__init__.py +0 -0
  136. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/_mcp.py +0 -0
  137. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/_setup.py +0 -0
  138. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/_spawn_wrap.py +0 -0
  139. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/__init__.py +0 -0
  140. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/_hook_helpers.py +0 -0
  141. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/antigravity.py +0 -0
  142. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/base.py +0 -0
  143. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/claude_code.py +0 -0
  144. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/claude_desktop.py +0 -0
  145. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/codex.py +0 -0
  146. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/copilot.py +0 -0
  147. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/vscode.py +0 -0
  148. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/agent_metadata.py +0 -0
  149. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/agent_status.py +0 -0
  150. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/Info.plist +0 -0
  151. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/README.md +0 -0
  152. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/ThreadKeeperAgentStatus.swift +0 -0
  153. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/build.sh +0 -0
  154. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/install.sh +0 -0
  155. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/auto_update.py +0 -0
  156. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/backup.py +0 -0
  157. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/brief.py +0 -0
  158. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/candidate_reviewer.py +0 -0
  159. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/config.py +0 -0
  160. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/config_io.py +0 -0
  161. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/config_watcher.py +0 -0
  162. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/curator.py +0 -0
  163. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/curator_snapshots.py +0 -0
  164. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/daemon_liveness.py +0 -0
  165. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/daemon_state.py +0 -0
  166. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/daemon_supervisor.py +0 -0
  167. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/db.py +0 -0
  168. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/dialectic_miner.py +0 -0
  169. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/dialectic_validator.py +0 -0
  170. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/egress.py +0 -0
  171. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/elicitation.py +0 -0
  172. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/embeddings.py +0 -0
  173. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/eval/__init__.py +0 -0
  174. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/eval/__main__.py +0 -0
  175. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/eval/harness.py +0 -0
  176. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/evolve_applier.py +0 -0
  177. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/evolve_daemon.py +0 -0
  178. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/extract_daemon.py +0 -0
  179. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/forget.py +0 -0
  180. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/github_budget.py +0 -0
  181. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/github_safety.py +0 -0
  182. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/harvest.py +0 -0
  183. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/helpers.py +0 -0
  184. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/host.py +0 -0
  185. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/host_embed.py +0 -0
  186. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/i18n.py +0 -0
  187. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/identity.py +0 -0
  188. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/ingest.py +0 -0
  189. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/lesson_violations.py +0 -0
  190. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/lessons.py +0 -0
  191. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/link_health.py +0 -0
  192. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/memory_guard.py +0 -0
  193. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/menubar_app.py +0 -0
  194. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/migrate_embeddings.py +0 -0
  195. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/model_catalog.py +0 -0
  196. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/notify.py +0 -0
  197. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/nudges.py +0 -0
  198. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/permissions.py +0 -0
  199. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/probe_daemon.py +0 -0
  200. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/process_health.py +0 -0
  201. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/retention.py +0 -0
  202. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/retrieval.py +0 -0
  203. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/review_prompts.py +0 -0
  204. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/search_proxy.py +0 -0
  205. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/server.py +0 -0
  206. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/shadow_review.py +0 -0
  207. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/skill_audit.py +0 -0
  208. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/skill_updater.py +0 -0
  209. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/skill_watcher.py +0 -0
  210. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/spawn_budget.py +0 -0
  211. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/spawn_config.py +0 -0
  212. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/spawn_result.py +0 -0
  213. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/__init__.py +0 -0
  214. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/capture.py +0 -0
  215. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/daemon.py +0 -0
  216. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/identity.py +0 -0
  217. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/migrate.py +0 -0
  218. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/protocol.py +0 -0
  219. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/reset_node.py +0 -0
  220. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/server.py +0 -0
  221. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/task_spool.py +0 -0
  222. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/thread_janitor.py +0 -0
  223. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tool_schemas.py +0 -0
  224. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/__init__.py +0 -0
  225. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/agent_status.py +0 -0
  226. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/candidate_reviewer.py +0 -0
  227. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/concepts.py +0 -0
  228. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/config_watch.py +0 -0
  229. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/consolidate.py +0 -0
  230. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/core_memory.py +0 -0
  231. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/correlation.py +0 -0
  232. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/curator.py +0 -0
  233. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dashboard.py +0 -0
  234. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/db_maintenance.py +0 -0
  235. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dialectic.py +0 -0
  236. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dialectic_feed.py +0 -0
  237. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dialog.py +0 -0
  238. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/distill.py +0 -0
  239. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/evolve_applier.py +0 -0
  240. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/evolve_research.py +0 -0
  241. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/extract.py +0 -0
  242. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/forget.py +0 -0
  243. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/graph.py +0 -0
  244. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/invariants.py +0 -0
  245. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/lessons.py +0 -0
  246. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/memory_guard.py +0 -0
  247. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/missed_spawns.py +0 -0
  248. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/panel.py +0 -0
  249. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/peers.py +0 -0
  250. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/pickup.py +0 -0
  251. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/probes.py +0 -0
  252. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/process_health.py +0 -0
  253. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/prompts.py +0 -0
  254. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/resources.py +0 -0
  255. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/session.py +0 -0
  256. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/shadow_review.py +0 -0
  257. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/skills.py +0 -0
  258. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/style.py +0 -0
  259. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/sync.py +0 -0
  260. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/threads.py +0 -0
  261. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/validate.py +0 -0
  262. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/trash.py +0 -0
  263. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/verify_ingest.py +0 -0
  264. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/wikilinks.py +0 -0
  265. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/SOURCES.txt +0 -0
  266. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/dependency_links.txt +0 -0
  267. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/entry_points.txt +0 -0
  268. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/requires.txt +0 -0
  269. {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: threadkeeper
3
- Version: 0.18.2
3
+ Version: 0.18.3
4
4
  Summary: Multi-agent shared brain across Claude Code/Desktop, Codex, Antigravity CLI, Copilot, and VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server.
5
5
  Author: thread-keeper contributors
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "threadkeeper"
7
- version = "0.18.2"
7
+ version = "0.18.3"
8
8
  description = "Multi-agent shared brain across Claude Code/Desktop, Codex, Antigravity CLI, Copilot, and VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server."
9
9
  requires-python = ">=3.11"
10
10
  authors = [{ name = "thread-keeper contributors" }]
@@ -9,7 +9,6 @@ from __future__ import annotations
9
9
  import json
10
10
  from pathlib import Path
11
11
 
12
- import pytest
13
12
 
14
13
 
15
14
  _FAKE_CID = "11112222-3333-4444-5555-666677778888"
@@ -265,18 +264,39 @@ def test_claude_large_prompt_uses_stdin_file(mp_with_cid, monkeypatch):
265
264
  assert mode == 0o600, f"expected 0600, got {oct(mode)}"
266
265
 
267
266
 
268
- def test_spawn_slim_falls_back_to_full_config_when_unable(tmp_path, monkeypatch):
269
- """If _build_slim_mcp_config returns None (e.g. write error), spawn()
270
- must NOT crash — it just runs without slim flags."""
271
- # We unit-test by patching _build_slim_mcp_config to return None and
272
- # then checking spawn doesn't append --mcp-config to the cmd. But the
273
- # whole flow runs subprocess.Popen which we don't want in tests. Skip
274
- # full integration — the conditional branch in spawn() is plain
275
- # if-statement, no need for deep coverage.
276
- pytest.skip(
277
- "spawn() invokes claude CLI; slim-fallback path is covered by "
278
- "inspection of the conditional branch"
267
+ def test_spawn_refuses_when_the_slim_config_cannot_be_written(
268
+ mp_with_cid, monkeypatch,
269
+ ):
270
+ """A slim child whose MCP file cannot be written must not silently run
271
+ with the user's full MCP config (every configured server)."""
272
+ pkg = mp_with_cid(_FAKE_CID)
273
+ import threadkeeper.identity as identity
274
+ import threadkeeper.spawn_config as spawn_config
275
+ import threadkeeper.tools.spawn as spawn_mod
276
+
277
+ monkeypatch.setattr(spawn_mod, "_claude_bin", lambda: "/bin/true")
278
+ monkeypatch.setattr(identity, "_active_cli", "claude")
279
+ monkeypatch.setattr(
280
+ spawn_config, "resolve_agent", lambda role, active_cli=None: "claude"
279
281
  )
282
+ monkeypatch.setattr(spawn_mod, "_build_slim_mcp_config", lambda *a, **k: None)
283
+ launched = []
284
+ monkeypatch.setattr(
285
+ spawn_mod.subprocess, "Popen", lambda *a, **k: launched.append(a),
286
+ )
287
+
288
+ out = spawn_mod.spawn(
289
+ prompt="x", cwd=str(pkg["tmp"]), slim=True, visible=False,
290
+ capture_output=False,
291
+ )
292
+
293
+ assert out == "ERR slim_mcp_config_failed"
294
+ assert launched == []
295
+ conn = pkg["db"].get_db()
296
+ try:
297
+ assert conn.execute("SELECT COUNT(*) FROM tasks").fetchone()[0] == 0
298
+ finally:
299
+ conn.close()
280
300
 
281
301
 
282
302
  def test_review_thread_uses_slim_by_default(mp_with_cid, monkeypatch):
@@ -456,8 +456,8 @@ def _build_slim_mcp_config(
456
456
  (matches their actual install). Fall back to a synthesized config
457
457
  based on the running Python interpreter and package location.
458
458
 
459
- Returns the path to the slim config file, or None if neither path
460
- can produce a valid entry (caller should fall back to full config).
459
+ Returns the path to the slim config file, or None if it cannot be
460
+ written; the caller then refuses the spawn rather than widen the child.
461
461
  """
462
462
  try:
463
463
  slim_dir = ensure_task_spool_dir(TASK_LOG_DIR)
@@ -946,9 +946,11 @@ def _spawn_impl(prompt: str, cwd: str = "", append_system: str = "",
946
946
  # API integrations).
947
947
  if slim:
948
948
  slim_cfg = _build_slim_mcp_config(task_id, mcp_env_overrides)
949
- if slim_cfg is not None:
950
- cmd += ["--mcp-config", str(slim_cfg),
951
- "--strict-mcp-config"]
949
+ if slim_cfg is None:
950
+ # Without the slim file the child would start every MCP server
951
+ # the user configured; refuse instead of widening it.
952
+ return "ERR slim_mcp_config_failed"
953
+ cmd += ["--mcp-config", str(slim_cfg), "--strict-mcp-config"]
952
954
  log_path: Optional[Path] = None
953
955
  try:
954
956
  task_log_dir = ensure_task_spool_dir(TASK_LOG_DIR)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: threadkeeper
3
- Version: 0.18.2
3
+ Version: 0.18.3
4
4
  Summary: Multi-agent shared brain across Claude Code/Desktop, Codex, Antigravity CLI, Copilot, and VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server.
5
5
  Author: thread-keeper contributors
6
6
  License: MIT
File without changes
File without changes
File without changes