brindle 0.5.0__tar.gz → 0.5.2__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 (199) hide show
  1. {brindle-0.5.0 → brindle-0.5.2}/PKG-INFO +5 -2
  2. {brindle-0.5.0 → brindle-0.5.2}/README.md +4 -1
  3. {brindle-0.5.0 → brindle-0.5.2}/pyproject.toml +2 -2
  4. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/__main__.py +2 -2
  5. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/agents.py +249 -76
  6. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/autopilot.py +15 -13
  7. brindle-0.5.2/src/brindle/builtin_agents/developer-codex.md +9 -0
  8. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/reviewer-codex.md +3 -1
  9. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/reviewer.md +1 -1
  10. brindle-0.5.2/src/brindle/bus.py +149 -0
  11. brindle-0.5.2/src/brindle/check_scope.py +317 -0
  12. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/cli.py +26 -12
  13. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/codemap.py +99 -58
  14. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/codex_hook.py +20 -2
  15. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/company_login.py +3 -1
  16. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/config.py +91 -16
  17. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/cull.py +13 -12
  18. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/api-schema.json +105 -1
  19. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/events.py +4 -0
  20. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/holds.py +144 -17
  21. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/routes_actions.py +77 -14
  22. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/routes_read.py +78 -18
  23. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/db.py +83 -6
  24. brindle-0.5.2/src/brindle/entry.py +25 -0
  25. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/gates.py +94 -20
  26. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/git.py +7 -2
  27. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/keystore.py +24 -1
  28. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/mcp_server.py +13 -1
  29. brindle-0.5.2/src/brindle/permission_asks.py +184 -0
  30. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/permission_grants.py +7 -3
  31. brindle-0.5.2/src/brindle/permission_groups.py +458 -0
  32. brindle-0.5.2/src/brindle/permission_routing.py +167 -0
  33. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/permissions.py +975 -35
  34. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pipeline.py +42 -27
  35. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/policy.py +7 -4
  36. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/_files.py +11 -6
  37. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/license.py +196 -6
  38. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/profiles.py +18 -0
  39. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/prompt_answer.py +22 -0
  40. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/provider_homes.py +35 -0
  41. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/providers.py +37 -1
  42. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/providers_install.py +28 -0
  43. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/quota.py +6 -2
  44. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/dto.py +17 -3
  45. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/inbox.py +13 -6
  46. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/permissions.py +5 -2
  47. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/routing.py +6 -3
  48. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/watch.py +8 -1
  49. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/worker_models.py +30 -13
  50. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/workspaces.py +28 -15
  51. brindle-0.5.0/src/brindle/builtin_agents/developer-codex.md +0 -6
  52. brindle-0.5.0/src/brindle/bus.py +0 -75
  53. {brindle-0.5.0 → brindle-0.5.2}/.gitignore +0 -0
  54. {brindle-0.5.0 → brindle-0.5.2}/LICENSE +0 -0
  55. {brindle-0.5.0 → brindle-0.5.2}/SCHEDULE-A +0 -0
  56. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/__init__.py +0 -0
  57. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/account.py +0 -0
  58. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/airgap.py +0 -0
  59. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/antigravity.py +0 -0
  60. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/assembler.py +0 -0
  61. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/assets/braid_dark.png +0 -0
  62. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/assets/braid_light.png +0 -0
  63. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/budget.py +0 -0
  64. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/__init__.py +0 -0
  65. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/backend-auditor.md +0 -0
  66. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/coordinator.md +0 -0
  67. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-fable.md +0 -0
  68. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-gemini.md +0 -0
  69. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-heavy.md +0 -0
  70. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-light.md +0 -0
  71. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-local.md +0 -0
  72. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-opencode.md +0 -0
  73. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer-sonnet.md +0 -0
  74. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/developer.md +0 -0
  75. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/qa.md +0 -0
  76. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/reviewer-gemini.md +0 -0
  77. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/reviewer-local.md +0 -0
  78. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/reviewer-opencode.md +0 -0
  79. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/subagent.md +0 -0
  80. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_agents/supervisor.md +0 -0
  81. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_rules/__init__.py +0 -0
  82. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_rules/security/backend.md +0 -0
  83. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_rules/style/minimal-diff.md +0 -0
  84. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/builtin_rules/tests/only.md +0 -0
  85. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/ci_adapters.py +0 -0
  86. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/ci_client.py +0 -0
  87. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/ci_federation.py +0 -0
  88. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/ci_hosts.py +0 -0
  89. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/clone.py +0 -0
  90. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/cloud_credential.py +0 -0
  91. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/cloud_login.py +0 -0
  92. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/codemap_docs.py +0 -0
  93. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/company_identity.py +0 -0
  94. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/conflicts.py +0 -0
  95. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/coordinator.py +0 -0
  96. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/cost.py +0 -0
  97. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/cost_estimate.py +0 -0
  98. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/__init__.py +0 -0
  99. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/app.py +0 -0
  100. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/auth.py +0 -0
  101. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/lifecycle.py +0 -0
  102. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/peer.py +0 -0
  103. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/routes_org_permissions.py +0 -0
  104. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/schema.py +0 -0
  105. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/session_review.py +0 -0
  106. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/daemon/terminal.py +0 -0
  107. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/debuglog.py +0 -0
  108. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/demo.py +0 -0
  109. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/detect.py +0 -0
  110. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/doctor.py +0 -0
  111. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/escapes.py +0 -0
  112. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/events.py +0 -0
  113. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/guardrails.py +0 -0
  114. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/history.py +0 -0
  115. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/identity_lock.py +0 -0
  116. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/inbox.py +0 -0
  117. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/kb.py +0 -0
  118. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/key_check.py +0 -0
  119. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/keys_cmds.py +0 -0
  120. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/knowledge.py +0 -0
  121. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/launch_health.py +0 -0
  122. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/learned_rules.py +0 -0
  123. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/learning.py +0 -0
  124. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/legacy.py +0 -0
  125. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/local_setup.py +0 -0
  126. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/login_pause.py +0 -0
  127. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/model_access.py +0 -0
  128. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/model_availability.py +0 -0
  129. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/__init__.py +0 -0
  130. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/catalog.py +0 -0
  131. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/client.py +0 -0
  132. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/loop.py +0 -0
  133. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/lsp.py +0 -0
  134. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/permissions.py +0 -0
  135. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/runner.py +0 -0
  136. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/serve.py +0 -0
  137. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/native/tools.py +0 -0
  138. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/opencode.py +0 -0
  139. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/org_permissions.py +0 -0
  140. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pane_auth.py +0 -0
  141. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/picker.py +0 -0
  142. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/plugins.py +0 -0
  143. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pool.py +0 -0
  144. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/preflight.py +0 -0
  145. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pricing.py +0 -0
  146. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/__init__.py +0 -0
  147. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/account.py +0 -0
  148. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/audit_chain.py +0 -0
  149. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/audit_export.py +0 -0
  150. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/auth.py +0 -0
  151. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/brief_learning.py +0 -0
  152. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/cost_centers.py +0 -0
  153. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/credentials.py +0 -0
  154. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/features.py +0 -0
  155. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/keys.py +0 -0
  156. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/learning.py +0 -0
  157. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/loopback.py +0 -0
  158. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/managed_models.py +0 -0
  159. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/org_profiles.py +0 -0
  160. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/orgkey.py +0 -0
  161. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/rollout.py +0 -0
  162. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/route_health.py +0 -0
  163. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/settings_sync.py +0 -0
  164. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/status.py +0 -0
  165. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/team_events.py +0 -0
  166. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/pro/team_policy.py +0 -0
  167. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/procs.py +0 -0
  168. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/repo_cmds.py +0 -0
  169. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/repos.py +0 -0
  170. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/rewind.py +0 -0
  171. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/rule_checks.py +0 -0
  172. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/savings.py +0 -0
  173. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/scratch.py +0 -0
  174. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/secrets.py +0 -0
  175. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/self_serve.py +0 -0
  176. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/__init__.py +0 -0
  177. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/errors.py +0 -0
  178. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/service/sessions.py +0 -0
  179. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/services.py +0 -0
  180. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/sessions.py +0 -0
  181. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/sidebar_follow.py +0 -0
  182. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/sidebar_logo.py +0 -0
  183. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/signin_pause.py +0 -0
  184. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/status_cache.py +0 -0
  185. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/tasks.py +0 -0
  186. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/tmux.py +0 -0
  187. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/updates.py +0 -0
  188. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/upgrade.py +0 -0
  189. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/usage.py +0 -0
  190. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/view.py +0 -0
  191. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/wake.py +0 -0
  192. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/watch_costs.py +0 -0
  193. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/__init__.py +0 -0
  194. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/chat.py +0 -0
  195. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/dashboard.py +0 -0
  196. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/diff.py +0 -0
  197. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/server.py +0 -0
  198. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/static/app.js +0 -0
  199. {brindle-0.5.0 → brindle-0.5.2}/src/brindle/web/static/index.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brindle
