gobby 0.2.7__py3-none-any.whl → 0.2.8__py3-none-any.whl

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 (80) hide show
  1. gobby/adapters/claude_code.py +96 -35
  2. gobby/adapters/gemini.py +140 -38
  3. gobby/agents/isolation.py +130 -0
  4. gobby/agents/registry.py +11 -0
  5. gobby/agents/session.py +1 -0
  6. gobby/agents/spawn_executor.py +43 -13
  7. gobby/agents/spawners/macos.py +26 -1
  8. gobby/cli/__init__.py +0 -2
  9. gobby/cli/memory.py +185 -0
  10. gobby/clones/git.py +177 -0
  11. gobby/config/skills.py +31 -0
  12. gobby/hooks/event_handlers.py +109 -10
  13. gobby/hooks/hook_manager.py +19 -1
  14. gobby/install/gemini/hooks/hook_dispatcher.py +74 -15
  15. gobby/mcp_proxy/instructions.py +2 -2
  16. gobby/mcp_proxy/registries.py +21 -4
  17. gobby/mcp_proxy/tools/agent_messaging.py +93 -44
  18. gobby/mcp_proxy/tools/agents.py +45 -9
  19. gobby/mcp_proxy/tools/artifacts.py +43 -9
  20. gobby/mcp_proxy/tools/sessions/_commits.py +31 -24
  21. gobby/mcp_proxy/tools/sessions/_crud.py +5 -5
  22. gobby/mcp_proxy/tools/sessions/_handoff.py +45 -41
  23. gobby/mcp_proxy/tools/sessions/_messages.py +35 -7
  24. gobby/mcp_proxy/tools/spawn_agent.py +44 -6
  25. gobby/mcp_proxy/tools/tasks/_context.py +18 -0
  26. gobby/mcp_proxy/tools/tasks/_crud.py +13 -6
  27. gobby/mcp_proxy/tools/tasks/_lifecycle.py +29 -14
  28. gobby/mcp_proxy/tools/tasks/_session.py +22 -7
  29. gobby/mcp_proxy/tools/workflows.py +84 -34
  30. gobby/mcp_proxy/tools/worktrees.py +32 -7
  31. gobby/memory/extractor.py +15 -1
  32. gobby/runner.py +13 -0
  33. gobby/servers/routes/mcp/hooks.py +50 -3
  34. gobby/servers/websocket.py +57 -1
  35. gobby/sessions/analyzer.py +2 -2
  36. gobby/sessions/manager.py +9 -0
  37. gobby/sessions/transcripts/gemini.py +100 -34
  38. gobby/storage/database.py +9 -2
  39. gobby/storage/memories.py +32 -21
  40. gobby/storage/migrations.py +23 -4
  41. gobby/storage/sessions.py +4 -2
  42. gobby/storage/skills.py +43 -3
  43. gobby/workflows/detection_helpers.py +38 -24
  44. gobby/workflows/enforcement/blocking.py +13 -1
  45. gobby/workflows/engine.py +93 -0
  46. gobby/workflows/evaluator.py +110 -0
  47. gobby/workflows/hooks.py +41 -0
  48. gobby/workflows/memory_actions.py +11 -0
  49. gobby/workflows/safe_evaluator.py +8 -0
  50. gobby/workflows/summary_actions.py +123 -50
  51. {gobby-0.2.7.dist-info → gobby-0.2.8.dist-info}/METADATA +1 -1
  52. {gobby-0.2.7.dist-info → gobby-0.2.8.dist-info}/RECORD +56 -80
  53. gobby/cli/tui.py +0 -34
  54. gobby/tui/__init__.py +0 -5
  55. gobby/tui/api_client.py +0 -278
  56. gobby/tui/app.py +0 -329
  57. gobby/tui/screens/__init__.py +0 -25
  58. gobby/tui/screens/agents.py +0 -333
  59. gobby/tui/screens/chat.py +0 -450
  60. gobby/tui/screens/dashboard.py +0 -377
  61. gobby/tui/screens/memory.py +0 -305
  62. gobby/tui/screens/metrics.py +0 -231
  63. gobby/tui/screens/orchestrator.py +0 -903
  64. gobby/tui/screens/sessions.py +0 -412
  65. gobby/tui/screens/tasks.py +0 -440
  66. gobby/tui/screens/workflows.py +0 -289
  67. gobby/tui/screens/worktrees.py +0 -174
  68. gobby/tui/widgets/__init__.py +0 -21
  69. gobby/tui/widgets/chat.py +0 -210
  70. gobby/tui/widgets/conductor.py +0 -104
  71. gobby/tui/widgets/menu.py +0 -132
  72. gobby/tui/widgets/message_panel.py +0 -160
  73. gobby/tui/widgets/review_gate.py +0 -224
  74. gobby/tui/widgets/task_tree.py +0 -99
  75. gobby/tui/widgets/token_budget.py +0 -166
  76. gobby/tui/ws_client.py +0 -258
  77. {gobby-0.2.7.dist-info → gobby-0.2.8.dist-info}/WHEEL +0 -0
  78. {gobby-0.2.7.dist-info → gobby-0.2.8.dist-info}/entry_points.txt +0 -0
  79. {gobby-0.2.7.dist-info → gobby-0.2.8.dist-info}/licenses/LICENSE.md +0 -0
  80. {gobby-0.2.7.dist-info → gobby-0.2.8.dist-info}/top_level.txt +0 -0
@@ -22,6 +22,9 @@ logger = logging.getLogger(__name__)
22
22
  def format_turns_for_llm(turns: list[dict[str, Any]]) -> str:
23
23
  """Format transcript turns for LLM analysis.
24
24
 
25
+ Handles both Claude Code format (nested message.role/content) and
26
+ Gemini CLI format (flat type/role/content).
27
+
25
28
  Args:
26
29
  turns: List of transcript turn dicts
27
30
 
@@ -30,51 +33,108 @@ def format_turns_for_llm(turns: list[dict[str, Any]]) -> str:
30
33
  """
31
34
  formatted: list[str] = []
32
35
  for i, turn in enumerate(turns):
33
- message = turn.get("message", {})
34
- role = message.get("role", "unknown")
35
- content = message.get("content", "")
36
-
37
- # Assistant messages have content as array of blocks
38
- if isinstance(content, list):
39
- text_parts: list[str] = []
40
- for block in content:
41
- if isinstance(block, dict):
42
- if block.get("type") == "text":
43
- text_parts.append(block.get("text", ""))
44
- elif block.get("type") == "thinking":
45
- text_parts.append(f"[Thinking: {block.get('thinking', '')}]")
46
- elif block.get("type") == "tool_use":
47
- text_parts.append(f"[Tool: {block.get('name', 'unknown')}]")
48
- elif block.get("type") == "tool_result":
49
- result_content = block.get("content", "")
50
- # Extract text from list of content blocks if needed
51
- if isinstance(result_content, list):
52
- extracted = []
53
- for item in result_content:
54
- if isinstance(item, dict):
55
- extracted.append(
56
- item.get("text", "") or item.get("content", "")
57
- )
58
- else:
59
- extracted.append(str(item))
60
- result_content = " ".join(extracted)
61
- content_str = str(result_content)
62
- preview = content_str[:100]
63
- suffix = "..." if len(content_str) > 100 else ""
64
- text_parts.append(f"[Result: {preview}{suffix}]")
65
- content = " ".join(text_parts)
36
+ # Detect format: Gemini CLI uses "type" field, Claude uses nested "message"
37
+ event_type = turn.get("type")
38
+
39
+ if event_type:
40
+ # Gemini CLI format: flat structure with type field
41
+ role, content = _format_gemini_turn(turn, event_type)
42
+ if role is None:
43
+ continue # Skip non-displayable events
44
+ else:
45
+ # Claude Code format: nested message structure
46
+ role, content = _format_claude_turn(turn)
66
47
 
67
48
  formatted.append(f"[Turn {i + 1} - {role}]: {content}")
68
49
 
69
50
  return "\n\n".join(formatted)
70
51
 
71
52
 
