spooling 0.2.7__tar.gz → 0.2.8__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 (70) hide show
  1. {spooling-0.2.7/spooling.egg-info → spooling-0.2.8}/PKG-INFO +2 -2
  2. {spooling-0.2.7 → spooling-0.2.8}/README.md +1 -1
  3. {spooling-0.2.7 → spooling-0.2.8}/pyproject.toml +1 -1
  4. {spooling-0.2.7 → spooling-0.2.8}/spooling/cli.py +26 -4
  5. {spooling-0.2.7 → spooling-0.2.8/spooling.egg-info}/PKG-INFO +2 -2
  6. {spooling-0.2.7 → spooling-0.2.8}/tests/test_session_ids.py +19 -0
  7. {spooling-0.2.7 → spooling-0.2.8}/LICENSE +0 -0
  8. {spooling-0.2.7 → spooling-0.2.8}/setup.cfg +0 -0
  9. {spooling-0.2.7 → spooling-0.2.8}/spooling/__init__.py +0 -0
  10. {spooling-0.2.7 → spooling-0.2.8}/spooling/agent.py +0 -0
  11. {spooling-0.2.7 → spooling-0.2.8}/spooling/classifiers.py +0 -0
  12. {spooling-0.2.7 → spooling-0.2.8}/spooling/cloud.py +0 -0
  13. {spooling-0.2.7 → spooling-0.2.8}/spooling/config.py +0 -0
  14. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/__init__.py +0 -0
  15. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/base.py +0 -0
  16. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/bigquery.py +0 -0
  17. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/clickhouse.py +0 -0
  18. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/factory.py +0 -0
  19. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/mongodb.py +0 -0
  20. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/mysql.py +0 -0
  21. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/postgresql.py +0 -0
  22. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/rest/__init__.py +0 -0
  23. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/rest/base.py +0 -0
  24. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/rest/shopify_connectors.py +0 -0
  25. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/snowflake.py +0 -0
  26. {spooling-0.2.7 → spooling-0.2.8}/spooling/connectors/types.py +0 -0
  27. {spooling-0.2.7 → spooling-0.2.8}/spooling/db.py +0 -0
  28. {spooling-0.2.7 → spooling-0.2.8}/spooling/embeddings.py +0 -0
  29. {spooling-0.2.7 → spooling-0.2.8}/spooling/evals.py +0 -0
  30. {spooling-0.2.7 → spooling-0.2.8}/spooling/experiments.py +0 -0
  31. {spooling-0.2.7 → spooling-0.2.8}/spooling/ingest.py +0 -0
  32. {spooling-0.2.7 → spooling-0.2.8}/spooling/mcp_server.py +0 -0
  33. {spooling-0.2.7 → spooling-0.2.8}/spooling/optimize.py +0 -0
  34. {spooling-0.2.7 → spooling-0.2.8}/spooling/parser.py +0 -0
  35. {spooling-0.2.7 → spooling-0.2.8}/spooling/pricing.py +0 -0
  36. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/__init__.py +0 -0
  37. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/antigravity.py +0 -0
  38. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/base.py +0 -0
  39. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/codex.py +0 -0
  40. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/copilot.py +0 -0
  41. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/cortex_code.py +0 -0
  42. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/cursor.py +0 -0
  43. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/gemini.py +0 -0
  44. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/github.py +0 -0
  45. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/gitlab.py +0 -0
  46. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/kiro.py +0 -0
  47. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/opencode.py +0 -0
  48. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/session_file.py +0 -0
  49. {spooling-0.2.7 → spooling-0.2.8}/spooling/providers/windsurf.py +0 -0
  50. {spooling-0.2.7 → spooling-0.2.8}/spooling/redact.py +0 -0
  51. {spooling-0.2.7 → spooling-0.2.8}/spooling/remote_otel.py +0 -0
  52. {spooling-0.2.7 → spooling-0.2.8}/spooling/schema.py +0 -0
  53. {spooling-0.2.7 → spooling-0.2.8}/spooling/sdk.py +0 -0
  54. {spooling-0.2.7 → spooling-0.2.8}/spooling/search.py +0 -0
  55. {spooling-0.2.7 → spooling-0.2.8}/spooling/server.py +0 -0
  56. {spooling-0.2.7 → spooling-0.2.8}/spooling/sessions.py +0 -0
  57. {spooling-0.2.7 → spooling-0.2.8}/spooling/stats.py +0 -0
  58. {spooling-0.2.7 → spooling-0.2.8}/spooling/subscription_pricing.py +0 -0
  59. {spooling-0.2.7 → spooling-0.2.8}/spooling/tracing.py +0 -0
  60. {spooling-0.2.7 → spooling-0.2.8}/spooling/tunnel.py +0 -0
  61. {spooling-0.2.7 → spooling-0.2.8}/spooling/tunnel_auth.py +0 -0
  62. {spooling-0.2.7 → spooling-0.2.8}/spooling/watcher.py +0 -0
  63. {spooling-0.2.7 → spooling-0.2.8}/spooling.egg-info/SOURCES.txt +0 -0
  64. {spooling-0.2.7 → spooling-0.2.8}/spooling.egg-info/dependency_links.txt +0 -0
  65. {spooling-0.2.7 → spooling-0.2.8}/spooling.egg-info/entry_points.txt +0 -0
  66. {spooling-0.2.7 → spooling-0.2.8}/spooling.egg-info/requires.txt +0 -0
  67. {spooling-0.2.7 → spooling-0.2.8}/spooling.egg-info/top_level.txt +0 -0
  68. {spooling-0.2.7 → spooling-0.2.8}/tests/test_mcp_auth_middleware.py +0 -0
  69. {spooling-0.2.7 → spooling-0.2.8}/tests/test_storage_optimizations.py +0 -0
  70. {spooling-0.2.7 → spooling-0.2.8}/tests/test_tunnel_auth.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spooling
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: Local session tracker and semantic search for AI coding assistants
5
5
  Author: Parsed Analytics, Inc.
