claude-session-backup 0.2.2__tar.gz → 0.2.3__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 (37) hide show
  1. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/PKG-INFO +10 -3
  2. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/README.md +9 -2
  3. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/_version.py +2 -2
  4. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/cli.py +65 -4
  5. claude_session_backup-0.2.3/claude_session_backup/commands.py +858 -0
  6. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/config.py +6 -1
  7. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/index.py +230 -0
  8. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/metadata.py +10 -12
  9. claude_session_backup-0.2.3/claude_session_backup/pathkit.py +307 -0
  10. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/timeline.py +96 -36
  11. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup.egg-info/PKG-INFO +10 -3
  12. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup.egg-info/SOURCES.txt +3 -0
  13. claude_session_backup-0.2.3/tests/test_cli.py +470 -0
  14. claude_session_backup-0.2.3/tests/test_commands.py +499 -0
  15. claude_session_backup-0.2.3/tests/test_index.py +721 -0
  16. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/tests/test_metadata.py +23 -1
  17. claude_session_backup-0.2.3/tests/test_pathkit.py +504 -0
  18. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/tests/test_timeline.py +64 -0
  19. claude_session_backup-0.2.2/claude_session_backup/commands.py +0 -526
  20. claude_session_backup-0.2.2/tests/test_cli.py +0 -113
  21. claude_session_backup-0.2.2/tests/test_index.py +0 -214
  22. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/LICENSE +0 -0
  23. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/__init__.py +0 -0
  24. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/__main__.py +0 -0
  25. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/git_ops.py +0 -0
  26. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/lockfile.py +0 -0
  27. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup/scanner.py +0 -0
  28. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup.egg-info/dependency_links.txt +0 -0
  29. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup.egg-info/entry_points.txt +0 -0
  30. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup.egg-info/requires.txt +0 -0
  31. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/claude_session_backup.egg-info/top_level.txt +0 -0
  32. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/pyproject.toml +0 -0
  33. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/setup.cfg +0 -0
  34. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/tests/test_hook.py +0 -0
  35. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/tests/test_lockfile.py +0 -0
  36. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/tests/test_scanner.py +0 -0
  37. {claude_session_backup-0.2.2 → claude_session_backup-0.2.3}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-session-backup
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Git-backed Claude Code session backup with timeline view, folder analysis, deletion detection, and session restore.
5
5
  Author-email: djdarcy <6962246+djdarcy@users.noreply.github.com>
6
6
  License: GPL-3.0-or-later
@@ -89,8 +89,15 @@ csb list [keyword] # Filter by keyword in name/project/folder
89
89
  csb list --sort expiration # Sort by soonest-to-purge first
90
90
  csb list --sort {last-used|expiration|started|oldest|messages|size}
91
91
  csb list --deleted # Show deleted sessions
92
- csb scan [path] # Find sessions touching this directory
93
- csb scan [path] -NU # Prefix-only match (skip folder-usage search)
92
+ csb scan # Find sessions touching cwd (path-prefix)
93
+ csb scan <term> # Filter by term: name, project, folder paths
94
+ csb scan ./<dirname> # Shortcut: same as -d <dirname> (no flag to remember)
95
+ csb scan -d <pattern> # Path-strict: folder + descendants
96
+ csb scan -D <pattern> # Path-strict: this folder only, no descendants
97
+ csb scan -s <pattern> # start_folder only ("what sessions originated here?")
98
+ csb scan -d <pattern> <term> # Scope-then-filter combined
99
+ csb scan -d <pattern>* / -D <pattern>* / -s <pattern>* # Trailing-* wildcard
100
+ csb scan ... -NU # Skip folder-usage search (start_folder only)
94
101
  csb status # Summary stats
95
102
  csb show <session-id> # Detailed session info with folder analysis
96
103
  csb search "query" # Search by session name, project, or folder
@@ -58,8 +58,15 @@ csb list [keyword] # Filter by keyword in name/project/folder
58
58
  csb list --sort expiration # Sort by soonest-to-purge first
59
59
  csb list --sort {last-used|expiration|started|oldest|messages|size}
60
60
  csb list --deleted # Show deleted sessions
61
- csb scan [path] # Find sessions touching this directory
62
- csb scan [path] -NU # Prefix-only match (skip folder-usage search)
61
+ csb scan # Find sessions touching cwd (path-prefix)
62
+ csb scan <term> # Filter by term: name, project, folder paths
63
+ csb scan ./<dirname> # Shortcut: same as -d <dirname> (no flag to remember)
64
+ csb scan -d <pattern> # Path-strict: folder + descendants
65
+ csb scan -D <pattern> # Path-strict: this folder only, no descendants
66
+ csb scan -s <pattern> # start_folder only ("what sessions originated here?")
67
+ csb scan -d <pattern> <term> # Scope-then-filter combined
68
+ csb scan -d <pattern>* / -D <pattern>* / -s <pattern>* # Trailing-* wildcard
69
+ csb scan ... -NU # Skip folder-usage search (start_folder only)
63
70
  csb status # Summary stats
64
71
  csb show <session-id> # Detailed session info with folder analysis
65
72
  csb search "query" # Search by session name, project, or folder
@@ -15,13 +15,13 @@ To bump version: python scripts/sync-versions.py --bump patch
15
15
  # Version components - edit these for version bumps
16
16
  MAJOR = 0
17
17
  MINOR = 2
18
- PATCH = 2
18
+ PATCH = 3
19
19
  PHASE = "" # Per-MINOR feature set: None, "alpha", "beta", "rc1", etc.
