brindle 0.0.1__tar.gz → 0.0.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 (84) hide show
  1. {brindle-0.0.1 → brindle-0.0.2}/PKG-INFO +1 -1
  2. {brindle-0.0.1 → brindle-0.0.2}/pyproject.toml +1 -1
  3. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/watch.py +26 -10
  4. {brindle-0.0.1 → brindle-0.0.2}/.gitignore +0 -0
  5. {brindle-0.0.1 → brindle-0.0.2}/LICENSE +0 -0
  6. {brindle-0.0.1 → brindle-0.0.2}/README.md +0 -0
  7. {brindle-0.0.1 → brindle-0.0.2}/SCHEDULE-A +0 -0
  8. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/__init__.py +0 -0
  9. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/__main__.py +0 -0
  10. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/account.py +0 -0
  11. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/agents.py +0 -0
  12. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/airgap.py +0 -0
  13. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/antigravity.py +0 -0
  14. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/autopilot.py +0 -0
  15. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/__init__.py +0 -0
  16. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/developer-codex.md +0 -0
  17. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/developer-heavy.md +0 -0
  18. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/developer-local.md +0 -0
  19. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/developer.md +0 -0
  20. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/reviewer-codex.md +0 -0
  21. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/reviewer-local.md +0 -0
  22. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/reviewer.md +0 -0
  23. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/subagent.md +0 -0
  24. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/builtin_agents/supervisor.md +0 -0
  25. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/ci.py +0 -0
  26. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/cli.py +0 -0
  27. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/codemap.py +0 -0
  28. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/codex_hook.py +0 -0
  29. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/config.py +0 -0
  30. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/cull.py +0 -0
  31. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/db.py +0 -0
  32. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/demo.py +0 -0
  33. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/detect.py +0 -0
  34. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/doctor.py +0 -0
  35. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/events.py +0 -0
  36. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/gates.py +0 -0
  37. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/git.py +0 -0
  38. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/history.py +0 -0
  39. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/inbox.py +0 -0
  40. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/learning.py +0 -0
  41. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/legacy.py +0 -0
  42. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/mcp_server.py +0 -0
  43. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/__init__.py +0 -0
  44. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/client.py +0 -0
  45. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/loop.py +0 -0
  46. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/permissions.py +0 -0
  47. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/runner.py +0 -0
  48. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/serve.py +0 -0
  49. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/native/tools.py +0 -0
  50. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/permissions.py +0 -0
  51. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pipeline.py +0 -0
  52. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/plugins.py +0 -0
  53. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/policy.py +0 -0
  54. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pool.py +0 -0
  55. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/__init__.py +0 -0
  56. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/_files.py +0 -0
  57. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/account.py +0 -0
  58. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/audit_chain.py +0 -0
  59. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/auth.py +0 -0
  60. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/credentials.py +0 -0
  61. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/features.py +0 -0
  62. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/keys.py +0 -0
  63. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/learning.py +0 -0
  64. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/license.py +0 -0
  65. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/loopback.py +0 -0
  66. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/orgkey.py +0 -0
  67. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/settings_sync.py +0 -0
  68. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/team_events.py +0 -0
  69. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/pro/team_policy.py +0 -0
  70. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/procs.py +0 -0
  71. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/profiles.py +0 -0
  72. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/providers.py +0 -0
  73. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/quota.py +0 -0
  74. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/savings.py +0 -0
  75. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/scratch.py +0 -0
  76. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/services.py +0 -0
  77. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/sessions.py +0 -0
  78. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/sidebar_follow.py +0 -0
  79. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/status_cache.py +0 -0
  80. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/tasks.py +0 -0
  81. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/tmux.py +0 -0
  82. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/usage.py +0 -0
  83. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/view.py +0 -0
  84. {brindle-0.0.1 → brindle-0.0.2}/src/brindle/workspaces.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brindle
3
- Version: 0.0.1
3
+ Version: 0.0.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "brindle"
3
- version = "0.0.1"
3
+ version = "0.0.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"
@@ -700,19 +700,35 @@ def _peek(stdscr, agent: dict, styles: dict[str, int]) -> None:
700
700
  stdscr.timeout(int(REFRESH_SECONDS * 1000))
701
701
 
702
702
 
703
- LOGO = [ # a paw print; the wordmark sits beside its middle row
704
- (" ▄▄ ▄▄ ", ""),
705
- ("▄▄ ▀▀ ▀▀ ▄▄", ""),
706
- ("▀▀ ▄▄▄▄ ▀▀ ", "brindle"),
707
- (" ██████", ""),
708
- (" ▀▀▀▀", ""),
703
+ # The paw as pixels, one cell wide and two tall: X is a toe, P the pad, . empty.
704
+ PAW = [
705
+ "...XX.XX...",
706
+ "...XX.XX...",
707
+ "XX.......XX",
708
+ "XX..PPP..XX",
709
+ "...PPPPP...",
710
+ "..PPPPPPP..",
711
+ "..PPPPPPP..",
712
+ "...PP.PP...",
709
713
  ]
714
+ HALF_BLOCKS = {(False, False): " ", (True, False): "▀", (False, True): "▄", (True, True): "█"}
715
+ WORDMARK_ROW = 2 # the wordmark sits beside this terminal row of the paw
716
+
717
+
718
+ def _paw_row(y: int) -> str:
719
+ """Terminal row y of the paw: pixel rows 2y and 2y+1 as half blocks."""
720
+ top, bottom = PAW[2 * y], PAW[2 * y + 1]
721
+ return "".join(HALF_BLOCKS[(t != ".", b != ".")] for t, b in zip(top, bottom))
722
+
723
+
724
+ LOGO = [(_paw_row(y), "brindle" if y == WORDMARK_ROW else "") for y in range(len(PAW) // 2)]
710
725
  COMPACT_LOGO = "▀▄▀" # two toes over the pad, for one-line headers
711
726
 
712
727
 
713
728
  def _coat(x: int, y: int) -> str:
714
- """Brindle: a fawn coat, with dark stripes down the pad."""
715
- return "streak" if y >= 2 and 3 <= x <= 8 and x % 2 == 0 else "coat"
729
+ """Brindle: a fawn coat, with dark stripes down every other column of the pad."""
730
+ pad = "P" in (PAW[2 * y][x], PAW[2 * y + 1][x])
731
+ return "streak" if pad and x % 2 == 1 else "coat"
716
732
 
717
733
 
718
734
  def _draw_logo(stdscr, w: int, styles: dict[str, int]) -> int:
@@ -722,8 +738,8 @@ def _draw_logo(stdscr, w: int, styles: dict[str, int]) -> int:
722
738
  for x, ch in enumerate(paw):
723
739
  if ch != " " and x < w - 2:
724
740
  stdscr.addstr(y, 1 + x, ch, styles.get(_coat(x, y), styles["accent"]))
725
- if word and w > len(paw) + len(word) + 2:
726
- stdscr.addnstr(y, 1 + len(paw), word, len(word), styles["bold"])
741
+ if word and w > len(paw) + len(word) + 4:
742
+ stdscr.addnstr(y, 3 + len(paw), word, len(word), styles["bold"])
727
743
  if w > len(clock) + 16:
728
744
  stdscr.addnstr(0, w - 1 - len(clock), clock, len(clock), styles["dim"])
729
745
  stdscr.addnstr(len(LOGO), 1, "─" * max(0, w - 3), w - 2, styles["dim"])
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