airbyte-internal-ops 0.6.1__py3-none-any.whl → 0.7.0__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.
Files changed (33) hide show
  1. {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.0.dist-info}/METADATA +4 -1
  2. {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.0.dist-info}/RECORD +33 -30
  3. airbyte_ops_mcp/_sentry.py +101 -0
  4. airbyte_ops_mcp/cli/app.py +1 -1
  5. airbyte_ops_mcp/cli/{repo.py → local.py} +131 -8
  6. airbyte_ops_mcp/connector_ops/__init__.py +17 -0
  7. airbyte_ops_mcp/connector_ops/utils.py +859 -0
  8. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/assets.py +4 -5
  9. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/__init__.py +1 -1
  10. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/documentation.py +23 -22
  11. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/models.py +7 -7
  12. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/metadata.py +15 -15
  13. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/packaging.py +11 -9
  14. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/security.py +16 -20
  15. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/version.py +94 -18
  16. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/cli.py +6 -8
  17. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/models.py +7 -8
  18. airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/utils.py +2 -2
  19. airbyte_ops_mcp/mcp/_guidance.py +37 -0
  20. airbyte_ops_mcp/mcp/cloud_connector_versions.py +46 -9
  21. airbyte_ops_mcp/mcp/server.py +5 -0
  22. {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.0.dist-info}/WHEEL +0 -0
  23. {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.0.dist-info}/entry_points.txt +0 -0
  24. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/README.md +0 -0
  25. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/__init__.py +0 -0
  26. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/__init__.py +0 -0
  27. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/helpers.py +0 -0
  28. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/templates/documentation_headers_check_description.md.j2 +0 -0
  29. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/templates/section_content_description.md.j2 +0 -0
  30. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/templates/template.md.j2 +0 -0
  31. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/consts.py +0 -0
  32. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/templates/__init__.py +0 -0
  33. /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/templates/qa_checks.md.j2 +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-internal-ops
3
- Version: 0.6.1
3
+ Version: 0.7.0
4
4
  Summary: MCP and API interfaces that let the agents do the admin work
5
5
  Author-email: Aaron Steers <aj@airbyte.io>
6
6
  Keywords: admin,airbyte,api,mcp
@@ -29,11 +29,14 @@ Requires-Dist: google-cloud-secret-manager<3.0,>=2.18.0
29
29
  Requires-Dist: google-cloud-storage<3.0,>=2.8.0
30
30
  Requires-Dist: jinja2<4.0,>=3.1.2
31
31
  Requires-Dist: pydantic>=2.0.0
32
+ Requires-Dist: pydash<8.0,>=6.0.2
32
33
  Requires-Dist: python-dotenv<2.0,>=1.0.0
33
34
  Requires-Dist: pyyaml<7.0,>=6.0.0
34
35
  Requires-Dist: requests<3.0,>=2.31.0
35
36
  Requires-Dist: rich<14.0,>=13.0.0
36
37
  Requires-Dist: semver<4.0,>=3.0.1
38
+ Requires-Dist: sentry-sdk>=2.50.0
39
+ Requires-Dist: simpleeval<1.0,>=0.9.13
37
40
  Requires-Dist: slack-sdk<4.0,>=3.36.0
38
41
  Requires-Dist: sqlalchemy<3.0,>=2.0.0
39
42
  Requires-Dist: toml<1.0,>=0.10.2
@@ -1,4 +1,5 @@
1
1
  airbyte_ops_mcp/__init__.py,sha256=tuzdlMkfnWBnsri5KGHM2M_xuNnzFk2u_aR79mmN7Yg,772
2
+ airbyte_ops_mcp/_sentry.py,sha256=bCgLfIdD6Jf_8bdLkhs0JchtMLXLiK3skPxaRK36fzU,3351
2
3
  airbyte_ops_mcp/constants.py,sha256=xU8ARMs7jG0-1hseKn3K1dmhyMOMM3JTetRZugLSKEo,7695
3
4
  airbyte_ops_mcp/docker_hub.py,sha256=qdOYpj2KOFOsEGsl2b2rcVPzyYDharOVM_lJxNTytds,5833
4
5
  airbyte_ops_mcp/gcp_auth.py,sha256=i0cm1_xX4fj_31iKlfARpNvTaSr85iGTSw9KMf4f4MU,7206
