sqlsaber 0.11.0__tar.gz → 0.12.0__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.

Potentially problematic release.


This version of sqlsaber might be problematic. Click here for more details.

Files changed (69) hide show
  1. sqlsaber-0.12.0/.github/workflows/claude-code-review.yml +78 -0
  2. sqlsaber-0.12.0/.github/workflows/claude.yml +64 -0
  3. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/PKG-INFO +10 -1
  4. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/README.md +9 -0
  5. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/pyproject.toml +1 -1
  6. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/commands.py +14 -3
  7. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/uv.lock +1 -1
  8. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/.github/workflows/publish.yml +0 -0
  9. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/.gitignore +0 -0
  10. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/.python-version +0 -0
  11. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/AGENT.md +0 -0
  12. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/CHANGELOG.md +0 -0
  13. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/CLAUDE.md +0 -0
  14. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/LICENSE +0 -0
  15. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/pytest.ini +0 -0
  16. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/sqlsaber.svg +0 -0
  17. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/__init__.py +0 -0
  18. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/__main__.py +0 -0
  19. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/agents/__init__.py +0 -0
  20. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/agents/anthropic.py +0 -0
  21. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/agents/base.py +0 -0
  22. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/agents/mcp.py +0 -0
  23. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/agents/streaming.py +0 -0
  24. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/__init__.py +0 -0
  25. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/auth.py +0 -0
  26. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/completers.py +0 -0
  27. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/database.py +0 -0
  28. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/display.py +0 -0
  29. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/interactive.py +0 -0
  30. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/memory.py +0 -0
  31. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/models.py +0 -0
  32. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/cli/streaming.py +0 -0
  33. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/clients/__init__.py +0 -0
  34. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/clients/anthropic.py +0 -0
  35. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/clients/base.py +0 -0
  36. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/clients/exceptions.py +0 -0
  37. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/clients/models.py +0 -0
  38. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/clients/streaming.py +0 -0
  39. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/__init__.py +0 -0
  40. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/api_keys.py +0 -0
  41. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/auth.py +0 -0
  42. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/database.py +0 -0
  43. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/oauth_flow.py +0 -0
  44. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/oauth_tokens.py +0 -0
  45. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/config/settings.py +0 -0
  46. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/database/__init__.py +0 -0
  47. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/database/connection.py +0 -0
  48. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/database/schema.py +0 -0
  49. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/mcp/__init__.py +0 -0
  50. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/mcp/mcp.py +0 -0
  51. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/memory/__init__.py +0 -0
  52. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/memory/manager.py +0 -0
  53. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/memory/storage.py +0 -0
  54. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/models/__init__.py +0 -0
  55. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/models/events.py +0 -0
  56. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/src/sqlsaber/models/types.py +0 -0
  57. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/__init__.py +0 -0
  58. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/conftest.py +0 -0
  59. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_agents/test_anthropic_oauth.py +0 -0
  60. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_cli/__init__.py +0 -0
  61. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_cli/test_commands.py +0 -0
  62. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_clients/test_anthropic_client.py +0 -0
  63. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_clients/test_streaming.py +0 -0
  64. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_config/__init__.py +0 -0
  65. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_config/test_database.py +0 -0
  66. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_config/test_oauth.py +0 -0
  67. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_config/test_settings.py +0 -0
  68. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_database/__init__.py +0 -0
  69. {sqlsaber-0.11.0 → sqlsaber-0.12.0}/tests/test_database/test_connection.py +0 -0
