YeonGyu-Kim
eb063b231a
feat(#160): wire claw list-sessions and delete-session CLI commands
Closes the last #160 gap: claws can now manage session lifecycle entirely
through the CLI without filesystem hacks.
New commands:
- claw list-sessions [--directory DIR] [--output-format text|json]
Enumerates stored session IDs. JSON mode emits {sessions, count}.
Missing/empty directories return empty list (exit 0), not an error.
- claw delete-session SESSION_ID [--directory DIR] [--output-format text|json]
Idempotent: not-found is exit 0 with status='not_found' (no raise).
Partial-failure: exit 1 with typed JSON error envelope:
{session_id, deleted: false, error: {kind, message, retryable}}
The 'session_delete_failed' kind is retryable=true so orchestrators
know to retry vs escalate.
Public API surface extended in src/__init__.py:
- list_sessions, session_exists, delete_session
- SessionNotFoundError, SessionDeleteError
Tests added (tests/test_porting_workspace.py):
- test_list_sessions_cli_runs: text + json modes against tempdir
- test_delete_session_cli_idempotent: first call deleted=true,
second call deleted=false (exit 0, status=not_found)
- test_delete_session_cli_partial_failure_exit_1: permission error
surfaces as exit 1 + typed JSON error with retryable=true
All 43 tests pass. The session storage abstraction chapter is closed:
- storage layer decoupled from claw code (#160 initial impl)
- delete contract hardened + caller-audited (#160 hardening pass)
- CLI wired with idempotency preserved at exit-code boundary (this commit)
2026-04-27 18:29:18 +09:00
..
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-03-31 07:17:34 -07:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-03 18:35:27 +09:00
2026-04-27 18:29:18 +09:00
2026-04-03 18:35:27 +09:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 07:17:34 -07:00
2026-04-27 18:29:18 +09:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-04-27 18:29:18 +09:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 07:17:34 -07:00
2026-03-31 08:16:20 -07:00
2026-03-31 08:16:20 -07:00