@@ -150,27 +151,6 @@ airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/steps.py,sha256=t7
150
151
  airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/contexts/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
151
152
  airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/contexts/click_pipeline_context.py,sha256=aPwt8XTzt2NOIU2ItAj0mLTZu4lmQwgwut7iOfM6lnI,5458
152
153
  airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/contexts/pipeline_context.py,sha256=68lfAR5NuLMqUgaHayJKkwXt-vqcucsKWq5L6PA4rqA,15640
153
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/README.md,sha256=ajuFHew-gZPqGwoX3AAPbGvuysUyQJqTKmzvVEDJRWk,5146
154
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/cli.py,sha256=-GpHJvlZDBU49XJmepBDqXlkRmf47K4GIpQYG0tVkKk,5152
156
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/consts.py,sha256=XK0M1dend18Mz1ThxS-tUEiU1zb_4HUcje7BR9Eb6mQ,1161
157
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/models.py,sha256=VSTLs7CSObwF5_m6Fh1tYZODAMgGxeTuEMIBjRsbpA0,11572
158
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/utils.py,sha256=MSQFYK87hLXISh2IeDHJTDap23ZOHI_vEB9qoOLbe0I,1514
159
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/__init__.py,sha256=aN4T6K0hfj-jOroBNu93BD5FKG9XxCjDiL1foZLNQkg,578
160
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/assets.py,sha256=cQqM1UTNo3VBYjg8b_dgMVJzbqNuE-9fZnhJT2CZsi8,4440
161
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/metadata.py,sha256=d3ZhQPgyGN-Q4is2M1j0GPio2OUyAy65kBm0KGM5vAQ,11256
162
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/packaging.py,sha256=ME5MtSIs5NFlpN1eYe_FpOWKanNfe9nRJpFinFw5HHQ,11383
163
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/security.py,sha256=bd0AX9f7O78RfebYgxDh5LAur-WNrV5vdTGx-MlHqAU,6140
164
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/version.py,sha256=W-3YC5mQoykpAcqUag0wJsCkv1u8sbGp32wea5QAuZo,5629
165
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/__init__.py,sha256=8KFZmApEqToxV9wolNKSbNy8LO6z6J0pDSKDCHExQBQ,1058
166
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/documentation.py,sha256=4Vkos46JmMxYSTUMOvDXT2FdYgFhKlPlnRPDlfAhx8o,28187
167
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/helpers.py,sha256=89ueBU9uo3f-fOcD3Jd7J8XoO8ymRSZc0vPf9CQ9MCc,6250
168
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/models.py,sha256=-X8RpJ3QdLFOTLTwPcBE7arR-Fx6VPfaJE_qn7BdTNg,5533
169
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/templates/documentation_headers_check_description.md.j2,sha256=EFcYAhOQvvoc58YO_yqu6DgmSZFe8l0JnOTmG_3g7e4,572
170
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/templates/section_content_description.md.j2,sha256=2TXJbvt_S9-PTlJ-MmC3xUanpOvuCY4dUjTYuoocwdc,365
171
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/templates/template.md.j2,sha256=bYxLfOP3GDwQC9Q3PiVbxsL5GS0p5b10k1dwzfOrm1M,1962
172
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/templates/qa_checks.md.j2,sha256=v3NyYUAYkqRiYAFDQ2NgpgYK6PIDhDKrqfRgpX8454s,1946
174
154
  airbyte_ops_mcp/_legacy/airbyte_ci/metadata_service/README.md,sha256=uAAl7KUD4NRgwRhyTAgRSV7NVYMELfGRiGGVmDar8ss,602
175
155
  airbyte_ops_mcp/_legacy/airbyte_ci/metadata_service/commands.py,sha256=5nUC1UF6Jt0I9XmnH_ON1c24JlG8Y3lwkc9EATKQ0sA,13338
176
156
  airbyte_ops_mcp/_legacy/airbyte_ci/metadata_service/constants.py,sha256=bSXsx-RQjRh5Nlw0-621p28UuaUx4B9PKSe-TF3HEpc,2664