3
- Version: 0.5.0
3
+ Version: 0.5.2
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
@@ -473,6 +473,7 @@ knowing them helps when you tell the supervisor how to work.
473
473
  | `report_result` | worker | finish a task and hand back the result |
474
474
  | `submit_plan` | worker | a `plan_first` worker proposes its plan and waits for approval before editing |
475
475
  | `approve_plan` | supervisor | approve a worker's plan, or send it back with feedback (`approved=false`) |
476
+ | `answer_permission` | supervisor | allow, deny or escalate (with a reason) a worker's permission ask before the person sees it |
476
477
  | `complete_subagent` | supervisor | record the result of a `subagent`-profile task |
477
478
  | `set_goal` / `get_progress` / `check_milestone` | supervisor | autopilot's goal, its progress, and running the checks |
478
479
  | `record_audit_decision` | supervisor | record acceptance of an audit finding with rationale so subsequent audits respect it |
@@ -672,7 +673,8 @@ Autopilot, merge gates and cleanup:
672
673
  | `autopilot` | `true` | start the supervisor with autopilot on |
673
674
  | `claude_permission_mode` | `"default"` | the `--permission-mode` for Claude Code sessions whose profile sets no `permission_mode`; the default holds permission requests for the brindle app, set `"auto"` to opt into auto mode. Only read from `~/.brindle/config.json` |