53
+ def _format_gemini_turn(turn: dict[str, Any], event_type: str) -> tuple[str | None, str]:
54
+ """Format a Gemini CLI turn.
55
+
56
+ Returns:
57
+ Tuple of (role, formatted_content) or (None, "") if should skip
58
+ """
59
+ if event_type == "message":
60
+ role = turn.get("role", "unknown")
61
+ if role == "model":
62
+ role = "assistant"
63
+ content = turn.get("content", "")
64
+ if isinstance(content, list):
65
+ content = " ".join(str(part) for part in content)
66
+ return role, str(content)
67
+
68
+ elif event_type == "tool_use":
69
+ tool_name = turn.get("tool_name") or turn.get("function_name", "unknown")
70
+ params = turn.get("parameters") or turn.get("args", {})
71
+ param_preview = str(params)[:100] if params else ""
72
+ return "assistant", f"[Tool: {tool_name}] {param_preview}"
73
+
74
+ elif event_type == "tool_result":
75
+ tool_name = turn.get("tool_name", "")
76
+ output = turn.get("output") or turn.get("result", "")
77
+ output_str = str(output)
78
+ preview = output_str[:100]
79
+ suffix = "..." if len(output_str) > 100 else ""
80
+ return "tool", f"[Result{' from ' + tool_name if tool_name else ''}]: {preview}{suffix}"
81
+
82
+ elif event_type in ("init", "result"):
83
+ # Skip initialization and final result events
84
+ return None, ""
85
+
86
+ else:
87
+ # Unknown type, try to extract something
88
+ content = turn.get("content", turn.get("message", ""))
89
+ return "unknown", str(content)[:200]
90
+
91
+
92
+ def _format_claude_turn(turn: dict[str, Any]) -> tuple[str, str]:
93
+ """Format a Claude Code turn with nested message structure."""
94
+ message = turn.get("message", {})
95
+ role = message.get("role", "unknown")
96
+ content = message.get("content", "")
97
+
98
+ # Assistant messages have content as array of blocks
99
+ if isinstance(content, list):
100
+ text_parts: list[str] = []
101
+ for block in content:
102
+ if isinstance(block, dict):
103
+ if block.get("type") == "text":
104
+ text_parts.append(block.get("text", ""))
105
+ elif block.get("type") == "thinking":
106
+ text_parts.append(f"[Thinking: {block.get('thinking', '')}]")
107
+ elif block.get("type") == "tool_use":
108
+ text_parts.append(f"[Tool: {block.get('name', 'unknown')}]")
109
+ elif block.get("type") == "tool_result":
110
+ result_content = block.get("content", "")
111
+ # Extract text from list of content blocks if needed
112
+ if isinstance(result_content, list):
113
+ extracted = []
114
+ for item in result_content:
115
+ if isinstance(item, dict):
116
+ extracted.append(item.get("text", "") or item.get("content", ""))
117
+ else:
118
+ extracted.append(str(item))
119
+ result_content = " ".join(extracted)
120
+ content_str = str(result_content)
121
+ preview = content_str[:100]
122
+ suffix = "..." if len(content_str) > 100 else ""
123
+ text_parts.append(f"[Result: {preview}{suffix}]")
124
+ content = " ".join(text_parts)
125
+
126
+ return role, str(content)
127
+
128
+
72
129
  def extract_todowrite_state(turns: list[dict[str, Any]]) -> str:
73
130
  """Extract the last TodoWrite tool call's todos list from transcript.
74
131
 
75
132
  Scans turns in reverse to find the most recent TodoWrite tool call
76
133
  and formats it as a markdown checklist.
77
134
 
135
+ Handles both Claude Code format (nested message.content) and
136
+ Gemini CLI format (flat type/tool_name/parameters).
137
+
78
138
  Args:
79
139
  turns: List of transcript turns
80
140
 
@@ -82,6 +142,16 @@ def extract_todowrite_state(turns: list[dict[str, Any]]) -> str:
82
142
  Formatted markdown string with todo list, or empty string if not found
83
143
  """
84
144
  for turn in reversed(turns):
145
+ # Check Gemini CLI format: flat structure with type="tool_use"
146
+ event_type = turn.get("type")
147
+ if event_type == "tool_use":
148
+ tool_name = turn.get("tool_name") or turn.get("function_name", "")
149
+ if tool_name == "TodoWrite":
150
+ tool_input = turn.get("parameters") or turn.get("args") or turn.get("input", {})
151
+ todos = tool_input.get("todos", [])
152
+ return _format_todos(todos)
153
+
154
+ # Check Claude Code format: nested message.content
85
155
  message = turn.get("message", {})
86
156
  content = message.get("content", [])
87
157
 
@@ -91,29 +161,32 @@ def extract_todowrite_state(turns: list[dict[str, Any]]) -> str:
91
161
  if block.get("name") == "TodoWrite":
92
162
  tool_input = block.get("input", {})
93
163
  todos = tool_input.get("todos", [])
164
+ return _format_todos(todos)
94
165
 
95
- if not todos:
96
- return ""
166
+ return ""
97
167
 
98
- # Format as markdown checklist
99
- lines: list[str] = []
100
- for todo in todos:
101
- content_text = todo.get("content", "")
102
- status = todo.get("status", "pending")
103
168
 
104
- # Map status to checkbox style
105
- if status == "completed":
106
- checkbox = "[x]"
107
- elif status == "in_progress":
108
- checkbox = "[>]"
109
- else:
110
- checkbox = "[ ]"
169
+ def _format_todos(todos: list[dict[str, Any]]) -> str:
170
+ """Format todos list as markdown checklist."""
171
+ if not todos:
172
+ return ""
111
173
 
112
- lines.append(f"- {checkbox} {content_text}")
174
+ lines: list[str] = []
175
+ for todo in todos:
176
+ content_text = todo.get("content", "")
177
+ status = todo.get("status", "pending")
113
178
 
114
- return "\n".join(lines)
179
+ # Map status to checkbox style
180
+ if status == "completed":
181
+ checkbox = "[x]"
182
+ elif status == "in_progress":
183
+ checkbox = "[>]"
184
+ else:
185
+ checkbox = "[ ]"
115
186
 
116
- return ""
187
+ lines.append(f"- {checkbox} {content_text}")
188
+
189
+ return "\n".join(lines)
117
190
 
118
191
 