@@ -243,11 +223,11 @@ airbyte_ops_mcp/airbyte_repo/utils.py,sha256=TXlOAfhiu_hVRNjCxB4PRPVDhTWCU5lYmgq
243
223
  airbyte_ops_mcp/cli/__init__.py,sha256=XpL7FyVfgabfBF2JR7u7NwJ2krlYqjd_OwLcWf-Xc7s,114
244
224
  airbyte_ops_mcp/cli/_base.py,sha256=I8tWnyQf0ks4r3J8N8h-5GZxyn37T-55KsbuHnxYlcg,415
245
225
  airbyte_ops_mcp/cli/_shared.py,sha256=jg-xMyGzTCGPqKd8VTfE_3kGPIyO_3Kx5sQbG4rPc0Y,1311
246
- airbyte_ops_mcp/cli/app.py,sha256=SEdBpqFUG2O8zGV5ifwptxrLGFph_dLr66-MX9d69gQ,789
226
+ airbyte_ops_mcp/cli/app.py,sha256=xxlyJzlFvZuy-qKAhTPPmzj-t0o7MSqQ7aPHonfT1vU,790
247
227
  airbyte_ops_mcp/cli/cloud.py,sha256=jac0FcG3UvNNeNNhqZR04uY9BCyVvins1kjO0LRZ86Y,45861
248
228
  airbyte_ops_mcp/cli/gh.py,sha256=koJPu0MDB6AW7mJq2z4dZV65ofvsZTkqoeitGF8KJR8,5364
229
+ airbyte_ops_mcp/cli/local.py,sha256=7C6PZ2RHDnOciurrSan5te93LWPjC1Rfwes6y37JL5Q,20756
249
230
  airbyte_ops_mcp/cli/registry.py,sha256=L4nDKhlegr31gSE-GUvDFSq10KgDz5kJuZXgLIxYIyg,9785
250
- airbyte_ops_mcp/cli/repo.py,sha256=G1hoQpH0XYhUH3FFOsia9xabGB0LP9o3XcwBuqvFVo0,16331
251
231
  airbyte_ops_mcp/cloud_admin/__init__.py,sha256=cqE96Q10Kp6elhH9DAi6TVsIwSUy3sooDLLrxTaktGk,816
252
232
  airbyte_ops_mcp/cloud_admin/api_client.py,sha256=pzdnZpIxOaXJsF_vQuw9_goiDbqwgEQxFwZwsoupY40,57459
253
233
  airbyte_ops_mcp/cloud_admin/auth.py,sha256=qE2Aqe0qbZB755KscL65s54Jz78-F-X5a8fXKsrYEOQ,3749
@@ -257,11 +237,34 @@ airbyte_ops_mcp/connection_config_retriever/__init__.py,sha256=Xoi-YvARrNPhECdpw
257
237
  airbyte_ops_mcp/connection_config_retriever/audit_logging.py,sha256=QdOG9984NXeMaKeJnFUZ4oCOmqi37PBRG2NRBBjrZQQ,2753
258
238
  airbyte_ops_mcp/connection_config_retriever/retrieval.py,sha256=s6yeCyrboWkUd6KdaheEo87x-rLtQNTL8XeR8O9z2HI,12160
259
239
  airbyte_ops_mcp/connection_config_retriever/secrets_resolution.py,sha256=12g0lZzhCzAPl4Iv4eMW6d76mvXjIBGspOnNhywzks4,3644
