brindle 0.4.0__tar.gz → 0.4.1__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 (149) hide show
  1. {brindle-0.4.0 → brindle-0.4.1}/PKG-INFO +2 -2
  2. {brindle-0.4.0 → brindle-0.4.1}/README.md +1 -1
  3. {brindle-0.4.0 → brindle-0.4.1}/pyproject.toml +1 -1
  4. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/sessions.py +8 -9
  5. {brindle-0.4.0 → brindle-0.4.1}/.gitignore +0 -0
  6. {brindle-0.4.0 → brindle-0.4.1}/LICENSE +0 -0
  7. {brindle-0.4.0 → brindle-0.4.1}/SCHEDULE-A +0 -0
  8. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/__init__.py +0 -0
  9. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/__main__.py +0 -0
  10. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/account.py +0 -0
  11. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/agents.py +0 -0
  12. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/airgap.py +0 -0
  13. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/antigravity.py +0 -0
  14. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/assembler.py +0 -0
  15. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/assets/braid_dark.png +0 -0
  16. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/assets/braid_light.png +0 -0
  17. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/autopilot.py +0 -0
  18. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/budget.py +0 -0
  19. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/__init__.py +0 -0
  20. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/backend-auditor.md +0 -0
  21. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/coordinator.md +0 -0
  22. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer-codex.md +0 -0
  23. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer-fable.md +0 -0
  24. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer-gemini.md +0 -0
  25. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer-heavy.md +0 -0
  26. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer-light.md +0 -0
  27. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer-local.md +0 -0
  28. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/developer.md +0 -0
  29. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/qa.md +0 -0
  30. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/reviewer-codex.md +0 -0
  31. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/reviewer-gemini.md +0 -0
  32. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/reviewer-local.md +0 -0
  33. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/reviewer.md +0 -0
  34. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/subagent.md +0 -0
  35. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_agents/supervisor.md +0 -0
  36. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_rules/__init__.py +0 -0
  37. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_rules/security/backend.md +0 -0
  38. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_rules/style/minimal-diff.md +0 -0
  39. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/builtin_rules/tests/only.md +0 -0
  40. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/ci_adapters.py +0 -0
  41. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/ci_client.py +0 -0
  42. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/ci_federation.py +0 -0
  43. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/ci_hosts.py +0 -0
  44. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/cli.py +0 -0
  45. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/cloud_credential.py +0 -0
  46. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/cloud_login.py +0 -0
  47. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/codemap.py +0 -0
  48. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/codemap_docs.py +0 -0
  49. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/codex_hook.py +0 -0
  50. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/company_identity.py +0 -0
  51. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/company_login.py +0 -0
  52. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/config.py +0 -0
  53. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/conflicts.py +0 -0
  54. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/coordinator.py +0 -0
  55. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/cost.py +0 -0
  56. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/cost_estimate.py +0 -0
  57. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/cull.py +0 -0
  58. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/db.py +0 -0
  59. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/demo.py +0 -0
  60. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/detect.py +0 -0
  61. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/doctor.py +0 -0
  62. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/escapes.py +0 -0
  63. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/events.py +0 -0
  64. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/gates.py +0 -0
  65. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/git.py +0 -0
  66. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/guardrails.py +0 -0
  67. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/history.py +0 -0
  68. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/identity_lock.py +0 -0
  69. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/inbox.py +0 -0
  70. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/kb.py +0 -0
  71. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/key_check.py +0 -0
  72. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/keys_cmds.py +0 -0
  73. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/keystore.py +0 -0
  74. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/knowledge.py +0 -0
  75. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/launch_health.py +0 -0
  76. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/learned_rules.py +0 -0
  77. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/learning.py +0 -0
  78. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/legacy.py +0 -0
  79. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/local_setup.py +0 -0
  80. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/login_pause.py +0 -0
  81. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/mcp_server.py +0 -0
  82. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/model_access.py +0 -0
  83. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/model_availability.py +0 -0
  84. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/__init__.py +0 -0
  85. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/client.py +0 -0
  86. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/loop.py +0 -0
  87. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/permissions.py +0 -0
  88. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/runner.py +0 -0
  89. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/serve.py +0 -0
  90. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/native/tools.py +0 -0
  91. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pane_auth.py +0 -0
  92. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/permissions.py +0 -0
  93. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/picker.py +0 -0
  94. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pipeline.py +0 -0
  95. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/plugins.py +0 -0
  96. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/policy.py +0 -0
  97. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pool.py +0 -0
  98. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pricing.py +0 -0
  99. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/__init__.py +0 -0
  100. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/_files.py +0 -0
  101. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/account.py +0 -0
  102. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/audit_chain.py +0 -0
  103. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/audit_export.py +0 -0
  104. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/auth.py +0 -0
  105. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/brief_learning.py +0 -0
  106. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/cost_centers.py +0 -0
  107. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/credentials.py +0 -0
  108. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/features.py +0 -0
  109. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/keys.py +0 -0
  110. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/learning.py +0 -0
  111. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/license.py +0 -0
  112. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/loopback.py +0 -0
  113. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/managed_models.py +0 -0
  114. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/org_profiles.py +0 -0
  115. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/orgkey.py +0 -0
  116. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/rollout.py +0 -0
  117. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/route_health.py +0 -0
  118. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/settings_sync.py +0 -0
  119. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/status.py +0 -0
  120. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/team_events.py +0 -0
  121. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/pro/team_policy.py +0 -0
  122. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/procs.py +0 -0
  123. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/profiles.py +0 -0
  124. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/prompt_answer.py +0 -0
  125. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/providers.py +0 -0
  126. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/quota.py +0 -0
  127. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/repo_cmds.py +0 -0
  128. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/repos.py +0 -0
  129. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/rewind.py +0 -0
  130. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/rule_checks.py +0 -0
  131. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/savings.py +0 -0
  132. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/scratch.py +0 -0
  133. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/secrets.py +0 -0
  134. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/self_serve.py +0 -0
  135. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/services.py +0 -0
  136. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/sidebar_follow.py +0 -0
  137. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/sidebar_logo.py +0 -0
  138. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/signin_pause.py +0 -0
  139. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/status_cache.py +0 -0
  140. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/tasks.py +0 -0
  141. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/tmux.py +0 -0
  142. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/updates.py +0 -0
  143. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/upgrade.py +0 -0
  144. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/usage.py +0 -0
  145. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/view.py +0 -0
  146. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/watch.py +0 -0
  147. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/watch_costs.py +0 -0
  148. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/worker_models.py +0 -0
  149. {brindle-0.4.0 → brindle-0.4.1}/src/brindle/workspaces.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brindle
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Run coding agents in parallel, each on its own git branch, with a supervisor that delegates, reviews, and merges
5
5
  Project-URL: Homepage, https://pawdelta.com/brindle/