@@ -0,0 +1,78 @@
1
+ name: Claude Code Review
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize]
6
+ # Optional: Only run on specific file changes
7
+ # paths:
8
+ # - "src/**/*.ts"
9
+ # - "src/**/*.tsx"
10
+ # - "src/**/*.js"
11
+ # - "src/**/*.jsx"
12
+
13
+ jobs:
14
+ claude-review:
15
+ # Optional: Filter by PR author
16
+ # if: |
17
+ # github.event.pull_request.user.login == 'external-contributor' ||
18
+ # github.event.pull_request.user.login == 'new-developer' ||
19
+ # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
20
+
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+ pull-requests: read
25
+ issues: read
26
+ id-token: write
27
+
28
+ steps:
29
+ - name: Checkout repository
30
+ uses: actions/checkout@v4
31
+ with:
32
+ fetch-depth: 1
33
+
34
+ - name: Run Claude Code Review
35
+ id: claude-review
36
+ uses: anthropics/claude-code-action@beta
37
+ with:
38
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
39
+
40
+ # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
41
+ # model: "claude-opus-4-20250514"
42
+
43
+ # Direct prompt for automated review (no @claude mention needed)
44
+ direct_prompt: |
45
+ Please review this pull request and provide feedback on:
46
+ - Code quality and best practices
47
+ - Potential bugs or issues
48
+ - Performance considerations
49
+ - Security concerns
50
+ - Test coverage
51
+
52
+ Be constructive and helpful in your feedback.
53
+
54
+ # Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR
55
+ # use_sticky_comment: true
56
+
57
+ # Optional: Customize review based on file types
58
+ # direct_prompt: |
59
+ # Review this PR focusing on:
60
+ # - For TypeScript files: Type safety and proper interface usage
61
+ # - For API endpoints: Security, input validation, and error handling
62
+ # - For React components: Performance, accessibility, and best practices
63
+ # - For tests: Coverage, edge cases, and test quality
64
+
65
+ # Optional: Different prompts for different authors
66
+ # direct_prompt: |
67
+ # ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' &&
68
+ # 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' ||
69
+ # 'Please provide a thorough code review focusing on our coding standards and best practices.' }}
70
+
71
+ # Optional: Add specific tools for running tests or linting
72
+ # allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)"
73
+
74
+ # Optional: Skip review for certain conditions
75
+ # if: |
76
+ # !contains(github.event.pull_request.title, '[skip-review]') &&
77
+ # !contains(github.event.pull_request.title, '[WIP]')
78
+
@@ -0,0 +1,64 @@
1
+ name: Claude Code
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_review_comment:
7
+ types: [created]
8
+ issues:
9
+ types: [opened, assigned]
10
+ pull_request_review:
11
+ types: [submitted]
12
+
13
+ jobs:
14
+ claude:
15
+ if: |
16
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19
+ (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: read
23
+ pull-requests: read
24
+ issues: read
25
+ id-token: write
26
+ actions: read # Required for Claude to read CI results on PRs
27
+ steps:
28
+ - name: Checkout repository
29
+ uses: actions/checkout@v4
30
+ with:
31
+ fetch-depth: 1
32
+
33
+ - name: Run Claude Code
34
+ id: claude
35
+ uses: anthropics/claude-code-action@beta
36
+ with:
37
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
38
+
39
+ # This is an optional setting that allows Claude to read CI results on PRs
40
+ additional_permissions: |
41
+ actions: read
42
+
43
+ # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
44
+ # model: "claude-opus-4-20250514"
45
+
46
+ # Optional: Customize the trigger phrase (default: @claude)
47
+ # trigger_phrase: "/claude"
48
+
49
+ # Optional: Trigger when specific user is assigned to an issue
50
+ # assignee_trigger: "claude-bot"
51
+
52
+ # Optional: Allow Claude to run specific commands
53
+ # allowed_tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)"
54
+
55
+ # Optional: Add custom instructions for Claude to customize its behavior for your project
56
+ # custom_instructions: |
57
+ # Follow our coding standards
58
+ # Ensure all new code has tests
59
+ # Use TypeScript for new files
60
+
61
+ # Optional: Custom environment variables for Claude
62
+ # claude_env: |
63
+ # NODE_ENV: test
64
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlsaber
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: SQLSaber - Agentic SQL assistant like Claude Code
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -21,6 +21,15 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  # SQLSaber
23
23
 
24
+ ```
25
+ ███████ ██████ ██ ███████ █████ ██████ ███████ ██████
26
+ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
27
+ ███████ ██ ██ ██ ███████ ███████ ██████ █████ ██████
28
+ ██ ██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
29
+ ███████ ██████ ███████ ███████ ██ ██ ██████ ███████ ██ ██
30
+ ▀▀
31
+ ```
32
+
24
33
  > Use the agent Luke!
25
34
 
26
35
  SQLSaber is an agentic SQL assistant. Think Claude Code but for SQL.
@@ -1,5 +1,14 @@
1
1
  # SQLSaber
2
2
 
3
+ ```
4
+ ███████ ██████ ██ ███████ █████ ██████ ███████ ██████
5
+ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
6
+ ███████ ██ ██ ██ ███████ ███████ ██████ █████ ██████
7
+ ██ ██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
8
+ ███████ ██████ ███████ ███████ ██ ██ ██████ ███████ ██ ██
9
+ ▀▀
10
+ ```
11
+
3
12
  > Use the agent Luke!
4
13
 
5
14
  SQLSaber is an agentic SQL assistant. Think Claude Code but for SQL.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sqlsaber"
3
- version = "0.11.0"
3
+ version = "0.12.0"
4
4
  description = "SQLSaber - Agentic SQL assistant like Claude Code"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -43,7 +43,7 @@ def meta_handler(
43
43
  str | None,
44
44
  cyclopts.Parameter(
45
45
  ["--database", "-d"],
46
- help="Database connection name (uses default if not specified)",
46
+ help="Database connection name or direct file path for CSV/SQLite files (uses default if not specified)",
47
47
  ),
48
48
  ] = None,
49
49
  ):