240
+ airbyte_ops_mcp/connector_ops/__init__.py,sha256=5nkBfeHDRKVyqEln8bvPs-J1qDDM6RBvRYPgWNb5dZk,370
241
+ airbyte_ops_mcp/connector_ops/utils.py,sha256=yZsrdj2Jv-6rb97recNncZCkmY79EqpPiZOMUOf8ke4,28573
242
+ airbyte_ops_mcp/connector_qa/README.md,sha256=ajuFHew-gZPqGwoX3AAPbGvuysUyQJqTKmzvVEDJRWk,5146
243
+ airbyte_ops_mcp/connector_qa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
+ airbyte_ops_mcp/connector_qa/cli.py,sha256=e9hygxSttegibGzs3g6xEJ1AiXEnOnrIFQQEsNWTY6E,5037
245
+ airbyte_ops_mcp/connector_qa/consts.py,sha256=XK0M1dend18Mz1ThxS-tUEiU1zb_4HUcje7BR9Eb6mQ,1161
246
+ airbyte_ops_mcp/connector_qa/models.py,sha256=PDWeKVzqOa5VLa5iLHE76h7qePL3r-zhf8dmeLuXMUw,11488
247
+ airbyte_ops_mcp/connector_qa/utils.py,sha256=AtegjKBGmYqq9juPedJ4-Jt7LBxcD4ZYNIIS7iLEqiU,1476
248
+ airbyte_ops_mcp/connector_qa/checks/__init__.py,sha256=aN4T6K0hfj-jOroBNu93BD5FKG9XxCjDiL1foZLNQkg,578
249
+ airbyte_ops_mcp/connector_qa/checks/assets.py,sha256=94LgVaHmlDkVL3u6dkHHHUtyXv8xsTk_QjESeUfYYIU,4369
250
+ airbyte_ops_mcp/connector_qa/checks/metadata.py,sha256=ZSIc-odQ8lyuOGVLCVMqqzgaulo47a7exwjOEt-UVDs,11332
251
+ airbyte_ops_mcp/connector_qa/checks/packaging.py,sha256=KyS9vc0FmvLrxZUVwizoWN-D60sMCUmH2nplJ3KGEZI,11456
252
+ airbyte_ops_mcp/connector_qa/checks/security.py,sha256=JEZJAOrAXF6PsLKZQAJ1JDLQpiBPaF_4aLdBO9y5buI,6072
253
+ airbyte_ops_mcp/connector_qa/checks/version.py,sha256=zWLmLLbBooPGmJhHzQ6glOfwc2DPjujkKvAVuZeezOI,9240
254
+ airbyte_ops_mcp/connector_qa/checks/documentation/__init__.py,sha256=CFLhD2C4tlGkYcLRnd6xSzWB1MvQfXXswgp76HcoIjk,1039
255
+ airbyte_ops_mcp/connector_qa/checks/documentation/documentation.py,sha256=cA8f2huCi4Jcut9sOkmwnuEFcoxmwDRWokHKsy6KubY,28236
256
+ airbyte_ops_mcp/connector_qa/checks/documentation/helpers.py,sha256=89ueBU9uo3f-fOcD3Jd7J8XoO8ymRSZc0vPf9CQ9MCc,6250
257
+ airbyte_ops_mcp/connector_qa/checks/documentation/models.py,sha256=c4xH7TsLI0EqkdwwTOYA_RpeU-zxvFRuy9ZNKcd_FjQ,5533
258
+ airbyte_ops_mcp/connector_qa/checks/documentation/templates/documentation_headers_check_description.md.j2,sha256=EFcYAhOQvvoc58YO_yqu6DgmSZFe8l0JnOTmG_3g7e4,572
259
+ airbyte_ops_mcp/connector_qa/checks/documentation/templates/section_content_description.md.j2,sha256=2TXJbvt_S9-PTlJ-MmC3xUanpOvuCY4dUjTYuoocwdc,365
260
+ airbyte_ops_mcp/connector_qa/checks/documentation/templates/template.md.j2,sha256=bYxLfOP3GDwQC9Q3PiVbxsL5GS0p5b10k1dwzfOrm1M,1962
261
+ airbyte_ops_mcp/connector_qa/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
262
+ airbyte_ops_mcp/connector_qa/templates/qa_checks.md.j2,sha256=v3NyYUAYkqRiYAFDQ2NgpgYK6PIDhDKrqfRgpX8454s,1946
260
263
  airbyte_ops_mcp/gcp_logs/__init__.py,sha256=IqkxclXJnD1U4L2at7aC9GYqPXnuLdYLgmkm3ZiIu6s,409
261
264
  airbyte_ops_mcp/gcp_logs/error_lookup.py,sha256=Ufl1FtNQJKP_yWndVT1Xku1mT-gxW_0atmNMCYMXvOo,12757
262
265
  airbyte_ops_mcp/mcp/__init__.py,sha256=Y5K-iKUxSY5KM_2XWrYRJqGpjjTHE_ezriED98ZzalU,538
