recce-cloud-nightly 1.27.0.20251130__py3-none-any.whl → 1.31.0.20260101__py3-none-any.whl

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 recce-cloud-nightly might be problematic. Click here for more details.

@@ -0,0 +1,801 @@
1
+ Metadata-Version: 2.4
2
+ Name: recce-cloud-nightly
3
+ Version: 1.31.0.20260101
4
+ Summary: Lightweight CLI for Recce Cloud operations
5
+ Project-URL: Bug Tracker, https://github.com/InfuseAI/recce/issues
6
+ Author-email: InfuseAI Dev Team <dev@infuseai.io>
7
+ License: Apache-2.0
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3.9
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Requires-Python: >=3.9
17
+ Requires-Dist: click>=7.1
18
+ Requires-Dist: requests>=2.28.1
19
+ Requires-Dist: rich>=12.0.0
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Recce Cloud CLI
23
+
24
+ Lightweight command-line tool for managing dbt artifacts with Recce Cloud in CI/CD environments.
25
+
26
+ ## Overview
27
+
28
+ The Recce Cloud CLI (`recce-cloud`) is a standalone tool designed for CI/CD pipelines that need to upload and download dbt artifacts (manifest.json and catalog.json) to/from Recce Cloud without the full `recce` package dependencies.
29
+
30
+ **Key Features:**
31
+
32
+ - 🚀 Lightweight - minimal dependencies for fast CI/CD execution
33
+ - 🤖 Auto-detection - automatically detects CI platform, repository, and PR/MR context
34
+ - ⬆️ Upload - push dbt artifacts to Recce Cloud sessions
35
+ - ⬇️ Download - pull dbt artifacts from Recce Cloud sessions
36
+ - 🔐 Flexible authentication - works with CI tokens or explicit API tokens
37
+ - ✅ Platform-specific - optimized for GitHub Actions and GitLab CI
38
+
39
+ ## Installation
40
+
41
+ ```bash
42
+ pip install recce-cloud
43
+ ```
44
+
45
+ Or in your CI/CD workflow:
46
+
47
+ ```yaml
48
+ # GitHub Actions
49
+ - name: Install recce-cloud
50
+ run: pip install recce-cloud
51
+
52
+ # GitLab CI
53
+ install:
54
+ script:
55
+ - pip install recce-cloud
56
+ ```
57
+
58
+ ## Quick Start
59
+
60
+ ### GitHub Actions
61
+
62
+ **Upload artifacts:**
63
+
64
+ ```yaml
65
+ - name: Upload to Recce Cloud
66
+ run: recce-cloud upload
67
+ env:
68
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
69
+ ```
70
+
71
+ **Download artifacts:**
72
+
73
+ ```yaml
74
+ - name: Download from Recce Cloud
75
+ run: recce-cloud download --prod --target-path target-base
76
+ env:
77
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
78
+ ```
79
+
80
+ ### GitLab CI
81
+
82
+ **Upload artifacts:**
83
+
84
+ ```yaml
85
+ recce-upload:
86
+ script:
87
+ - recce-cloud upload
88
+ ```
89
+
90
+ **Download artifacts:**
91
+
92
+ ```yaml
93
+ recce-download:
94
+ script:
95
+ - recce-cloud download --prod --target-path target-base
96
+ ```
97
+
98
+ ## Upload Workflows
99
+
100
+ The `recce-cloud upload` command supports two workflows:
101
+
102
+ ### 1. Platform-Specific Workflow (Recommended)
103
+
104
+ **For GitHub Actions and GitLab CI**
105
+
106
+ Automatically creates Recce Cloud sessions using platform-specific APIs. No session ID required.
107
+
108
+ **Features:**
109
+
110
+ - ✅ Auto-creates session with `touch-recce-session` API
111
+ - ✅ Auto-detects PR/MR context and links session
112
+ - ✅ Notifies upload completion
113
+ - ✅ Works with CI-provided tokens (GITHUB_TOKEN, CI_JOB_TOKEN)
114
+
115
+ **Usage:**
116
+
117
+ ```bash
118
+ # GitHub Actions
119
+ recce-cloud upload
120
+
121
+ # GitLab CI
122
+ recce-cloud upload
123
+
124
+ # With custom target path
125
+ recce-cloud upload --target-path custom-target
126
+
127
+ # With manual overrides
128
+ recce-cloud upload --cr 123 --type cr
129
+ ```
130
+
131
+ **Requirements:**
132
+
133
+ - Running in GitHub Actions or GitLab CI environment
134
+ - RECCE_API_TOKEN or CI-provided token (GITHUB_TOKEN/CI_JOB_TOKEN)
135
+ - dbt artifacts in target directory
136
+
137
+ ### 2. Generic Workflow
138
+
139
+ **For other CI platforms or existing sessions**
140
+
141
+ Uploads to a pre-existing Recce Cloud session using session ID.
142
+
143
+ **Usage:**
144
+
145
+ ```bash
146
+ # With session ID parameter
147
+ recce-cloud upload --session-id abc123
148
+
149
+ # With environment variable
150
+ export RECCE_SESSION_ID=abc123
151
+ recce-cloud upload
152
+
153
+ # With custom target path
154
+ recce-cloud upload --session-id abc123 --target-path my-target
155
+ ```
156
+
157
+ **Requirements:**
158
+
159
+ - Pre-created session ID (from Recce Cloud web app or API)
160
+ - RECCE_API_TOKEN
161
+ - dbt artifacts in target directory
162
+
163
+ ## Download Workflows
164
+
165
+ The `recce-cloud download` command supports two workflows:
166
+
167
+ ### 1. Platform-Specific Workflow (Recommended)
168
+
169
+ **For GitHub Actions and GitLab CI**
170
+
171
+ Automatically finds and downloads artifacts from Recce Cloud sessions using platform-specific APIs. No session ID required.
172
+
173
+ **Features:**
174
+
175
+ - ✅ Auto-detects PR/MR context
176
+ - ✅ Supports downloading production/base session with `--prod` flag
177
+ - ✅ Works with CI-provided tokens (GITHUB_TOKEN, CI_JOB_TOKEN)
178
+
179
+ **Usage:**
180
+
181
+ ```bash
182
+ # GitHub Actions - Download current PR session
183
+ recce-cloud download
184
+
185
+ # GitLab CI - Download current MR session
186
+ recce-cloud download
187
+
188
+ # Download production/base session
189
+ recce-cloud download --prod
190
+
191
+ # Download to custom target path
192
+ recce-cloud download --target-path target-base
193
+
194
+ # Force overwrite existing files
195
+ recce-cloud download --force
196
+ ```
197
+
198
+ **Requirements:**
199
+
200
+ - Running in GitHub Actions or GitLab CI environment
201
+ - CI-provided token (GITHUB_TOKEN/CI_JOB_TOKEN)
202
+ - Session must exist in Recce Cloud
203
+
204
+ ### 2. Generic Workflow
205
+
206
+ **For other CI platforms or specific sessions**
207
+
208
+ Downloads from a specific Recce Cloud session using session ID.
209
+
210
+ **Usage:**
211
+
212
+ ```bash
213
+ # With session ID parameter
214
+ recce-cloud download --session-id abc123
215
+
216
+ # With environment variable
217
+ export RECCE_SESSION_ID=abc123
218
+ recce-cloud download
219
+
220
+ # With custom target path
221
+ recce-cloud download --session-id abc123 --target-path my-target
222
+
223
+ # Force overwrite
224
+ recce-cloud download --session-id abc123 --force
225
+ ```
226
+
227
+ **Requirements:**
228
+
229
+ - Session ID (from Recce Cloud web app or API)
230
+ - RECCE_API_TOKEN
231
+ - Session must exist in Recce Cloud
232
+
233
+ ## Command Reference
234
+
235
+ ### `recce-cloud upload`
236
+
237
+ Upload dbt artifacts to Recce Cloud session.
238
+
239
+ **Options:**
240
+
241
+ | Option | Type | Default | Description |
242
+ | --------------- | ------- | -------- | --------------------------------------------- |
243
+ | `--target-path` | path | `target` | Path to dbt target directory |
244
+ | `--session-id` | string | - | Session ID for generic workflow (optional) |
245
+ | `--cr` | integer | - | Override PR/MR number |
246
+ | `--type` | choice | - | Override session type: `cr`, `prod`, `dev` |
247
+ | `--dry-run` | flag | false | Show what would be uploaded without uploading |
248
+
249
+ **Environment Variables:**
250
+
251
+ | Variable | Required | Description |
252
+ | ------------------ | ------------- | ------------------------------- |
253
+ | `RECCE_API_TOKEN` | Recommended | Recce Cloud API token |
254
+ | `RECCE_SESSION_ID` | Optional | Session ID for generic workflow |
255
+ | `GITHUB_TOKEN` | Explicit set | GitHub authentication (Actions) |
256
+ | `CI_JOB_TOKEN` | Auto-detected | GitLab authentication (CI) |
257
+
258
+ **Exit Codes:**
259
+
260
+ | Code | Description |
261
+ | ---- | --------------------------------------------------- |
262
+ | 0 | Success |
263
+ | 1 | Platform not supported (platform-specific workflow) |
264
+ | 2 | Authentication error |
265
+ | 3 | File validation error |
266
+ | 4 | Upload error |
267
+
268
+ ### `recce-cloud download`
269
+
270
+ Download dbt artifacts (manifest.json, catalog.json) from Recce Cloud session.
271
+
272
+ **Options:**
273
+
274
+ | Option | Type | Default | Description |
275
+ | --------------- | ------ | -------- | ---------------------------------------------------- |
276
+ | `--target-path` | path | `target` | Path to directory where artifacts will be downloaded |
277
+ | `--session-id` | string | - | Session ID for generic workflow (optional) |
278
+ | `--prod` | flag | false | Download production/base session |
279
+ | `--dry-run` | flag | false | Show what would be downloaded without downloading |
280
+ | `--force`, `-f` | flag | false | Overwrite existing files without prompting |
281
+
282
+ **Environment Variables:**
283
+
284
+ | Variable | Required | Description |
285
+ | ------------------ | ------------- | ------------------------------- |
286
+ | `RECCE_API_TOKEN` | Recommended | Recce Cloud API token |
287
+ | `RECCE_SESSION_ID` | Optional | Session ID for generic workflow |
288
+ | `GITHUB_TOKEN` | Explicit set | GitHub authentication (Actions) |
289
+ | `CI_JOB_TOKEN` | Auto-detected | GitLab authentication (CI) |
290
+
291
+ **Exit Codes:**
292
+
293
+ | Code | Description |
294
+ | ---- | --------------------------------------------------- |
295
+ | 0 | Success |
296
+ | 1 | Platform not supported (platform-specific workflow) |
297
+ | 2 | Authentication error |
298
+ | 3 | File validation error |
299
+ | 4 | Download error |
300
+
301
+ **Common Examples:**
302
+
303
+ ```bash
304
+ # Auto-find and download current PR/MR session
305
+ recce-cloud download
306
+
307
+ # Download project's production/base session
308
+ recce-cloud download --prod
309
+
310
+ # Download from specific session ID
311
+ recce-cloud download --session-id abc123
312
+
313
+ # Download prod session to target-base
314
+ recce-cloud download --prod --target-path target-base
315
+
316
+ # Force overwrite existing files
317
+ recce-cloud download --force
318
+
319
+ # Dry run - preview what would be downloaded
320
+ recce-cloud download --dry-run
321
+ ```
322
+
323
+ ### `recce-cloud version`
324
+
325
+ Display the version of recce-cloud.
326
+
327
+ ```bash
328
+ recce-cloud version
329
+ ```
330
+
331
+ ## Authentication
332
+
333
+ The CLI supports multiple authentication methods with the following priority:
334
+
335
+ 1. **RECCE_API_TOKEN** (explicit token) - Recommended for production
336
+ 2. **CI-provided tokens** - GITHUB_TOKEN (Actions) or CI_JOB_TOKEN (GitLab CI)
337
+ 3. Error if no token available
338
+
339
+ ### Getting API Tokens
340
+
341
+ **Recce Cloud API Token:**
342
+
343
+ 1. Log in to [Recce Cloud](https://cloud.datarecce.io)
344
+ 2. Go to Settings → API Tokens
345
+ 3. Create a new token
346
+ 4. Add to CI/CD secrets as `RECCE_API_TOKEN`
347
+
348
+ **GitHub Token:**
349
+
350
+ - Available as `${{ secrets.GITHUB_TOKEN }}` in Actions
351
+ - Must be explicitly set in `env:` section of your workflow
352
+
353
+ **GitLab Token:**
354
+
355
+ - Automatically available as `$CI_JOB_TOKEN` in GitLab CI
356
+ - No additional configuration needed
357
+
358
+ ## Auto-Detection
359
+
360
+ The CLI automatically detects your CI environment:
361
+
362
+ ### Detected Information
363
+
364
+ | Information | GitHub Actions | GitLab CI |
365
+ | ------------- | --------------------- | ---------------------------------------- |
366
+ | Platform | ✅ `github-actions` | ✅ `gitlab-ci` |
367
+ | Repository | ✅ `owner/repo` | ✅ `group/project` |
368
+ | PR/MR Number | ✅ From event payload | ✅ From `CI_MERGE_REQUEST_IID` |
369
+ | PR/MR URL | ✅ Constructed | ✅ Constructed (self-hosted support) |
370
+ | Commit SHA | ✅ `GITHUB_SHA` | ✅ `CI_COMMIT_SHA` |
371
+ | Source Branch | ✅ `GITHUB_HEAD_REF` | ✅ `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` |
372
+ | Base Branch | ✅ `GITHUB_BASE_REF` | ✅ `CI_MERGE_REQUEST_TARGET_BRANCH_NAME` |
373
+ | Session Type | ✅ Auto-determined | ✅ Auto-determined |
374
+ | Access Token | ✅ `GITHUB_TOKEN` | ✅ `CI_JOB_TOKEN` |
375
+
376
+ ### Manual Overrides
377
+
378
+ You can override auto-detected values:
379
+
380
+ ```bash
381
+ # Override PR/MR number
382
+ recce-cloud upload --cr 456
383
+
384
+ # Override session type
385
+ recce-cloud upload --type prod
386
+
387
+ # Multiple overrides
388
+ recce-cloud upload --cr 789 --type cr
389
+
390
+ # Dry run - preview what would be uploaded
391
+ recce-cloud upload --dry-run
392
+ ```
393
+
394
+ ## CI/CD Integration Examples
395
+
396
+ ### GitHub Actions - Upload Workflow
397
+
398
+ ```yaml
399
+ name: Recce CI - Upload
400
+
401
+ on:
402
+ pull_request:
403
+ branches: [main]
404
+
405
+ jobs:
406
+ recce:
407
+ runs-on: ubuntu-latest
408
+ steps:
409
+ - uses: actions/checkout@v4
410
+
411
+ - name: Setup Python
412
+ uses: actions/setup-python@v4
413
+ with:
414
+ python-version: "3.11"
415
+
416
+ - name: Install dependencies
417
+ run: |
418
+ pip install dbt-core dbt-postgres recce-cloud
419
+
420
+ - name: Build dbt project
421
+ run: |
422
+ dbt deps
423
+ dbt build
424
+ dbt docs generate
425
+
426
+ - name: Upload to Recce Cloud
427
+ run: recce-cloud upload
428
+ env:
429
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
430
+ ```
431
+
432
+ ### GitHub Actions - Download Workflow
433
+
434
+ ```yaml
435
+ name: Recce CI - Download
436
+
437
+ on:
438
+ pull_request:
439
+ branches: [main]
440
+
441
+ jobs:
442
+ recce:
443
+ runs-on: ubuntu-latest
444
+ steps:
445
+ - uses: actions/checkout@v4
446
+
447
+ - name: Setup Python
448
+ uses: actions/setup-python@v4
449
+ with:
450
+ python-version: "3.11"
451
+
452
+ - name: Install dependencies
453
+ run: |
454
+ pip install dbt-core dbt-postgres recce-cloud
455
+
456
+ # Download production/base artifacts
457
+ - name: Download base artifacts from Recce Cloud
458
+ run: recce-cloud download --prod --target-path target-base
459
+ env:
460
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
461
+
462
+ # Build current PR version
463
+ - name: Build dbt project (current)
464
+ run: |
465
+ dbt deps
466
+ dbt build
467
+ dbt docs generate
468
+
469
+ # Upload current PR artifacts
470
+ - name: Upload to Recce Cloud
471
+ run: recce-cloud upload
472
+ env:
473
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
474
+ ```
475
+
476
+ ### GitLab CI - Upload Workflow
477
+
478
+ ```yaml
479
+ stages:
480
+ - build
481
+ - upload
482
+
483
+ dbt-build:
484
+ stage: build
485
+ image: python:3.11-slim
486
+ script:
487
+ - pip install dbt-core dbt-postgres
488
+ - dbt deps
489
+ - dbt build
490
+ - dbt docs generate
491
+ artifacts:
492
+ paths:
493
+ - target/
494
+
495
+ recce-upload:
496
+ stage: upload
497
+ image: python:3.11-slim
498
+ script:
499
+ - pip install recce-cloud
500
+ - recce-cloud upload
501
+ dependencies:
502
+ - dbt-build
503
+ only:
504
+ - merge_requests
505
+ - main
506
+ ```
507
+
508
+ ### GitLab CI - Download Workflow
509
+
510
+ ```yaml
511
+ stages:
512
+ - download
513
+ - build
514
+ - upload
515
+
516
+ recce-download-base:
517
+ stage: download
518
+ image: python:3.11-slim
519
+ script:
520
+ - pip install recce-cloud
521
+ - recce-cloud download --prod --target-path target-base
522
+ artifacts:
523
+ paths:
524
+ - target-base/
525
+ only:
526
+ - merge_requests
527
+
528
+ dbt-build:
529
+ stage: build
530
+ image: python:3.11-slim
531
+ script:
532
+ - pip install dbt-core dbt-postgres
533
+ - dbt deps
534
+ - dbt build
535
+ - dbt docs generate
536
+ artifacts:
537
+ paths:
538
+ - target/
539
+ only:
540
+ - merge_requests
541
+
542
+ recce-upload:
543
+ stage: upload
544
+ image: python:3.11-slim
545
+ script:
546
+ - pip install recce-cloud
547
+ - recce-cloud upload
548
+ dependencies:
549
+ - dbt-build
550
+ only:
551
+ - merge_requests
552
+ ```
553
+
554
+ ### Generic CI Platform
555
+
556
+ For other CI platforms, use the generic workflow with session ID:
557
+
558
+ ```yaml
559
+ # Upload
560
+ - name: Upload to Recce Cloud
561
+ script:
562
+ - pip install recce-cloud
563
+ - recce-cloud upload --session-id ${SESSION_ID}
564
+ environment:
565
+ RECCE_API_TOKEN: ${RECCE_API_TOKEN}
566
+ SESSION_ID: ${SESSION_ID}
567
+
568
+ # Download
569
+ - name: Download from Recce Cloud
570
+ script:
571
+ - pip install recce-cloud
572
+ - recce-cloud download --session-id ${SESSION_ID}
573
+ environment:
574
+ RECCE_API_TOKEN: ${RECCE_API_TOKEN}
575
+ SESSION_ID: ${SESSION_ID}
576
+ ```
577
+
578
+ ## Troubleshooting
579
+
580
+ ### Common Issues
581
+
582
+ **1. Missing dbt artifacts**
583
+
584
+ ```
585
+ Error: Invalid target path: target
586
+ Please provide a valid target path containing manifest.json and catalog.json.
587
+ ```
588
+
589
+ **Solution:** Ensure `dbt docs generate` has been run successfully before upload.
590
+
591
+ ```bash
592
+ dbt build
593
+ dbt docs generate # Required!
594
+ recce-cloud upload
595
+ ```
596
+
597
+ **2. Authentication failed**
598
+
599
+ ```
600
+ Error: No authentication token provided
601
+ Set RECCE_API_TOKEN environment variable or ensure CI token is available
602
+ ```
603
+
604
+ **Solution:** Token requirements depend on your workflow type:
605
+
606
+ **For Generic Workflow (with `--session-id`):**
607
+ - Always requires explicit `RECCE_API_TOKEN`
608
+
609
+ ```bash
610
+ # Set token and use session ID
611
+ export RECCE_API_TOKEN=your_token_here
612
+ recce-cloud upload --session-id abc123
613
+ recce-cloud download --session-id abc123
614
+ ```
615
+
616
+ **For Platform-Specific Workflow:**
617
+
618
+ _GitHub CI_
619
+ - Use `GITHUB_TOKEN` (explicitly set)
620
+
621
+ ```yaml
622
+ env:
623
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
624
+ ```
625
+
626
+ **3. Platform not supported**
627
+
628
+ ```
629
+ Error: Platform-specific upload requires GitHub Actions or GitLab CI environment
630
+ Detected platform: unknown
631
+ ```
632
+
633
+ **Solution:** Use generic workflow with session ID, or run in supported CI platform.
634
+
635
+ ```bash
636
+ recce-cloud upload --session-id abc123
637
+ ```
638
+
639
+ **4. Session not found**
640
+
641
+ ```
642
+ Error: Session ID abc123 does not belong to any organization.
643
+ ```
644
+
645
+ **Solution:** Verify session ID is correct and accessible with your API token.
646
+
647
+ **5. GitLab self-hosted instance**
648
+
649
+ The CLI automatically detects self-hosted GitLab instances using `CI_SERVER_URL`.
650
+
651
+ ```yaml
652
+ # No additional configuration needed
653
+ recce-upload:
654
+ script:
655
+ - recce-cloud upload
656
+ ```
657
+
658
+ **6. Target path already exists (download)**
659
+
660
+ ```
661
+ Error: Target path already exists: target
662
+ Use --force to overwrite existing directory
663
+ ```
664
+
665
+ **Solution:** Use `--force` flag to overwrite existing files, or choose a different target path.
666
+
667
+ ```bash
668
+ recce-cloud download --force
669
+ # OR
670
+ recce-cloud download --target-path target-new
671
+ ```
672
+
673
+ **7. No production session available**
674
+
675
+ ```
676
+ Error: No production session found for this project
677
+ ```
678
+
679
+ **Solution:** Upload a production session first, or use a specific session ID.
680
+
681
+ ```bash
682
+ # Upload production session (on main branch)
683
+ recce-cloud upload --type prod
684
+
685
+ # Or download from specific session
686
+ recce-cloud download --session-id abc123
687
+ ```
688
+
689
+ ### Debug Mode
690
+
691
+ Enable verbose logging for troubleshooting:
692
+
693
+ ```bash
694
+ # Set log level to DEBUG
695
+ export RECCE_LOG_LEVEL=DEBUG
696
+ recce-cloud upload
697
+ ```
698
+
699
+ ## Architecture
700
+
701
+ ### Platform-Specific APIs
702
+
703
+ The CLI uses platform-specific API endpoints for auto-session creation:
704
+
705
+ **GitHub Actions:**
706
+
707
+ - `POST /api/v2/github/{repository}/touch-recce-session`
708
+ - `POST /api/v2/github/{repository}/upload-completed`
709
+
710
+ **GitLab CI:**
711
+
712
+ - `POST /api/v2/gitlab/{project_path}/touch-recce-session`
713
+ - `POST /api/v2/gitlab/{project_path}/upload-completed`
714
+
715
+ ### Upload Process
716
+
717
+ **Platform-Specific Workflow:**
718
+
719
+ 1. Detect CI platform and extract context
720
+ 2. Validate dbt artifacts
721
+ 3. Extract adapter type from manifest
722
+ 4. Authenticate with Recce Cloud API
723
+ 5. Call `touch-recce-session` (creates or updates session)
724
+ 6. Upload manifest.json to presigned S3 URL
725
+ 7. Upload catalog.json to presigned S3 URL
726
+ 8. Call `upload-completed` (notifies Recce Cloud)
727
+
728
+ **Generic Workflow:**
729
+
730
+ 1. Detect CI platform (optional)
731
+ 2. Validate dbt artifacts
732
+ 3. Extract adapter type from manifest
733
+ 4. Authenticate with Recce Cloud API
734
+ 5. Get session info (org_id, project_id)
735
+ 6. Get presigned upload URLs
736
+ 7. Upload manifest.json to S3
737
+ 8. Upload catalog.json to S3
738
+ 9. Update session metadata
739
+
740
+ ### Download Process
741
+
742
+ **Platform-Specific Workflow:**
743
+
744
+ 1. Detect CI platform and extract context
745
+ 2. Authenticate with Recce Cloud API
746
+ 3. Call download API with PR/MR context
747
+ 4. Get presigned download URLs and session ID
748
+ 5. Create target directory (if needed)
749
+ 6. Download manifest.json from S3
750
+ 7. Download catalog.json from S3
751
+
752
+ **Generic Workflow (Session ID):**
753
+
754
+ 1. Authenticate with Recce Cloud API
755
+ 2. Get session info (org_id, project_id)
756
+ 3. Get presigned download URLs by session ID
757
+ 4. Create target directory (if needed)
758
+ 5. Download manifest.json from S3
759
+ 6. Download catalog.json from S3
760
+
761
+ ## Development
762
+
763
+ ### Running Tests
764
+
765
+ ```bash
766
+ # Install development dependencies
767
+ pip install -e .[dev]
768
+
769
+ # Run tests
770
+ pytest tests/recce_cloud/
771
+
772
+ # Run with coverage
773
+ pytest --cov=recce_cloud --cov-report=html tests/recce_cloud/
774
+
775
+ # Run specific test file
776
+ pytest tests/recce_cloud/test_platform_clients.py
777
+ ```
778
+
779
+ ### Code Quality
780
+
781
+ ```bash
782
+ # Format code
783
+ make format
784
+
785
+ # Run quality checks
786
+ make check
787
+
788
+ # Run all checks and tests
789
+ make test
790
+ ```
791
+
792
+ ## Support
793
+
794
+ - **Documentation:** [docs.reccehq.com](https://docs.reccehq.com)
795
+ - **Issues:** [GitHub Issues](https://github.com/DataRecce/recce/issues)
796
+ - **Community:** [Recce Slack](https://getdbt.slack.com/archives/C05C28V7CPP)
797
+ - **Email:** <support@reccehq.com>
798
+
799
+ ## License
800
+
801
+ Apache License 2.0 - See [LICENSE](../LICENSE) file for details.