gobby 0.2.8__tar.gz → 0.2.11__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.
- {gobby-0.2.8 → gobby-0.2.11}/PKG-INFO +56 -22
- {gobby-0.2.8 → gobby-0.2.11}/README.md +55 -21
- {gobby-0.2.8 → gobby-0.2.11}/pyproject.toml +2 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/__init__.py +1 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/__init__.py +6 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/base.py +11 -2
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/claude_code.py +5 -28
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/codex_impl/adapter.py +38 -43
- gobby-0.2.11/src/gobby/adapters/copilot.py +324 -0
- gobby-0.2.11/src/gobby/adapters/cursor.py +373 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/gemini.py +2 -26
- gobby-0.2.11/src/gobby/adapters/windsurf.py +359 -0
- gobby-0.2.11/src/gobby/agents/definitions.py +303 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/isolation.py +33 -1
- gobby-0.2.11/src/gobby/agents/pty_reader.py +192 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/registry.py +10 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/runner.py +24 -8
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/sandbox.py +8 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/session.py +4 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawn.py +9 -2
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawn_executor.py +49 -61
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/command_builder.py +4 -4
- gobby-0.2.11/src/gobby/app_context.py +64 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/__init__.py +4 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/install.py +259 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/__init__.py +12 -0
- gobby-0.2.11/src/gobby/cli/installers/copilot.py +242 -0
- gobby-0.2.11/src/gobby/cli/installers/cursor.py +244 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/shared.py +3 -0
- gobby-0.2.11/src/gobby/cli/installers/windsurf.py +242 -0
- gobby-0.2.11/src/gobby/cli/pipelines.py +639 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/sessions.py +3 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/skills.py +209 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/crud.py +6 -5
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/search.py +1 -1
- gobby-0.2.11/src/gobby/cli/ui.py +116 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/utils.py +5 -17
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/workflows.py +38 -17
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/app.py +5 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/features.py +0 -20
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/skills.py +23 -2
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/tasks.py +4 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/broadcaster.py +9 -0
- gobby-0.2.11/src/gobby/hooks/event_handlers/__init__.py +155 -0
- gobby-0.2.11/src/gobby/hooks/event_handlers/_agent.py +175 -0
- gobby-0.2.11/src/gobby/hooks/event_handlers/_base.py +92 -0
- gobby-0.2.11/src/gobby/hooks/event_handlers/_misc.py +66 -0
- gobby-0.2.11/src/gobby/hooks/event_handlers/_session.py +487 -0
- gobby-0.2.11/src/gobby/hooks/event_handlers/_tool.py +196 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/events.py +48 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/hook_manager.py +27 -3
- gobby-0.2.11/src/gobby/install/copilot/hooks/hook_dispatcher.py +203 -0
- gobby-0.2.11/src/gobby/install/cursor/hooks/hook_dispatcher.py +203 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/gemini/hooks/hook_dispatcher.py +8 -0
- gobby-0.2.11/src/gobby/install/windsurf/hooks/hook_dispatcher.py +205 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/__init__.py +14 -1
- gobby-0.2.11/src/gobby/llm/claude.py +1117 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/service.py +149 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/importer.py +4 -41
- gobby-0.2.11/src/gobby/mcp_proxy/instructions.py +38 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/manager.py +13 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/models.py +1 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/registries.py +66 -5
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/server.py +6 -2
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/recommendation.py +2 -28
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/tool_filter.py +7 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/tool_proxy.py +19 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/stdio.py +37 -21
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/agents.py +7 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/artifacts.py +3 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/hub.py +30 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/cleanup.py +5 -5
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/monitor.py +1 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/orchestrate.py +8 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/review.py +17 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/wait.py +7 -7
- gobby-0.2.11/src/gobby/mcp_proxy/tools/pipelines/__init__.py +254 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/pipelines/_discovery.py +67 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/pipelines/_execution.py +281 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_crud.py +4 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_handoff.py +1 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/skills/__init__.py +184 -30
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/spawn_agent.py +229 -14
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_readiness.py +27 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_context.py +8 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_crud.py +27 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_helpers.py +1 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_lifecycle.py +125 -8
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_lifecycle_validation.py +2 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_search.py +1 -1
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/__init__.py +273 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/_artifacts.py +225 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/_import.py +112 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/_lifecycle.py +332 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/_query.py +226 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/_resolution.py +78 -0
- gobby-0.2.11/src/gobby/mcp_proxy/tools/workflows/_terminal.py +175 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/worktrees.py +54 -15
- gobby-0.2.11/src/gobby/memory/components/ingestion.py +98 -0
- gobby-0.2.11/src/gobby/memory/components/search.py +108 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/context.py +5 -5
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/manager.py +16 -25
- gobby-0.2.11/src/gobby/paths.py +51 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/prompts/loader.py +1 -35
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/runner.py +131 -16
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/http.py +193 -150
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/__init__.py +2 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/admin.py +56 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/execution.py +33 -32
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/registry.py +8 -8
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/hooks.py +10 -1
- gobby-0.2.11/src/gobby/servers/routes/pipelines.py +227 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/websocket.py +314 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/analyzer.py +89 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/manager.py +5 -5
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/transcripts/__init__.py +3 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/transcripts/claude.py +5 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/transcripts/codex.py +5 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/transcripts/gemini.py +5 -0
- gobby-0.2.11/src/gobby/skills/hubs/__init__.py +25 -0
- gobby-0.2.11/src/gobby/skills/hubs/base.py +234 -0
- gobby-0.2.11/src/gobby/skills/hubs/claude_plugins.py +328 -0
- gobby-0.2.11/src/gobby/skills/hubs/clawdhub.py +289 -0
- gobby-0.2.11/src/gobby/skills/hubs/github_collection.py +465 -0
- gobby-0.2.11/src/gobby/skills/hubs/manager.py +263 -0
- gobby-0.2.11/src/gobby/skills/hubs/skillhub.py +342 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/parser.py +23 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/sync.py +5 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/artifacts.py +19 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/memories.py +4 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/migrations.py +118 -3
- gobby-0.2.11/src/gobby/storage/pipelines.py +367 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/sessions.py +23 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/skills.py +48 -8
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_aggregates.py +2 -2
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_lifecycle.py +4 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_models.py +7 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_queries.py +3 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sync/memories.py +4 -3
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/commits.py +48 -17
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/external_validator.py +4 -17
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/validation.py +13 -87
- gobby-0.2.11/src/gobby/tools/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tools/summarizer.py +18 -51
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/status.py +13 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/actions.py +80 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/context_actions.py +265 -27
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/definitions.py +119 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/detection_helpers.py +23 -11
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/enforcement/__init__.py +11 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/enforcement/blocking.py +96 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/enforcement/handlers.py +35 -1
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/enforcement/task_policy.py +18 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/engine.py +26 -4
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/evaluator.py +8 -5
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/lifecycle_evaluator.py +59 -27
- gobby-0.2.11/src/gobby/workflows/loader.py +883 -0
- gobby-0.2.11/src/gobby/workflows/lobster_compat.py +147 -0
- gobby-0.2.11/src/gobby/workflows/pipeline_executor.py +801 -0
- gobby-0.2.11/src/gobby/workflows/pipeline_state.py +172 -0
- gobby-0.2.11/src/gobby/workflows/pipeline_webhooks.py +206 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/premature_stop.py +5 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/worktrees/git.py +135 -20
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby.egg-info/PKG-INFO +56 -22
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby.egg-info/SOURCES.txt +46 -2
- {gobby-0.2.8 → gobby-0.2.11}/tests/test_import_pathing_trap.py +1 -0
- {gobby-0.2.8 → gobby-0.2.11}/tests/test_runner.py +9 -3
- gobby-0.2.8/src/gobby/agents/definitions.py +0 -143
- gobby-0.2.8/src/gobby/hooks/event_handlers.py +0 -1008
- gobby-0.2.8/src/gobby/llm/claude.py +0 -566
- gobby-0.2.8/src/gobby/mcp_proxy/instructions.py +0 -56
- gobby-0.2.8/src/gobby/mcp_proxy/tools/workflows.py +0 -1023
- gobby-0.2.8/src/gobby/workflows/loader.py +0 -346
- {gobby-0.2.8 → gobby-0.2.11}/LICENSE.md +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/setup.cfg +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/codex_impl/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/codex_impl/client.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/codex_impl/protocol.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/adapters/codex_impl/types.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/codex_session.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/constants.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/context.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/gemini_session.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/base.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/cross_platform.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/embedded.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/headless.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/linux.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/macos.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/prompt_manager.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/spawners/windows.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/agents/tty_config.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/autonomous/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/autonomous/progress_tracker.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/autonomous/stop_registry.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/autonomous/stuck_detector.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/__main__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/agents.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/artifacts.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/clones.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/conductor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/daemon.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/extensions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/github.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/init.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/antigravity.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/claude.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/codex.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/gemini.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/installers/git_hooks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/linear.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/mcp.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/mcp_proxy.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/memory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/merge.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/projects.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/_utils.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/ai.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/commits.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/deps.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/labels.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/tasks/main.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/cli/worktrees.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/clones/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/clones/git.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/alerts.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/loop.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/monitors/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/monitors/agents.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/monitors/tasks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/pricing.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/conductor/token_tracker.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/extensions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/llm_providers.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/logging.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/mcp.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/persistence.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/search.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/servers.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/config/sessions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/artifact_capture.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/git.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/health_monitor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/hook_types.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/plugins.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/session_coordinator.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/skill_manager.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/verification_runner.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/hooks/webhooks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/claude/hooks/HOOK_SCHEMAS.md +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/claude/hooks/hook_dispatcher.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/claude/hooks/validate_settings.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/claude/hooks-template.json +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/codex/hooks/hook_dispatcher.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/gemini/hooks-template.json +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/shared/plugins/code_guardian.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/install/shared/plugins/example_notify.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/integrations/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/integrations/github.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/integrations/linear.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/base.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/claude_executor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/codex.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/codex_executor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/executor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/factory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/gemini.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/litellm.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/litellm_executor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/llm/resolver.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/daemon_control.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/lazy.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/metrics.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/schema_hash.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/semantic_search.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/fallback.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/server_mgmt.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/services/system.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/agent_messaging.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/clones.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/internal.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/memory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/merge.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/metrics.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/utils.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_commits.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_factory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_messages.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_dependencies.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_github.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_linear.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_orchestration.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_sync.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_validation.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_expansion.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_factory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_resolution.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_session.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/base.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/factory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/http.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/stdio.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/websocket.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/backends/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/backends/mem0.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/backends/memu.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/backends/null.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/backends/openmemory.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/backends/sqlite.py +0 -0
- {gobby-0.2.8/src/gobby/tools → gobby-0.2.11/src/gobby/memory/components}/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/extractor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/ingestion/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/ingestion/multimodal.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/protocol.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/search/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/search/coordinator.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/search/text.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/services/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/services/crossref.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/memory/viz.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/prompts/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/prompts/models.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/py.typed +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/backends/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/backends/embedding.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/embeddings.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/models.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/protocol.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/tfidf.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/search/unified.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/models.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/dependencies.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/discovery.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/server.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/plugins.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/tools.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/mcp/webhooks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/servers/routes/sessions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/lifecycle.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/processor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/summary.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sessions/transcripts/base.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/loader.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/manager.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/search.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/updater.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/skills/validator.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/agents.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/artifact_classifier.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/clones.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/compaction.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/database.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/inter_session_messages.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/mcp.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/merge_resolutions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/projects.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/session_messages.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/session_tasks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/task_dependencies.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_crud.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_id.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_manager.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_ordering.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_path_cache.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/tasks/_search.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/workflow_audit.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/storage/worktrees.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sync/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sync/github.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sync/linear.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/sync/tasks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/build_verification.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/enhanced_validator.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/escalation.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/issue_extraction.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/tree_builder.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/validation_history.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/tasks/validation_models.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/daemon_client.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/git.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/id.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/json_helpers.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/logging.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/machine_id.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/metrics.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/project_context.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/project_init.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/validation.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/utils/version.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/approval_flow.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/artifact_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/audit_helpers.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/autonomous_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/enforcement/commit_policy.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/git_utils.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/hooks.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/llm_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/mcp_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/memory_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/safe_evaluator.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/session_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/state_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/state_manager.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/stop_signal_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/summary_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/task_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/task_sync_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/templates.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/todo_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/webhook.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/webhook_actions.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/workflows/webhook_executor.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/worktrees/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/worktrees/merge/__init__.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/worktrees/merge/conflict_parser.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby/worktrees/merge/resolver.py +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby.egg-info/dependency_links.txt +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby.egg-info/entry_points.txt +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby.egg-info/requires.txt +0 -0
- {gobby-0.2.8 → gobby-0.2.11}/src/gobby.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gobby
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.11
|
|
4
4
|
Summary: A local-first daemon to unify your AI coding tools. Session tracking and handoffs across Claude Code, Gemini CLI, and Codex. An MCP proxy that discovers tools without flooding context. Task management with dependencies, validation, and TDD expansion. Agent spawning and worktree orchestration. Persistent memory, extensible workflows, and hooks.
|
|
5
5
|
Author-email: Josh Wilhelmi <josh@gobby.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -65,7 +65,7 @@ Dynamic: license-file
|
|
|
65
65
|
|
|
66
66
|
---
|
|
67
67
|
|
|
68
|
-
Gobby is a local-first daemon that unifies your AI coding assistants—Claude Code, Gemini CLI, and Codex—under one persistent, extensible platform. It handles the stuff these tools forget: sessions that survive restarts, context that carries across compactions, workflows that keep agents from going off the rails, and an MCP proxy that doesn't eat half your context window just loading tool definitions.
|
|
68
|
+
Gobby is a local-first daemon that unifies your AI coding assistants—Claude Code, Gemini CLI, Cursor, Windsurf, Copilot, and Codex—under one persistent, extensible platform. It handles the stuff these tools forget: sessions that survive restarts, context that carries across compactions, workflows that keep agents from going off the rails, and an MCP proxy that doesn't eat half your context window just loading tool definitions.
|
|
69
69
|
|
|
70
70
|
**Gobby is built with Gobby.** Most of this codebase was written by AI agents running through Gobby's own task system and workflows. Dogfooding isn't a buzzword here—it's the development process.
|
|
71
71
|
|
|
@@ -144,10 +144,11 @@ Built-in workflows: `auto-task`, `plan-execute`, `test-driven`. Or write your ow
|
|
|
144
144
|
Spawn agents in isolated git worktrees. Run tasks in parallel without stepping on each other. Gobby tracks which agent is where and what they're doing.
|
|
145
145
|
|
|
146
146
|
```python
|
|
147
|
-
call_tool("gobby
|
|
147
|
+
call_tool("gobby", "spawn_agent", {
|
|
148
148
|
"prompt": "Implement OAuth flow",
|
|
149
|
-
"
|
|
150
|
-
"
|
|
149
|
+
"task_id": "#123",
|
|
150
|
+
"isolation": "worktree",
|
|
151
|
+
"branch_name": "feature/oauth"
|
|
151
152
|
})
|
|
152
153
|
```
|
|
153
154
|
|
|
@@ -287,9 +288,33 @@ args = ["mcp-server"]
|
|
|
287
288
|
|
|
288
289
|
| CLI | Hooks | Status |
|
|
289
290
|
| :--- | :--- | :--- |
|
|
290
|
-
| **Claude Code** | ✅
|
|
291
|
-
| **Gemini CLI** |
|
|
292
|
-
| **Codex CLI** |
|
|
291
|
+
| **Claude Code** | ✅ Full support | Native adapter, 12 hook types |
|
|
292
|
+
| **Gemini CLI** | ✅ Full support | Native adapter, all hook types |
|
|
293
|
+
| **Codex CLI** | ✅ Full support | Native adapter via app-server |
|
|
294
|
+
| **Cursor** | ✅ Full support | Native adapter, 17 hook types |
|
|
295
|
+
| **Windsurf** | ✅ Full support | Native adapter, 11 hook types |
|
|
296
|
+
| **Copilot** | ✅ Full support | Native adapter, 6 hook types |
|
|
297
|
+
|
|
298
|
+
### Hook Installation
|
|
299
|
+
|
|
300
|
+
Gobby uses Python hook dispatchers that capture terminal context and communicate with the daemon. Run `gobby install` in your project to set up hooks:
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
gobby install # Auto-detect and install hooks for all CLIs
|
|
304
|
+
gobby install --claude # Install for specific CLI
|
|
305
|
+
gobby install --gemini
|
|
306
|
+
gobby install --codex
|
|
307
|
+
gobby install --cursor
|
|
308
|
+
gobby install --windsurf
|
|
309
|
+
gobby install --copilot
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
The dispatchers handle:
|
|
313
|
+
- Terminal context capture (TTY, parent PID, session IDs)
|
|
314
|
+
- Proper JSON serialization and HTTP communication
|
|
315
|
+
- Exit code handling for blocking actions
|
|
316
|
+
|
|
317
|
+
All CLIs can also connect via MCP for tool access (see configuration examples above).
|
|
293
318
|
|
|
294
319
|
## How It Compares
|
|
295
320
|
|
|
@@ -342,23 +367,32 @@ Everything runs locally. No cloud. No API keys required (beyond what your AI CLI
|
|
|
342
367
|
|
|
343
368
|
Gobby exposes tools via MCP that your AI coding assistant can use:
|
|
344
369
|
|
|
345
|
-
**Task Management** (`gobby-tasks`)
|
|
346
|
-
`create_task`, `expand_task`, `validate_task`, `close_task`, `
|
|
370
|
+
**Task Management** (`gobby-tasks`)
|
|
371
|
+
`create_task`, `expand_task`, `validate_task`, `close_task`, `claim_task`, `list_ready_tasks`, `suggest_next_task`, `link_commit`, and more.
|
|
347
372
|
|
|
348
|
-
**Session Management** (`gobby-sessions`)
|
|
349
|
-
`pickup` (restore context), `get_handoff_context`, `list_sessions`
|
|
373
|
+
**Session Management** (`gobby-sessions`)
|
|
374
|
+
`get_current_session`, `pickup` (restore context), `get_handoff_context`, `list_sessions`, `send_message`
|
|
350
375
|
|
|
351
|
-
**Memory** (`gobby-memory`)
|
|
376
|
+
**Memory** (`gobby-memory`)
|
|
352
377
|
`remember`, `recall`, `forget` — persistent facts across sessions
|
|
353
378
|
|
|
354
|
-
**Workflows** (`gobby-workflows`)
|
|
355
|
-
`activate`, `advance`, `set_variable`, `get_status`
|
|
379
|
+
**Workflows** (`gobby-workflows`)
|
|
380
|
+
`activate`, `advance`, `set_variable`, `get_status`, `end_workflow`
|
|
381
|
+
|
|
382
|
+
**Agents** (`gobby-agents`)
|
|
383
|
+
`spawn_agent` (unified API with `isolation`: current/worktree/clone), `list_agents`, `get_agent`, `kill_agent`
|
|
384
|
+
|
|
385
|
+
**Worktrees** (`gobby-worktrees`)
|
|
386
|
+
`create_worktree`, `list_worktrees`, `delete_worktree`, `merge_worktree`
|
|
387
|
+
|
|
388
|
+
**Clones** (`gobby-clones`)
|
|
389
|
+
`create_clone`, `list_clones`, `delete_clone`, `merge_clone_to_target`
|
|
356
390
|
|
|
357
|
-
**
|
|
358
|
-
`
|
|
391
|
+
**Artifacts** (`gobby-artifacts`)
|
|
392
|
+
`save_artifact`, `get_artifact`, `list_artifacts` — capture and retrieve session artifacts
|
|
359
393
|
|
|
360
394
|
**MCP Proxy**
|
|
361
|
-
`list_mcp_servers`, `add_mcp_server`, `import_mcp_server`, `list_tools`, `get_tool_schema`, `call_tool`, `recommend_tools`
|
|
395
|
+
`list_mcp_servers`, `add_mcp_server`, `import_mcp_server`, `list_tools`, `get_tool_schema`, `call_tool`, `recommend_tools`, `search_tools`
|
|
362
396
|
|
|
363
397
|
**Skills** (`gobby-skills`)
|
|
364
398
|
`list_skills`, `get_skill`, `search_skills`, `install_skill`, `remove_skill`, `update_skill`
|
|
@@ -371,13 +405,13 @@ Gobby exposes tools via MCP that your AI coding assistant can use:
|
|
|
371
405
|
|
|
372
406
|
See [ROADMAP.md](ROADMAP.md) for the full plan, but highlights:
|
|
373
407
|
|
|
374
|
-
**Shipped:** Task system v2 (commit linking, validation gates), TDD expansion v2 (red/green/blue generation), workflow engine, MCP proxy with progressive discovery, session tracking and handoffs, memory, hooks integration, worktree
|
|
408
|
+
**Shipped:** Task system v2 (commit linking, validation gates, Claude Code interop), TDD expansion v2 (red/green/blue generation), workflow engine (state machines, tool restrictions, exit conditions), MCP proxy with progressive discovery, session tracking and handoffs, memory v3 (backend abstraction), hooks integration for all CLIs, unified agent spawning, worktree and clone orchestration, skills system, artifacts capture
|
|
375
409
|
|
|
376
|
-
**
|
|
410
|
+
**Beta:** Autonomous orchestration (conductor daemon, inter-agent messaging, token budget tracking, review gates)
|
|
377
411
|
|
|
378
|
-
**Next:**
|
|
412
|
+
**Next:** Security posture for MCP (allow/deny lists, audit logging), Observability (tool call tracing, session timelines), Web UI (read-only dashboard)
|
|
379
413
|
|
|
380
|
-
**Vision:** Always local first, but Pro cloud features to keep the lights on: Fleet management
|
|
414
|
+
**Vision:** Always local first, but Pro cloud features to keep the lights on: Fleet management, Plugin ecosystem, Team workflows, Enterprise hardening
|
|
381
415
|
|
|
382
416
|
## Changelog
|
|
383
417
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
Gobby is a local-first daemon that unifies your AI coding assistants—Claude Code, Gemini CLI, and Codex—under one persistent, extensible platform. It handles the stuff these tools forget: sessions that survive restarts, context that carries across compactions, workflows that keep agents from going off the rails, and an MCP proxy that doesn't eat half your context window just loading tool definitions.
|
|
22
|
+
Gobby is a local-first daemon that unifies your AI coding assistants—Claude Code, Gemini CLI, Cursor, Windsurf, Copilot, and Codex—under one persistent, extensible platform. It handles the stuff these tools forget: sessions that survive restarts, context that carries across compactions, workflows that keep agents from going off the rails, and an MCP proxy that doesn't eat half your context window just loading tool definitions.
|
|
23
23
|
|
|
24
24
|
**Gobby is built with Gobby.** Most of this codebase was written by AI agents running through Gobby's own task system and workflows. Dogfooding isn't a buzzword here—it's the development process.
|
|
25
25
|
|
|
@@ -98,10 +98,11 @@ Built-in workflows: `auto-task`, `plan-execute`, `test-driven`. Or write your ow
|
|
|
98
98
|
Spawn agents in isolated git worktrees. Run tasks in parallel without stepping on each other. Gobby tracks which agent is where and what they're doing.
|
|
99
99
|
|
|
100
100
|
```python
|
|
101
|
-
call_tool("gobby
|
|
101
|
+
call_tool("gobby", "spawn_agent", {
|
|
102
102
|
"prompt": "Implement OAuth flow",
|
|
103
|
-
"
|
|
104
|
-
"
|
|
103
|
+
"task_id": "#123",
|
|
104
|
+
"isolation": "worktree",
|
|
105
|
+
"branch_name": "feature/oauth"
|
|
105
106
|
})
|
|
106
107
|
```
|
|
107
108
|
|
|
@@ -241,9 +242,33 @@ args = ["mcp-server"]
|
|
|
241
242
|
|
|
242
243
|
| CLI | Hooks | Status |
|
|
243
244
|
| :--- | :--- | :--- |
|
|
244
|
-
| **Claude Code** | ✅
|
|
245
|
-
| **Gemini CLI** |
|
|
246
|
-
| **Codex CLI** |
|
|
245
|
+
| **Claude Code** | ✅ Full support | Native adapter, 12 hook types |
|
|
246
|
+
| **Gemini CLI** | ✅ Full support | Native adapter, all hook types |
|
|
247
|
+
| **Codex CLI** | ✅ Full support | Native adapter via app-server |
|
|
248
|
+
| **Cursor** | ✅ Full support | Native adapter, 17 hook types |
|
|
249
|
+
| **Windsurf** | ✅ Full support | Native adapter, 11 hook types |
|
|
250
|
+
| **Copilot** | ✅ Full support | Native adapter, 6 hook types |
|
|
251
|
+
|
|
252
|
+
### Hook Installation
|
|
253
|
+
|
|
254
|
+
Gobby uses Python hook dispatchers that capture terminal context and communicate with the daemon. Run `gobby install` in your project to set up hooks:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
gobby install # Auto-detect and install hooks for all CLIs
|
|
258
|
+
gobby install --claude # Install for specific CLI
|
|
259
|
+
gobby install --gemini
|
|
260
|
+
gobby install --codex
|
|
261
|
+
gobby install --cursor
|
|
262
|
+
gobby install --windsurf
|
|
263
|
+
gobby install --copilot
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
The dispatchers handle:
|
|
267
|
+
- Terminal context capture (TTY, parent PID, session IDs)
|
|
268
|
+
- Proper JSON serialization and HTTP communication
|
|
269
|
+
- Exit code handling for blocking actions
|
|
270
|
+
|
|
271
|
+
All CLIs can also connect via MCP for tool access (see configuration examples above).
|
|
247
272
|
|
|
248
273
|
## How It Compares
|
|
249
274
|
|
|
@@ -296,23 +321,32 @@ Everything runs locally. No cloud. No API keys required (beyond what your AI CLI
|
|
|
296
321
|
|
|
297
322
|
Gobby exposes tools via MCP that your AI coding assistant can use:
|
|
298
323
|
|
|
299
|
-
**Task Management** (`gobby-tasks`)
|
|
300
|
-
`create_task`, `expand_task`, `validate_task`, `close_task`, `
|
|
324
|
+
**Task Management** (`gobby-tasks`)
|
|
325
|
+
`create_task`, `expand_task`, `validate_task`, `close_task`, `claim_task`, `list_ready_tasks`, `suggest_next_task`, `link_commit`, and more.
|
|
301
326
|
|
|
302
|
-
**Session Management** (`gobby-sessions`)
|
|
303
|
-
`pickup` (restore context), `get_handoff_context`, `list_sessions`
|
|
327
|
+
**Session Management** (`gobby-sessions`)
|
|
328
|
+
`get_current_session`, `pickup` (restore context), `get_handoff_context`, `list_sessions`, `send_message`
|
|
304
329
|
|
|
305
|
-
**Memory** (`gobby-memory`)
|
|
330
|
+
**Memory** (`gobby-memory`)
|
|
306
331
|
`remember`, `recall`, `forget` — persistent facts across sessions
|
|
307
332
|
|
|
308
|
-
**Workflows** (`gobby-workflows`)
|
|
309
|
-
`activate`, `advance`, `set_variable`, `get_status`
|
|
333
|
+
**Workflows** (`gobby-workflows`)
|
|
334
|
+
`activate`, `advance`, `set_variable`, `get_status`, `end_workflow`
|
|
335
|
+
|
|
336
|
+
**Agents** (`gobby-agents`)
|
|
337
|
+
`spawn_agent` (unified API with `isolation`: current/worktree/clone), `list_agents`, `get_agent`, `kill_agent`
|
|
338
|
+
|
|
339
|
+
**Worktrees** (`gobby-worktrees`)
|
|
340
|
+
`create_worktree`, `list_worktrees`, `delete_worktree`, `merge_worktree`
|
|
341
|
+
|
|
342
|
+
**Clones** (`gobby-clones`)
|
|
343
|
+
`create_clone`, `list_clones`, `delete_clone`, `merge_clone_to_target`
|
|
310
344
|
|
|
311
|
-
**
|
|
312
|
-
`
|
|
345
|
+
**Artifacts** (`gobby-artifacts`)
|
|
346
|
+
`save_artifact`, `get_artifact`, `list_artifacts` — capture and retrieve session artifacts
|
|
313
347
|
|
|
314
348
|
**MCP Proxy**
|
|
315
|
-
`list_mcp_servers`, `add_mcp_server`, `import_mcp_server`, `list_tools`, `get_tool_schema`, `call_tool`, `recommend_tools`
|
|
349
|
+
`list_mcp_servers`, `add_mcp_server`, `import_mcp_server`, `list_tools`, `get_tool_schema`, `call_tool`, `recommend_tools`, `search_tools`
|
|
316
350
|
|
|
317
351
|
**Skills** (`gobby-skills`)
|
|
318
352
|
`list_skills`, `get_skill`, `search_skills`, `install_skill`, `remove_skill`, `update_skill`
|
|
@@ -325,13 +359,13 @@ Gobby exposes tools via MCP that your AI coding assistant can use:
|
|
|
325
359
|
|
|
326
360
|
See [ROADMAP.md](ROADMAP.md) for the full plan, but highlights:
|
|
327
361
|
|
|
328
|
-
**Shipped:** Task system v2 (commit linking, validation gates), TDD expansion v2 (red/green/blue generation), workflow engine, MCP proxy with progressive discovery, session tracking and handoffs, memory, hooks integration, worktree
|
|
362
|
+
**Shipped:** Task system v2 (commit linking, validation gates, Claude Code interop), TDD expansion v2 (red/green/blue generation), workflow engine (state machines, tool restrictions, exit conditions), MCP proxy with progressive discovery, session tracking and handoffs, memory v3 (backend abstraction), hooks integration for all CLIs, unified agent spawning, worktree and clone orchestration, skills system, artifacts capture
|
|
329
363
|
|
|
330
|
-
**
|
|
364
|
+
**Beta:** Autonomous orchestration (conductor daemon, inter-agent messaging, token budget tracking, review gates)
|
|
331
365
|
|
|
332
|
-
**Next:**
|
|
366
|
+
**Next:** Security posture for MCP (allow/deny lists, audit logging), Observability (tool call tracing, session timelines), Web UI (read-only dashboard)
|
|
333
367
|
|
|
334
|
-
**Vision:** Always local first, but Pro cloud features to keep the lights on: Fleet management
|
|
368
|
+
**Vision:** Always local first, but Pro cloud features to keep the lights on: Fleet management, Plugin ecosystem, Team workflows, Enterprise hardening
|
|
335
369
|
|
|
336
370
|
## Changelog
|
|
337
371
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "gobby"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.11"
|
|
4
4
|
description = "A local-first daemon to unify your AI coding tools. Session tracking and handoffs across Claude Code, Gemini CLI, and Codex. An MCP proxy that discovers tools without flooding context. Task management with dependencies, validation, and TDD expansion. Agent spawning and worktree orchestration. Persistent memory, extensible workflows, and hooks."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -194,6 +194,7 @@ dev = [
|
|
|
194
194
|
"bandit>=1.8.0",
|
|
195
195
|
"black>=24.0.0",
|
|
196
196
|
"mypy>=1.8.0",
|
|
197
|
+
"pip>=26.0", # CVE-2026-1703
|
|
197
198
|
"pip-audit>=2.7.0",
|
|
198
199
|
"pre-commit>=4.0.0",
|
|
199
200
|
"pytest>=8.4.2",
|
|
@@ -19,7 +19,10 @@ from gobby.adapters.base import BaseAdapter
|
|
|
19
19
|
from gobby.adapters.claude_code import ClaudeCodeAdapter
|
|
20
20
|
from gobby.adapters.codex_impl.adapter import CodexAdapter, CodexNotifyAdapter
|
|
21
21
|
from gobby.adapters.codex_impl.client import CodexAppServerClient
|
|
22
|
+
from gobby.adapters.copilot import CopilotAdapter
|
|
23
|
+
from gobby.adapters.cursor import CursorAdapter
|
|
22
24
|
from gobby.adapters.gemini import GeminiAdapter
|
|
25
|
+
from gobby.adapters.windsurf import WindsurfAdapter
|
|
23
26
|
|
|
24
27
|
__all__ = [
|
|
25
28
|
"BaseAdapter",
|
|
@@ -27,5 +30,8 @@ __all__ = [
|
|
|
27
30
|
"CodexAdapter",
|
|
28
31
|
"CodexAppServerClient",
|
|
29
32
|
"CodexNotifyAdapter",
|
|
33
|
+
"CopilotAdapter",
|
|
34
|
+
"CursorAdapter",
|
|
30
35
|
"GeminiAdapter",
|
|
36
|
+
"WindsurfAdapter",
|
|
31
37
|
]
|
|
@@ -68,8 +68,9 @@ class BaseAdapter(ABC):
|
|
|
68
68
|
|
|
69
69
|
This method handles the full round-trip:
|
|
70
70
|
1. Translate native event to HookEvent
|
|
71
|
-
2.
|
|
72
|
-
3.
|
|
71
|
+
2. Inject daemon's machine_id if not provided by CLI
|
|
72
|
+
3. Process through HookManager
|
|
73
|
+
4. Translate response back to native format
|
|
73
74
|
|
|
74
75
|
Note: This method is synchronous for Phase 2A-2B compatibility.
|
|
75
76
|
In Phase 2C+, when HookManager.handle() is async, subclasses may
|
|
@@ -89,5 +90,13 @@ class BaseAdapter(ABC):
|
|
|
89
90
|
if hook_event is None:
|
|
90
91
|
# Event ignored by adapter
|
|
91
92
|
return {}
|
|
93
|
+
|
|
94
|
+
# Inject daemon's machine_id if CLI didn't provide it
|
|
95
|
+
# This centralizes machine_id handling - adapters don't generate IDs
|
|
96
|
+
if not hook_event.machine_id:
|
|
97
|
+
from gobby.utils.machine_id import get_machine_id
|
|
98
|
+
|
|
99
|
+
hook_event.machine_id = get_machine_id()
|
|
100
|
+
|
|
92
101
|
hook_response = hook_manager.handle(hook_event)
|
|
93
102
|
return self.translate_from_hook_response(hook_response)
|
|
@@ -61,13 +61,10 @@ class ClaudeCodeAdapter(BaseAdapter):
|
|
|
61
61
|
"""Initialize the Claude Code adapter.
|
|
62
62
|
|
|
63
63
|
Args:
|
|
64
|
-
hook_manager: Reference to HookManager for
|
|
64
|
+
hook_manager: Reference to HookManager for delegation.
|
|
65
65
|
If None, the adapter can only translate (not handle events).
|
|
66
66
|
"""
|
|
67
67
|
self._hook_manager = hook_manager
|
|
68
|
-
# Phase 2C: Use new handle() path with unified HookEvent model
|
|
69
|
-
# Note: systemMessage handoff notification bug exists in both paths (see plan-multi-cli.md)
|
|
70
|
-
self._use_legacy = False
|
|
71
68
|
|
|
72
69
|
def translate_to_hook_event(self, native_event: dict[str, Any]) -> HookEvent:
|
|
73
70
|
"""Convert Claude Code native event to unified HookEvent.
|
|
@@ -295,8 +292,8 @@ class ClaudeCodeAdapter(BaseAdapter):
|
|
|
295
292
|
|
|
296
293
|
# Build hookSpecificOutput if we have any context to inject
|
|
297
294
|
# Only include hookSpecificOutput for hook types that Claude Code's schema accepts
|
|
298
|
-
# Valid hookEventName values: PreToolUse, UserPromptSubmit, PostToolUse
|
|
299
|
-
valid_hook_event_names = {"PreToolUse", "UserPromptSubmit", "PostToolUse"}
|
|
295
|
+
# Valid hookEventName values: PreToolUse, UserPromptSubmit, PostToolUse, SessionStart
|
|
296
|
+
valid_hook_event_names = {"PreToolUse", "UserPromptSubmit", "PostToolUse", "SessionStart"}
|
|
300
297
|
if additional_context_parts and hook_event_name in valid_hook_event_names:
|
|
301
298
|
result["hookSpecificOutput"] = {
|
|
302
299
|
"hookEventName": hook_event_name,
|
|
@@ -310,14 +307,6 @@ class ClaudeCodeAdapter(BaseAdapter):
|
|
|
310
307
|
) -> dict[str, Any]:
|
|
311
308
|
"""Main entry point for HTTP endpoint.
|
|
312
309
|
|
|
313
|
-
Strangler fig pattern:
|
|
314
|
-
- Phase 2A-2B: Delegates to existing execute() — validates translation only
|
|
315
|
-
- Phase 2C+: Calls new handle() with HookEvent
|
|
316
|
-
|
|
317
|
-
Note: This method is synchronous for Phase 2A-2B compatibility with
|
|
318
|
-
the existing execute() method. In Phase 2C+, it will become async
|
|
319
|
-
when handle() is implemented as async.
|
|
320
|
-
|
|
321
310
|
Args:
|
|
322
311
|
native_event: Raw payload from Claude Code's hook_dispatcher.py
|
|
323
312
|
hook_manager: HookManager instance for processing.
|
|
@@ -325,22 +314,10 @@ class ClaudeCodeAdapter(BaseAdapter):
|
|
|
325
314
|
Returns:
|
|
326
315
|
Response dict in Claude Code's expected format.
|
|
327
316
|
"""
|
|
328
|
-
#
|
|
317
|
+
# Translate to HookEvent
|
|
329
318
|
hook_event = self.translate_to_hook_event(native_event)
|
|
330
319
|
|
|
331
|
-
#
|
|
332
|
-
# Legacy execute() path removed as HookManager.execute is deprecated/removed.
|
|
320
|
+
# Use HookEvent-based handler
|
|
333
321
|
hook_type = native_event.get("hook_type", "")
|
|
334
322
|
hook_response = hook_manager.handle(hook_event)
|
|
335
323
|
return self.translate_from_hook_response(hook_response, hook_type=hook_type)
|
|
336
|
-
|
|
337
|
-
def set_legacy_mode(self, use_legacy: bool) -> None:
|
|
338
|
-
"""Toggle between legacy and new code paths.
|
|
339
|
-
|
|
340
|
-
This method is used during the strangler fig migration to switch
|
|
341
|
-
between delegating to execute() and calling handle() directly.
|
|
342
|
-
|
|
343
|
-
Args:
|
|
344
|
-
use_legacy: If True, use legacy execute() path. If False, use new handle() path.
|
|
345
|
-
"""
|
|
346
|
-
self._use_legacy = use_legacy
|
|
@@ -40,46 +40,26 @@ logger = logging.getLogger(__name__)
|
|
|
40
40
|
# =============================================================================
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def
|
|
44
|
-
"""Get
|
|
43
|
+
def _get_daemon_machine_id() -> str | None:
|
|
44
|
+
"""Get machine ID from the daemon's centralized utility.
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
2. MAC address (if real, not random)
|
|
49
|
-
3. Persisted UUID file (created on first run)
|
|
46
|
+
This adapter runs in the daemon process, so we use the centralized
|
|
47
|
+
machine_id management from utils.machine_id.
|
|
50
48
|
"""
|
|
51
|
-
from
|
|
49
|
+
from gobby.utils.machine_id import get_machine_id
|
|
50
|
+
|
|
51
|
+
return get_machine_id()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _get_machine_id() -> str:
|
|
55
|
+
"""Generate a machine identifier.
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
Used by Codex adapters when no machine_id is provided.
|
|
58
|
+
"""
|
|
54
59
|
node = platform.node()
|
|
55
60
|
if node:
|
|
56
61
|
return str(uuid.uuid5(uuid.NAMESPACE_DNS, node))
|
|
57
|
-
|
|
58
|
-
# Try MAC address - getnode() returns random value with multicast bit set if unavailable
|
|
59
|
-
mac = uuid.getnode()
|
|
60
|
-
# Check if MAC is real (multicast bit / bit 0 of first octet is 0)
|
|
61
|
-
if not (mac >> 40) & 1:
|
|
62
|
-
return str(uuid.uuid5(uuid.NAMESPACE_DNS, str(mac)))
|
|
63
|
-
|
|
64
|
-
# Fall back to persisted ID file for stability across restarts
|
|
65
|
-
machine_id_file = Path.home() / ".gobby" / ".machine_id"
|
|
66
|
-
try:
|
|
67
|
-
if machine_id_file.exists():
|
|
68
|
-
stored_id = machine_id_file.read_text().strip()
|
|
69
|
-
if stored_id:
|
|
70
|
-
return stored_id
|
|
71
|
-
except OSError:
|
|
72
|
-
pass # Fall through to generate new ID
|
|
73
|
-
|
|
74
|
-
# Generate and persist a new ID
|
|
75
|
-
new_id = str(uuid.uuid4())
|
|
76
|
-
try:
|
|
77
|
-
machine_id_file.parent.mkdir(parents=True, exist_ok=True)
|
|
78
|
-
machine_id_file.write_text(new_id)
|
|
79
|
-
except OSError:
|
|
80
|
-
pass # Use the generated ID even if we can't persist it
|
|
81
|
-
|
|
82
|
-
return new_id
|
|
62
|
+
return str(uuid.uuid4())
|
|
83
63
|
|
|
84
64
|
|
|
85
65
|
# =============================================================================
|
|
@@ -163,8 +143,8 @@ class CodexAdapter(BaseAdapter):
|
|
|
163
143
|
"""
|
|
164
144
|
self._hook_manager = hook_manager
|
|
165
145
|
self._codex_client: CodexAppServerClient | None = None
|
|
166
|
-
self._machine_id: str | None = None
|
|
167
146
|
self._attached = False
|
|
147
|
+
self._machine_id: str | None = None
|
|
168
148
|
|
|
169
149
|
@staticmethod
|
|
170
150
|
def is_codex_available() -> bool:
|
|
@@ -177,10 +157,18 @@ class CodexAdapter(BaseAdapter):
|
|
|
177
157
|
|
|
178
158
|
return shutil.which("codex") is not None
|
|
179
159
|
|
|
180
|
-
def _get_machine_id(self) -> str:
|
|
181
|
-
"""Get
|
|
182
|
-
if self._machine_id
|
|
160
|
+
def _get_machine_id(self) -> str | None:
|
|
161
|
+
"""Get machine ID with caching and daemon fallback."""
|
|
162
|
+
if self._machine_id:
|
|
163
|
+
return self._machine_id
|
|
164
|
+
|
|
165
|
+
# Try daemon first
|
|
166
|
+
self._machine_id = _get_daemon_machine_id()
|
|
167
|
+
|
|
168
|
+
# Fallback to generated if daemon not available
|
|
169
|
+
if not self._machine_id:
|
|
183
170
|
self._machine_id = _get_machine_id()
|
|
171
|
+
|
|
184
172
|
return self._machine_id
|
|
185
173
|
|
|
186
174
|
def normalize_tool_name(self, codex_tool_name: str) -> str:
|
|
@@ -532,15 +520,23 @@ class CodexNotifyAdapter(BaseAdapter):
|
|
|
532
520
|
max_seen_threads: Max threads to track (default 1000). Oldest evicted when full.
|
|
533
521
|
"""
|
|
534
522
|
self._hook_manager = hook_manager
|
|
535
|
-
self._machine_id: str | None = None
|
|
536
523
|
# Track threads we've seen using LRU cache to avoid unbounded growth
|
|
537
524
|
self._max_seen_threads = max_seen_threads or self.DEFAULT_MAX_SEEN_THREADS
|
|
538
525
|
self._seen_threads: OrderedDict[str, bool] = OrderedDict()
|
|
526
|
+
self._machine_id: str | None = None
|
|
527
|
+
|
|
528
|
+
def _get_machine_id(self) -> str | None:
|
|
529
|
+
"""Get machine ID with caching and daemon fallback."""
|
|
530
|
+
if self._machine_id:
|
|
531
|
+
return self._machine_id
|
|
539
532
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
533
|
+
# Try daemon first
|
|
534
|
+
self._machine_id = _get_daemon_machine_id()
|
|
535
|
+
|
|
536
|
+
# Fallback to generated if daemon not available
|
|
537
|
+
if not self._machine_id:
|
|
543
538
|
self._machine_id = _get_machine_id()
|
|
539
|
+
|
|
544
540
|
return self._machine_id
|
|
545
541
|
|
|
546
542
|
def _mark_thread_seen(self, thread_id: str) -> None:
|
|
@@ -716,7 +712,6 @@ class CodexNotifyAdapter(BaseAdapter):
|
|
|
716
712
|
|
|
717
713
|
|
|
718
714
|
__all__ = [
|
|
719
|
-
"_get_machine_id",
|
|
720
715
|
"CodexAdapter",
|
|
721
716
|
"CodexNotifyAdapter",
|
|
722
717
|
]
|