263
- airbyte_ops_mcp/mcp/_guidance.py,sha256=48tQSnDnxqXtyGJxxgjz0ZiI814o_7Fj7f6R8jpQ7so,2375
264
- airbyte_ops_mcp/mcp/cloud_connector_versions.py,sha256=ZisoDEZMbgUwf3aarz2L5CaJcON3J5-vXH3v7kmM0IY,34741
266
+ airbyte_ops_mcp/mcp/_guidance.py,sha256=n0dLggQXNi2PKZ0eFDqQx5YIjhQpMnI3xcjouub9AGA,4211
267
+ airbyte_ops_mcp/mcp/cloud_connector_versions.py,sha256=dRKrgsRGadQieTSvBrc5HYI6TTDzVAT6-4tiOHNcDHU,36244
265
268
  airbyte_ops_mcp/mcp/connector_analysis.py,sha256=OC4KrOSkMkKPkOisWnSv96BDDE5TQYHq-Jxa2vtjJpo,298
266
269
  airbyte_ops_mcp/mcp/connector_qa.py,sha256=aImpqdnqBPDrz10BS0owsV4kuIU2XdalzgbaGZsbOL0,258
267
270
  airbyte_ops_mcp/mcp/gcp_logs.py,sha256=QCDQHmsxQHJ26BB0sxkBgKXr7Ja9wVFkdpY6423H-xo,2677
@@ -273,7 +276,7 @@ airbyte_ops_mcp/mcp/prod_db_queries.py,sha256=EdZyrccrM5tHKEtjks4598hzbZ62FuDCCH
273
276
  airbyte_ops_mcp/mcp/prompts.py,sha256=v4bguskw7hSsISkseACzKQm5QwrIXmiwbs27oclXTE8,1591
274
277
  airbyte_ops_mcp/mcp/registry.py,sha256=PW-VYUj42qx2pQ_apUkVaoUFq7VgB9zEU7-aGrkSCCw,290
275
278
  airbyte_ops_mcp/mcp/regression_tests.py,sha256=zwdQ-ymUhWtVcIjwiNIZAC151GKhuxi55HDi4S91RnI,17046
276
- airbyte_ops_mcp/mcp/server.py,sha256=u9P-cJkAe9KkSj6Kcvkly68toOn1Wt8KCOxLrmav2u0,7061
279
+ airbyte_ops_mcp/mcp/server.py,sha256=ID7wZIds8e-qcGAhsaK0vTJDQQ4YNSdYKTQGQWL3Evw,7280
277
280
  airbyte_ops_mcp/prod_db_access/__init__.py,sha256=5pxouMPY1beyWlB0UwPnbaLTKTHqU6X82rbbgKY2vYU,1069
278
281
  airbyte_ops_mcp/prod_db_access/db_engine.py,sha256=VUqEWZtharJUR-Cri_pMwtGh1C4Neu4s195mbEXlm-w,9190
279
282
  airbyte_ops_mcp/prod_db_access/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -302,7 +305,7 @@ airbyte_ops_mcp/regression_tests/regression/comparators.py,sha256=MJkLZEKHivgrG0
302
305
  airbyte_ops_mcp/regression_tests/validation/__init__.py,sha256=MBEwGOoNuqT4_oCahtoK62OKWIjUCfWa7vZTxNj_0Ek,1532
303
306
  airbyte_ops_mcp/regression_tests/validation/catalog_validators.py,sha256=jqqVAMOk0mtdPgwu4d0hA0ZEjtsNh5gapvGydRv3_qk,12553
304
307
  airbyte_ops_mcp/regression_tests/validation/record_validators.py,sha256=RjauAhKWNwxMBTu0eNS2hMFNQVs5CLbQU51kp6FOVDk,7432
