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.
- {agent_ps-0.7.0 → agent_ps-0.7.2}/PKG-INFO +2 -2
- {agent_ps-0.7.0 → agent_ps-0.7.2}/README.md +1 -1
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/__init__.py +1 -1
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/ui.py +8 -4
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/util.py +6 -1
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/PKG-INFO +2 -2
- {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_release_notes.py +6 -3
- {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_ui.py +9 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/LICENSE +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/__main__.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/__init__.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/antigravity.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/base.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/claude.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/codex.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/copilot.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/hermes.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/opencode.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/pilike.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/backends/sqlite.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/collect.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/jsonl.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/procs.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps/resume.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/SOURCES.txt +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/dependency_links.txt +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/entry_points.txt +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/agent_ps.egg-info/top_level.txt +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/pyproject.toml +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/setup.cfg +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_backends.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_errors.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_procs.py +0 -0
- {agent_ps-0.7.0 → agent_ps-0.7.2}/tests/test_prune.py +0 -0
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
392
|
+
6647524d283f5f13880f9d23e94fee6c0f77c42c8d06d8da8f701c8672cdf36a agent-ps
|
|
393
393
|
```
|
|
394
394
|
|
|
395
395
|
Adding an agent takes one class and one line in the registry. See
|
|
@@ -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",
|
|
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,
|
|
635
|
+
self._put(0, 1, title, width - 2)
|
|
634
636
|
self.screen.attroff(curses.A_BOLD)
|
|
635
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|