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.
- {threadkeeper-0.18.2/threadkeeper.egg-info → threadkeeper-0.18.3}/PKG-INFO +1 -1
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/pyproject.toml +1 -1
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_slim.py +32 -12
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/spawn.py +7 -5
- {threadkeeper-0.18.2 → threadkeeper-0.18.3/threadkeeper.egg-info}/PKG-INFO +1 -1
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/LICENSE +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/README.md +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/setup.cfg +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_adapters.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_agent_status.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_antigravity_ingest.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_auto_update.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_backup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_brief_footprint.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_brief_sections.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_candidate_reviewer.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ci_parallel.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_concepts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_config_settings.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_config_watcher.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_core_memory.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_curator.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_host_config.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_host_integration.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_liveness.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_daemon_state.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dashboard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_compact.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_contention.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_leak_guard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_migration_fts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_runtime.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_db_schema.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_delegated_search.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_feed_tools.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_miner.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_observation_resolve.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_recompute.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_tier.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialectic_validator.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_dialog_fts_external.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_documentation_inventory.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_egress_policy.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embed_routing.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embedding_generation.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embedding_model_revision.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_embedding_storage_dedup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_error_paths.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_eval_harness.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_applier.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_apply_2.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_apply_3.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_evolve_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_extract_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_extract_dedup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_forget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_github_budget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_github_safety.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_helpers.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_hook_child_guard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_embed.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_env.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_main.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_host_wedged.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_hybrid_retrieval.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_i18n_multilang.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_identity.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_cursor.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_denylist.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_secret_redaction.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_status.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_ingest_transactions.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_lesson_violations.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_lessons.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_mcp_resources_prompts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_mcp_sdk_compat.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_memory_eval.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_memory_guard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_memory_guard_host.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_menubar_app.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_missed_spawns.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_model_catalog.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_notify_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_nudges.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_onnx_embeddings.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_panel.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_permissions.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_pickup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_probe_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_process_health.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_release_workflows.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_retention.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_review_prompts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_search_fts_punctuation.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_session_read_purity.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_setup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_shadow_review.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_single_flight_prompt_prefixes.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_hint.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_passive_tier.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_tier.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_updater.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_use_parser.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skill_watcher.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_skills.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_background_cwd.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_budget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_child_env.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_codex_stdin.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_config.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_hint.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_permission_gate.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_reap.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_result.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_watchdog.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_worktree_isolation.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_spawn_wrap.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_capture.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_identity.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_migrate.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_protocol.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_reset_node.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_sync_transport.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_task_retention.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_task_spool.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_thin_session.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_thread_janitor.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_threads.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_tool_annotations.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_tools_smoke.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_validate_threads.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_vec_search.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/tests/test_verify_ingest.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/__init__.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/_mcp.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/_setup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/_spawn_wrap.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/__init__.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/_hook_helpers.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/antigravity.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/base.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/claude_code.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/claude_desktop.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/codex.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/copilot.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/adapters/vscode.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/agent_metadata.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/agent_status.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/Info.plist +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/README.md +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/ThreadKeeperAgentStatus.swift +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/build.sh +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/install.sh +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/auto_update.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/backup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/brief.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/candidate_reviewer.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/config.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/config_io.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/config_watcher.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/curator.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/curator_snapshots.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/daemon_liveness.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/daemon_state.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/daemon_supervisor.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/db.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/dialectic_miner.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/dialectic_validator.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/egress.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/elicitation.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/embeddings.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/eval/__init__.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/eval/__main__.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/eval/harness.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/evolve_applier.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/evolve_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/extract_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/forget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/github_budget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/github_safety.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/harvest.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/helpers.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/host.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/host_embed.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/i18n.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/identity.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/ingest.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/lesson_violations.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/lessons.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/link_health.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/memory_guard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/menubar_app.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/migrate_embeddings.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/model_catalog.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/notify.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/nudges.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/permissions.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/probe_daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/process_health.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/retention.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/retrieval.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/review_prompts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/search_proxy.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/server.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/shadow_review.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/skill_audit.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/skill_updater.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/skill_watcher.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/spawn_budget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/spawn_config.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/spawn_result.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/__init__.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/capture.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/daemon.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/identity.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/migrate.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/protocol.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/reset_node.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/sync/server.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/task_spool.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/thread_janitor.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tool_schemas.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/__init__.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/agent_status.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/candidate_reviewer.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/concepts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/config_watch.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/consolidate.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/core_memory.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/correlation.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/curator.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dashboard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/db_maintenance.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dialectic.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dialectic_feed.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/dialog.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/distill.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/evolve_applier.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/evolve_research.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/extract.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/forget.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/graph.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/invariants.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/lessons.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/memory_guard.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/missed_spawns.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/panel.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/peers.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/pickup.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/probes.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/process_health.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/prompts.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/resources.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/session.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/shadow_review.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/skills.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/style.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/sync.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/threads.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/tools/validate.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/trash.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/verify_ingest.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/wikilinks.py +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/SOURCES.txt +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/dependency_links.txt +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/entry_points.txt +0 -0
- {threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper.egg-info/requires.txt +0 -0
- {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.
|
|
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.
|
|
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
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
460
|
-
|
|
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
|
|
950
|
-
|
|
951
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/Info.plist
RENAMED
|
File without changes
|
{threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{threadkeeper-0.18.2 → threadkeeper-0.18.3}/threadkeeper/assets/macos-agent-status/install.sh
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
|
|
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
|
|
File without changes
|