305
- airbyte_internal_ops-0.6.1.dist-info/METADATA,sha256=BPnWlT4bx1Ayw9-1n7gvikiutGNwsKI34PtI26rhjSw,5777
306
- airbyte_internal_ops-0.6.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
307
- airbyte_internal_ops-0.6.1.dist-info/entry_points.txt,sha256=WxP0l7bRFss4Cr5uQqVj9mTEKwnRKouNuphXQF0lotA,171
308
- airbyte_internal_ops-0.6.1.dist-info/RECORD,,
308
+ airbyte_internal_ops-0.7.0.dist-info/METADATA,sha256=9b3wX4zJzWEH2uuzPfhspIJdkQgHiV_gs7nJQPoLQXQ,5884
309
+ airbyte_internal_ops-0.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
310
+ airbyte_internal_ops-0.7.0.dist-info/entry_points.txt,sha256=WxP0l7bRFss4Cr5uQqVj9mTEKwnRKouNuphXQF0lotA,171
311
+ airbyte_internal_ops-0.7.0.dist-info/RECORD,,
@@ -0,0 +1,101 @@
1
+ # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
2
+ """Sentry error tracking integration for airbyte-ops-mcp.
3
+
4
+ This module provides automatic error tracking via Sentry for the airbyte-ops-mcp
5
+ package. Errors during server startup, tool execution, and API interactions are
6
+ automatically captured and reported.
7
+
8
+ The Sentry DSN is embedded in the package since it only allows write access
9
+ (sending errors), not read access. This is standard practice for client-side
10
+ error tracking.
11
+
12
+ To disable Sentry tracking, set the environment variable:
13
+ AIRBYTE_DISABLE_SENTRY=1
14
+ """
15
+
16
+ import logging
17
+ import os
18
+ from typing import Literal
19
+
20
+ import sentry_sdk
21
+
22
+ # Valid Sentry severity levels
23
+ SentryLevel = Literal["fatal", "error", "warning", "info", "debug"]
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+ # Environment variable to disable Sentry tracking
28
+ DISABLE_SENTRY_ENV_VAR = "AIRBYTE_DISABLE_SENTRY"
29
+
30
+ # Sentry DSN for the airbyte-ops-mcp project
31
+ # This DSN only allows sending errors to Sentry, not reading data.
32
+ # It is safe to embed in client-side code per Sentry's documentation.
33
+ # Project: https://airbytehq.sentry.io/projects/internal-ops-app/
34
+ _SENTRY_DSN = "https://292842cbf7f632f34c68cff23f2deee3@o1009025.ingest.us.sentry.io/4510746336559104"
35
+
36
+ _sentry_initialized = False
37
+
38
+
39
+ def _get_package_version() -> str:
40
+ """Get the package version for Sentry release tracking."""
41
+ try:
42
+ from importlib.metadata import version
43
+
44
+ return version("airbyte-internal-ops")
45
+ except Exception as exc:
46
+ logger.debug("Failed to get package version for Sentry release", exc_info=exc)
47
+ return "unknown"
48
+
49
+
50
+ def init_sentry_tracking() -> bool:
51
+ """Initialize Sentry error tracking if not already initialized.
52
+
53
+ Returns:
54
+ True if Sentry was initialized successfully, False otherwise.
55
+ """
56
+ global _sentry_initialized
57
+
58
+ if _sentry_initialized:
59
+ return True
60
+
61
+ if os.getenv(DISABLE_SENTRY_ENV_VAR):
62
+ logger.debug("Sentry tracking is disabled via environment variable")
63
+ return False
64
+
65
+ try:
66
+ sentry_sdk.init(
67
+ dsn=_SENTRY_DSN,
68
+ release=f"airbyte-ops-mcp@{_get_package_version()}",
69
+ environment=os.getenv("SENTRY_ENVIRONMENT", "production"),
70
+ # Only send errors, not performance data
71
+ traces_sample_rate=0.0,
72
+ # Attach request data for better debugging
73
+ send_default_pii=False,
74
+ # Set server name to help identify the source
75
+ server_name=os.getenv("HOSTNAME", "unknown"),
76
+ )
77
+ _sentry_initialized = True
78
+ logger.debug("Sentry initialized successfully")
79
+ return True
80
+ except Exception as e:
81
+ logger.warning(f"Failed to initialize Sentry: {e}")
82
+ return False
83
+
84
+
85
+ def capture_exception(exception: BaseException) -> None:
86
+ """Capture an exception and send it to Sentry.
87
+
88
+ This is a convenience wrapper that ensures Sentry is initialized
89
+ before capturing the exception.
90
+ """
91
+ if init_sentry_tracking():
92
+ sentry_sdk.capture_exception(exception)
93
+
94
+
95
+ def capture_message(message: str, level: SentryLevel = "info") -> None:
96
+ """Capture a message and send it to Sentry.
97
+
98
+ This is useful for logging important events that aren't exceptions.
99
+ """
100
+ if init_sentry_tracking():
101
+ sentry_sdk.capture_message(message, level=level)
@@ -12,8 +12,8 @@ and provides the main() function for the CLI entry point.
12
12
  from airbyte_ops_mcp.cli import (
13
13
  cloud, # noqa: F401
14
14
  gh, # noqa: F401
15
+ local, # noqa: F401
15
16
  registry, # noqa: F401
16
- repo, # noqa: F401
17
17
  )