6
6
  License: MIT
@@ -188,7 +188,7 @@ spooling session show ses_e6310bd1 -m # plus the full conversation text
188
188
  spooling session show ses_e6310bd1 -m --max-chars 300 # truncate each message
189
189
  ```
190
190
 
191
- `session show` accepts a full session id or any unique prefix. If a prefix matches several sessions, it lists them and exits so you can pick one.
191
+ `spooling session <id> -m` is shorthand for `spooling session show <id> -m`. `session show` accepts a full session id or any unique prefix. If a prefix matches several sessions, it lists them and exits so you can pick one.
192
192
 
193
193
  ### `spooling optimize`
194
194
 
@@ -152,7 +152,7 @@ spooling session show ses_e6310bd1 -m # plus the full conversation text
152
152
  spooling session show ses_e6310bd1 -m --max-chars 300 # truncate each message
153
153
  ```
154
154
 
155
- `session show` accepts a full session id or any unique prefix. If a prefix matches several sessions, it lists them and exits so you can pick one.
155
+ `spooling session <id> -m` is shorthand for `spooling session show <id> -m`. `session show` accepts a full session id or any unique prefix. If a prefix matches several sessions, it lists them and exits so you can pick one.
156
156
 
157
157
  ### `spooling optimize`
158
158
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "spooling"
3
- version = "0.2.7"
3
+ version = "0.2.8"
4
4
  description = "Local session tracker and semantic search for AI coding assistants"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Parsed Analytics, Inc." }]
@@ -1135,9 +1135,27 @@ def redact(path, session_id, show):
1135
1135
  # Sessions
1136
1136
  # ---------------------------------------------------------------------------
1137
1137
 
1138
- @cli.group()
1138
+ class _SessionGroup(click.Group):
1139
+ """`spooling session <id>` is shorthand for `spooling session show <id>`."""
1140
+
1141
+ def resolve_command(self, ctx, args):
1142
+ try:
1143
+ return super().resolve_command(ctx, args)
1144
+ except click.UsageError:
1145
+ if args and not args[0].startswith("-") and "show" in self.commands:
1146
+ return "show", self.commands["show"], args
1147
+ raise
1148
+
1149
+
1150
+ @cli.group(cls=_SessionGroup)
1139
1151
  def session():
1140
- """Inspect and list local sessions."""
1152
+ """Inspect and list local sessions.
1153
+
1154
+ \b
1155
+ spooling session list list sessions with ids
1156
+ spooling session show ID -m read a session's full text
1157
+ spooling session ID -m same as 'show ID'
1158
+ """
1141
1159
  pass
1142
1160
 
1143
1161
 
@@ -1234,8 +1252,12 @@ def session_show(session_id, messages, max_chars):
1234
1252
 
1235
1253
  detail = get_session_detail(session_id)
1236
1254
  if not detail:
1237
- console.print(f"[yellow]Session not found: {session_id}[/yellow]")
1238
- return
1255
+ console.print(
1256
+ f"[yellow]Session not found: {session_id}[/yellow]\n"
1257
+ "[dim]Find ids with 'spooling session list --id PART' or 'spooling search QUERY'. "
1258
+ "If the session is recent, run 'spooling sync' first.[/dim]"
1259
+ )
1260
+ raise SystemExit(1)
1239
1261
 
1240
1262
  s = detail["session"]
1241
1263
  console.print(Panel(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spooling
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: Local session tracker and semantic search for AI coding assistants
5
5
  Author: Parsed Analytics, Inc.
6
6
  License: MIT
@@ -188,7 +188,7 @@ spooling session show ses_e6310bd1 -m # plus the full conversation text
188
188
  spooling session show ses_e6310bd1 -m --max-chars 300 # truncate each message
189
189
  ```
190
190
 
191
- `session show` accepts a full session id or any unique prefix. If a prefix matches several sessions, it lists them and exits so you can pick one.
191
+ `spooling session <id> -m` is shorthand for `spooling session show <id> -m`. `session show` accepts a full session id or any unique prefix. If a prefix matches several sessions, it lists them and exits so you can pick one.
192
192
 
193
193
  ### `spooling optimize`
194
194
 
@@ -133,3 +133,22 @@ def test_cli_session_show_and_list(conn):
133
133
  assert res.exit_code == 0
134
134
  assert UU1 in res.output
135
135
  assert OC1 not in res.output
136
+
137
+
138
+ def test_cli_session_id_shortcut_and_not_found(conn):
139
+ from spooling.cli import cli
140
+
141
+ r = CliRunner()
142
+ res = r.invoke(cli, ["session", "ses_e6310bd1", "-m"]) # no 'show'
143
+ assert res.exit_code == 0, res.output
144
+ assert "hello from login issue" in res.output
145
+
146
+ res = r.invoke(cli, ["session", "nosuchcommand"])
147
+ assert res.exit_code == 1
148
+ assert "not found" in res.output.lower()
149
+
150
+ res = r.invoke(cli, ["session", "list", "--id", "0b104f33"], env={"COLUMNS": "200"})
151
+ assert res.exit_code == 0 # real subcommands still win
152
+
153
+ res = r.invoke(cli, ["session"]) # bare group shows help
154
+ assert "show" in res.output and "list" in res.output
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