119
192
  async def synthesize_title(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gobby
3
- Version: 0.2.7
3
+ Version: 0.2.8
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
@@ -1,10 +1,10 @@
1
1
  gobby/__init__.py,sha256=c3bndCCE5kOwyv9yBzkP2Kf8dtUYBI5xLBKvUXaMqvI,90
2
2
  gobby/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- gobby/runner.py,sha256=M4cTkNsoYsnXOebwUXOc_H7TQPMYr5L5yhF5njx5hgA,21109
3
+ gobby/runner.py,sha256=2pjeK4PKMdWhgHZY_5TAhygy9DhzptUc6peOBYQMsS4,21735
4
4
  gobby/adapters/__init__.py,sha256=addiq8910J-tAgAyY_b-odBOaiDDS3BtMkhu2XH0qhE,1085
5
5
  gobby/adapters/base.py,sha256=zkl9JPhleSteFqELuHO2-N9z8jahpHX0NOn4VlSa_qs,3462
6
- gobby/adapters/claude_code.py,sha256=2-d_LQboIr6uoZs595zh26Qj0dWpKpotC6FsATCv6qg,12606
7
- gobby/adapters/gemini.py,sha256=EDhlg7ZeeknFaJvoVwsNZqIhPYrAhb1-yU-BRRmDFIM,13882
6
+ gobby/adapters/claude_code.py,sha256=iH1ogzX_K53Z3TxTarmi3oWIfNPa3Ah32ZoG_TihVcU,15243
7
+ gobby/adapters/gemini.py,sha256=Kha3M_Hgttrwdqix3VR5K-ewYRSpI2Fgpoev65DerfQ,18548
8
8
  gobby/adapters/codex_impl/__init__.py,sha256=NnB2baPYEWm-6TfxLjthUfFn_XHNSx1gSFqp9wn0H0A,1056
9
9
  gobby/adapters/codex_impl/adapter.py,sha256=Kd5gCVw_dBj1-rYtcqlSNvGvFV5XIHGCYq86DWNyB9A,25304
10
10
  gobby/adapters/codex_impl/client.py,sha256=disC5v4_1u70PltvkxajXuRZ2QaAjAhC4jlZwktDQ5A,22847
@@ -16,13 +16,13 @@ gobby/agents/constants.py,sha256=nOkuh6-_wP6VvECYvOKWWyQ5YisRlcPxc1yQQEF1OD8,368
16
16
  gobby/agents/context.py,sha256=rsq9hSd32MU3OtX_Zfv10TxjGym174j1IM0mHt8nEI4,12758
17
17
  gobby/agents/definitions.py,sha256=_wc5XTYyvhvBcjj9TBoPmjNNREHP6-S06TmUKO0DHXI,4386
18
18
  gobby/agents/gemini_session.py,sha256=alnAlO7fAy13Mh24KsIIa0DpAk4ak47rpQWCsdmuo7U,3626
19
- gobby/agents/isolation.py,sha256=rjPTEpu-1xMR0adkvwBfymtk2w3ou-yQWHejivOQyx0,13046
20
- gobby/agents/registry.py,sha256=AjdM3WgjyHPp6Tl78lNlT3q-HMF4VD_qlEdaIASBNLs,22318
19
+ gobby/agents/isolation.py,sha256=_1XMqly1ZXv4ZwRZujSE6JPnK5eBRK-0o3ZPyHAOyFc,17354
20
+ gobby/agents/registry.py,sha256=Qyq76rQovs-g5FdAlHVf3XvVx0cet0BGQg3gtpSbxTw,22687
21
21
  gobby/agents/runner.py,sha256=kS4HTp-84TPum-NrpCC_w1QYsyhowBHWFTUnWArLanY,35818
22
22
  gobby/agents/sandbox.py,sha256=CeW2IjjMPM5bXl57bLS2MrVwXiaVu-u1Ff-zrdvNeDo,8039
23
- gobby/agents/session.py,sha256=zLjDrGyAPCO5CeIB-17yXC50CPAyFVRw36vzx4mS8GE,8114
23
+ gobby/agents/session.py,sha256=5jLumr4AUAe6vpH3G55W7_-1TqTsUgDiLHomR8ZqabY,8162
24
24
  gobby/agents/spawn.py,sha256=H41DCjFhnHloys8_3WbnIBi9e3wn4Zlxwla4kDP3vpo,21436
25
- gobby/agents/spawn_executor.py,sha256=beCt8OXMikfHaByRMwYfXY-AvuzU5BhofURgOK4RqMU,12611
25
+ gobby/agents/spawn_executor.py,sha256=D2vfj6cvOXyZVqC4BhlUz0E7DbAV8B4DcKMdmYAHhck,13722
26
26
  gobby/agents/tty_config.py,sha256=AX_0654idljU34on7TO20A0NEhrg7gU9rzqnmAphsUM,8481
27
27
  gobby/agents/spawners/__init__.py,sha256=xc2P-dnLwv6BTTcc1igYELpdxKOvPOknfCU6re1voJ0,2462
28
28
  gobby/agents/spawners/base.py,sha256=mFcfkRe5MhfCcFK2urlB-te2mzCgm5z9zEsTa6Qk-t4,3561
@@ -31,14 +31,14 @@ gobby/agents/spawners/cross_platform.py,sha256=QTHENlDYPiRXfWqIXk3bHTCW2MYeEtsfl
31
31
  gobby/agents/spawners/embedded.py,sha256=Vtz-wa5PmabWIUF4QIR9kF-XAx1WSODrnw-_L1_ozFE,7865
32
32
  gobby/agents/spawners/headless.py,sha256=qwASELJMvU3C8tYCUErOkDI4hUb_QbO4tpd5VQ6f9ow,8257
33
33
  gobby/agents/spawners/linux.py,sha256=G2LKI9NJr8k8D6McFeymEsNJSXlL_7hegc-laAVdNs0,3941
34
- gobby/agents/spawners/macos.py,sha256=1XpsmgmG4po40cS_94m3eXNYRmkFOdTQK3IZWvYQ8ew,10385
34
+ gobby/agents/spawners/macos.py,sha256=tngN3vx1knQ6L13w8jSjdUKEFLCA1Itav93xpKdmY_Y,11468
35
35
  gobby/agents/spawners/prompt_manager.py,sha256=ogEFTxECdl0buXzb3rzkLwUwu7uACs7mfkZooxiGnwI,3982
36
36
  gobby/agents/spawners/windows.py,sha256=3Lj3kM000NSnkm2wFCtq3RmY0YKxtx9TAH6UBufoKqo,10861
37
37
  gobby/autonomous/__init__.py,sha256=pKFInMsSBwIOH2bGT2bWZwftgPvhqX5bmBk9dPxARf8,798
38
38
  gobby/autonomous/progress_tracker.py,sha256=0mQCHRAeDrTIZrR9Tl7c8UP34EEME-gS0sh7l6BYV5c,14885
39
39
  gobby/autonomous/stop_registry.py,sha256=A2khm_HJJVSxiGyQSOIaNO4tP7J85G6oet10BQDy-qM,8415
40
40
  gobby/autonomous/stuck_detector.py,sha256=1uVw9I041ibsfxoo13ojnZ_EqQaou9Xv3CUNnh1wHVA,13337
41
- gobby/cli/__init__.py,sha256=uvNne9qgJlZmsd3EW8eam1dEb3G6HanMI4bVwVLxyqY,1813
41
+ gobby/cli/__init__.py,sha256=SZb1EhhSt5o_rpzfc0au7sCfepGr68nFrXhUJpsg4f4,1773
42
42
  gobby/cli/__main__.py,sha256=zmea_Nm9EbjMSo3Pits3qYSL1__uN7cALX5lJ0HiJvI,101
43
43
  gobby/cli/agents.py,sha256=Ef1dHvuVwz97gtmMafxsKvQ_dW6pRfOZUFPtYxYJH2w,17219
44
44
  gobby/cli/artifacts.py,sha256=hRKdXSmrF58_EqmFaDTPvG8_JlJgIJUSWkUj4AGGols,8543
@@ -52,12 +52,11 @@ gobby/cli/install.py,sha256=MwbzqA84PDq4BOFImiKkSTL6tRu5jOXRO4w2YN2emuc,22413
52
52
  gobby/cli/linear.py,sha256=YDCxPPm-2iU198DpvLozv-aHcGfuCrgk9M35hXBALI8,8524
53
53
  gobby/cli/mcp.py,sha256=F3MDY4F6RqA552bvUXT7FZOHN_oIRyJtyUs7JwnBZ50,668
54
54
  gobby/cli/mcp_proxy.py,sha256=CSZAJYuEgq-y7RNi2HCIGLgROaxyCApfq9yfkM_L5sI,22659
55
- gobby/cli/memory.py,sha256=1aVquWWDHtlK7_7nF5pewqgDk3QAgW5zcEgQjzTXQWg,10799
55
+ gobby/cli/memory.py,sha256=xqqJ7EtU7qZz7MhFFoVLny5o4eF4J6ur-hob_OZWrJs,17000
56
56
  gobby/cli/merge.py,sha256=35TBrBOiHuo4mS4-3zMMP6EM0lqmJLMcFc3TeIQrFS8,12193
57
57
  gobby/cli/projects.py,sha256=3p-ECuAKfn17UuTGSi0F8EYUk9de122NpzfxSLJWlFI,2319
58
58
  gobby/cli/sessions.py,sha256=TQUYusbt2z97kIbO5axIBM9QO6rM-0OAeywNQsuc1x4,21941
59
59
  gobby/cli/skills.py,sha256=kHAwSsQVgyGZLxaYiXh5UVDQpxNZZCsjR3eKIqfBz3w,26320
60
- gobby/cli/tui.py,sha256=pCxPIf5Nbx_9DinyJg-fCeyaeEquLmRbRJFqseZFNno,763
61
60
  gobby/cli/utils.py,sha256=S5BUriATddhcazw1q_y960_KMWHZsIiaL3uicxe-0cg,16148
62
61
  gobby/cli/workflows.py,sha256=mC2Wj_Ce2ABvsv2wsD1oppGPoau3v_K90PZqxr9yyIY,31558
63
62
  gobby/cli/worktrees.py,sha256=y65rBiktgPb78pwW7e1OF773IWe2gnqvhoPHQFzV3xc,16298
@@ -78,7 +77,7 @@ gobby/cli/tasks/labels.py,sha256=eefec7BOtZYghKACaMJwONMxjAjgo4dqNoaotD8T6Js,193
78
77
  gobby/cli/tasks/main.py,sha256=A8sMWr-v5ci4cnUVYT3ml7Pz1sKd6fd_3lCVUJPbUyE,8001
79
78
  gobby/cli/tasks/search.py,sha256=VU1W1J9IoJ71mMnAkDYBaqBibHB-ii3pikmBS26hIGI,4470
80
79
  gobby/clones/__init__.py,sha256=GjgorVgIXUiNmnPzRDK1Z4QPmLeIelGgdHZUmU0drQ4,362
81
- gobby/clones/git.py,sha256=WaQZHvXYluCcOcvtjX5Z1spDMn_iD7IYFh6PzPU0lys,17379
80
+ gobby/clones/git.py,sha256=7QZWY8qHCj9m86UJ90BfwjPqfi5M9GbQf2v2w8cGssM,23638
82
81
  gobby/conductor/__init__.py,sha256=fPZmcKBp-u_WHrs2NtK1Qp5G3TP_utaiVZrOoyqLTuI,632
83
82
  gobby/conductor/alerts.py,sha256=T2XtR36zeT-bclWYcPNCRjHFv5tT5IvUltM9GQO3XOo,4038
84
83
  gobby/conductor/loop.py,sha256=SaLRzN6evSs9AJ9sBXpNTsJNK65HBM7mmRoR4b1mOUs,5449
@@ -98,16 +97,16 @@ gobby/config/persistence.py,sha256=OoymeuZHouRLqR8R9lbbX_OBU1cjtnEqpqGfRf6iet0,8
98
97
  gobby/config/search.py,sha256=TT76NNlNtbhm4d0RAaM24jUW9L0V8zRAUmng2hHRQ1E,3697
99
98
  gobby/config/servers.py,sha256=u7hLGDMoWedy4vNAUE_1dK6NQ6Lklv05yoUiud-4t70,4602
100
99
  gobby/config/sessions.py,sha256=LLeDp6w314Qs9D5D_Qqcvmlkeh2MZb_6-CKr9Lnt43Y,7922
101
- gobby/config/skills.py,sha256=G44ECmK3FCy-USoR3c_fRu0Bsc_M54wwt2cDhZDPafA,1277
100
+ gobby/config/skills.py,sha256=OrZu6nLW5SkMQpLhugBiPC1Y6H1kajIZQf-2V5wG61o,2010
102
101
  gobby/config/tasks.py,sha256=ihLcUXHFN3-wcIVvsTZY_XoQrET4kYTrO9Rv5leOryk,23864
103
102
  gobby/hooks/__init__.py,sha256=8WDNKooutm0zYXuP21q0gQ8h2MInnPOs8FFlvjeDZ_w,2717
104
103
  gobby/hooks/artifact_capture.py,sha256=V_GXGJhm-fmNvRQkRf-G36c_jHKa-Hf4cimCfi6gRGc,6922
105
104
  gobby/hooks/broadcaster.py,sha256=gKUcmCHHr0-ECJp7izT904PBJuBoznOB0xw0C4FWDcQ,9964
106
- gobby/hooks/event_handlers.py,sha256=nGrPN0o-dsf3dKdDH-qUwpU3hfdGXBs8LDKiylPcxdM,39113
105
+ gobby/hooks/event_handlers.py,sha256=ejuK0F-3_1n4n94tUNBfYUGkU2naFL2oOg4ARQ5kkYI,43273
107
106
  gobby/hooks/events.py,sha256=YGb--5DlbCRhZzdUS3uJcRk_nm6mmtZQZw0DYR9ZtIE,7192
108
107
  gobby/hooks/git.py,sha256=F1p2jvS3-9pAbPjKzc8wa9Td7249jx4eUiBMzz-11kU,5198
109
108
  gobby/hooks/health_monitor.py,sha256=Pe2aS0w9t1BM4m3CEYAMTVZq1tAtwgftb7Ko-JjsIjU,6423
110
- gobby/hooks/hook_manager.py,sha256=lxMSX4HfngdSaMgtbD_UJtEkaK96yDnGipBrZUJmcYY,38146
109
+ gobby/hooks/hook_manager.py,sha256=-jD2aoz1O-Si74RFlKHnjviuQx7js3Fuwo1LHT7Y7wk,39192
111
110
  gobby/hooks/hook_types.py,sha256=oQ6SiDyVKozE575d3dndl9I5Tr21ecS9sCbMZyb0FSA,19256
112
111
  gobby/hooks/plugins.py,sha256=0Uf5C4uY_otF5yzc-c1aX2YtBfFpZAh6ob2d9iSlFZo,27953
113
112
  gobby/hooks/session_coordinator.py,sha256=YDbPtwZk2CKVyb-YNs2P-5jKr7EC6nHqq0EF4h-gI6M,13867
@@ -120,7 +119,7 @@ gobby/install/claude/hooks/hook_dispatcher.py,sha256=-sHi2HSgXu0fhqG7zWW5qXaGWYz
120
119
  gobby/install/claude/hooks/validate_settings.py,sha256=jVR2VGOxsnyYHGYZIIzOoY2kQAFrJEpAUq5N02KQBKU,2750
121
120
  gobby/install/codex/hooks/hook_dispatcher.py,sha256=GBLQPxHKhguQbZf_UWLukjV2WV3oqgDKNwIjuSqGuZo,4022
122
121
  gobby/install/gemini/hooks-template.json,sha256=QUsEAZ0XlgH8E1UMPBCTYqRjONuG2fggikaPDaBY8Tc,3479
123
- gobby/install/gemini/hooks/hook_dispatcher.py,sha256=xe-Nzb3WICns5pYKAEZ3y1065-GeOK0utcdfyKtjvEU,11993
122
+ gobby/install/gemini/hooks/hook_dispatcher.py,sha256=9UV57CrAxzRpCXGdspNnFnWwsyG3Bz_Rcluly_yjm20,13679
124
123
  gobby/install/shared/plugins/code_guardian.py,sha256=m4UrlBP6Mx4Xf-egpVe6KHm3t_0aqFfcTC0mxRA2jzY,16145
125
124
  gobby/install/shared/plugins/example_notify.py,sha256=cvsptzKyfPJ7u_IYEoTAEcg1BhxPBECxhWe5RcE-1AI,11260
126
125
  gobby/integrations/__init__.py,sha256=LAJmdQXeWxdZx5R7KKk1tvD2Z-XLzuXaSkLNbyOGnJQ,341
@@ -143,12 +142,12 @@ gobby/mcp_proxy/__init__.py,sha256=wtCqRfarZX5iERfiUraJtgIp5WBFTI_4-LmOuQTvyR4,6
143
142
  gobby/mcp_proxy/actions.py,sha256=sKmdVn-mAt7Y_5Si3TYqado9WB-frm6-nalfvclHGQA,5248
144
143
  gobby/mcp_proxy/daemon_control.py,sha256=2sKbDbCxJP32T0Opcgf6YZ8f3K7M_a-AD6R4uG4Xh5Q,6228
145
144
  gobby/mcp_proxy/importer.py,sha256=TZlLuXG7lgTnGP-WRLPDB1EVOKItIuL4i2GFeOSOdVo,17508
146
- gobby/mcp_proxy/instructions.py,sha256=OD1AWaVZ8XjId003VRFYKpFs384F4nqX6WTAJadUiW4,1989
145
+ gobby/mcp_proxy/instructions.py,sha256=wzT_0FfYJVqKLcfRBPzNxXslMMfUu2uTUsQi5QJ1bUI,2024
147
146
  gobby/mcp_proxy/lazy.py,sha256=taP6y8cu6_2o8j-qkyYSMzYTrGu1O_fQSyuXGGMMlIY,10826
148
147
  gobby/mcp_proxy/manager.py,sha256=moG5wortkbhcBHQ2X7ULgDxSkK-44lxssMWZdQxxF8E,31691
149
148
  gobby/mcp_proxy/metrics.py,sha256=sK6SZIhgDfVpUMgBmR64dC-Nwt5ZgFBiJO1zjBARLUA,20520
150
149
  gobby/mcp_proxy/models.py,sha256=QxQrflKB4sRZi4FAJHW2VH0svyoY2vWBe0_RTyAzTFI,4610
151
- gobby/mcp_proxy/registries.py,sha256=Xk-rtnna5Wz8xWpZjxooOcgYW5aQ5Zp5Z0FeVm5nQlI,11675
150
+ gobby/mcp_proxy/registries.py,sha256=uiMXBt4QOtGmkIy7trSMyOXoS-dChCDFiszHpZEP8AE,12439
152
151
  gobby/mcp_proxy/schema_hash.py,sha256=8k_lw4jAfoZ51W-morJcD1u7FLOcXLDEmyeWCSPhbHY,11579
153
152
  gobby/mcp_proxy/semantic_search.py,sha256=kTpD5PrVXgfYByvx0yrb1gqFVU4HLwigPx3gMAFSVVU,22312
154
153
  gobby/mcp_proxy/server.py,sha256=5ScbBb5eWSw94Jez3mspkb8Rv6pK-qfSynLzneuBszw,19376
@@ -161,16 +160,16 @@ gobby/mcp_proxy/services/system.py,sha256=waqEdzOwCL7Fq_SRIzYYcoWO5x2XdXqi8eYew8
161
160
  gobby/mcp_proxy/services/tool_filter.py,sha256=LJwIQiimyyQP8had1K-9PFskEzob731WHiPmJvWUKqU,7233
162
161
  gobby/mcp_proxy/services/tool_proxy.py,sha256=G5VvdTIgPPe2popPDaR00Mf3qHWj9ETZHaRSY_jR_X4,15506
163
162
  gobby/mcp_proxy/tools/__init__.py,sha256=6R34L-DiMFk6l4PasnnOBdindME4JLFVDL-K1NYxY3I,907
164
- gobby/mcp_proxy/tools/agent_messaging.py,sha256=DrDuO1IWUnFnsl9rRoajJZxmBkPoR7zOTNSFjBLjrKA,10058
165
- gobby/mcp_proxy/tools/agents.py,sha256=_PDdWaOEip2Q2yWQPJx6kzn1DllQwoyJibLkV0BqXpM,13090
166
- gobby/mcp_proxy/tools/artifacts.py,sha256=ntx7uH6A8W_Om0u1RLNU44o9OthhZdsv3LvaZSTuRwg,6754
163
+ gobby/mcp_proxy/tools/agent_messaging.py,sha256=IBmggWUeD-wd7WFSvpJxJRBndRBkrz_MJvWLoGfPS9k,12548
164
+ gobby/mcp_proxy/tools/agents.py,sha256=-fTAQKsv4ASt_hu3uZMA5orVByrKKyOHPAufgaj3ktI,15021
165
+ gobby/mcp_proxy/tools/artifacts.py,sha256=9EzjDKyKaDQ4WY2ZDLLGvXo4hyvSuHdQG1GwcvqPBFI,8531
167
166
  gobby/mcp_proxy/tools/clones.py,sha256=1_N55Bj_XV7l3TeZRHuU6RiWDZ_UV3G2I49laPCbGUM,16177
168
167
  gobby/mcp_proxy/tools/hub.py,sha256=wI01OvMGRGKMapzK_n_QZKZ2JkxoErp1qrpYEn9M4xE,10735
169
168
  gobby/mcp_proxy/tools/internal.py,sha256=520G2M_AKW79VFeUVY0pVHD4c9naIxqsAGz9ZoPkGdo,9953
170
169
  gobby/mcp_proxy/tools/memory.py,sha256=ImuyjE63ChhksjbgntAYR4FHfmg7LnAf6GxVR5qDKps,17823
171
170
  gobby/mcp_proxy/tools/merge.py,sha256=VV29ZKQY7rYoktoJ2DZ5NC_YUDHvVwaPuYBjy4uk4BQ,14257
172
171
  gobby/mcp_proxy/tools/metrics.py,sha256=Mx3eIBoy5nrg44iM6J982t_PVL_HBPFbnQ0b4y32Uo8,10726
173
- gobby/mcp_proxy/tools/spawn_agent.py,sha256=QuIrKLHec7-HmJAe6ZnF7AUeren9DOY_bG7SgWKMV_w,16193
172
+ gobby/mcp_proxy/tools/spawn_agent.py,sha256=e3GxqS12v3o5_dL6AH5LPmiTlsh1cjuQ7qBlG0YXd4M,18054
174
173
  gobby/mcp_proxy/tools/task_dependencies.py,sha256=4PVtYtrmpd2tfEHvST74GRCK5zfJ5UgDFIwVyEKgP8E,8041
175
174
  gobby/mcp_proxy/tools/task_github.py,sha256=ke8z4JjTD4O79sE5S9RqA5pBGJZsr42AAXFdFrojUKk,12346
176
175
  gobby/mcp_proxy/tools/task_linear.py,sha256=ZBO4rFbIaGiA_tKh_EiETrKzyrquW58R_l7qcSWDm-k,11959
@@ -178,8 +177,8 @@ gobby/mcp_proxy/tools/task_orchestration.py,sha256=aQUjMYmHHpDudb0gD6t4PAD-XHYZe
178
177
  gobby/mcp_proxy/tools/task_readiness.py,sha256=YQa6uzCx8VK1WeQCky8U4UGLYnyaj4b7chibqp2iu3w,19909
179
178
  gobby/mcp_proxy/tools/task_sync.py,sha256=yoZuNOuOoMEo1XT7UZruK3oU40zwPC3y3Ixm6qXxVms,12159
180
179
  gobby/mcp_proxy/tools/task_validation.py,sha256=pwDWvjaQRIAPkwUJ_Rel1d0zesl5UsuN6kuTZTGQ5oE,30972
181
- gobby/mcp_proxy/tools/workflows.py,sha256=WUnlXMYG9LGv-t7FNygy8ONZv8Z42oifjliUQNlEya8,36206
182
- gobby/mcp_proxy/tools/worktrees.py,sha256=hi99WSQvRPmVSWrTWig8W9wVj9tHym2ISwpDEu-G35U,31015
180
+ gobby/mcp_proxy/tools/workflows.py,sha256=7CAU44rYykGFI8EiLXZOMDdQxlKeDEWU69X8hnh0bNg,38903
181
+ gobby/mcp_proxy/tools/worktrees.py,sha256=dNNuyEGiiqkDIzEmR_TFtQMNG763ecs1VXeSjN5TT2A,32302
183
182
  gobby/mcp_proxy/tools/orchestration/__init__.py,sha256=eQ96Q4NaMm0oKouBTxMFriqTp7cedFt0Zh9Wh1fLTyI,1113
184
183
  gobby/mcp_proxy/tools/orchestration/cleanup.py,sha256=YvjT-_OqORv7t7P03xlEknxyBiTu2c5MCWsRObNTKZg,28333
185
184
  gobby/mcp_proxy/tools/orchestration/monitor.py,sha256=cd5JEItJogwkV4bG_u3AFpnKbTq5pdXz2UbTmVEQ-VY,14516
@@ -188,23 +187,23 @@ gobby/mcp_proxy/tools/orchestration/review.py,sha256=vsVFZUkKhDowJKn9-iJoWLVAM8b
188
187
  gobby/mcp_proxy/tools/orchestration/utils.py,sha256=2DLwtDynWAN__SCjEMkIA0XyiLhEhzcWQfpRuaN5wko,390
189
188
  gobby/mcp_proxy/tools/orchestration/wait.py,sha256=hHj0pAVjys6Z1nXsI22mm7_lDg9TpKb4u1wZx0Sa3js,16088
190
189
  gobby/mcp_proxy/tools/sessions/__init__.py,sha256=KO0bWt_hATPieYxnjNEnu1hkk6EI2KAAGwWVqrFVfVs,424
191
- gobby/mcp_proxy/tools/sessions/_commits.py,sha256=svVle-En8LSoNDO5l2uY7rU7cvx7jeJfHx5_h5yS7KM,7811
192
- gobby/mcp_proxy/tools/sessions/_crud.py,sha256=INFVCOyu74kpERz8OVR9hzL81hN3bNNGOwB3-1p42DU,8605
190
+ gobby/mcp_proxy/tools/sessions/_commits.py,sha256=VChmD_yA3kML0oLcYeMMM4WpjRvcJXiREQJux3_5j88,8340
191
+ gobby/mcp_proxy/tools/sessions/_crud.py,sha256=8n2mxiPEGWXw3ppwoTz0pZAK67BO-IcJu-iSNs5gk9o,8645
193
192
  gobby/mcp_proxy/tools/sessions/_factory.py,sha256=kIREcGFS9MlPvM5VcgwNUfSy8WvTLiGRBxi-ewhmV1E,2205
194
- gobby/mcp_proxy/tools/sessions/_handoff.py,sha256=35muGFSGK1s2u_kc_x28iF48rLUYbwyRTyC4X5mmWEU,18604
195
- gobby/mcp_proxy/tools/sessions/_messages.py,sha256=J551sd5hS8aMkFDo6jyuUadklNjfexXW1R3G8zRtcvs,4893
193
+ gobby/mcp_proxy/tools/sessions/_handoff.py,sha256=qOFOmJZK3iKxKWJvUxN9S5hJ4gjUHBpVmcNViqaL2o4,19139
194
+ gobby/mcp_proxy/tools/sessions/_messages.py,sha256=2HYMfcDEobwAZ94juZJdOG6DYuEEF8Lz_MhZSLyS1HI,6170
196
195
  gobby/mcp_proxy/tools/skills/__init__.py,sha256=-HQZJ9LpEUVjW7B47zpCem9CBtyKpV8su4JeKqqDlaU,20939
197
196
  gobby/mcp_proxy/tools/tasks/__init__.py,sha256=2PmKHYV0dAKDGmg642dfsg-Y3fkID7k_5wvK1GHiTTU,877
198
- gobby/mcp_proxy/tools/tasks/_context.py,sha256=fnhmvMMLaSDVphabpaNhDq6UTmuwlWiaM0bzvJtwl78,3637
199
- gobby/mcp_proxy/tools/tasks/_crud.py,sha256=fY4AXVqliWW2lthx6lZg1GIEm5-MVtmzWMa9k7Ys4R4,24198
197
+ gobby/mcp_proxy/tools/tasks/_context.py,sha256=RSJARYTFOrd_diWi55gy1ZnFclO-UU-Aqytff4crHMg,4273
198
+ gobby/mcp_proxy/tools/tasks/_crud.py,sha256=WK3KI_JkBlafKEMIoAcG-znEP6CdwJkIkQ6zP5t0QZU,24538
200
199
  gobby/mcp_proxy/tools/tasks/_expansion.py,sha256=pJ055C_4FGxWJRj2D-nRwOxlcwkRjfNHiPPDbaV5sCg,12993
201
200
  gobby/mcp_proxy/tools/tasks/_factory.py,sha256=loBtSLliCJ_QXsO-cmj1fs7eloemXQVASm29uqOwm3U,6773
202
201
  gobby/mcp_proxy/tools/tasks/_helpers.py,sha256=Esv-tMB9ASGLurUd3Kgql4kDCnpV7HddB0iy05fFwPg,3219
203
- gobby/mcp_proxy/tools/tasks/_lifecycle.py,sha256=-E17x6LRo-0bwXLhqR_BHYqRjUlRQ-YJA3YV7idfMws,24231
202
+ gobby/mcp_proxy/tools/tasks/_lifecycle.py,sha256=4Kh8gs84m4wlYnAmr9w-pV-m6PSADscgbrMV7EAomK4,24968
204
203
  gobby/mcp_proxy/tools/tasks/_lifecycle_validation.py,sha256=b5je3kT2GkosuhaoviRIzKakXTuv8CSNeSYfcF1MoSg,10329
205
204
  gobby/mcp_proxy/tools/tasks/_resolution.py,sha256=8YpMvHXpwknxV_re5YtIXBpoZ7cuu24DJLu25CO9mGg,2028
206
205
  gobby/mcp_proxy/tools/tasks/_search.py,sha256=s2_LKRruY8WBbfdfsAt73xUlsPBYjcV8QBi50nXYkbU,7765
207
- gobby/mcp_proxy/tools/tasks/_session.py,sha256=XTcxdZzNDNgwmg0UG18gfgDGmvC_JXZJOB42AVGvPww,4262
206
+ gobby/mcp_proxy/tools/tasks/_session.py,sha256=PtbC7nDzxFlq6YAO74y5aQ164j4eOk9sJDgM0b9js-Y,4983
208
207
  gobby/mcp_proxy/transports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
208
  gobby/mcp_proxy/transports/base.py,sha256=e_-VJUuOCX32Jb2ZYPbQBiC4Cuv_9JSrKOHk29ZXl7U,2960
210
209
  gobby/mcp_proxy/transports/factory.py,sha256=YNM3u3-s5GBFrzyvL0EXhbh_AEstK6VUfpiIGXBvhyY,1513
@@ -212,7 +211,7 @@ gobby/mcp_proxy/transports/http.py,sha256=UxHxaRrY0IBBVz--eHtD2E_RUO87m2zJ1vuKo6
212
211
  gobby/mcp_proxy/transports/stdio.py,sha256=pp323eGtqFmaJHMD0voZmetc7tr2SW-wfHohOsGbCXc,8001
213
212
  gobby/mcp_proxy/transports/websocket.py,sha256=oLmrLx2MRvntaaxzK2NNNBf8rz_SiqBFoUcg5tD2iHM,5620
214
213
  gobby/memory/context.py,sha256=eH7aWsqy-u5SI_2xnoUQALS_3yPKcnLovEpnpPEn188,2536
215
- gobby/memory/extractor.py,sha256=E99fx-CxdaLwO6RiPwMz94XALbtsMzrzdlY8jkQ2jnw,16117
214
+ gobby/memory/extractor.py,sha256=QWtciQHdGxBHubHfdbt6CwFROCwgdqVki-wC__EiBmY,16806
216
215
  gobby/memory/manager.py,sha256=dBOQmpo1GtabQaMK_3hNpxJdKKLplxl1qrXF05O6gio,27138
217
216
  gobby/memory/protocol.py,sha256=XnvnZDM6RvAukLFKRXJ342ckvRxNlmToM0_McXGOyHI,14699
218
217
  gobby/memory/viz.py,sha256=IzSHjwhfUUvmzeJpCfdHEc92mPAg3J4jTJzwKPBNEwA,7745
@@ -243,13 +242,13 @@ gobby/search/backends/embedding.py,sha256=ndK3ZjXRzSgWmvlxmlAW8gPga3Og8HD1SMvDkg
243
242
  gobby/servers/__init__.py,sha256=QaZkdTw7rL2BoGc_bYa8uw5PBCmxBgYFWoi1_N-1BWY,201
244
243
  gobby/servers/http.py,sha256=bFsC3E-bqFRtxPs-iit763pldarDQNTmAmFLR-rLOBQ,25317
245
244
  gobby/servers/models.py,sha256=M52ok5FXus9F8dXbpAkxxRBjcQGT6Kl68mNEPwQCBsU,1305
246
- gobby/servers/websocket.py,sha256=8S7rH9zuPKT4kt0xTCHQ2nxv203arsH2d0lDxyhitg4,25363
245
+ gobby/servers/websocket.py,sha256=iIjCFmYCdEVZSdN_jKCpI95ujYKb1_XgA11fTF86rPQ,27342
247
246
  gobby/servers/routes/__init__.py,sha256=ZLBuxYPVntij_kriPdNGjpDCD9xkIcbImoz-nY3ksu0,564
248
247
  gobby/servers/routes/admin.py,sha256=eIk7Zl8nHNnPYpF7NM5G9wJ6Yja_lyE14x9AwnAeqrM,27047
249
248
  gobby/servers/routes/dependencies.py,sha256=XZb95IgqLKbLY_TmrAHIDk-UhNX_bhLiVgoDCunP7qY,3835
250
249
  gobby/servers/routes/sessions.py,sha256=jS_XFenFD0HG7n7LZ1WwIs9FeNeDolCB6u6eaSjhvdk,20764
251
250
  gobby/servers/routes/mcp/__init__.py,sha256=Q9Ocd6hlMZspEytGFNKQ2QySMMna8ZSGoPZOF3JC6vM,826
252
- gobby/servers/routes/mcp/hooks.py,sha256=-Ko41dDPW3-x7w84i9cPZnw-Hhd3oOBDuMJUop0Ve-4,4672
251
+ gobby/servers/routes/mcp/hooks.py,sha256=I8keiHlMcz5YAVW4OadxO_z-Yn2d19UxU_2lOhXUjPg,6594
253
252
  gobby/servers/routes/mcp/plugins.py,sha256=tNMjrcYWeRf_p-tGiN_vFGECAXeZMPmMQ4_YEZddJ4M,3590
254
253
  gobby/servers/routes/mcp/tools.py,sha256=wm4ESgR_WcSz8wlUcC6juxRNNpBYl3K7e2OtAf4Tyfc,2063
255
254
  gobby/servers/routes/mcp/webhooks.py,sha256=sd9jcxYQ0KBhT4wsxjh6DHmqNR13Ev1LVdFhnbae4sE,4915
@@ -259,16 +258,16 @@ gobby/servers/routes/mcp/endpoints/execution.py,sha256=hqdM__UkbLQbRzgzywnThhH6S
259
258
  gobby/servers/routes/mcp/endpoints/registry.py,sha256=xDhuZ-w4jdf6sDwWQ0nHICQXVUvbxqaHFHVKCPhA1tI,14189
260
259
  gobby/servers/routes/mcp/endpoints/server.py,sha256=9ac8zwsQ5M3CyK6-JF_cKqPrulzvAMkvVsCVnjgFlB0,9704
261
260
  gobby/sessions/__init__.py,sha256=t9Df_MQrVPDIH5xrn-Q-v0i5cWTZqdwg-tdrgdLQiVk,466
262
- gobby/sessions/analyzer.py,sha256=9euPSzV0AToy17s17hSvKPC8WBWqSSLCjd58zXIGFlw,12500
261
+ gobby/sessions/analyzer.py,sha256=-UphWGtKcJ9UQDjYgB3RyXPRfcZBN-0RV35QZwryHxM,12508
263
262
  gobby/sessions/lifecycle.py,sha256=eFWBrmyVZQ7pr29TSCJrGMedWEEv1S8XtB5d5t9HVV4,8399
264
- gobby/sessions/manager.py,sha256=qdKPgpv9skIUgPkwRk0Rjp37iUHp9q9zz8q32uoebHQ,20393
263
+ gobby/sessions/manager.py,sha256=HSakBtTZwto60Ndl8EweGp8N1Jdan2yrYvcfPPvyGM0,20871
265
264
  gobby/sessions/processor.py,sha256=QTsIJUs4bw6RfGPLGGLHFJnBkHdH0AI1euju2A9V1aU,8199
266
265
  gobby/sessions/summary.py,sha256=vi5FMVxtg3kMPbQeXWZfqBBUSoG1072bZhGgUbmjHIw,21089
267
266
  gobby/sessions/transcripts/__init__.py,sha256=f6YwRoKEIc3V4t-3UC38pBPLwNiA0qc6_1SgrbmODKQ,1103
268
267
  gobby/sessions/transcripts/base.py,sha256=4G50lA7ziv0HXu0a8ee-J4J_sfFd6YqdImFbAuG5T0k,3379
269
268
  gobby/sessions/transcripts/claude.py,sha256=-t8lalta51ri21YM7SnTDxgHfqMImI6flfhjDXWxJFY,16625
270
269
  gobby/sessions/transcripts/codex.py,sha256=aL91wlO_p6QzlcbwsjKGCFa7Mf1WgMTKa5yp4nB1dDI,4495
271
- gobby/sessions/transcripts/gemini.py,sha256=3Sxe25yRtGOKLSwF34ILiaLmxyclQrCl2T-dWnmCJkQ,6538
270
+ gobby/sessions/transcripts/gemini.py,sha256=SqGXUcpA7iApQGx5kMP4DBpprM0iC_xp_H1EVCSI9Ik,9482
272
271
  gobby/skills/__init__.py,sha256=43uNx_IpLmDqbYqS--nSW_uD_419ayI1tQY9-25OJ14,2127
273
272
  gobby/skills/loader.py,sha256=VRbycr0NUjG6f3LFbRcxLfP7JPOEQgxMmscpovBeA9U,22315
274
273
  gobby/skills/manager.py,sha256=tBfpi6oSvzDJxmPenDp3xvOfxEcSJnMuZjiITU99o3w,11272
@@ -283,17 +282,17 @@ gobby/storage/artifact_classifier.py,sha256=_adpLpA5aq9994mu60XgM4oOZ7MybHu-s9kM
283
282
  gobby/storage/artifacts.py,sha256=-oWRsjsvj4Y-h_aszLKuQRaMjXcHKndDITfeCfAI0jo,9210
284
283
  gobby/storage/clones.py,sha256=KPVYgL41XvVLsMzptwJir1nqUyyFTiHbaZ3WZ1g7Kq4,11144
285
284
  gobby/storage/compaction.py,sha256=pRPfKyO1sQuF6KZB-e_GyGZLKFLao5tabz-N7_i5drE,2333
286
- gobby/storage/database.py,sha256=t5jpBwiSA3e_OfrmJ0DXjrurZ7vqzWCqgJj3vecr__s,12504
285
+ gobby/storage/database.py,sha256=Ic734K7bnXeWD9kMpQm2ANUZzxriVp6K-Wc0HHjtpCA,12794
287
286
  gobby/storage/inter_session_messages.py,sha256=wPl78L_GsZYwpY16j47GkFc_48R0gjnmJMDYbrhrABU,5514
288
287
  gobby/storage/mcp.py,sha256=xF9TbRsXbVANfRBvngh6ipCmw7Hz8VkqKc1M2MaPJxA,23427
289
- gobby/storage/memories.py,sha256=nuZ6mXXDbrpehdqkexL_I14HHWprNVxbalm_vazAW6s,20452
288
+ gobby/storage/memories.py,sha256=P3RwRp5PuWMi9hgUJj68x_dSebZlOtOVTl90tXwKIic,20720
290
289
  gobby/storage/merge_resolutions.py,sha256=18-p49vNA4LUbff0UmyXlJO2wC3EOoJyFLYHmxjXBHY,17137
291
- gobby/storage/migrations.py,sha256=UcpEWR8sBZ8s6ezFy92idq_5iFXeDbvlNaLQKERiktA,30454
290
+ gobby/storage/migrations.py,sha256=fZpx6B3cAElyuQ0C3uQ3G-I1jIFBJ5AoN5pwan3AnC0,31214
292
291
  gobby/storage/projects.py,sha256=nDV_jyBn1h55p3T1ICV88enTPkZ7loTciQjW0yYADU8,5013
293
292
  gobby/storage/session_messages.py,sha256=jQhbZye-tCQBSPmi6H7u1WN-AQOz9CJWjC6UMHrkKmQ,8424
294
293
  gobby/storage/session_tasks.py,sha256=E7TL_7S8QTiSyZ_aiFU32NlVdHzq849utBlXTViIqrw,3236
295
- gobby/storage/sessions.py,sha256=HNQbza3WRsgVRmh6XoGHzY8ZbqsxgeMgtJpuPu8ce4k,32203
296
- gobby/storage/skills.py,sha256=MjB2KRkEvu4F1sB0vb8I_lRVy3jaBzg_BWMSClWCCJw,26265
294
+ gobby/storage/sessions.py,sha256=qBtSfy6bZJFE-N8mb23KMWCvrwnT1TvhMOFFwgr_T7c,32302
295
+ gobby/storage/skills.py,sha256=oHneRAe2gPG7EFC-MIaVJ1dEJCGbWFrBFChg1FvdRXU,28052
297
296
  gobby/storage/task_dependencies.py,sha256=y7738oMmI4a3b0AFNaHacxhK7VzDMkjSCQnbnQqgo9g,7255
298
297
  gobby/storage/workflow_audit.py,sha256=F7lza1Qz3QS_mFYgHbfgD4e-ih58C9nU_-DlxybBBpg,11713
299
298
  gobby/storage/worktrees.py,sha256=h1G7B4l2qPxcjQ-q-xhIg5CIaJGN2V92wgAKDBS2GCA,16333
@@ -326,29 +325,6 @@ gobby/tasks/validation_history.py,sha256=uOaql1DjaJfCpd0LDNJqVHuNCv8uKPDiqZAqAn7
326
325
  gobby/tasks/validation_models.py,sha256=rOzNKEIwgCusn8CRH6a7DMj37JywaBju3mAvrVVPa7I,2755
327
326
  gobby/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
328
327
  gobby/tools/summarizer.py,sha256=IUPAbp7whQoP_TeeknGrTMxWbzz-P597Zl2-EY0foQI,9186
329
- gobby/tui/__init__.py,sha256=g8Mua5f7322t8c8A1m8_yVm3j5Ii9tTwAX4fND75pQQ,140
330
- gobby/tui/api_client.py,sha256=-ewySqyGGUCPOKYMxQooKmvUSpmX2T4Pnkw0YI8nYuw,9682
331
- gobby/tui/app.py,sha256=8v7dIsVbMT069WAo8bfSAWT6CpwGEbb5Jwab3yZ36JM,10703
332
- gobby/tui/ws_client.py,sha256=-4Y5GmPrHS9E-bf0sg-DgKLTzPweps7x5QSqUhLd6M0,8995
333
- gobby/tui/screens/__init__.py,sha256=pyiFiXDzBu5U9f_geBcrNQY1Mw2PnQjIy4tc368w2Js,800
334
- gobby/tui/screens/agents.py,sha256=SC9XtmBlNBOPYhF5uBgznsuBztKB4XLB1jJ_4NvWz-w,10536
335
- gobby/tui/screens/chat.py,sha256=xQMXOKLgIzQDG9mWyeox7-q5eujYab9yNEbyUFOVPBQ,13991
336
- gobby/tui/screens/dashboard.py,sha256=WAdpMJhXEj56rauyY0psXMWofAiL-HyuZghsr5N4kIs,12079
337
- gobby/tui/screens/memory.py,sha256=5Yj733uq5f3GGoPoSbHyw5fCOBD_rXiJH4Y-K8D1Fdk,9399
338
- gobby/tui/screens/metrics.py,sha256=FkW1pfRB5GETRve2FGtkEOku8M6Aw04saWBaoWDZguU,7012
339
- gobby/tui/screens/orchestrator.py,sha256=cNyOqWjL_m1nsuwm5g9eSmdIf_ImtgTjeaBm7Ha6BDA,26973
340
- gobby/tui/screens/sessions.py,sha256=HCVqN4OCHEjLwViTh7Znhvh8b7DhqkVh1DJknaFeVfo,13307
341
- gobby/tui/screens/tasks.py,sha256=pwQsJBBTBXwKTxVstuAi49ZC7e9yY_qmZ8gLES7zJtI,14232
342
- gobby/tui/screens/workflows.py,sha256=1dsb9GtVuWWW1f2Iybz0nEKpVFJ9njPkZJ6jt36AFhQ,9175
343
- gobby/tui/screens/worktrees.py,sha256=MP8egSz5H-V15ZzhXxFp-x2P9MgD6AlweRW7fszG0xI,5377
344
- gobby/tui/widgets/__init__.py,sha256=2HwaceTJVXQ-ilhNABbqtG19cSvz6WcwEUdNH4bvX6I,651
345
- gobby/tui/widgets/chat.py,sha256=AASxv61NKBA6xnrQ8dRDIoyUY_Zcfu6nNYtV4wV2pSQ,5106
346
- gobby/tui/widgets/conductor.py,sha256=f5df0zjYjMku-buvwjNjOMKqOcs7VzncmD-4jyQjPZ0,2762
347
- gobby/tui/widgets/menu.py,sha256=4pUAfgbkjqc9PKQSUJ-pV2kJ7VCOsi1_G0eXuwZCP3E,3644
348
- gobby/tui/widgets/message_panel.py,sha256=cw_s8J8LxUpyuP4FSQHVt6__7FRB-q11mozxVxEKRsQ,4416
349
- gobby/tui/widgets/review_gate.py,sha256=a22ZHTYYdQxyNQB_e3mqYHuti0yJkt5UKr1gcfnz788,6607
350
- gobby/tui/widgets/task_tree.py,sha256=ZiSB8PImhsOz_lr8yNukZjil9A4hRz63vIvsonDU1SY,2910
351
- gobby/tui/widgets/token_budget.py,sha256=4qouo_-FEYjAvBujyrM-KdD69VtP6JzmWVml5IeaEhM,4659
352
328
  gobby/utils/__init__.py,sha256=GRlImMV99Y1_keGckfJcRqtYijxDMi5cmgEuiC-ZnKc,55
353
329
  gobby/utils/daemon_client.py,sha256=EQC85sap8lat5pTTMEYhqaqAMXPmiND8VIXjhYuzGX0,7825
354
330
  gobby/utils/git.py,sha256=zKuL0nVJItAoqO1WmYJWN7Uw4q8jYGdS3ckhWtkjfqM,6547
@@ -370,23 +346,23 @@ gobby/workflows/audit_helpers.py,sha256=kWgshrF-eyy17I59ugHC1-LUCVpzq_IP-dhfggnk
370
346
  gobby/workflows/autonomous_actions.py,sha256=F7ziXV99rQEFtvv2ClT1bC7UR5x1R6l18tiWxChOHEQ,9202
371
347
  gobby/workflows/context_actions.py,sha256=zIPbIGacyKLcfKwP0dCrq-LVMVm84gKLS6iS-P2Pjrs,17927
372
348
  gobby/workflows/definitions.py,sha256=eLb_mpquN3xmcqy6I0-_mmRrBKCxht-k2I-4of6RwmU,4343
373
- gobby/workflows/detection_helpers.py,sha256=QH_S5f5Gfb-FsGWhXhMR8oeUYnr8f-v_fhNFw7YYDXY,11508
374
- gobby/workflows/engine.py,sha256=jz8MfgO1r-fKOzeec_3RHk1Lyc2vObYPX3_ZL3k3LAM,20201
375
- gobby/workflows/evaluator.py,sha256=Ji5HgsfAaO42NgnnMz5ePb0ID0rTo0_PSeVxmVAun3w,25299
349
+ gobby/workflows/detection_helpers.py,sha256=o87W3Yc-QTYUy8it_khC0iUV_J0bFnDJ_DkCOU5z0lY,12015
350
+ gobby/workflows/engine.py,sha256=LljsFMB-XZlZEhuizKgrNSThjWVVV6rMerlNFiCt4bU,23814
351
+ gobby/workflows/evaluator.py,sha256=eIhixORAljw5BgwU9IOudW2kTcXyFo_VDBws98lHH-s,29498
376
352
  gobby/workflows/git_utils.py,sha256=Kt5fVqHn2KQYx8hQ__C_Cgqz8rf728DFGCmSTXuKfuY,6463
377
- gobby/workflows/hooks.py,sha256=461DY_4yyE8k9sb5N1jw4Fe0S7OSqoNiwuHzGMNtw30,7067
353
+ gobby/workflows/hooks.py,sha256=E8TAtK2SYGmRw7hHoM8TlNZx8NmddbXHl7XF5PyEO3U,8495
378
354
  gobby/workflows/lifecycle_evaluator.py,sha256=uGgC-xYodyK6b1Jq7Sua4HwIrwxWloHZzrqrVFiosP4,25053
379
355
  gobby/workflows/llm_actions.py,sha256=2G-LPy8vXUvZKdcqnGSrDGqxDv4HsFWhk-muianyz8I,3102
380
356
  gobby/workflows/loader.py,sha256=0Lzwr_JhYqSiIyA3gIb55sU6PhG0s12rQ9c3EsBG8Mc,13646
381
357
  gobby/workflows/mcp_actions.py,sha256=5ZzZSZDLRGKhHgJl2P5wm81UwvQjkJ8pu5caixWNY5g,2556
382
- gobby/workflows/memory_actions.py,sha256=GoCg3y7cuuv6m5G5ZY9Ap93w0iosFyJGzawnFBXVSxQ,14173
358
+ gobby/workflows/memory_actions.py,sha256=Dq9ocsaQbWzMfy1qLH2YWVB4xtiSeT34TH73-K1Yo-U,14650
383
359
  gobby/workflows/premature_stop.py,sha256=aOcJDff-C5YhkpTloZHFTtMUTqubIWDWxehTuJQeRaw,5668
384
- gobby/workflows/safe_evaluator.py,sha256=0mkMEjdimPL5vIWHmVynkBkHTvFWFB1_OtrEtM6NBz4,6667
360
+ gobby/workflows/safe_evaluator.py,sha256=6xOvYCco0C4bGkaUtsW9x4NERB1v4Pi3SNPezQbGHjo,7021
385
361
  gobby/workflows/session_actions.py,sha256=pB2pCSUwpfiTFcEj_NMXxSpvmzJj6QG_GFJfOGQMoMM,5618
386
362
  gobby/workflows/state_actions.py,sha256=K7g_zWmIdWdDi5gcW_4uEL-yLyihBbA67T0uA3at2CU,5423
387
363
  gobby/workflows/state_manager.py,sha256=tE_QXo_HB-nk6rb0MXneXhYs4o47QJondlnuAsh8QEY,4394
388
364
  gobby/workflows/stop_signal_actions.py,sha256=53m8TpwJxIsEDNal0rY5OZREkFM19LJ5o-7WwjcBEbs,6876
389
- gobby/workflows/summary_actions.py,sha256=oNw_L6vurP_ET_9Tc67EnHMU_vezeUVu09LHsU-23jA,17034
365
+ gobby/workflows/summary_actions.py,sha256=5J68Vnw3GNNxwQCYNuVd-0iRgIA4MwRcT9D30-DxJeU,19550
390
366
  gobby/workflows/task_actions.py,sha256=tM61ilG0xpahCst9Aq0373QddSDr2yiWiReh49alQuA,8496
391
367
  gobby/workflows/task_sync_actions.py,sha256=5DsvUanp8kcGckZpmezXePXfmDJlX4Qp8SMOffL2mcc,11755
392
368
  gobby/workflows/templates.py,sha256=cxHxLZQHy0qHeiyzjHpN_CwvXN4uhrRaSSK2gqq_AC4,1918
@@ -395,7 +371,7 @@ gobby/workflows/webhook.py,sha256=96HE2u7E2mKy9e5XbnDLRw3mAMNJ0mtkS2LPuYUv4ho,68
395
371
  gobby/workflows/webhook_actions.py,sha256=Ebi8BZ4eKqfW_zS5sBGuP1VrNtiw1gqhdj9iyNvOwfg,6623
396
372
  gobby/workflows/webhook_executor.py,sha256=9oxGu1WUYRCoVSwtesdhzbxqb6nkMKDLCz2JXa496Y0,13090
397
373
  gobby/workflows/enforcement/__init__.py,sha256=xW7UOoT2EHfVdDsgg6s8ReYaKFWwf69gZtIxHpiPdi0,1478
398
- gobby/workflows/enforcement/blocking.py,sha256=lMMwv_gdKKanOmA7KHIsuB_sK8d0DJD6MkORrwfW2qc,10325
374
+ gobby/workflows/enforcement/blocking.py,sha256=zNm7JHYk5EEvOj0QN47Fr5728QaR65CTu5V3PjEieAQ,10919
399
375
  gobby/workflows/enforcement/commit_policy.py,sha256=FCcRJWH8KazE2F2NRuKfWoZIaTxvhFGpas_eLOu3J74,10949
400
376
  gobby/workflows/enforcement/handlers.py,sha256=nHvFind7xr0B2xS3H0oqXwCoZZlA98ccfNL05OZ9hGg,8743
401
377
  gobby/workflows/enforcement/task_policy.py,sha256=9NDG6S5HtlCPkOF24KFz656Bhcd9UhBhvZv-x9RMboU,22292
@@ -404,9 +380,9 @@ gobby/worktrees/git.py,sha256=qkd589nUx0s0ZIcmD9JDeiPfAaa-kksuXbEMvHrqBm0,23456
404
380
  gobby/worktrees/merge/__init__.py,sha256=MSL_S4IXWmEdGOd5owgYTyQ8JdpM9GstUhDemWESFdA,471
405
381
  gobby/worktrees/merge/conflict_parser.py,sha256=b0d8J98OOn8Tuq4uvFP8Ze4HAGNS_zsf-Y-u4t5uPdM,5660
406
382
  gobby/worktrees/merge/resolver.py,sha256=kRtixWOrbwqzFfwMMc1H9jQAa8EvWq4wXEoEtQHhVm4,17041
407
- gobby-0.2.7.dist-info/licenses/LICENSE.md,sha256=OXz1KVKRLQB1BigqLwwSYiemL6gB9vKr63ddV5LGiFE,9867
408
- gobby-0.2.7.dist-info/METADATA,sha256=51gMylY4X5wHsM2bfb_LClj8f-P9DseIv_2FvFwDM0Q,14138
409
- gobby-0.2.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
410
- gobby-0.2.7.dist-info/entry_points.txt,sha256=XHhzeXTKGGTCiazxtWQ05XDajAU4RRoCGxqr4gAWfp0,40
411
- gobby-0.2.7.dist-info/top_level.txt,sha256=BMSZ-0OdJVLH2xLypOmmVrl17G9TGI6RqKFZWxd6MCg,6
412
- gobby-0.2.7.dist-info/RECORD,,
383
+ gobby-0.2.8.dist-info/licenses/LICENSE.md,sha256=OXz1KVKRLQB1BigqLwwSYiemL6gB9vKr63ddV5LGiFE,9867
384
+ gobby-0.2.8.dist-info/METADATA,sha256=UMgAME1mFeEOThSPl0itOEy7exEdNSvC86qPT45H3gc,14138
385
+ gobby-0.2.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
386
+ gobby-0.2.8.dist-info/entry_points.txt,sha256=XHhzeXTKGGTCiazxtWQ05XDajAU4RRoCGxqr4gAWfp0,40
387
+ gobby-0.2.8.dist-info/top_level.txt,sha256=BMSZ-0OdJVLH2xLypOmmVrl17G9TGI6RqKFZWxd6MCg,6
388
+ gobby-0.2.8.dist-info/RECORD,,
gobby/cli/tui.py DELETED
@@ -1,34 +0,0 @@
1
- """TUI command for launching the Gobby dashboard."""
2
-
3
- import click
4
-
5
-
6
- @click.command()
7
- @click.option(
8
- "--port",
9
- "-p",
10
- default=60887,
11
- help="Daemon HTTP port",
12
- show_default=True,
13
- )
14
- @click.option(
15
- "--ws-port",
16
- "-w",
17
- default=60888,
18
- help="Daemon WebSocket port",
19
- show_default=True,
20
- )
21
- def ui(port: int, ws_port: int) -> None:
22
- """Launch the Gobby TUI dashboard.
23
-
24
- The TUI provides a terminal-based interface for monitoring and managing
25
- Gobby sessions, tasks, agents, and more.
26
-
27
- Requires the Gobby daemon to be running (gobby start).
28
- """
29
- from gobby.tui.app import run_tui
30
-
31
- daemon_url = f"http://localhost:{port}"
32
- ws_url = f"ws://localhost:{ws_port}"
33
-
34
- run_tui(daemon_url=daemon_url, ws_url=ws_url)
gobby/tui/__init__.py DELETED
@@ -1,5 +0,0 @@
1
- """Gobby TUI - Textual-based dashboard for Gobby daemon."""
2
-
3
- from gobby.tui.app import GobbyApp, run_tui
4
-
5
- __all__ = ["GobbyApp", "run_tui"]