cloudcat 0.3.8__tar.gz → 0.5.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 (68) hide show
  1. {cloudcat-0.3.8 → cloudcat-0.5.1}/PKG-INFO +103 -35
  2. {cloudcat-0.3.8 → cloudcat-0.5.1}/README.md +89 -17
  3. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/__init__.py +1 -1
  4. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/cli.py +529 -268
  5. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/compression.py +13 -4
  6. cloudcat-0.5.1/cloudcat/data/SKILL.md +114 -0
  7. cloudcat-0.5.1/cloudcat/filtering.py +225 -0
  8. cloudcat-0.5.1/cloudcat/formatters.py +159 -0
  9. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/progress.py +21 -9
  10. cloudcat-0.5.1/cloudcat/readers/avro.py +197 -0
  11. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/csv.py +63 -18
  12. cloudcat-0.5.1/cloudcat/readers/json.py +372 -0
  13. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/orc.py +88 -31
  14. cloudcat-0.5.1/cloudcat/readers/parquet.py +380 -0
  15. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/text.py +92 -8
  16. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/azure.py +67 -21
  17. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/base.py +73 -25
  18. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/gcs.py +4 -2
  19. cloudcat-0.5.1/cloudcat/storage/local.py +58 -0
  20. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/s3.py +4 -2
  21. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/filesystems.py +23 -10
  22. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/stats.py +7 -0
  23. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/tracking.py +2 -1
  24. cloudcat-0.5.1/cloudcat/user_config.py +107 -0
  25. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/PKG-INFO +103 -35
  26. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/SOURCES.txt +16 -4
  27. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/requires.txt +15 -0
  28. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/top_level.txt +0 -1
  29. cloudcat-0.5.1/pyproject.toml +104 -0
  30. cloudcat-0.5.1/tests/test_bugfix_round2.py +246 -0
  31. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_cli.py +6 -6
  32. cloudcat-0.5.1/tests/test_cli_features.py +121 -0
  33. cloudcat-0.5.1/tests/test_config_stats_completion.py +110 -0
  34. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_integration.py +9 -5
  35. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_path_parsing.py +5 -5
  36. cloudcat-0.5.1/tests/test_read_data_streaming.py +59 -0
  37. cloudcat-0.5.1/tests/test_readers_roundtrip.py +122 -0
  38. cloudcat-0.5.1/tests/test_regressions.py +93 -0
  39. cloudcat-0.5.1/tests/test_skill_install.py +70 -0
  40. cloudcat-0.5.1/tests/test_storage_listing.py +75 -0
  41. cloudcat-0.5.1/tests/test_streaming_stats.py +60 -0
  42. cloudcat-0.5.1/tests/test_tracking.py +62 -0
  43. cloudcat-0.5.1/tests/test_v05_features.py +256 -0
  44. cloudcat-0.5.1/tests/test_visual_output.py +95 -0
  45. cloudcat-0.3.8/cloudcat/filtering.py +0 -120
  46. cloudcat-0.3.8/cloudcat/formatters.py +0 -93
  47. cloudcat-0.3.8/cloudcat/readers/avro.py +0 -144
  48. cloudcat-0.3.8/cloudcat/readers/json.py +0 -254
  49. cloudcat-0.3.8/cloudcat/readers/parquet.py +0 -282
  50. cloudcat-0.3.8/pyproject.toml +0 -3
  51. cloudcat-0.3.8/setup.py +0 -96
  52. cloudcat-0.3.8/tests/__init__.py +0 -0
  53. cloudcat-0.3.8/tests/conftest.py +0 -45
  54. {cloudcat-0.3.8 → cloudcat-0.5.1}/LICENSE +0 -0
  55. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/config.py +0 -0
  56. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/__init__.py +0 -0
  57. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/__init__.py +0 -0
  58. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/__init__.py +0 -0
  59. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/dependency_links.txt +0 -0
  60. {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/entry_points.txt +0 -0
  61. {cloudcat-0.3.8 → cloudcat-0.5.1}/setup.cfg +0 -0
  62. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_compression.py +0 -0
  63. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_config.py +0 -0
  64. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_data_reading.py +0 -0
  65. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_file_filtering.py +0 -0
  66. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_filtering.py +0 -0
  67. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_format_detection.py +0 -0
  68. {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_output_formatting.py +0 -0
@@ -1,10 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudcat
3
- Version: 0.3.8
3
+ Version: 0.5.1
4
4
  Summary: Preview and analyze data files in Google Cloud Storage, AWS S3, and Azure Data Lake Storage Gen2 from your terminal
5
- Home-page: https://github.com/jonathansudhakar1/cloudcat
6
5
  Author: Jonathan Sudhakar
7
- Author-email: jonathan@example.com
6
+ License: MIT
8
7
  Project-URL: Homepage, https://github.com/jonathansudhakar1/cloudcat
9
8
  Project-URL: Documentation, https://cloudcatcli.com
10
9
  Project-URL: Bug Reports, https://github.com/jonathansudhakar1/cloudcat/issues
@@ -22,14 +21,12 @@ Classifier: Environment :: Console
22
21
  Classifier: License :: OSI Approved :: MIT License
23
22
  Classifier: Operating System :: OS Independent
24
23
  Classifier: Programming Language :: Python :: 3
25
- Classifier: Programming Language :: Python :: 3.7
26
- Classifier: Programming Language :: Python :: 3.8
27
24
  Classifier: Programming Language :: Python :: 3.9
28
25
  Classifier: Programming Language :: Python :: 3.10
29
26
  Classifier: Programming Language :: Python :: 3.11
30
27
  Classifier: Programming Language :: Python :: 3.12
31
28
  Classifier: Programming Language :: Python :: 3.13
32
- Requires-Python: >=3.7
29
+ Requires-Python: >=3.9
33
30
  Description-Content-Type: text/markdown
34
31
  License-File: LICENSE
35
32
  Requires-Dist: click>=8.0.0
@@ -39,7 +36,9 @@ Requires-Dist: colorama>=0.4.4
39
36
  Requires-Dist: google-cloud-storage>=2.0.0
40
37
  Requires-Dist: boto3>=1.18.0
41
38
  Requires-Dist: azure-storage-file-datalake>=12.0.0
39
+ Requires-Dist: azure-storage-blob>=12.0.0
42
40
  Requires-Dist: azure-identity>=1.0.0
41
+ Requires-Dist: tomli>=1.1.0; python_version < "3.11"
43
42
  Provides-Extra: parquet
44
43
  Requires-Dist: pyarrow>=5.0.0; extra == "parquet"
45
44
  Provides-Extra: avro
@@ -62,19 +61,16 @@ Requires-Dist: fastavro>=1.4.0; extra == "all"
62
61
  Requires-Dist: zstandard>=0.15.0; extra == "all"
63
62
  Requires-Dist: lz4>=3.0.0; extra == "all"
64
63
  Requires-Dist: python-snappy>=0.6.0; extra == "all"
65
- Dynamic: author
66
- Dynamic: author-email
67
- Dynamic: classifier
68
- Dynamic: description
69
- Dynamic: description-content-type
70
- Dynamic: home-page
71
- Dynamic: keywords
64
+ Provides-Extra: test
65
+ Requires-Dist: pytest>=6.0.0; extra == "test"
66
+ Requires-Dist: pytest-mock>=3.6.0; extra == "test"
67
+ Provides-Extra: dev
68
+ Requires-Dist: pytest>=6.0.0; extra == "dev"
69
+ Requires-Dist: pytest-mock>=3.6.0; extra == "dev"
70
+ Requires-Dist: moto>=4.0.0; extra == "dev"
71
+ Requires-Dist: build; extra == "dev"
72
+ Requires-Dist: twine; extra == "dev"
72
73
  Dynamic: license-file
73
- Dynamic: project-url
74
- Dynamic: provides-extra
75
- Dynamic: requires-dist
76
- Dynamic: requires-python
77
- Dynamic: summary
78
74
 
79
75
  <p align="center">
80
76
  <img src="https://raw.githubusercontent.com/jonathansudhakar1/cloudcat/main/assets/logo.png" alt="CloudCat Logo" width="200">
@@ -174,14 +170,17 @@ pip install --upgrade 'cloudcat[all]'
174
170
  ### Requirements
175
171
 
176
172
  - **Homebrew**: macOS (Apple Silicon only). Intel Mac users should use pip.
177
- - **pip**: Python 3.7+ (all platforms)
173
+ - **pip**: Python 3.9+ (all platforms)
178
174
  - Cloud provider credentials configured (see [Authentication](#authentication))
179
175
 
180
176
  ## Quick Start
181
177
 
182
178
  ```bash
183
- # Preview a CSV file from GCS
184
- cloudcat -p gcs://my-bucket/data.csv
179
+ # Preview a CSV file from GCS (PATH is positional; -p/--path also works)
180
+ cloudcat gcs://my-bucket/data.csv
181
+
182
+ # Preview a local file — no cloud credentials needed
183
+ cloudcat ./data.parquet
185
184
 
186
185
  # Preview a Parquet file from S3
187
186
  cloudcat -p s3://my-bucket/analytics/events.parquet
@@ -204,8 +203,8 @@ cloudcat -p s3://my-bucket/spark-output/ -i parquet
204
203
  # Read compressed files (auto-detected)
205
204
  cloudcat -p gcs://my-bucket/data.csv.gz
206
205
 
207
- # Filter rows with WHERE clause
208
- cloudcat -p s3://bucket/users.parquet --where "status=active"
206
+ # Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
207
+ cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
209
208
 
210
209
  # Skip first 100 rows (pagination)
211
210
  cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
@@ -220,6 +219,7 @@ cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
220
219
  | Google Cloud Storage | `gcs://` or `gs://` | ✅ Supported |
221
220
  | Amazon S3 | `s3://` | ✅ Supported |
222
221
  | Azure Data Lake Gen2 | `abfss://` | ✅ Supported |
222
+ | Local files | `file://` or a plain path | ✅ Supported (no credentials needed) |
223
223
 
224
224
  ### File Format Support
225
225
 
@@ -242,8 +242,8 @@ CloudCat uses intelligent streaming to minimize data transfer and egress costs:
242
242
  |--------|-------------|---------|-------------------|----------------|
243
243
  | Parquet | None/Internal | ✅ | ✅ Range requests | ✅ |
244
244
  | Parquet | External (.gz) | ❌ | ❌ | ❌ |
245
- | ORC | None/Internal | | | |
246
- | ORC | External (.gz) | ❌ | | |
245
+ | ORC | None/Internal | Stripe-by-stripe | | |
246
+ | ORC | External (.gz) | ❌ | | |
247
247
  | CSV | None | ✅ | ❌ | ✅ |
248
248
  | CSV | gzip/zstd/lz4/bz2 | ✅ | ❌ | ✅ |
249
249
  | CSV | snappy | ❌ | ❌ | ❌ |
@@ -272,7 +272,7 @@ CloudCat automatically detects and decompresses files based on extension (e.g.,
272
272
 
273
273
  | Format | Flag | Description |
274
274
  |--------|------|-------------|
275
- | Table | `-o table` | Beautiful ASCII table with colored headers (default) |
275
+ | Table | `-o table` | Rounded table with bold headers and type-aware coloring (default) |
276
276
  | JSON | `-o json` | Standard JSON Lines output |
277
277
  | Pretty JSON | `-o jsonp` | Syntax-highlighted, indented JSON |
278
278
  | CSV | `-o csv` | Comma-separated values |
@@ -329,8 +329,8 @@ cloudcat -p gcs://bucket/events.jsonl
329
329
  ### Filtering and Pagination
330
330
 
331
331
  ```bash
332
- # Filter rows with WHERE clause
333
- cloudcat -p s3://bucket/users.parquet --where "status=active"
332
+ # Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
333
+ cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
334
334
  cloudcat -p gcs://bucket/events.json --where "age>30"
335
335
  cloudcat -p s3://bucket/logs.csv --where "level=ERROR"
336
336
 
@@ -479,13 +479,17 @@ cloudcat -p s3://api-dumps/response.json -o csv > data.csv
479
479
  Usage: cloudcat [OPTIONS]
480
480
 
481
481
  Options:
482
- -p, --path TEXT Cloud storage path (required)
482
+ PATH Positional path: gs://, gcs://, s3://, abfss://,
483
+ file:// URL, or a plain local path
484
+ (-p/--path remains as a compatible alias)
483
485
  Format: gcs://bucket/path, s3://bucket/path,
484
486
  or abfss://container@account.dfs.core.windows.net/path
485
487
 
486
488
  -o, --output-format TEXT Output format: table, json, jsonp, csv
487
489
  [default: table]
488
490
 
491
+ -O, --output-file PATH Write rendered data to a file instead of stdout
492
+
489
493
  -i, --input-format TEXT Input format: csv, json, parquet, avro, orc, text
490
494
  [default: auto-detect from extension]
491
495
 
@@ -498,9 +502,12 @@ Options:
498
502
  --offset INTEGER Skip first N rows
499
503
  [default: 0]
500
504
 
501
- -w, --where TEXT Filter rows with SQL-like conditions
502
- Examples: "status=active", "age>30",
503
- "name contains john", "email endswith @gmail.com"
505
+ -w, --where TEXT Filter rows with SQL-like conditions; combine
506
+ with AND/OR. Streams the file and stops at
507
+ --num-rows matches; Parquet skips row groups
508
+ via column statistics.
509
+ Examples: "status=active", "age>30 AND age<65",
510
+ "level=ERROR or level=FATAL"
504
511
 
505
512
  -s, --schema TEXT Schema display: show, dont_show, schema_only
506
513
  [default: show]
@@ -516,13 +523,25 @@ Options:
516
523
  -d, --delimiter TEXT CSV delimiter (use \t for tab)
517
524
  [default: comma]
518
525
 
526
+ --no-color Disable colored output (also honors NO_COLOR).
527
+ Color is auto-disabled when output is piped.
528
+
519
529
  --profile TEXT AWS profile name (for S3 access)
520
530
 
521
531
  --project TEXT GCP project ID (for GCS access)
522
532
 
523
533
  --credentials TEXT Path to GCP service account JSON file
524
534
 
525
- --account TEXT Azure storage account name
535
+ --stats Show per-column statistics (nulls, distinct,
536
+ min/max) over the retrieved rows
537
+
538
+ --config-profile TEXT Named profile from ~/.config/cloudcat/config.toml
539
+
540
+ --completion [bash|zsh|fish] Print the shell completion script and exit
541
+
542
+ --az-access-key TEXT Azure storage account access key
543
+
544
+ -y, --yes Skip confirmation prompts (for scripting)
526
545
 
527
546
  --help Show this message and exit
528
547
  ```
@@ -696,6 +715,50 @@ pip install -e ".[all]"
696
715
  pytest
697
716
  ```
698
717
 
718
+ ## Use with AI Agents
719
+
720
+ CloudCat is optimized for AI coding agents: **stdout carries only data**
721
+ (diagnostics go to stderr, color auto-disables when piped), `-o json` emits
722
+ parseable NDJSON, `-y` makes every command non-interactive, filtering streams
723
+ with Parquet row-group pushdown, and local files need no credentials.
724
+
725
+ The repo ships an [Agent Skill](https://agentskills.io) at
726
+ [`skills/cloudcat/SKILL.md`](skills/cloudcat/SKILL.md) — a compact reference
727
+ that teaches agents the optimal scanning recipes (schema discovery, filtered
728
+ sampling, metadata-fast counts, column profiling) with zero trial-and-error.
729
+
730
+ Install the skill (pick one):
731
+
732
+ ```bash
733
+ # 1. Built-in installer — the skill ships inside the package (works offline)
734
+ cloudcat --install-skill claude # Claude Code, all projects (~/.claude/skills)
735
+ cloudcat --install-skill claude-project # Claude Code, this project (./.claude/skills)
736
+ cloudcat --install-skill codex # OpenAI Codex CLI (~/.codex/skills)
737
+ cloudcat --install-skill print # stdout — pipe into any other agent's instructions
738
+
739
+ # 2. Claude Code plugin marketplace
740
+ /plugin marketplace add jonathansudhakar1/cloudcat
741
+ /plugin install cloudcat@cloudcat
742
+
743
+ # 3. Or fetch it directly (no cloudcat install needed)
744
+ curl -fsSL --create-dirs -o ~/.claude/skills/cloudcat/SKILL.md \
745
+ https://raw.githubusercontent.com/jonathansudhakar1/cloudcat/main/skills/cloudcat/SKILL.md
746
+ ```
747
+
748
+ The recipes agents learn:
749
+
750
+ ```bash
751
+ cloudcat s3://bucket/events/ -s schema_only -y # structure, no data read
752
+ cloudcat s3://bucket/events/ --count -s schema_only -y # exact rows (Parquet/ORC: metadata-only)
753
+ cloudcat s3://bucket/events/ -w "type=purchase AND amount>250" \
754
+ -n 5 -o json -s dont_show -y # filtered NDJSON sample
755
+ cloudcat s3://bucket/events/ --stats -n 0 -s dont_show -y # nulls/distinct/min/max per column
756
+ ```
757
+
758
+ Works with any agent framework that can run shell commands and load the
759
+ SKILL.md (or plain markdown) as instructions. See the
760
+ [AI Agents docs](https://cloudcatcli.com/#agents) for details.
761
+
699
762
  ## Roadmap
700
763
 
701
764
  - [x] Azure Blob Storage support
@@ -705,9 +768,14 @@ pytest
705
768
  - [x] SQL-like filtering (`--where` clause)
706
769
  - [x] Compression support (gzip, zstd, lz4, snappy, bz2)
707
770
  - [x] Row offset/pagination (`--offset`)
771
+ - [x] Output to file with `--output-file`
772
+ - [x] Compound WHERE conditions (`AND`/`OR`)
773
+ - [x] Streaming WHERE with Parquet row-group pushdown
774
+ - [x] Local file support (`file://` or plain paths)
775
+ - [x] Configuration file with named profiles
776
+ - [x] Column statistics (`--stats`)
777
+ - [x] Shell completion (bash/zsh/fish)
708
778
  - [ ] Interactive mode with pagination
709
- - [ ] Output to file with `--output-file`
710
- - [ ] Configuration file support
711
779
 
712
780
  ## Related Projects
713
781
 
@@ -96,14 +96,17 @@ pip install --upgrade 'cloudcat[all]'
96
96
  ### Requirements
97
97
 
98
98
  - **Homebrew**: macOS (Apple Silicon only). Intel Mac users should use pip.
99
- - **pip**: Python 3.7+ (all platforms)
99
+ - **pip**: Python 3.9+ (all platforms)
100
100
  - Cloud provider credentials configured (see [Authentication](#authentication))
101
101
 
102
102
  ## Quick Start
103
103
 
104
104
  ```bash
105
- # Preview a CSV file from GCS
106
- cloudcat -p gcs://my-bucket/data.csv
105
+ # Preview a CSV file from GCS (PATH is positional; -p/--path also works)
106
+ cloudcat gcs://my-bucket/data.csv
107
+
108
+ # Preview a local file — no cloud credentials needed
109
+ cloudcat ./data.parquet
107
110
 
108
111
  # Preview a Parquet file from S3
109
112
  cloudcat -p s3://my-bucket/analytics/events.parquet
@@ -126,8 +129,8 @@ cloudcat -p s3://my-bucket/spark-output/ -i parquet
126
129
  # Read compressed files (auto-detected)
127
130
  cloudcat -p gcs://my-bucket/data.csv.gz
128
131
 
129
- # Filter rows with WHERE clause
130
- cloudcat -p s3://bucket/users.parquet --where "status=active"
132
+ # Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
133
+ cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
131
134
 
132
135
  # Skip first 100 rows (pagination)
133
136
  cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
@@ -142,6 +145,7 @@ cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
142
145
  | Google Cloud Storage | `gcs://` or `gs://` | ✅ Supported |
143
146
  | Amazon S3 | `s3://` | ✅ Supported |
144
147
  | Azure Data Lake Gen2 | `abfss://` | ✅ Supported |
148
+ | Local files | `file://` or a plain path | ✅ Supported (no credentials needed) |
145
149
 
146
150
  ### File Format Support
147
151
 
@@ -164,8 +168,8 @@ CloudCat uses intelligent streaming to minimize data transfer and egress costs:
164
168
  |--------|-------------|---------|-------------------|----------------|
165
169
  | Parquet | None/Internal | ✅ | ✅ Range requests | ✅ |
166
170
  | Parquet | External (.gz) | ❌ | ❌ | ❌ |
167
- | ORC | None/Internal | | | |
168
- | ORC | External (.gz) | ❌ | | |
171
+ | ORC | None/Internal | Stripe-by-stripe | | |
172
+ | ORC | External (.gz) | ❌ | | |
169
173
  | CSV | None | ✅ | ❌ | ✅ |
170
174
  | CSV | gzip/zstd/lz4/bz2 | ✅ | ❌ | ✅ |
171
175
  | CSV | snappy | ❌ | ❌ | ❌ |
@@ -194,7 +198,7 @@ CloudCat automatically detects and decompresses files based on extension (e.g.,
194
198
 
195
199
  | Format | Flag | Description |
196
200
  |--------|------|-------------|
197
- | Table | `-o table` | Beautiful ASCII table with colored headers (default) |
201
+ | Table | `-o table` | Rounded table with bold headers and type-aware coloring (default) |
198
202
  | JSON | `-o json` | Standard JSON Lines output |
199
203
  | Pretty JSON | `-o jsonp` | Syntax-highlighted, indented JSON |
200
204
  | CSV | `-o csv` | Comma-separated values |
@@ -251,8 +255,8 @@ cloudcat -p gcs://bucket/events.jsonl
251
255
  ### Filtering and Pagination
252
256
 
253
257
  ```bash
254
- # Filter rows with WHERE clause
255
- cloudcat -p s3://bucket/users.parquet --where "status=active"
258
+ # Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
259
+ cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
256
260
  cloudcat -p gcs://bucket/events.json --where "age>30"
257
261
  cloudcat -p s3://bucket/logs.csv --where "level=ERROR"
258
262
 
@@ -401,13 +405,17 @@ cloudcat -p s3://api-dumps/response.json -o csv > data.csv
401
405
  Usage: cloudcat [OPTIONS]
402
406
 
403
407
  Options:
404
- -p, --path TEXT Cloud storage path (required)
408
+ PATH Positional path: gs://, gcs://, s3://, abfss://,
409
+ file:// URL, or a plain local path
410
+ (-p/--path remains as a compatible alias)
405
411
  Format: gcs://bucket/path, s3://bucket/path,
406
412
  or abfss://container@account.dfs.core.windows.net/path
407
413
 
408
414
  -o, --output-format TEXT Output format: table, json, jsonp, csv
409
415
  [default: table]
410
416
 
417
+ -O, --output-file PATH Write rendered data to a file instead of stdout
418
+
411
419
  -i, --input-format TEXT Input format: csv, json, parquet, avro, orc, text
412
420
  [default: auto-detect from extension]
413
421
 
@@ -420,9 +428,12 @@ Options:
420
428
  --offset INTEGER Skip first N rows
421
429
  [default: 0]
422
430
 
423
- -w, --where TEXT Filter rows with SQL-like conditions
424
- Examples: "status=active", "age>30",
425
- "name contains john", "email endswith @gmail.com"
431
+ -w, --where TEXT Filter rows with SQL-like conditions; combine
432
+ with AND/OR. Streams the file and stops at
433
+ --num-rows matches; Parquet skips row groups
434
+ via column statistics.
435
+ Examples: "status=active", "age>30 AND age<65",
436
+ "level=ERROR or level=FATAL"
426
437
 
427
438
  -s, --schema TEXT Schema display: show, dont_show, schema_only
428
439
  [default: show]
@@ -438,13 +449,25 @@ Options:
438
449
  -d, --delimiter TEXT CSV delimiter (use \t for tab)
439
450
  [default: comma]
440
451
 
452
+ --no-color Disable colored output (also honors NO_COLOR).
453
+ Color is auto-disabled when output is piped.
454
+
441
455
  --profile TEXT AWS profile name (for S3 access)
442
456
 
443
457
  --project TEXT GCP project ID (for GCS access)
444
458
 
445
459
  --credentials TEXT Path to GCP service account JSON file
446
460
 
447
- --account TEXT Azure storage account name
461
+ --stats Show per-column statistics (nulls, distinct,
462
+ min/max) over the retrieved rows
463
+
464
+ --config-profile TEXT Named profile from ~/.config/cloudcat/config.toml
465
+
466
+ --completion [bash|zsh|fish] Print the shell completion script and exit
467
+
468
+ --az-access-key TEXT Azure storage account access key
469
+
470
+ -y, --yes Skip confirmation prompts (for scripting)
448
471
 
449
472
  --help Show this message and exit
450
473
  ```
@@ -618,6 +641,50 @@ pip install -e ".[all]"
618
641
  pytest
619
642
  ```
620
643
 
644
+ ## Use with AI Agents
645
+
646
+ CloudCat is optimized for AI coding agents: **stdout carries only data**
647
+ (diagnostics go to stderr, color auto-disables when piped), `-o json` emits
648
+ parseable NDJSON, `-y` makes every command non-interactive, filtering streams
649
+ with Parquet row-group pushdown, and local files need no credentials.
650
+
651
+ The repo ships an [Agent Skill](https://agentskills.io) at
652
+ [`skills/cloudcat/SKILL.md`](skills/cloudcat/SKILL.md) — a compact reference
653
+ that teaches agents the optimal scanning recipes (schema discovery, filtered
654
+ sampling, metadata-fast counts, column profiling) with zero trial-and-error.
655
+
656
+ Install the skill (pick one):
657
+
658
+ ```bash
659
+ # 1. Built-in installer — the skill ships inside the package (works offline)
660
+ cloudcat --install-skill claude # Claude Code, all projects (~/.claude/skills)
661
+ cloudcat --install-skill claude-project # Claude Code, this project (./.claude/skills)
662
+ cloudcat --install-skill codex # OpenAI Codex CLI (~/.codex/skills)
663
+ cloudcat --install-skill print # stdout — pipe into any other agent's instructions
664
+
665
+ # 2. Claude Code plugin marketplace
666
+ /plugin marketplace add jonathansudhakar1/cloudcat
667
+ /plugin install cloudcat@cloudcat
668
+
669
+ # 3. Or fetch it directly (no cloudcat install needed)
670
+ curl -fsSL --create-dirs -o ~/.claude/skills/cloudcat/SKILL.md \
671
+ https://raw.githubusercontent.com/jonathansudhakar1/cloudcat/main/skills/cloudcat/SKILL.md
672
+ ```
673
+
674
+ The recipes agents learn:
675
+
676
+ ```bash
677
+ cloudcat s3://bucket/events/ -s schema_only -y # structure, no data read
678
+ cloudcat s3://bucket/events/ --count -s schema_only -y # exact rows (Parquet/ORC: metadata-only)
679
+ cloudcat s3://bucket/events/ -w "type=purchase AND amount>250" \
680
+ -n 5 -o json -s dont_show -y # filtered NDJSON sample
681
+ cloudcat s3://bucket/events/ --stats -n 0 -s dont_show -y # nulls/distinct/min/max per column
682
+ ```
683
+
684
+ Works with any agent framework that can run shell commands and load the
685
+ SKILL.md (or plain markdown) as instructions. See the
686
+ [AI Agents docs](https://cloudcatcli.com/#agents) for details.
687
+
621
688
  ## Roadmap
622
689
 
623
690
  - [x] Azure Blob Storage support
@@ -627,9 +694,14 @@ pytest
627
694
  - [x] SQL-like filtering (`--where` clause)
628
695
  - [x] Compression support (gzip, zstd, lz4, snappy, bz2)
629
696
  - [x] Row offset/pagination (`--offset`)
697
+ - [x] Output to file with `--output-file`
698
+ - [x] Compound WHERE conditions (`AND`/`OR`)
699
+ - [x] Streaming WHERE with Parquet row-group pushdown
700
+ - [x] Local file support (`file://` or plain paths)
701
+ - [x] Configuration file with named profiles
702
+ - [x] Column statistics (`--stats`)
703
+ - [x] Shell completion (bash/zsh/fish)
630
704
  - [ ] Interactive mode with pagination
631
- - [ ] Output to file with `--output-file`
632
- - [ ] Configuration file support
633
705
 
634
706
  ## Related Projects
635
707
 
@@ -2,4 +2,4 @@
2
2
  #!/usr/bin/env python
3
3
  """cloudcat - A CLI utility to read and display files from cloud storage."""
4
4
 
5
- __version__ = "0.3.8"
5
+ __version__ = "0.5.1"