18
18
  from airbyte_ops_mcp.cli._base import app
19
19
 
@@ -2,9 +2,11 @@
2
2
  """CLI commands for local Airbyte monorepo operations.
3
3
 
4
4
  Commands:
5
- airbyte-ops repo connector list - List connectors in the monorepo
6
- airbyte-ops repo connector info - Get metadata for a single connector
7
- airbyte-ops repo connector bump-version - Bump connector version
5
+ airbyte-ops local connector list - List connectors in the monorepo
6
+ airbyte-ops local connector info - Get metadata for a single connector
7
+ airbyte-ops local connector bump-version - Bump connector version
8
+ airbyte-ops local connector qa - Run QA checks on a connector
9
+ airbyte-ops local connector qa-docs-generate - Generate QA checks documentation
8
10
  """
9
11
 
10
12
  from __future__ import annotations
@@ -15,6 +17,7 @@ from typing import Annotated, Literal
15
17
 
16
18
  import yaml
17
19
  from cyclopts import App, Parameter
20
+ from jinja2 import Environment, PackageLoader, select_autoescape
18
21
  from rich.console import Console
19
22
 
20
23
  from airbyte_ops_mcp.airbyte_repo.bump_version import (
@@ -31,6 +34,19 @@ from airbyte_ops_mcp.airbyte_repo.list_connectors import (
31
34
  )
32
35
  from airbyte_ops_mcp.cli._base import app
33
36
  from airbyte_ops_mcp.cli._shared import exit_with_error, print_json
37
+ from airbyte_ops_mcp.connector_ops.utils import Connector
38
+ from airbyte_ops_mcp.connector_qa.checks import ENABLED_CHECKS
39
+ from airbyte_ops_mcp.connector_qa.consts import CONNECTORS_QA_DOC_TEMPLATE_NAME
40
+ from airbyte_ops_mcp.connector_qa.models import (
41
+ Check,
42
+ CheckCategory,
43
+ CheckStatus,
44
+ Report,
45
+ )
46
+ from airbyte_ops_mcp.connector_qa.utils import (
47
+ get_all_connectors_in_directory,
48
+ remove_strict_encrypt_suffix,
49
+ )
34
50
  from airbyte_ops_mcp.mcp.github_repo_ops import list_connectors_in_repo
35
51
 
36
52
  console = Console()
@@ -138,13 +154,13 @@ def _get_connector_info(
138
154
  }
139
155
 
140
156
 
141
- # Create the repo sub-app
142
- repo_app = App(name="repo", help="Local Airbyte monorepo operations.")
143
- app.command(repo_app)
157
+ # Create the local sub-app
158
+ local_app = App(name="local", help="Local Airbyte monorepo operations.")
159
+ app.command(local_app)
144
160
 
145
- # Create the connector sub-app under repo
161
+ # Create the connector sub-app under local
146
162
  connector_app = App(name="connector", help="Connector operations in the monorepo.")
147
- repo_app.command(connector_app)
163
+ local_app.command(connector_app)
148
164
 
149
165
 
150
166
  @connector_app.command(name="list")
@@ -486,3 +502,110 @@ def bump_version(
486
502
  "new_version": result.new_version,
487
503
  }
488
504
  )