20
20
  PRE_RELEASE_NUM = 1 # PEP 440 pre-release number (e.g., a1, b2)
21
21
  PROJECT_PHASE = "prealpha" # Project-wide: "prealpha", "alpha", "beta", "stable"
22
22
 
23
23
  # Auto-updated by git hooks - do not edit manually
24
- __version__ = "0.2.2"
24
+ __version__ = "0.2.3"
25
25
  __app_name__ = "claude-session-backup"
26
26
 
27
27
 
@@ -150,6 +150,15 @@ def build_parser():
150
150
  p_list.add_argument("--deleted", action="store_true", help="Show only deleted sessions")
151
151
  p_list.add_argument("--all", action="store_true", help="Show all sessions including deleted")
152
152
  p_list.add_argument("--json", action="store_true", help="Output as JSON")
153
+ p_list_folders = p_list.add_mutually_exclusive_group()
154
+ p_list_folders.add_argument(
155
+ "--top", type=int, metavar="N", default=None,
156
+ help="Show top N other folders per session (default: 3). Use --all-folders for everything.",
157
+ )
158
+ p_list_folders.add_argument(
159
+ "--all-folders", action="store_true",
160
+ help="Show every tracked folder per session (no cap).",
161
+ )
153
162
 
154
163
  # status
155
164
  p_status = sub.add_parser("status", help="Summary of sessions, deletions, git state")
@@ -172,12 +181,64 @@ def build_parser():
172
181
  p_resume.add_argument("session_id", help="Session ID (prefix match supported)")
173
182
 
174
183
  # scan
175
- p_scan = sub.add_parser("scan", help="Find sessions in current directory and children")
184
+ p_scan = sub.add_parser(
185
+ "scan",
186
+ help="Find sessions by term, location, or both",
187
+ description=(
188
+ "Find sessions by term, location, or both.\n\n"
189
+ " csb scan cwd path-prefix (today's default)\n"
190
+ " csb scan <term> broad metadata substring (name, project, folder paths)\n"
191
+ " csb scan ./dirname shortcut: same as -d dirname (no flag to remember)\n"
192
+ " csb scan -d <pattern> path-strict: folder + descendants (start_folder OR top-N folder_usage)\n"
193
+ " csb scan -D <pattern> path-strict: this folder only (no descendants)\n"
194
+ " csb scan -s <pattern> start_folder only: 'what sessions originated here?' (skips folder_usage)\n"
195
+ " csb scan -d|-D|-s <pat> <term> scope-then-filter combined\n\n"
196
+ "Patterns accept a trailing '*' for sibling-prefix expansion (amdead* matches amdead, amdead-fork, ...)."
197
+ ),
198
+ formatter_class=argparse.RawDescriptionHelpFormatter,
199
+ )
176
200
  _add_common_flags(p_scan)
177
- p_scan.add_argument("path", nargs="?", default=".", help="Root path to scan (default: current directory)")
201
+ p_scan.add_argument(
202
+ "term", nargs="?", default=None,
203
+ help="Filter sessions whose name, project, or folder paths contain term (case-insensitive). "
204
+ "If this starts with `./` or `.\\` (or is a bare `.`), it's auto-promoted to implicit -d.",
205
+ )
206
+ p_scan.add_argument(
207
+ "term2", nargs="?", default=None,
208
+ help="Optional second positional. Only valid when the first positional is a "
209
+ "`./dirname` / `.\\dirname` shortcut -- in that case `term2` is the actual term "
210
+ "filter (equivalent to `csb scan -d dirname term2`). Otherwise rejected.",
211
+ )
178
212
  p_scan.add_argument("-n", type=int, default=20, help="Number of sessions to show")
179
- p_scan.add_argument("--no-usage", "-NU", action="store_true",
180
- help="Only match by project start folder, skip folder usage search")
213
+ p_scan.add_argument(
214
+ "--no-usage", "-NU", action="store_true",
215
+ help="Skip folder_usage match; only consider session start_folder",
216
+ )
217
+ # -d / -D / -s mutually exclusive: path-strict modes
218
+ p_scan_dir = p_scan.add_mutually_exclusive_group()
219
+ p_scan_dir.add_argument(
220
+ "-d", "--directories-below", metavar="PATTERN", default=None,
221
+ help="Path-strict: match this folder + its descendants. Trailing '*' for sibling-prefix.",
222
+ )
223
+ p_scan_dir.add_argument(
224
+ "-D", "--directory-only", metavar="PATTERN", default=None,
225
+ help="Path-strict: match this folder only, no descendants. Trailing '*' for sibling-prefix.",
226
+ )
227
+ p_scan_dir.add_argument(
228
+ "-s", "--start-dir-only", metavar="PATTERN", default=None,
229
+ help="Path-strict: only match sessions whose start_folder is this folder + descendants. "
230
+ "Skips folder_usage entirely. Useful for 'what sessions originated from here?'",
231
+ )
232
+ # --top / --all-folders mutually exclusive: display + folder_usage matching gate
233
+ p_scan_folders = p_scan.add_mutually_exclusive_group()
234
+ p_scan_folders.add_argument(
235
+ "--top", type=int, metavar="N", default=None,
236
+ help="Show top N other folders per session (default: 3). Also gates -d/-D folder_usage matching.",
237
+ )
238
+ p_scan_folders.add_argument(
239
+ "--all-folders", action="store_true",
240
+ help="Show every tracked folder per session (no cap). Also removes top-N gate from -d/-D matching.",
241
+ )
181
242
 
182
243
  # search
183
244
  p_search = sub.add_parser("search", help="Search session metadata")