gobby 0.2.9__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.
Files changed (442) hide show
  1. {gobby-0.2.9 → gobby-0.2.11}/PKG-INFO +56 -22
  2. {gobby-0.2.9 → gobby-0.2.11}/README.md +55 -21
  3. {gobby-0.2.9 → gobby-0.2.11}/pyproject.toml +2 -1
  4. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/__init__.py +1 -1
  5. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/__init__.py +6 -0
  6. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/base.py +11 -2
  7. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/claude_code.py +2 -2
  8. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/codex_impl/adapter.py +38 -43
  9. gobby-0.2.11/src/gobby/adapters/copilot.py +324 -0
  10. gobby-0.2.11/src/gobby/adapters/cursor.py +373 -0
  11. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/gemini.py +2 -26
  12. gobby-0.2.11/src/gobby/adapters/windsurf.py +359 -0
  13. gobby-0.2.11/src/gobby/agents/definitions.py +303 -0
  14. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/isolation.py +33 -1
  15. gobby-0.2.11/src/gobby/agents/pty_reader.py +192 -0
  16. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/registry.py +10 -1
  17. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/runner.py +24 -8
  18. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/sandbox.py +8 -3
  19. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/session.py +4 -0
  20. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawn.py +9 -2
  21. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawn_executor.py +49 -61
  22. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/command_builder.py +4 -4
  23. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/app_context.py +5 -0
  24. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/__init__.py +4 -0
  25. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/install.py +259 -4
  26. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/__init__.py +12 -0
  27. gobby-0.2.11/src/gobby/cli/installers/copilot.py +242 -0
  28. gobby-0.2.11/src/gobby/cli/installers/cursor.py +244 -0
  29. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/shared.py +3 -0
  30. gobby-0.2.11/src/gobby/cli/installers/windsurf.py +242 -0
  31. gobby-0.2.11/src/gobby/cli/pipelines.py +639 -0
  32. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/sessions.py +3 -1
  33. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/skills.py +209 -0
  34. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/crud.py +6 -5
  35. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/search.py +1 -1
  36. gobby-0.2.11/src/gobby/cli/ui.py +116 -0
  37. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/workflows.py +38 -17
  38. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/app.py +5 -0
  39. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/skills.py +23 -2
  40. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/broadcaster.py +9 -0
  41. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/event_handlers/_base.py +6 -1
  42. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/event_handlers/_session.py +44 -130
  43. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/events.py +48 -0
  44. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/hook_manager.py +25 -3
  45. gobby-0.2.11/src/gobby/install/copilot/hooks/hook_dispatcher.py +203 -0
  46. gobby-0.2.11/src/gobby/install/cursor/hooks/hook_dispatcher.py +203 -0
  47. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/gemini/hooks/hook_dispatcher.py +8 -0
  48. gobby-0.2.11/src/gobby/install/windsurf/hooks/hook_dispatcher.py +205 -0
  49. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/__init__.py +14 -1
  50. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/claude.py +217 -1
  51. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/service.py +149 -0
  52. gobby-0.2.11/src/gobby/mcp_proxy/instructions.py +38 -0
  53. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/models.py +1 -0
  54. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/registries.py +56 -9
  55. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/server.py +6 -2
  56. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/tool_filter.py +7 -0
  57. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/tool_proxy.py +19 -1
  58. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/stdio.py +37 -21
  59. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/agents.py +7 -0
  60. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/hub.py +30 -1
  61. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/cleanup.py +5 -5
  62. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/monitor.py +1 -1
  63. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/orchestrate.py +8 -3
  64. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/review.py +17 -4
  65. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/wait.py +7 -7
  66. gobby-0.2.11/src/gobby/mcp_proxy/tools/pipelines/__init__.py +254 -0
  67. gobby-0.2.11/src/gobby/mcp_proxy/tools/pipelines/_discovery.py +67 -0
  68. gobby-0.2.11/src/gobby/mcp_proxy/tools/pipelines/_execution.py +281 -0
  69. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_crud.py +4 -4
  70. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_handoff.py +1 -1
  71. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/skills/__init__.py +184 -30
  72. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/spawn_agent.py +229 -14
  73. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_context.py +8 -0
  74. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_crud.py +27 -1
  75. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_helpers.py +1 -1
  76. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_lifecycle.py +125 -8
  77. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_lifecycle_validation.py +2 -1
  78. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_search.py +1 -1
  79. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/__init__.py +9 -2
  80. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/_lifecycle.py +12 -1
  81. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/_query.py +45 -26
  82. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/_terminal.py +39 -3
  83. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/worktrees.py +54 -15
  84. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/context.py +5 -5
  85. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/runner.py +108 -6
  86. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/http.py +7 -1
  87. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/__init__.py +2 -0
  88. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/admin.py +44 -0
  89. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/execution.py +18 -25
  90. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/hooks.py +10 -1
  91. gobby-0.2.11/src/gobby/servers/routes/pipelines.py +227 -0
  92. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/websocket.py +314 -1
  93. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/analyzer.py +87 -1
  94. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/manager.py +5 -5
  95. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/transcripts/__init__.py +3 -0
  96. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/transcripts/claude.py +5 -0
  97. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/transcripts/codex.py +5 -0
  98. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/transcripts/gemini.py +5 -0
  99. gobby-0.2.11/src/gobby/skills/hubs/__init__.py +25 -0
  100. gobby-0.2.11/src/gobby/skills/hubs/base.py +234 -0
  101. gobby-0.2.11/src/gobby/skills/hubs/claude_plugins.py +328 -0
  102. gobby-0.2.11/src/gobby/skills/hubs/clawdhub.py +289 -0
  103. gobby-0.2.11/src/gobby/skills/hubs/github_collection.py +465 -0
  104. gobby-0.2.11/src/gobby/skills/hubs/manager.py +263 -0
  105. gobby-0.2.11/src/gobby/skills/hubs/skillhub.py +342 -0
  106. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/memories.py +4 -4
  107. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/migrations.py +95 -3
  108. gobby-0.2.11/src/gobby/storage/pipelines.py +367 -0
  109. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/sessions.py +23 -4
  110. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/skills.py +1 -1
  111. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_aggregates.py +2 -2
  112. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_lifecycle.py +4 -4
  113. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_models.py +7 -1
  114. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_queries.py +3 -3
  115. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sync/memories.py +4 -3
  116. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/commits.py +48 -17
  117. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/actions.py +75 -0
  118. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/context_actions.py +246 -5
  119. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/definitions.py +119 -1
  120. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/detection_helpers.py +23 -11
  121. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/enforcement/task_policy.py +18 -0
  122. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/engine.py +20 -1
  123. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/evaluator.py +8 -5
  124. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/lifecycle_evaluator.py +57 -26
  125. gobby-0.2.11/src/gobby/workflows/loader.py +883 -0
  126. gobby-0.2.11/src/gobby/workflows/lobster_compat.py +147 -0
  127. gobby-0.2.11/src/gobby/workflows/pipeline_executor.py +801 -0
  128. gobby-0.2.11/src/gobby/workflows/pipeline_state.py +172 -0
  129. gobby-0.2.11/src/gobby/workflows/pipeline_webhooks.py +206 -0
  130. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/premature_stop.py +5 -0
  131. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/worktrees/git.py +135 -20
  132. {gobby-0.2.9 → gobby-0.2.11}/src/gobby.egg-info/PKG-INFO +56 -22
  133. {gobby-0.2.9 → gobby-0.2.11}/src/gobby.egg-info/SOURCES.txt +28 -0
  134. {gobby-0.2.9 → gobby-0.2.11}/tests/test_import_pathing_trap.py +1 -0
  135. {gobby-0.2.9 → gobby-0.2.11}/tests/test_runner.py +7 -2
  136. gobby-0.2.9/src/gobby/agents/definitions.py +0 -143
  137. gobby-0.2.9/src/gobby/mcp_proxy/instructions.py +0 -56
  138. gobby-0.2.9/src/gobby/workflows/loader.py +0 -346
  139. {gobby-0.2.9 → gobby-0.2.11}/LICENSE.md +0 -0
  140. {gobby-0.2.9 → gobby-0.2.11}/setup.cfg +0 -0
  141. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/codex_impl/__init__.py +0 -0
  142. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/codex_impl/client.py +0 -0
  143. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/codex_impl/protocol.py +0 -0
  144. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/adapters/codex_impl/types.py +0 -0
  145. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/__init__.py +0 -0
  146. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/codex_session.py +0 -0
  147. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/constants.py +0 -0
  148. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/context.py +0 -0
  149. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/gemini_session.py +0 -0
  150. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/__init__.py +0 -0
  151. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/base.py +0 -0
  152. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/cross_platform.py +0 -0
  153. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/embedded.py +0 -0
  154. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/headless.py +0 -0
  155. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/linux.py +0 -0
  156. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/macos.py +0 -0
  157. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/prompt_manager.py +0 -0
  158. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/spawners/windows.py +0 -0
  159. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/agents/tty_config.py +0 -0
  160. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/autonomous/__init__.py +0 -0
  161. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/autonomous/progress_tracker.py +0 -0
  162. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/autonomous/stop_registry.py +0 -0
  163. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/autonomous/stuck_detector.py +0 -0
  164. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/__main__.py +0 -0
  165. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/agents.py +0 -0
  166. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/artifacts.py +0 -0
  167. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/clones.py +0 -0
  168. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/conductor.py +0 -0
  169. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/daemon.py +0 -0
  170. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/extensions.py +0 -0
  171. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/github.py +0 -0
  172. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/init.py +0 -0
  173. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/antigravity.py +0 -0
  174. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/claude.py +0 -0
  175. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/codex.py +0 -0
  176. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/gemini.py +0 -0
  177. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/installers/git_hooks.py +0 -0
  178. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/linear.py +0 -0
  179. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/mcp.py +0 -0
  180. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/mcp_proxy.py +0 -0
  181. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/memory.py +0 -0
  182. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/merge.py +0 -0
  183. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/projects.py +0 -0
  184. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/__init__.py +0 -0
  185. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/_utils.py +0 -0
  186. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/ai.py +0 -0
  187. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/commits.py +0 -0
  188. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/deps.py +0 -0
  189. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/labels.py +0 -0
  190. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/tasks/main.py +0 -0
  191. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/utils.py +0 -0
  192. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/cli/worktrees.py +0 -0
  193. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/clones/__init__.py +0 -0
  194. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/clones/git.py +0 -0
  195. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/__init__.py +0 -0
  196. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/alerts.py +0 -0
  197. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/loop.py +0 -0
  198. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/monitors/__init__.py +0 -0
  199. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/monitors/agents.py +0 -0
  200. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/monitors/tasks.py +0 -0
  201. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/pricing.py +0 -0
  202. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/conductor/token_tracker.py +0 -0
  203. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/__init__.py +0 -0
  204. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/extensions.py +0 -0
  205. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/features.py +0 -0
  206. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/llm_providers.py +0 -0
  207. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/logging.py +0 -0
  208. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/mcp.py +0 -0
  209. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/persistence.py +0 -0
  210. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/search.py +0 -0
  211. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/servers.py +0 -0
  212. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/sessions.py +0 -0
  213. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/config/tasks.py +0 -0
  214. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/__init__.py +0 -0
  215. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/artifact_capture.py +0 -0
  216. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/event_handlers/__init__.py +0 -0
  217. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/event_handlers/_agent.py +0 -0
  218. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/event_handlers/_misc.py +0 -0
  219. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/event_handlers/_tool.py +0 -0
  220. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/git.py +0 -0
  221. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/health_monitor.py +0 -0
  222. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/hook_types.py +0 -0
  223. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/plugins.py +0 -0
  224. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/session_coordinator.py +0 -0
  225. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/skill_manager.py +0 -0
  226. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/verification_runner.py +0 -0
  227. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/hooks/webhooks.py +0 -0
  228. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/claude/hooks/HOOK_SCHEMAS.md +0 -0
  229. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/claude/hooks/hook_dispatcher.py +0 -0
  230. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/claude/hooks/validate_settings.py +0 -0
  231. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/claude/hooks-template.json +0 -0
  232. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/codex/hooks/hook_dispatcher.py +0 -0
  233. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/gemini/hooks-template.json +0 -0
  234. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/shared/plugins/code_guardian.py +0 -0
  235. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/install/shared/plugins/example_notify.py +0 -0
  236. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/integrations/__init__.py +0 -0
  237. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/integrations/github.py +0 -0
  238. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/integrations/linear.py +0 -0
  239. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/base.py +0 -0
  240. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/claude_executor.py +0 -0
  241. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/codex.py +0 -0
  242. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/codex_executor.py +0 -0
  243. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/executor.py +0 -0
  244. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/factory.py +0 -0
  245. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/gemini.py +0 -0
  246. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/litellm.py +0 -0
  247. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/litellm_executor.py +0 -0
  248. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/llm/resolver.py +0 -0
  249. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/__init__.py +0 -0
  250. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/actions.py +0 -0
  251. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/daemon_control.py +0 -0
  252. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/importer.py +0 -0
  253. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/lazy.py +0 -0
  254. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/manager.py +0 -0
  255. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/metrics.py +0 -0
  256. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/schema_hash.py +0 -0
  257. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/semantic_search.py +0 -0
  258. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/__init__.py +0 -0
  259. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/fallback.py +0 -0
  260. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/recommendation.py +0 -0
  261. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/server_mgmt.py +0 -0
  262. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/services/system.py +0 -0
  263. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/__init__.py +0 -0
  264. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/agent_messaging.py +0 -0
  265. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/artifacts.py +0 -0
  266. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/clones.py +0 -0
  267. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/internal.py +0 -0
  268. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/memory.py +0 -0
  269. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/merge.py +0 -0
  270. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/metrics.py +0 -0
  271. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/__init__.py +0 -0
  272. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/orchestration/utils.py +0 -0
  273. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/__init__.py +0 -0
  274. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_commits.py +0 -0
  275. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_factory.py +0 -0
  276. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/sessions/_messages.py +0 -0
  277. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_dependencies.py +0 -0
  278. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_github.py +0 -0
  279. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_linear.py +0 -0
  280. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_orchestration.py +0 -0
  281. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_readiness.py +0 -0
  282. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_sync.py +0 -0
  283. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/task_validation.py +0 -0
  284. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/__init__.py +0 -0
  285. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_expansion.py +0 -0
  286. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_factory.py +0 -0
  287. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_resolution.py +0 -0
  288. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/tasks/_session.py +0 -0
  289. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/_artifacts.py +0 -0
  290. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/_import.py +0 -0
  291. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/tools/workflows/_resolution.py +0 -0
  292. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/__init__.py +0 -0
  293. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/base.py +0 -0
  294. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/factory.py +0 -0
  295. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/http.py +0 -0
  296. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/stdio.py +0 -0
  297. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/mcp_proxy/transports/websocket.py +0 -0
  298. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/backends/__init__.py +0 -0
  299. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/backends/mem0.py +0 -0
  300. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/backends/memu.py +0 -0
  301. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/backends/null.py +0 -0
  302. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/backends/openmemory.py +0 -0
  303. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/backends/sqlite.py +0 -0
  304. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/components/__init__.py +0 -0
  305. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/components/ingestion.py +0 -0
  306. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/components/search.py +0 -0
  307. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/extractor.py +0 -0
  308. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/ingestion/__init__.py +0 -0
  309. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/ingestion/multimodal.py +0 -0
  310. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/manager.py +0 -0
  311. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/protocol.py +0 -0
  312. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/search/__init__.py +0 -0
  313. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/search/coordinator.py +0 -0
  314. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/search/text.py +0 -0
  315. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/services/__init__.py +0 -0
  316. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/services/crossref.py +0 -0
  317. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/memory/viz.py +0 -0
  318. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/paths.py +0 -0
  319. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/prompts/__init__.py +0 -0
  320. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/prompts/loader.py +0 -0
  321. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/prompts/models.py +0 -0
  322. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/py.typed +0 -0
  323. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/__init__.py +0 -0
  324. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/backends/__init__.py +0 -0
  325. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/backends/embedding.py +0 -0
  326. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/embeddings.py +0 -0
  327. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/models.py +0 -0
  328. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/protocol.py +0 -0
  329. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/tfidf.py +0 -0
  330. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/search/unified.py +0 -0
  331. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/__init__.py +0 -0
  332. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/models.py +0 -0
  333. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/dependencies.py +0 -0
  334. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/__init__.py +0 -0
  335. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/__init__.py +0 -0
  336. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/discovery.py +0 -0
  337. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/registry.py +0 -0
  338. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/endpoints/server.py +0 -0
  339. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/plugins.py +0 -0
  340. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/tools.py +0 -0
  341. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/mcp/webhooks.py +0 -0
  342. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/servers/routes/sessions.py +0 -0
  343. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/__init__.py +0 -0
  344. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/lifecycle.py +0 -0
  345. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/processor.py +0 -0
  346. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/summary.py +0 -0
  347. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sessions/transcripts/base.py +0 -0
  348. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/__init__.py +0 -0
  349. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/loader.py +0 -0
  350. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/manager.py +0 -0
  351. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/parser.py +0 -0
  352. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/search.py +0 -0
  353. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/sync.py +0 -0
  354. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/updater.py +0 -0
  355. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/skills/validator.py +0 -0
  356. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/__init__.py +0 -0
  357. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/agents.py +0 -0
  358. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/artifact_classifier.py +0 -0
  359. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/artifacts.py +0 -0
  360. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/clones.py +0 -0
  361. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/compaction.py +0 -0
  362. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/database.py +0 -0
  363. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/inter_session_messages.py +0 -0
  364. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/mcp.py +0 -0
  365. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/merge_resolutions.py +0 -0
  366. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/projects.py +0 -0
  367. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/session_messages.py +0 -0
  368. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/session_tasks.py +0 -0
  369. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/task_dependencies.py +0 -0
  370. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/__init__.py +0 -0
  371. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_crud.py +0 -0
  372. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_id.py +0 -0
  373. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_manager.py +0 -0
  374. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_ordering.py +0 -0
  375. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_path_cache.py +0 -0
  376. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/tasks/_search.py +0 -0
  377. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/workflow_audit.py +0 -0
  378. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/storage/worktrees.py +0 -0
  379. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sync/__init__.py +0 -0
  380. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sync/github.py +0 -0
  381. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sync/linear.py +0 -0
  382. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/sync/tasks.py +0 -0
  383. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/__init__.py +0 -0
  384. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/build_verification.py +0 -0
  385. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/enhanced_validator.py +0 -0
  386. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/escalation.py +0 -0
  387. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/external_validator.py +0 -0
  388. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/issue_extraction.py +0 -0
  389. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/tree_builder.py +0 -0
  390. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/validation.py +0 -0
  391. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/validation_history.py +0 -0
  392. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tasks/validation_models.py +0 -0
  393. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tools/__init__.py +0 -0
  394. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/tools/summarizer.py +0 -0
  395. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/__init__.py +0 -0
  396. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/daemon_client.py +0 -0
  397. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/git.py +0 -0
  398. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/id.py +0 -0
  399. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/json_helpers.py +0 -0
  400. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/logging.py +0 -0
  401. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/machine_id.py +0 -0
  402. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/metrics.py +0 -0
  403. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/project_context.py +0 -0
  404. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/project_init.py +0 -0
  405. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/status.py +0 -0
  406. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/validation.py +0 -0
  407. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/utils/version.py +0 -0
  408. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/__init__.py +0 -0
  409. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/approval_flow.py +0 -0
  410. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/artifact_actions.py +0 -0
  411. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/audit_helpers.py +0 -0
  412. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/autonomous_actions.py +0 -0
  413. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/enforcement/__init__.py +0 -0
  414. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/enforcement/blocking.py +0 -0
  415. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/enforcement/commit_policy.py +0 -0
  416. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/enforcement/handlers.py +0 -0
  417. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/git_utils.py +0 -0
  418. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/hooks.py +0 -0
  419. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/llm_actions.py +0 -0
  420. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/mcp_actions.py +0 -0
  421. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/memory_actions.py +0 -0
  422. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/safe_evaluator.py +0 -0
  423. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/session_actions.py +0 -0
  424. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/state_actions.py +0 -0
  425. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/state_manager.py +0 -0
  426. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/stop_signal_actions.py +0 -0
  427. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/summary_actions.py +0 -0
  428. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/task_actions.py +0 -0
  429. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/task_sync_actions.py +0 -0
  430. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/templates.py +0 -0
  431. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/todo_actions.py +0 -0
  432. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/webhook.py +0 -0
  433. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/webhook_actions.py +0 -0
  434. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/workflows/webhook_executor.py +0 -0
  435. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/worktrees/__init__.py +0 -0
  436. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/worktrees/merge/__init__.py +0 -0
  437. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/worktrees/merge/conflict_parser.py +0 -0
  438. {gobby-0.2.9 → gobby-0.2.11}/src/gobby/worktrees/merge/resolver.py +0 -0
  439. {gobby-0.2.9 → gobby-0.2.11}/src/gobby.egg-info/dependency_links.txt +0 -0
  440. {gobby-0.2.9 → gobby-0.2.11}/src/gobby.egg-info/entry_points.txt +0 -0
  441. {gobby-0.2.9 → gobby-0.2.11}/src/gobby.egg-info/requires.txt +0 -0
  442. {gobby-0.2.9 → 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.9
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-worktrees", "spawn_agent_in_worktree", {
147
+ call_tool("gobby", "spawn_agent", {
148
148
  "prompt": "Implement OAuth flow",
149
- "branch_name": "feature/oauth",
150
- "task_id": "task-123"
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** | ✅ All 14 types | Full support |
291
- | **Gemini CLI** | Ready | Waiting on upstream PR (see [#9070](https://github.com/google-gemini/gemini-cli/issues/9070)) |
292
- | **Codex CLI** | 🔸 Basic | `after_agent` only |
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`, `list_ready_tasks`, `suggest_next_task`, `add_dependency`, `get_dependency_tree`, and more.
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
- **Worktrees** (`gobby-worktrees`)
358
- `create_worktree`, `spawn_agent_in_worktree`, `list_worktrees`
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 primitives
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
- **In Progress:** Memory v3 (backend abstraction layer for external memory solutions: MemU, Mem0, OpenMemory)
410
+ **Beta:** Autonomous orchestration (conductor daemon, inter-agent messaging, token budget tracking, review gates)
377
411
 
378
- **Next:** Autonomous orchestration, TUI, Web UI (for remote access to your agents), Observability (tool call tracing, OpenTelemetry), Security posture for MCP (allow/deny lists, audit logging)
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 (manage sessions across multiple machines), Plugin ecosystem, Team workflows, Enterprise hardening
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-worktrees", "spawn_agent_in_worktree", {
101
+ call_tool("gobby", "spawn_agent", {
102
102
  "prompt": "Implement OAuth flow",
103
- "branch_name": "feature/oauth",
104
- "task_id": "task-123"
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** | ✅ All 14 types | Full support |
245
- | **Gemini CLI** | Ready | Waiting on upstream PR (see [#9070](https://github.com/google-gemini/gemini-cli/issues/9070)) |
246
- | **Codex CLI** | 🔸 Basic | `after_agent` only |
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`, `list_ready_tasks`, `suggest_next_task`, `add_dependency`, `get_dependency_tree`, and more.
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
- **Worktrees** (`gobby-worktrees`)
312
- `create_worktree`, `spawn_agent_in_worktree`, `list_worktrees`
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 primitives
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
- **In Progress:** Memory v3 (backend abstraction layer for external memory solutions: MemU, Mem0, OpenMemory)
364
+ **Beta:** Autonomous orchestration (conductor daemon, inter-agent messaging, token budget tracking, review gates)
331
365
 
332
- **Next:** Autonomous orchestration, TUI, Web UI (for remote access to your agents), Observability (tool call tracing, OpenTelemetry), Security posture for MCP (allow/deny lists, audit logging)
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 (manage sessions across multiple machines), Plugin ecosystem, Team workflows, Enterprise hardening
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.9"
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",
@@ -1,3 +1,3 @@
1
1
  """Gobby - Local-first daemon for multi-CLI session management."""
2
2
 
3
- __version__ = "0.2.9"
3
+ __version__ = "0.2.11"
@@ -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. Process through HookManager
72
- 3. Translate response back to native format
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)
@@ -292,8 +292,8 @@ class ClaudeCodeAdapter(BaseAdapter):
292
292
 
293
293
  # Build hookSpecificOutput if we have any context to inject
294
294
  # Only include hookSpecificOutput for hook types that Claude Code's schema accepts
295
- # Valid hookEventName values: PreToolUse, UserPromptSubmit, PostToolUse
296
- valid_hook_event_names = {"PreToolUse", "UserPromptSubmit", "PostToolUse"}
295
+ # Valid hookEventName values: PreToolUse, UserPromptSubmit, PostToolUse, SessionStart
296
+ valid_hook_event_names = {"PreToolUse", "UserPromptSubmit", "PostToolUse", "SessionStart"}
297
297
  if additional_context_parts and hook_event_name in valid_hook_event_names:
298
298
  result["hookSpecificOutput"] = {
299
299
  "hookEventName": hook_event_name,
@@ -40,46 +40,26 @@ logger = logging.getLogger(__name__)
40
40
  # =============================================================================
41
41
 
42
42
 
43
- def _get_machine_id() -> str:
44
- """Get or generate a stable machine identifier.
43
+ def _get_daemon_machine_id() -> str | None:
44
+ """Get machine ID from the daemon's centralized utility.
45
45
 
46
- Priority:
47
- 1. Hostname (if available)
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 pathlib import Path
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
- # Try hostname first
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 or generate a machine identifier."""
182
- if self._machine_id is None:
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
- def _get_machine_id(self) -> str:
541
- """Get or generate a machine identifier."""
542
- if self._machine_id is None:
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
  ]