505
+
506
+
507
+ @connector_app.command(name="qa")
508
+ def run_qa_checks(
509
+ name: Annotated[
510
+ list[str] | None,
511
+ Parameter(
512
+ help="Connector technical name(s) (e.g., source-github). Can be specified multiple times."
513
+ ),
514
+ ] = None,
515
+ connector_directory: Annotated[
516
+ str | None,
517
+ Parameter(
518
+ help="Directory containing connectors to run checks on all connectors in this directory."
519
+ ),
520
+ ] = None,
521
+ check: Annotated[
522
+ list[str] | None,
523
+ Parameter(help="Specific check(s) to run. Can be specified multiple times."),
524
+ ] = None,
525
+ report_path: Annotated[
526
+ str | None,
527
+ Parameter(help="Path to write the JSON report file."),
528
+ ] = None,
529
+ ) -> None:
530
+ """Run QA checks on connector(s).
531
+
532
+ Validates connector metadata, documentation, packaging, security, and versioning.
533
+ Exit code is non-zero if any checks fail.
534
+ """
535
+ # Determine which checks to run
536
+ checks_to_run = ENABLED_CHECKS
537
+ if check:
538
+ check_names = set(check)
539
+ checks_to_run = [c for c in ENABLED_CHECKS if type(c).__name__ in check_names]
540
+ if not checks_to_run:
541
+ exit_with_error(
542
+ f"No matching checks found. Available checks: {[type(c).__name__ for c in ENABLED_CHECKS]}"
543
+ )
544
+
545
+ # Collect connectors to check
546
+ connectors: list[Connector] = []
547
+ if name:
548
+ connectors.extend(Connector(remove_strict_encrypt_suffix(n)) for n in name)
549
+ if connector_directory:
550
+ connectors.extend(get_all_connectors_in_directory(Path(connector_directory)))
551
+
552
+ if not connectors:
553
+ exit_with_error("No connectors specified. Use --name or --connector-directory.")
554
+
555
+ connectors = sorted(connectors, key=lambda c: c.technical_name)
556
+
557
+ # Run checks synchronously (simpler than async for CLI)
558
+ all_results = []
559
+ for connector in connectors:
560
+ for qa_check in checks_to_run:
561
+ result = qa_check.run(connector)
562
+ status_icon = (
563
+ "[green]PASS[/green]"
564
+ if result.status == CheckStatus.PASSED
565
+ else "[red]FAIL[/red]"
566
+ )
567
+ console.print(
568
+ f"{status_icon} {connector.technical_name}: {result.check.name}"
569
+ )
570
+ if result.message:
571
+ console.print(f" {result.message}")
572
+ all_results.append(result)
573
+
574
+ # Write report if requested
575
+ if report_path:
576
+ Report(check_results=all_results).write(Path(report_path))
577
+ console.print(f"Report written to {report_path}")
578
+
579
+ # Exit with error if any checks failed
580
+ failed = [r for r in all_results if r.status == CheckStatus.FAILED]
581
+ if failed:
582
+ exit_with_error(f"{len(failed)} check(s) failed")
583
+
584
+
585
+ @connector_app.command(name="qa-docs-generate")
586
+ def generate_qa_docs(
587
+ output_file: Annotated[
588
+ str,
589
+ Parameter(help="Path to write the generated documentation file."),
590
+ ],
591
+ ) -> None:
592
+ """Generate documentation for QA checks.
593
+
594
+ Creates a markdown file documenting all available QA checks organized by category.
595
+ """
596
+ checks_by_category: dict[CheckCategory, list[Check]] = {}
597
+ for qa_check in ENABLED_CHECKS:
598
+ checks_by_category.setdefault(qa_check.category, []).append(qa_check)
599
+
600
+ jinja_env = Environment(
601
+ loader=PackageLoader("airbyte_ops_mcp.connector_qa", "templates"),
602
+ autoescape=select_autoescape(),
603
+ trim_blocks=False,
604
+ lstrip_blocks=True,
605
+ )
606
+ template = jinja_env.get_template(CONNECTORS_QA_DOC_TEMPLATE_NAME)
607
+ documentation = template.render(checks_by_category=checks_by_category)
608
+
609
+ output_path = Path(output_file)
610
+ output_path.write_text(documentation)
611
+ console.print(f"Documentation written to {output_file}")
@@ -0,0 +1,17 @@
1
+ """Connector operations utilities."""
2
+
3
+ from airbyte_ops_mcp.connector_ops.utils import (
4
+ Connector,
5
+ ConnectorInvalidNameError,
6
+ ConnectorLanguage,
7
+ ConnectorLanguageError,
8
+ ConnectorVersionNotFound,
9
+ )
10
+
11
+ __all__ = [
12
+ "Connector",
13
+ "ConnectorInvalidNameError",
14
+ "ConnectorLanguage",
15
+ "ConnectorLanguageError",
16
+ "ConnectorVersionNotFound",
17
+ ]