674
675
  | `auto_update` | `false` | run `uv tool upgrade brindle` in the background at session start when PyPI has a newer version; restart to use it. Can also be set in `~/.brindle/config.json` for every repo |
675
- | `checks` | `[]` | commands that must pass in a worker's branch before it merges |
676
+ | `scoped_checks` | unset (acts as `"off"`) | `"infer"` narrows a bare pytest check (`pytest ...`, `python -m pytest ...`, `uv run pytest ...`, options only) on a worker's branch to the tests `graphify affected` reaches plus the touched test files, when the repo has a stored graph; it runs in full when the mapping fails or `conftest.py`, `pyproject.toml`, `setup.cfg`, `pytest.ini`, `tox.ini` or a lockfile changed. A pytest command that already names test paths (`pytest tests/`) and every other command always run in full. `"off"` narrows nothing. It becomes the default next release; until you set it, brindle tells you once |
677
+ | `checks` | `[]` | commands (plain strings) that must pass in a worker's branch before it merges. On a worker's branch every check also gets `BRINDLE_CHANGED_FILES` (the files changed since the branch left its base, one repo-relative path per line) so a script can narrow itself; the supervisor's checkout always runs every check in full (see `scoped_checks` and `brindle/check_scope.py`) |
676
678
  | `review` | only under autopilot | require a reviewer's approval before merging |
