agent-ps 0.7.0__tar.gz → 0.7.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 (35) hide show
  1. {agent_ps-0.7.0 → agent_ps-0.7.2}/PKG-INFO +2 -2
  2. {agent_ps-0.7.0 → agent_ps-0.7.2}/README.md +1 -1
  3. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/__init__.py +1 -1
  4. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/ui.py +8 -4
  5. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/util.py +6 -1
  6. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/PKG-INFO +2 -2
  7. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_release_notes.py +6 -3
  8. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_ui.py +9 -0
  9. {agent_ps-0.7.0 → agent_ps-0.7.2}/LICENSE +0 -0
  10. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/__main__.py +0 -0
  11. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/__init__.py +0 -0
  12. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/antigravity.py +0 -0
  13. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/base.py +0 -0
  14. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/claude.py +0 -0
  15. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/codex.py +0 -0
  16. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/copilot.py +0 -0
  17. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/hermes.py +0 -0
  18. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/opencode.py +0 -0
  19. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/pilike.py +0 -0
  20. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/sqlite.py +0 -0
  21. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/collect.py +0 -0
  22. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/jsonl.py +0 -0
  23. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/procs.py +0 -0
  24. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/resume.py +0 -0
  25. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/SOURCES.txt +0 -0
  26. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/dependency_links.txt +0 -0
  27. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/entry_points.txt +0 -0
  28. {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/top_level.txt +0 -0
  29. {agent_ps-0.7.0 → agent_ps-0.7.2}/pyproject.toml +0 -0
  30. {agent_ps-0.7.0 → agent_ps-0.7.2}/setup.cfg +0 -0
  31. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_backends.py +0 -0
  32. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_errors.py +0 -0
  33. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_procs.py +0 -0
  34. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_prune.py +0 -0
  35. {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_terminal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-ps
3
- Version: 0.7.0
3
+ Version: 0.7.2
4
4
  Summary: A process table for coding agent sessions. Claude Code, Codex, OpenCode, Hermes, Pi, CommandCode and Copilot in one view, with models, idle time, disk use and one key to stop them.
5
5
  Author: mkhuda
6
6
  License: MIT License
@@ -435,7 +435,7 @@ install fetches. The build is reproducible: the same source always produces the
435
435
  same bytes, so the committed executable can be checked against the tree.
436
436
 
437
437
  ```
438
- 9f5c42aeb1fe52ed69781731bcfb6c945b028e81f7067122ec925e2451f1a0ca agent-ps
438
+ 6647524d283f5f13880f9d23e94fee6c0f77c42c8d06d8da8f701c8672cdf36a agent-ps
439
439
  ```
440
440
 
441
441
  Adding an agent takes one class and one line in the registry. See
@@ -389,7 +389,7 @@ install fetches. The build is reproducible: the same source always produces the
389
389
  same bytes, so the committed executable can be checked against the tree.
390
390
 
391
391
  ```
392
- 9f5c42aeb1fe52ed69781731bcfb6c945b028e81f7067122ec925e2451f1a0ca agent-ps
392
+ 6647524d283f5f13880f9d23e94fee6c0f77c42c8d06d8da8f701c8672cdf36a agent-ps
393
393
  ```
394
394
 
395
395
  Adding an agent takes one class and one line in the registry. See
@@ -1,3 +1,3 @@
1
1
  """agent-ps: a process table for coding agent sessions."""
2
2
 
3
- VERSION = "0.7.0"
3
+ VERSION = "0.7.2"
@@ -9,7 +9,7 @@ import os
9
9
  import shutil
10
10
  import time
11
11
 
12
- from . import backends
12
+ from . import VERSION, backends
13
13
  from .collect import ATTACH_WINDOW, idle_seconds, is_live
14
14
  from .backends.base import (ATTACH_INFERRED, KIND_ENDED, KIND_SESSION,
15
15
  STATUS_BUSY)
@@ -100,7 +100,7 @@ def idle_label(row):
100
100
  COLUMNS = [
101
101
  ("PID", 8, pid_label),
102
102
  ("AGENT", 18, agent_label),
103
- ("SESSION", 16, lambda r: r["name"] or "-"),
103
+ ("SESSION", 24, lambda r: r["name"] or "-"),
104
104
  ("STATUS", 7, status_label),
105
105
  ("MODEL", 20, model_label),
106
106
  ("UPTIME", 8, lambda r: human_duration(r["uptime"]) if r["pid"] else "-"),
@@ -494,6 +494,7 @@ class Tui:
494
494
  session = [
495
495
  ("agent", agent_label(row), self.agent_colour.get(row["agent"], 0)),
496
496
  ("session", row["session_id"] or "not matched to a session", 0),
497
+ ("name", row["name"] or "-", 0),
497
498
  ("status", status_label(row),
498
499
  self.style["busy"] if row["status"] == STATUS_BUSY else 0),
499
500
  ("model", row["model"] or "-", 0),
@@ -629,10 +630,13 @@ class Tui:
629
630
  if self.filter_text:
630
631
  state = f"/{self.filter_text} " + state
631
632
 
633
+ title = f"agent-ps {VERSION}"
632
634
  self.screen.attron(curses.A_BOLD)
633
- self._put(0, 1, "agent-ps", width - 2)
635
+ self._put(0, 1, title, width - 2)
634
636
  self.screen.attroff(curses.A_BOLD)
635
- self._put(0, 10, f" {' '.join(parts)} {state}", width - 11)
637
+ start = 1 + len(title)
638
+ self._put(0, start, f" {' '.join(parts)} {state}",
639
+ max(0, width - start - 1))
636
640
 
637
641
  # from live rows, not from self.rows: those are filtered, and a
638
642
  # machine wide total that moves when you type a search term is wrong
@@ -90,7 +90,12 @@ def short_path(path, width=25):
90
90
  while len(parts) > 1 and len(os.sep.join(parts)) + 4 > width:
91
91
  parts.pop(0)
92
92
  short = ".../" + os.sep.join(parts)
93
- return short if len(short) <= width else short[:width - 1] + "\u2026"
93
+ if len(short) <= width:
94
+ return short
95
+ # the last whole segment does not fit even on its own. Two of these are
96
+ # usually distinguished by their tail, not their head (a worktree suffix,
97
+ # a numbered clone), so the cut goes at the front instead of the back
98
+ return "\u2026" + os.sep.join(parts)[-(width - 1):]
94
99
 
95
100
 
96
101
  def decode_project_dir(directory):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-ps
3
- Version: 0.7.0
3
+ Version: 0.7.2
4
4
  Summary: A process table for coding agent sessions. Claude Code, Codex, OpenCode, Hermes, Pi, CommandCode and Copilot in one view, with models, idle time, disk use and one key to stop them.
5
5
  Author: mkhuda
6
6
  License: MIT License
@@ -435,7 +435,7 @@ install fetches. The build is reproducible: the same source always produces the
435
435
  same bytes, so the committed executable can be checked against the tree.
436
436
 
437
437
  ```
438
- 9f5c42aeb1fe52ed69781731bcfb6c945b028e81f7067122ec925e2451f1a0ca agent-ps
438
+ 6647524d283f5f13880f9d23e94fee6c0f77c42c8d06d8da8f701c8672cdf36a agent-ps
439
439
  ```
440
440
 
441
441
  Adding an agent takes one class and one line in the registry. See
@@ -76,7 +76,11 @@ class Reading(unittest.TestCase):
76
76
 
77
77
 
78
78
  class AgainstTheRealChangelog(unittest.TestCase):
79
- def test_every_released_version_has_a_title_and_notes(self):
79
+ def test_every_released_version_has_notes(self):
80
+ """A title is optional now: a section of plain bullets gets a plain
81
+ `vX.Y.Z` release title, which is the convention going forward. See
82
+ CONTRIBUTING.md's "Changelog entries" section.
83
+ """
80
84
  import re
81
85
  root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
82
86
  with open(os.path.join(root, "CHANGELOG.md")) as handle:
@@ -85,9 +89,8 @@ class AgainstTheRealChangelog(unittest.TestCase):
85
89
  self.assertTrue(versions, "no released versions found")
86
90
  for version in versions:
87
91
  with self.subTest(version):
88
- title, notes = release_notes.split(
92
+ _, notes = release_notes.split(
89
93
  release_notes.section(version, text))
90
- self.assertTrue(title, f"{version} has no summary line")
91
94
  self.assertTrue(notes, f"{version} has no notes")
92
95
 
93
96
 
@@ -45,6 +45,15 @@ class Formatting(unittest.TestCase):
45
45
  def test_a_path_that_fits_is_left_alone(self):
46
46
  self.assertEqual(util.short_path("/tmp/work", 25), "/tmp/work")
47
47
 
48
+ def test_a_long_single_segment_keeps_its_tail_not_its_head(self):
49
+ """Two worktrees differing only by a trailing suffix must stay
50
+ distinguishable, not collapse to the same truncated text."""
51
+ a = util.short_path("/Users/rg/projects/ottoshare-factory-7e", 23)
52
+ b = util.short_path("/Users/rg/projects/ottoshare-factory-cb", 23)
53
+ self.assertNotEqual(a, b)
54
+ self.assertTrue(a.endswith("7e"), a)
55
+ self.assertTrue(b.endswith("cb"), b)
56
+
48
57
 
49
58
  class Columns(unittest.TestCase):
50
59
  def test_an_inferred_pairing_is_marked(self):
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