@@ -54,6 +54,8 @@ def meta_handler(
54
54
  saber # Start interactive mode
55
55
  saber "show me all users" # Run a single query with default database
56
56
  saber -d mydb "show me users" # Run a query with specific database
57
+ saber -d data.csv "show me users" # Run a query with ad-hoc CSV file
58
+ saber -d data.db "show me users" # Run a query with ad-hoc SQLite file
57
59
  echo "show me all users" | saber # Read query from stdin
58
60
  cat query.txt | saber # Read query from file via stdin
59
61
  """
@@ -73,7 +75,7 @@ def query(
73
75
  str | None,
74
76
  cyclopts.Parameter(
75
77
  ["--database", "-d"],
76
- help="Database connection name (uses default if not specified)",
78
+ help="Database connection name or direct file path for CSV/SQLite files (uses default if not specified)",
77
79
  ),
78
80
  ] = None,
79
81
  ):
@@ -88,6 +90,8 @@ def query(
88
90
  Examples:
89
91
  saber # Start interactive mode
90
92
  saber "show me all users" # Run a single query
93
+ saber -d data.csv "show users" # Run a query with ad-hoc CSV file
94
+ saber -d data.db "show users" # Run a query with ad-hoc SQLite file
91
95
  echo "show me all users" | saber # Read query from stdin
92
96
  """
93
97
 
@@ -101,7 +105,7 @@ def query(
101
105
  # If stdin was empty, fall back to interactive mode
102
106
  actual_query = None
103
107
 
104
- # Get database configuration or handle direct CSV file
108
+ # Get database configuration or handle direct file paths
105
109
  if database:
106
110
  # Check if this is a direct CSV file path
107
111
  if database.endswith(".csv"):
@@ -110,6 +114,13 @@ def query(
110
114
  raise CLIError(f"CSV file '{database}' not found.")
111
115
  connection_string = f"csv:///{csv_path}"
112
116
  db_name = csv_path.stem
117
+ # Check if this is a direct SQLite file path
118
+ elif database.endswith((".db", ".sqlite", ".sqlite3")):
119
+ sqlite_path = Path(database).expanduser().resolve()
120
+ if not sqlite_path.exists():
121
+ raise CLIError(f"SQLite file '{database}' not found.")
122
+ connection_string = f"sqlite:///{sqlite_path}"
123
+ db_name = sqlite_path.stem
113
124
  else:
114
125
  # Look up configured database connection
115
126
  db_config = config_manager.get_database(database)
@@ -918,7 +918,7 @@ wheels = [
918
918
 
919
919
  [[package]]
920
920
  name = "sqlsaber"
921
- version = "0.11.0"
921
+ version = "0.12.0"
922
922
  source = { editable = "." }
923
923
  dependencies = [
924
924
  { name = "aiomysql" },
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