6
6
  Project-URL: Documentation, https://pawdelta.com/brindle/docs/recommended-use
@@ -94,7 +94,7 @@ uv tool install --editable ~/Projects/brindle # or from a local checkout
94
94
  brindle drives Claude Code, so you need that too (`npm install -g @anthropic-ai/claude-code`).
95
95
 
96
96
  `brindle --version` prints the installed version; the tmux status bar of every brindle
97
- session shows it too (`brindle 0.4.0`). A session started before an upgrade keeps
97
+ session shows it too (`brindle 0.4.1`). A session started before an upgrade keeps
98
98
  running the old code, and shows the old number, until you restart it.
99
99
 
100
100
  ## Quick start
@@ -63,7 +63,7 @@ uv tool install --editable ~/Projects/brindle # or from a local checkout
63
63
  brindle drives Claude Code, so you need that too (`npm install -g @anthropic-ai/claude-code`).
64
64
 
65
65
  `brindle --version` prints the installed version; the tmux status bar of every brindle
66
- session shows it too (`brindle 0.4.0`). A session started before an upgrade keeps
66
+ session shows it too (`brindle 0.4.1`). A session started before an upgrade keeps
67
67
  running the old code, and shows the old number, until you restart it.
68
68
 
69
69
  ## Quick start
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "brindle"
3
- version = "0.4.0"
3
+ version = "0.4.1"
4
4
  description = "Run coding agents in parallel, each on its own git branch, with a supervisor that delegates, reviews, and merges"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -189,9 +189,9 @@ def _repoint_orphaned_tasks(db: DB, root_id: str) -> None:
189
189
 
190
190
 
191
191
  def _forget(db: DB, s: Session) -> None:
192
- """Drop a session: its records, and any of its workers' worktrees that are
193
- clean and not used by anything else. Branches and dirty worktrees stay."""
194
- worker_workspaces = {}
192
+ """Drop a session: its records, and any of its worktrees that are clean and
193
+ not used by anything else. Branches and dirty worktrees stay."""
194
+ worktrees = {}
195
195
  panes = tmux.list_panes()
196
196
  owners = agents.pane_owners(db, panes)
197
197
  for a in s.members:
@@ -205,18 +205,17 @@ def _forget(db: DB, s: Session) -> None:
205
205
  if (a.tmux_window and agents.same_server(a, panes) and agents.is_alive(a, panes)
206
206
  and agents.owns_pane(db, a, owners)):
207
207
  tmux.kill_window(a.tmux_window)
208
- if a.id != s.root.id:
209
- ws = db.get_workspace(a.workspace_id)
210
- if ws and ws.kind == "worktree":
211
- worker_workspaces[ws.id] = ws
208
+ ws = db.get_workspace(a.workspace_id)
209
+ if ws and ws.kind == "worktree":
210
+ worktrees[ws.id] = ws
212
211
  member_ids = {a.id for a in s.members}
213
- for ws in worker_workspaces.values():
212
+ for ws in worktrees.values():
214
213
  if any(a.id not in member_ids for a in db.list_agents(ws.id)):
215
214
  continue # someone else still works here
216
215
  if os.path.isdir(ws.path) and git.dirty_files(ws.path):
217
216
  continue # uncommitted work: keep it, quietly
218
217
  try:
219
- workspaces.remove(db, ws, force=False)
218
+ workspaces.remove(db, ws, force=False, delete_branch=False)
220
219
  except (workspaces.WorkspaceError, git.GitError):
221
220
  pass
222
221
  if not history.archive(db, None, [a for a in s.members if db.get_agent(a.id)],
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes