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.
Files changed (62) hide show
  1. {cc_session_control-0.7.0/src/cc_session_control.egg-info → cc_session_control-0.7.1}/PKG-INFO +1 -1
  2. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/__init__.py +1 -1
  3. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/rc.py +10 -1
  4. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/rc.py +2 -2
  5. {cc_session_control-0.7.0 → cc_session_control-0.7.1/src/cc_session_control.egg-info}/PKG-INFO +1 -1
  6. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_rc.py +11 -5
  7. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/LICENSE +0 -0
  8. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/README.md +0 -0
  9. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/pyproject.toml +0 -0
  10. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/setup.cfg +0 -0
  11. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/__main__.py +0 -0
  12. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/__init__.py +0 -0
  13. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/agent_ops.py +0 -0
  14. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/resume_list.py +0 -0
  15. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/session_ops.py +0 -0
  16. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/actions/skill_ops.py +0 -0
  17. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/app.py +0 -0
  18. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/cli.py +0 -0
  19. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/clipboard.py +0 -0
  20. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/config.py +0 -0
  21. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/__init__.py +0 -0
  22. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/cleanup.py +0 -0
  23. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/environments.py +0 -0
  24. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/liveness.py +0 -0
  25. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/proc.py +0 -0
  26. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/registry.py +0 -0
  27. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/sessions.py +0 -0
  28. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/snapshot.py +0 -0
  29. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/data/tmux.py +0 -0
  30. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/models.py +0 -0
  31. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/skill/SKILL.md +0 -0
  32. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/__init__.py +0 -0
  33. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_base.py +0 -0
  34. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_colspec.py +0 -0
  35. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_confirm.py +0 -0
  36. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_keytable.py +0 -0
  37. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_rows.py +0 -0
  38. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_session_row.py +0 -0
  39. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/_sessions_cleanup.py +0 -0
  40. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/agents.py +0 -0
  41. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control/views/sessions.py +0 -0
  42. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/SOURCES.txt +0 -0
  43. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/dependency_links.txt +0 -0
  44. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/entry_points.txt +0 -0
  45. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/requires.txt +0 -0
  46. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/src/cc_session_control.egg-info/top_level.txt +0 -0
  47. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_agent_ops.py +0 -0
  48. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_agents.py +0 -0
  49. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_app.py +0 -0
  50. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_cleanup.py +0 -0
  51. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_cli.py +0 -0
  52. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_data.py +0 -0
  53. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_environments.py +0 -0
  54. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_liveness.py +0 -0
  55. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_proc.py +0 -0
  56. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_registry.py +0 -0
  57. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_resume_list.py +0 -0
  58. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_sessions.py +0 -0
  59. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_skill_ops.py +0 -0
  60. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_smoke.py +0 -0
  61. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_snapshot.py +0 -0
  62. {cc_session_control-0.7.0 → cc_session_control-0.7.1}/tests/test_views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-control
3
- Version: 0.7.0
3
+ Version: 0.7.1
4
4
  Summary: TUI manager for Claude Code sessions and Remote Control
5
5
  Author: dzshzx
6
6
  License-Expression: MIT
@@ -1,3 +1,3 @@
1
1
  """cc-session-control — TUI manager for Claude Code sessions and Remote Control."""
2
2
 
3
- __version__ = "0.7.0"
3
+ __version__ = "0.7.1"
@@ -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=os.path.isdir(directory),
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
- " 项目目录已删除,但 claude 的信任记录(~/.claude.json)或自启列表仍引用它。",
183
- " csctl 不改写 claude 的文件;用 a 键可将其移出自启列表,信任记录需手动清理。",
182
+ " 项目目录已删除,但自启列表仍引用它(或其远控服务还在跑);用 a 键移出自启列表。",
183
+ " 只剩 claude 信任记录(~/.claude.json)引用的已删项目不再显示;信任记录需手动清理。",
184
184
  "",
185
185
  "RC 服务(只读):",
186
186
  " 外部服务只展示,不接管、不重启。",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-control
3
- Version: 0.7.0
3
+ Version: 0.7.1
4
4
  Summary: TUI manager for Claude Code sessions and Remote Control
5
5
  Author: dzshzx
6
6
  License-Expression: MIT
@@ -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 trusted/enabled project whose workspace dir is gone stays listed
208
- (claude.json / rc-enabled still reference it) but gets dir_exists=False."""
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", "deleted", "gone-enabled"}
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"