677
679
  | `reviewer` | `"reviewer"` | the agent profile that reviews (a Codex profile gives a second model's view) |
678
680
  | `review_profile` | none | force `request_review`'s profile, skipping its automatic cross-model pick (see below) |
@@ -692,6 +694,7 @@ Autopilot, merge gates and cleanup:
692
694
  | `merge_into` | none | branch that worker branches are cut from and merge into, whatever branch the supervisor is on |
693
695
  | `auto_merge_default_branch` | `false` | let the pipeline merge into the repo's default branch (origin HEAD, else `main`/`master`) on its own; by default it sends a "needs you" message instead, and you run `merge_workspace` yourself (manual merges are never gated) |
694
696
  | `permission_policy` | `"on"` with a Pro license, else `"off"` | `"on"`: brindle answers workers' permission requests from its rules (see "Permission policy" below); `"off"`: the provider's own prompts and permission mode decide, except Antigravity workers under `agy_approvals: "brindle"`, whose hook still enforces the rules. The only permission switch: a leftover `permission_essentials` key is ignored |
697
+ | `permission_supervisor_hold_seconds` | `120` | with `permission_policy` on, how long a Claude Code or Codex worker's ask waits on its supervisor (`answer_permission`) before you see it; asks a person-only rule makes (pushes into the default or a release branch) come straight to you |
695
698
  | `agy_approvals` | unset | `"brindle"`: Antigravity agents run without approval prompts and brindle's hook allows or denies every call, applying the profile's `allowed_tools` (see "Antigravity" under "Permission policy"); `"prompt"`: agy asks as usual. Unset, workers get `"brindle"` and interactive agy sessions `"prompt"` |
696
699
  | `rules` | `[]` | standing rules for the supervisor, e.g. `["Fix review findings without asking", "Validate options before offering them"]`; added to every supervisor's brief. Rules in `~/.brindle/config.json`, the repo's config and `config.local.json` are all kept, so a team's rules and your own add up |
697
700
  | `plan_first` | `false` | workers propose a plan (`submit_plan`) and wait for `approve_plan` before editing |
@@ -441,6 +441,7 @@ knowing them helps when you tell the supervisor how to work.
441
441
  | `report_result` | worker | finish a task and hand back the result |
442
442
  | `submit_plan` | worker | a `plan_first` worker proposes its plan and waits for approval before editing |
443
443
  | `approve_plan` | supervisor | approve a worker's plan, or send it back with feedback (`approved=false`) |
444
+ | `answer_permission` | supervisor | allow, deny or escalate (with a reason) a worker's permission ask before the person sees it |
444
445
  | `complete_subagent` | supervisor | record the result of a `subagent`-profile task |
445
446
  | `set_goal` / `get_progress` / `check_milestone` | supervisor | autopilot's goal, its progress, and running the checks |
446
447
  | `record_audit_decision` | supervisor | record acceptance of an audit finding with rationale so subsequent audits respect it |
@@ -640,7 +641,8 @@ Autopilot, merge gates and cleanup:
640
641
  | `autopilot` | `true` | start the supervisor with autopilot on |
641
642
  | `claude_permission_mode` | `"default"` | the `--permission-mode` for Claude Code sessions whose profile sets no `permission_mode`; the default holds permission requests for the brindle app, set `"auto"` to opt into auto mode. Only read from `~/.brindle/config.json` |
642
643
  | `auto_update` | `false` | run `uv tool upgrade brindle` in the background at session start when PyPI has a newer version; restart to use it. Can also be set in `~/.brindle/config.json` for every repo |
643
- | `checks` | `[]` | commands that must pass in a worker's branch before it merges |
644
+ | `scoped_checks` | unset (acts as `"off"`) | `"infer"` narrows a bare pytest check (`pytest ...`, `python -m pytest ...`, `uv run pytest ...`, options only) on a worker's branch to the tests `graphify affected` reaches plus the touched test files, when the repo has a stored graph; it runs in full when the mapping fails or `conftest.py`, `pyproject.toml`, `setup.cfg`, `pytest.ini`, `tox.ini` or a lockfile changed. A pytest command that already names test paths (`pytest tests/`) and every other command always run in full. `"off"` narrows nothing. It becomes the default next release; until you set it, brindle tells you once |
645
+ | `checks` | `[]` | commands (plain strings) that must pass in a worker's branch before it merges. On a worker's branch every check also gets `BRINDLE_CHANGED_FILES` (the files changed since the branch left its base, one repo-relative path per line) so a script can narrow itself; the supervisor's checkout always runs every check in full (see `scoped_checks` and `brindle/check_scope.py`) |
644
646
  | `review` | only under autopilot | require a reviewer's approval before merging |
645
647
  | `reviewer` | `"reviewer"` | the agent profile that reviews (a Codex profile gives a second model's view) |
646
648
  | `review_profile` | none | force `request_review`'s profile, skipping its automatic cross-model pick (see below) |
@@ -660,6 +662,7 @@ Autopilot, merge gates and cleanup:
660
662
  | `merge_into` | none | branch that worker branches are cut from and merge into, whatever branch the supervisor is on |
661
663
  | `auto_merge_default_branch` | `false` | let the pipeline merge into the repo's default branch (origin HEAD, else `main`/`master`) on its own; by default it sends a "needs you" message instead, and you run `merge_workspace` yourself (manual merges are never gated) |
662
664
  | `permission_policy` | `"on"` with a Pro license, else `"off"` | `"on"`: brindle answers workers' permission requests from its rules (see "Permission policy" below); `"off"`: the provider's own prompts and permission mode decide, except Antigravity workers under `agy_approvals: "brindle"`, whose hook still enforces the rules. The only permission switch: a leftover `permission_essentials` key is ignored |
665
+ | `permission_supervisor_hold_seconds` | `120` | with `permission_policy` on, how long a Claude Code or Codex worker's ask waits on its supervisor (`answer_permission`) before you see it; asks a person-only rule makes (pushes into the default or a release branch) come straight to you |
663
666
  | `agy_approvals` | unset | `"brindle"`: Antigravity agents run without approval prompts and brindle's hook allows or denies every call, applying the profile's `allowed_tools` (see "Antigravity" under "Permission policy"); `"prompt"`: agy asks as usual. Unset, workers get `"brindle"` and interactive agy sessions `"prompt"` |
664
667
  | `rules` | `[]` | standing rules for the supervisor, e.g. `["Fix review findings without asking", "Validate options before offering them"]`; added to every supervisor's brief. Rules in `~/.brindle/config.json`, the repo's config and `config.local.json` are all kept, so a team's rules and your own add up |
665
668
  | `plan_first` | `false` | workers propose a plan (`submit_plan`) and wait for `approve_plan` before editing |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "brindle"
3
- version = "0.5.0"
3
+ version = "0.5.2"
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"
@@ -36,7 +36,7 @@ Changelog = "https://pawdelta.com/brindle/changelog"
36
36
  Support = "https://pawdelta.com/brindle/docs/faq"
37
37
 
38
38
  [project.scripts]
39
- brindle = "brindle.cli:app"
39
+ brindle = "brindle.entry:main"
40
40
 
41
41
  # brindle Pro and Team (src/brindle/pro): inert without a verified entitlement.
42
42
  [project.entry-points."brindle.account"]
@@ -15,6 +15,6 @@ if len(sys.argv) >= 3 and sys.argv[1] == "_sidebar-follow":
15
15
  pass
16
16
  raise SystemExit(0)
17
17
 
18
- from brindle.cli import app
18
+ from brindle.entry import main
19
19
 
20
- app()
20
+ main()