cc-session-control 0.7.0__tar.gz → 0.7.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.
- {cc_session_control-0.7.0/src/cc_session_control.egg-info → cc_session_control-0.7.1}/PKG-INFO +1 -1
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/__init__.py +1 -1
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/rc.py +10 -1
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/rc.py +2 -2
- {cc_session_control-0.7.0 → cc_session_control-0.7.1/src/cc_session_control.egg-info}/PKG-INFO +1 -1
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_rc.py +11 -5
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/LICENSE +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/README.md +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/pyproject.toml +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/setup.cfg +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/__main__.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/__init__.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/agent_ops.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/resume_list.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/session_ops.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/skill_ops.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/app.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/cli.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/clipboard.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/config.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/__init__.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/cleanup.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/environments.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/liveness.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/proc.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/registry.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/sessions.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/snapshot.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/tmux.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/models.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/skill/SKILL.md +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/__init__.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_base.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_colspec.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_confirm.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_keytable.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_rows.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_session_row.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_sessions_cleanup.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/agents.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/sessions.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/SOURCES.txt +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/dependency_links.txt +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/entry_points.txt +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/requires.txt +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/top_level.txt +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_agent_ops.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_agents.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_app.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_cleanup.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_cli.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_data.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_environments.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_liveness.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_proc.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_registry.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_resume_list.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_sessions.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_skill_ops.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_smoke.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_snapshot.py +0 -0
- {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_views.py +0 -0
|
@@ -183,6 +183,15 @@ def scan() -> list[RCProject]:
|
|
|
183
183
|
for name in all_names:
|
|
184
184
|
directory = str(cfg.workspace / name)
|
|
185
185
|
in_windows = name in windows
|
|
186
|
+
dir_exists = os.path.isdir(directory)
|
|
187
|
+
if not dir_exists and name not in enabled and not in_windows:
|
|
188
|
+
# Pure trust residue: the directory is gone and only claude's own
|
|
189
|
+
# trust record (~/.claude.json) still references it. csctl can't
|
|
190
|
+
# act on it (no start, and it never edits claude's files), so it
|
|
191
|
+
# is dropped instead of rendered as a ✖ 缺失 row. Missing-dir
|
|
192
|
+
# projects that ARE actionable (in the autostart list, or with a
|
|
193
|
+
# live/dead tmux window) stay listed.
|
|
194
|
+
continue
|
|
186
195
|
if in_windows:
|
|
187
196
|
status = "running" if _is_alive(name) else "dead"
|
|
188
197
|
else:
|
|
@@ -195,7 +204,7 @@ def scan() -> list[RCProject]:
|
|
|
195
204
|
auto_start=name in enabled,
|
|
196
205
|
rc_at_startup=_read_rc_at_startup(directory),
|
|
197
206
|
spawn_mode=_read_spawn_mode(name),
|
|
198
|
-
dir_exists=
|
|
207
|
+
dir_exists=dir_exists,
|
|
199
208
|
))
|
|
200
209
|
return result
|
|
201
210
|
|
|
@@ -179,8 +179,8 @@ class RCView(ListTabView):
|
|
|
179
179
|
sections=("项目操作(仅对「项目」行生效):", "批量操作:"),
|
|
180
180
|
suffix=(
|
|
181
181
|
"目录缺失(✖ 缺失):",
|
|
182
|
-
"
|
|
183
|
-
"
|
|
182
|
+
" 项目目录已删除,但自启列表仍引用它(或其远控服务还在跑);用 a 键移出自启列表。",
|
|
183
|
+
" 只剩 claude 信任记录(~/.claude.json)引用的已删项目不再显示;信任记录需手动清理。",
|
|
184
184
|
"",
|
|
185
185
|
"RC 服务(只读):",
|
|
186
186
|
" 外部服务只展示,不接管、不重启。",
|
|
@@ -204,21 +204,27 @@ def test_scan_populates_spawn_mode(tmp_path, monkeypatch):
|
|
|
204
204
|
|
|
205
205
|
|
|
206
206
|
def test_scan_marks_missing_directory(tmp_path, monkeypatch):
|
|
207
|
-
"""A
|
|
208
|
-
|
|
207
|
+
"""A missing-dir project stays listed (dir_exists=False) only while it is
|
|
208
|
+
still actionable — in the autostart list or holding a tmux window. Pure
|
|
209
|
+
trust residue (only ~/.claude.json references the deleted dir) is dropped:
|
|
210
|
+
csctl can't act on it and never edits claude's files."""
|
|
209
211
|
ws = tmp_path / "workspace"
|
|
210
212
|
(ws / "alive").mkdir(parents=True)
|
|
211
213
|
cj = _write_claude_json(tmp_path, {
|
|
212
214
|
str(ws / "alive"): {"hasTrustDialogAccepted": True},
|
|
213
215
|
str(ws / "deleted"): {"hasTrustDialogAccepted": True},
|
|
216
|
+
str(ws / "gone-running"): {"hasTrustDialogAccepted": True},
|
|
214
217
|
})
|
|
215
218
|
monkeypatch.setattr(rc.cfg, "claude_json", cj)
|
|
216
219
|
monkeypatch.setattr(rc.cfg, "workspace", ws)
|
|
217
220
|
monkeypatch.setattr(rc, "list_enabled", lambda: ["gone-enabled"])
|
|
218
|
-
monkeypatch.setattr(rc, "_tmux_windows", lambda: [])
|
|
221
|
+
monkeypatch.setattr(rc, "_tmux_windows", lambda: ["gone-running"])
|
|
222
|
+
monkeypatch.setattr(rc, "_is_alive", lambda name: True)
|
|
219
223
|
|
|
220
224
|
rows = {p.name: p for p in rc.scan()}
|
|
221
|
-
assert set(rows) == {"alive", "
|
|
225
|
+
assert set(rows) == {"alive", "gone-enabled", "gone-running"}
|
|
226
|
+
assert "deleted" not in rows # trust-only residue hidden
|
|
222
227
|
assert rows["alive"].dir_exists is True
|
|
223
|
-
assert rows["deleted"].dir_exists is False # stale trust entry
|
|
224
228
|
assert rows["gone-enabled"].dir_exists is False # stale rc-enabled entry
|
|
229
|
+
assert rows["gone-running"].dir_exists is False # window survives dir removal
|
|
230
|
+
assert rows["gone-running"].status == "running"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/__init__.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/agent_ops.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/resume_list.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/session_ops.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/skill_ops.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/__init__.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/cleanup.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/environments.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/liveness.py
RENAMED
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/registry.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/sessions.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/snapshot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_colspec.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_confirm.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_keytable.py
RENAMED
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_session_row.py
RENAMED
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/agents.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/sessions.py
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/requires.txt
RENAMED
|
File without changes
|
{cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/top_level.txt
RENAMED
|
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
|