devrev-Python-SDK 2.10.2__tar.gz → 2.11.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.
Files changed (366) hide show
  1. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/bug-fixer.md +1 -1
  2. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/builder.md +1 -1
  3. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/documentation.md +1 -1
  4. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/foreman.md +1 -1
  5. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/pr-review-boss.md +1 -1
  6. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/release-manager.md +1 -1
  7. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/simplifier.md +1 -1
  8. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/tester.md +1 -1
  9. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/foreman-work.md +1 -1
  10. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/release-prepare.md +1 -1
  11. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/review-start.md +1 -1
  12. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/simplify-code.md +1 -1
  13. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/PKG-INFO +1 -1
  14. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/tools-reference.md +8 -1
  15. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms-mcp.txt +9 -2
  16. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/pyproject.toml +1 -1
  17. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/articles.py +11 -0
  18. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/articles.py +25 -0
  19. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/server.py +3 -2
  20. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/articles.py +36 -0
  21. devrev_python_sdk-2.11.0/src/devrev_mcp/tools/question_answers.py +151 -0
  22. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/conftest.py +8 -0
  23. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_articles.py +170 -16
  24. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_parts.py +10 -0
  25. devrev_python_sdk-2.11.0/tests/unit/mcp/test_tools_question_answers.py +283 -0
  26. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_articles.py +83 -0
  27. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/uv.lock +1 -1
  28. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/code-quality.md +0 -0
  29. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/data-modeling.md +0 -0
  30. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/devrev-sdk.md +0 -0
  31. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/git-workflow.md +0 -0
  32. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/pull-requests.md +0 -0
  33. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/python-development.md +0 -0
  34. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/security.md +0 -0
  35. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/testing.md +0 -0
  36. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.dockerignore +0 -0
  37. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.env.sample +0 -0
  38. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
  39. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  40. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  41. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  42. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  43. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/dependabot.yml +0 -0
  44. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/pull_request_template.md +0 -0
  45. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/api-check.yml +0 -0
  46. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/ci.yml +0 -0
  47. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/claude-code-review.yml +0 -0
  48. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/claude.yml +0 -0
  49. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/deploy.yml +0 -0
  50. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/docs.yml +0 -0
  51. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/integration-tests.yml +0 -0
  52. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/release.yml +0 -0
  53. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/sync-openapi.yml +0 -0
  54. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.gitignore +0 -0
  55. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.pre-commit-config.yaml +0 -0
  56. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/CLAUDE.md +0 -0
  57. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/CODE_OF_CONDUCT.md +0 -0
  58. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/CONTRIBUTING.md +0 -0
  59. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/DEPRECATIONS.md +0 -0
  60. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/Dockerfile +0 -0
  61. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/KNOWN_ISSUES.md +0 -0
  62. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
  63. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/README.md +0 -0
  64. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/SECURITY.md +0 -0
  65. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/augment-mcp-config-remote.json +0 -0
  66. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/augment-mcp-config.json +0 -0
  67. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/augment-settings.json +0 -0
  68. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/README.md +0 -0
  69. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/bench_http_client.py +0 -0
  70. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/bench_models.py +0 -0
  71. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/bench_pagination.py +0 -0
  72. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/conftest.py +0 -0
  73. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/context7.json +0 -0
  74. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/README.md +0 -0
  75. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/audit-logging-setup.sh +0 -0
  76. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/cloudbuild.yaml +0 -0
  77. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/README.md +0 -0
  78. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/alert-policies.yaml +0 -0
  79. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/dashboard.json +0 -0
  80. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/validate-config.sh +0 -0
  81. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/service.yaml +0 -0
  82. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docker-compose.yml +0 -0
  83. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/brands.md +0 -0
  84. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/engagements.md +0 -0
  85. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/incidents.md +0 -0
  86. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/index.md +0 -0
  87. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/question-answers.md +0 -0
  88. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/recommendations.md +0 -0
  89. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/search.md +0 -0
  90. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/uoms.md +0 -0
  91. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta-api-differences.md +0 -0
  92. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/client.md +0 -0
  93. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/config.md +0 -0
  94. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/exceptions.md +0 -0
  95. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/index.md +0 -0
  96. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/accounts.md +0 -0
  97. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/base.md +0 -0
  98. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/index.md +0 -0
  99. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/users.md +0 -0
  100. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/works.md +0 -0
  101. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/accounts.md +0 -0
  102. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/articles.md +0 -0
  103. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/code-changes.md +0 -0
  104. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/conversations.md +0 -0
  105. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/dev-users.md +0 -0
  106. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/groups.md +0 -0
  107. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/index.md +0 -0
  108. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/links.md +0 -0
  109. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/parts.md +0 -0
  110. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/rev-users.md +0 -0
  111. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/slas.md +0 -0
  112. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/tags.md +0 -0
  113. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/timeline-entries.md +0 -0
  114. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/webhooks.md +0 -0
  115. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/works.md +0 -0
  116. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/changelog.md +0 -0
  117. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/advanced.md +0 -0
  118. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/basic.md +0 -0
  119. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/beta-features.md +0 -0
  120. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/index.md +0 -0
  121. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/integrations.md +0 -0
  122. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/authentication.md +0 -0
  123. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/index.md +0 -0
  124. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/installation.md +0 -0
  125. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/quickstart.md +0 -0
  126. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/beta-api.md +0 -0
  127. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/compatibility.md +0 -0
  128. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/configuration.md +0 -0
  129. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/error-handling.md +0 -0
  130. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/github-actions-setup.md +0 -0
  131. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/index.md +0 -0
  132. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/logging.md +0 -0
  133. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/pagination.md +0 -0
  134. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/sync-vs-async.md +0 -0
  135. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/testing.md +0 -0
  136. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/version-support.md +0 -0
  137. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/write-integration-testing-strategy.md +0 -0
  138. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/hooks/copy_llms.py +0 -0
  139. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/index.md +0 -0
  140. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/deployment.md +0 -0
  141. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/index.md +0 -0
  142. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/quickstart.md +0 -0
  143. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/stylesheets/extra.css +0 -0
  144. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/README.md +0 -0
  145. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/README.md +0 -0
  146. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/async_example.py +0 -0
  147. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/create_work.py +0 -0
  148. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/error_handling.py +0 -0
  149. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/list_accounts.py +0 -0
  150. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/pagination.py +0 -0
  151. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/search_users.py +0 -0
  152. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/cloud_functions/README.md +0 -0
  153. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/cloud_functions/main.py +0 -0
  154. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
  155. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/fastapi/README.md +0 -0
  156. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/fastapi/main.py +0 -0
  157. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/fastapi/requirements.txt +0 -0
  158. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/flask/README.md +0 -0
  159. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/flask/app.py +0 -0
  160. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/flask/requirements.txt +0 -0
  161. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms-ctx-full.txt +0 -0
  162. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms-ctx.txt +0 -0
  163. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms.txt +0 -0
  164. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/mkdocs.yml +0 -0
  165. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/openapi-beta.yaml +0 -0
  166. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/openapi-public.yaml +0 -0
  167. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/openapi-spec-corrections.yaml +0 -0
  168. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/scripts/build_ai_docs.py +0 -0
  169. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/scripts/debug_articles.py +0 -0
  170. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/scripts/setup-github-secrets.sh +0 -0
  171. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/__init__.py +0 -0
  172. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/client.py +0 -0
  173. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/config.py +0 -0
  174. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/exceptions.py +0 -0
  175. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/__init__.py +0 -0
  176. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/accounts.py +0 -0
  177. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/artifacts.py +0 -0
  178. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/base.py +0 -0
  179. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/brands.py +0 -0
  180. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/code_changes.py +0 -0
  181. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/conversations.py +0 -0
  182. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/dev_users.py +0 -0
  183. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/engagements.py +0 -0
  184. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/groups.py +0 -0
  185. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/incidents.py +0 -0
  186. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/links.py +0 -0
  187. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/notifications.py +0 -0
  188. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/parts.py +0 -0
  189. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/preferences.py +0 -0
  190. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/question_answers.py +0 -0
  191. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/recommendations.py +0 -0
  192. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/rev_users.py +0 -0
  193. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/search.py +0 -0
  194. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/slas.py +0 -0
  195. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/sync.py +0 -0
  196. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/tags.py +0 -0
  197. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/tasks.py +0 -0
  198. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/timeline_entries.py +0 -0
  199. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/timeline_events.py +0 -0
  200. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/track_events.py +0 -0
  201. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/uoms.py +0 -0
  202. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/webhooks.py +0 -0
  203. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/widgets.py +0 -0
  204. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/works.py +0 -0
  205. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/py.typed +0 -0
  206. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/__init__.py +0 -0
  207. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/accounts.py +0 -0
  208. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/artifacts.py +0 -0
  209. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/base.py +0 -0
  210. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/brands.py +0 -0
  211. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/code_changes.py +0 -0
  212. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/conversations.py +0 -0
  213. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/dev_users.py +0 -0
  214. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/engagements.py +0 -0
  215. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/groups.py +0 -0
  216. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/incidents.py +0 -0
  217. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/links.py +0 -0
  218. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/notifications.py +0 -0
  219. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/parts.py +0 -0
  220. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/preferences.py +0 -0
  221. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/question_answers.py +0 -0
  222. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/recommendations.py +0 -0
  223. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/rev_users.py +0 -0
  224. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/search.py +0 -0
  225. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/slas.py +0 -0
  226. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/tags.py +0 -0
  227. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/timeline_entries.py +0 -0
  228. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/track_events.py +0 -0
  229. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/uoms.py +0 -0
  230. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/webhooks.py +0 -0
  231. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/works.py +0 -0
  232. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/__init__.py +0 -0
  233. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/content_converter.py +0 -0
  234. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/deprecation.py +0 -0
  235. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/http.py +0 -0
  236. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/logging.py +0 -0
  237. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/pagination.py +0 -0
  238. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/__init__.py +0 -0
  239. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/__main__.py +0 -0
  240. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/config.py +0 -0
  241. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/__init__.py +0 -0
  242. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/audit.py +0 -0
  243. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/auth.py +0 -0
  244. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/health.py +0 -0
  245. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
  246. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/__init__.py +0 -0
  247. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/escalation.py +0 -0
  248. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/investigate.py +0 -0
  249. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/response.py +0 -0
  250. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/summarize.py +0 -0
  251. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/triage.py +0 -0
  252. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/__init__.py +0 -0
  253. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/account.py +0 -0
  254. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/article.py +0 -0
  255. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/conversation.py +0 -0
  256. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/part.py +0 -0
  257. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/server_info.py +0 -0
  258. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/ticket.py +0 -0
  259. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/user.py +0 -0
  260. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/__init__.py +0 -0
  261. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/accounts.py +0 -0
  262. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/conversations.py +0 -0
  263. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/engagements.py +0 -0
  264. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/groups.py +0 -0
  265. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/incidents.py +0 -0
  266. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/links.py +0 -0
  267. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/parts.py +0 -0
  268. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/recommendations.py +0 -0
  269. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/search.py +0 -0
  270. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/server_info.py +0 -0
  271. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/slas.py +0 -0
  272. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/tags.py +0 -0
  273. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/timeline.py +0 -0
  274. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/users.py +0 -0
  275. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/works.py +0 -0
  276. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/__init__.py +0 -0
  277. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/errors.py +0 -0
  278. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/formatting.py +0 -0
  279. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/pagination.py +0 -0
  280. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/__init__.py +0 -0
  281. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/conftest.py +0 -0
  282. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/__init__.py +0 -0
  283. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/conftest.py +0 -0
  284. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_accounts_e2e.py +0 -0
  285. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
  286. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_articles_lifecycle.py +0 -0
  287. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_backwards_compatibility.py +0 -0
  288. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_contacts_e2e.py +0 -0
  289. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_core_services_phase1.py +0 -0
  290. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_extended_services_phase2.py +0 -0
  291. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_get_endpoints.py +0 -0
  292. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_issues_e2e.py +0 -0
  293. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_kb_articles_e2e.py +0 -0
  294. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_mcp_articles.py +0 -0
  295. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_ping.py +0 -0
  296. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_question_answers_e2e.py +0 -0
  297. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_readonly_endpoints.py +0 -0
  298. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_specialized_services_phase3.py +0 -0
  299. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_tickets_e2e.py +0 -0
  300. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_write_operations.py +0 -0
  301. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/__init__.py +0 -0
  302. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/cleanup.py +0 -0
  303. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/constants.py +0 -0
  304. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/data_manager.py +0 -0
  305. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/performance/__init__.py +0 -0
  306. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/performance/test_articles_performance.py +0 -0
  307. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/__init__.py +0 -0
  308. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/__init__.py +0 -0
  309. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_audit.py +0 -0
  310. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_config.py +0 -0
  311. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
  312. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_prompts.py +0 -0
  313. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_resources.py +0 -0
  314. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_server_info.py +0 -0
  315. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
  316. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
  317. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
  318. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_groups.py +0 -0
  319. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
  320. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_links.py +0 -0
  321. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
  322. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_search.py +0 -0
  323. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_slas.py +0 -0
  324. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_tags.py +0 -0
  325. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
  326. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_users.py +0 -0
  327. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_works.py +0 -0
  328. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_utils.py +0 -0
  329. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/models/__init__.py +0 -0
  330. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/models/test_user_state_regression.py +0 -0
  331. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/__init__.py +0 -0
  332. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/conftest.py +0 -0
  333. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_async_services.py +0 -0
  334. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_brands.py +0 -0
  335. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_code_changes.py +0 -0
  336. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_conversations.py +0 -0
  337. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_engagements.py +0 -0
  338. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_groups.py +0 -0
  339. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_incidents.py +0 -0
  340. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_links.py +0 -0
  341. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_notifications.py +0 -0
  342. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_parts.py +0 -0
  343. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_preferences.py +0 -0
  344. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_question_answers.py +0 -0
  345. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_recommendations.py +0 -0
  346. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_search.py +0 -0
  347. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_slas.py +0 -0
  348. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_tags.py +0 -0
  349. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_timeline_entries.py +0 -0
  350. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_track_events.py +0 -0
  351. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_uoms.py +0 -0
  352. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_webhooks.py +0 -0
  353. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_works.py +0 -0
  354. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_articles_unified.py +0 -0
  355. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_artifacts.py +0 -0
  356. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_backward_compatibility.py +0 -0
  357. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_base_service.py +0 -0
  358. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_client.py +0 -0
  359. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_config.py +0 -0
  360. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_content_converter.py +0 -0
  361. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_deprecation.py +0 -0
  362. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_error_handling.py +0 -0
  363. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_exceptions.py +0 -0
  364. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_http.py +0 -0
  365. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_logging.py +0 -0
  366. {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_pagination.py +0 -0
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: bug-fixer
3
3
  description: Resolves individual code review comments and issues in PRs
4
- model: claude-sonnet-4-5
4
+ model: claude-sonnet-4-6
5
5
  color: orange
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: builder
3
3
  description: Implements specific feature components (APIs, services, models, UI)
4
- model: claude-sonnet-4-5
4
+ model: claude-sonnet-4-6
5
5
  color: teal
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: documentation
3
3
  description: Updates project documentation to reflect PR changes
4
- model: claude-sonnet-4-5
4
+ model: claude-sonnet-4-6
5
5
  color: blue
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: foreman
3
3
  description: Orchestrates feature development from GitHub issue to PR creation
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  color: indigo
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: pr-review-boss
3
3
  description: Orchestrates the complete PR review lifecycle with parallel sub-agents
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  color: purple
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: release-manager
3
3
  description: Automates semantic versioning releases with changelog generation and deployment triggers
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  color: green
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: code-simplifier
3
3
  description: Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  color: purple
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: tester
3
3
  description: Analyzes PR changes and creates comprehensive tests
4
- model: claude-sonnet-4-5
4
+ model: claude-sonnet-4-6
5
5
  color: green
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Start working on a GitHub issue using the Foreman agent
3
3
  argument-hint: [issue-number]
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  ---
6
6
 
7
7
  # Foreman Work Command
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Prepare and create a semantic versioned release with automated changelog
3
3
  argument-hint: "[patch|minor|major]"
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  ---
6
6
 
7
7
  # Release Prepare Command
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Start monitoring and reviewing PRs using the PR Review Boss agent
3
3
  argument-hint: [check-interval-seconds] [duration-minutes]
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  ---
6
6
 
7
7
  # PR Review Start Command
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Simplify and refine code for clarity, consistency, and maintainability
3
3
  argument-hint: [file-path-or-scope]
4
- model: claude-opus-4-5
4
+ model: claude-opus-4-6
5
5
  ---
6
6
 
7
7
  # Simplify Code Command
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devrev-Python-SDK
3
- Version: 2.10.2
3
+ Version: 2.11.0
4
4
  Summary: A modern, type-safe Python SDK for the DevRev API
5
5
  Project-URL: Homepage, https://github.com/mgmonteleone/py-dev-rev
6
6
  Project-URL: Documentation, https://github.com/mgmonteleone/py-dev-rev
@@ -6,7 +6,7 @@ icon: material/tools
6
6
 
7
7
  Complete reference of all MCP capabilities provided by the DevRev MCP Server.
8
8
 
9
- ## Tools (78+)
9
+ ## Tools (83+)
10
10
 
11
11
  Tools are the primary way AI assistants interact with DevRev. Each tool maps to one or more DevRev API endpoints.
12
12
 
@@ -139,6 +139,13 @@ Tools are the primary way AI assistants interact with DevRev. Each tool maps to
139
139
  | `devrev_incidents_get` | Get incident details |
140
140
  | `devrev_engagements_list` | List customer engagements |
141
141
  | `devrev_engagements_get` | Get engagement details |
142
+ | `devrev_question_answers_list` | List question-answer entries |
143
+ | `devrev_question_answers_get` | Get a question-answer by ID |
144
+ | `devrev_question_answers_create` | Create a new Q&A entry ¹ |
145
+ | `devrev_question_answers_update` | Update a Q&A entry ¹ |
146
+ | `devrev_question_answers_delete` | Delete a Q&A entry ¹ |
147
+
148
+ ¹ Also requires `MCP_ENABLE_DESTRUCTIVE_TOOLS=true`
142
149
 
143
150
  ---
144
151
 
@@ -163,6 +163,13 @@ devrev-mcp-server
163
163
  - `devrev_incidents_list` — List incidents
164
164
  - `devrev_incidents_get` — Get incident by ID
165
165
 
166
+ ### Question Answers (Beta)
167
+ - `devrev_question_answers_list` — List Q&A entries
168
+ - `devrev_question_answers_get` — Get Q&A by ID
169
+ - `devrev_question_answers_create` — Create a new Q&A entry (destructive)
170
+ - `devrev_question_answers_update` — Update a Q&A entry (destructive)
171
+ - `devrev_question_answers_delete` — Delete a Q&A entry (destructive)
172
+
166
173
  ### Search (Beta)
167
174
  - `devrev_search` — Hybrid search across DevRev objects
168
175
 
@@ -202,8 +209,8 @@ Pre-built workflow prompts for common support operations:
202
209
  1. **IDs are DON format**: `don:core:dvrv-us-1:devo/1:ticket/123`
203
210
  2. **Pagination**: Cursor-based using `cursor` and `limit` parameters
204
211
  3. **Creating tickets**: Requires `type` (ticket/issue), `title`, and `applies_to_part`
205
- 4. **Beta tools**: Require `MCP_ENABLE_BETA_TOOLS=true` (search, recommendations, incidents, engagements)
206
- 5. **Destructive tools**: Require `MCP_ENABLE_DESTRUCTIVE_TOOLS=true` (delete operations)
212
+ 4. **Beta tools**: Require `MCP_ENABLE_BETA_TOOLS=true` (search, recommendations, incidents, engagements, question answers)
213
+ 5. **Destructive tools**: Require `MCP_ENABLE_DESTRUCTIVE_TOOLS=true` (create/update/delete operations)
207
214
  6. **Auth for teams**: Use `MCP_AUTH_MODE=devrev-pat` — each user sends their own DevRev PAT as Bearer token
208
215
  7. **Transports**: stdio for local dev, streamable-http for production, sse for legacy
209
216
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "devrev-Python-SDK"
7
- version = "2.10.2"
7
+ version = "2.11.0"
8
8
  description = "A modern, type-safe Python SDK for the DevRev API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -328,6 +328,14 @@ class ArticlesUpdateRequestTags(DevRevBaseModel):
328
328
  set: list[SetTagWithValue] | None = Field(default=None, description="Set tags")
329
329
 
330
330
 
331
+ class ArticlesUpdateRequestSharedWith(DevRevBaseModel):
332
+ """Shared-with update for articles."""
333
+
334
+ set: list[SetSharedWithMembership] | None = Field(
335
+ default=None, description="Set shared-with memberships"
336
+ )
337
+
338
+
331
339
  class ArticlesUpdateRequest(DevRevBaseModel):
332
340
  """Request to update an article."""
333
341
 
@@ -357,6 +365,9 @@ class ArticlesUpdateRequest(DevRevBaseModel):
357
365
  parent: str | None = Field(default=None, description="New parent article ID")
358
366
  published_version: str | None = Field(default=None, description="Published version")
359
367
  release_notes: str | None = Field(default=None, description="New release notes")
368
+ shared_with: ArticlesUpdateRequestSharedWith | None = Field(
369
+ default=None, description="New shared-with memberships"
370
+ )
360
371
  artifacts: dict[str, Any] | None = Field(
361
372
  default=None,
362
373
  description="Artifacts update using set wrapper, e.g. {'set': ['artifact_id']}",
@@ -23,10 +23,12 @@ from devrev.models.articles import (
23
23
  ArticleStatus,
24
24
  ArticlesUpdateRequest,
25
25
  ArticlesUpdateRequestAppliesToParts,
26
+ ArticlesUpdateRequestSharedWith,
26
27
  ArticlesUpdateRequestTags,
27
28
  ArticlesUpdateResponse,
28
29
  ArticleType,
29
30
  ArticleWithContent,
31
+ SetSharedWithMembership,
30
32
  )
31
33
  from devrev.models.artifacts import (
32
34
  ArtifactPrepareRequest,
@@ -205,6 +207,7 @@ class ArticlesService(BaseService):
205
207
  article_type: str | None = None,
206
208
  language: str | None = None,
207
209
  authored_by: builtins.list[str] | None = None,
210
+ shared_with: builtins.list[SetSharedWithMembership] | None = None,
208
211
  ) -> Article:
209
212
  """Create an article with content in a single operation.
210
213
 
@@ -230,6 +233,7 @@ class ArticlesService(BaseService):
230
233
  article_type: Optional article type ('article', 'page', 'content_block')
231
234
  language: Optional language code (e.g., 'en')
232
235
  authored_by: Optional list of user IDs who author the article
236
+ shared_with: Optional list of shared-with memberships
233
237
 
234
238
  Returns:
235
239
  Created article
@@ -292,6 +296,7 @@ class ArticlesService(BaseService):
292
296
  article_type=article_type,
293
297
  language=language,
294
298
  authored_by=authored_by,
299
+ shared_with=shared_with,
295
300
  )
296
301
  return self.create(article_req)
297
302
 
@@ -454,6 +459,7 @@ class ArticlesService(BaseService):
454
459
  access_level: ArticleAccessLevel | None = None,
455
460
  tags: builtins.list[SetTagWithValue] | None = None,
456
461
  language: str | None = None,
462
+ shared_with: builtins.list[SetSharedWithMembership] | None = None,
457
463
  ) -> Article:
458
464
  """Update article metadata and/or content.
459
465
 
@@ -472,6 +478,7 @@ class ArticlesService(BaseService):
472
478
  access_level: Optional access level (internal, external, private, public)
473
479
  tags: Optional list of tags to apply (list of SetTagWithValue objects)
474
480
  language: Optional language code (e.g., 'en')
481
+ shared_with: Optional list of shared-with memberships
475
482
 
476
483
  Returns:
477
484
  Updated article
@@ -532,6 +539,11 @@ class ArticlesService(BaseService):
532
539
  if tags is not None:
533
540
  tags_req = ArticlesUpdateRequestTags(set=tags)
534
541
 
542
+ # Build shared_with wrapper if provided
543
+ shared_with_req = None
544
+ if shared_with is not None:
545
+ shared_with_req = ArticlesUpdateRequestSharedWith(set=shared_with)
546
+
535
547
  # Update metadata if any metadata fields provided
536
548
  has_metadata = (
537
549
  title is not None
@@ -541,6 +553,7 @@ class ArticlesService(BaseService):
541
553
  or access_level is not None
542
554
  or tags is not None
543
555
  or language is not None
556
+ or shared_with is not None
544
557
  )
545
558
  if has_metadata:
546
559
  update_req = ArticlesUpdateRequest(
@@ -552,6 +565,7 @@ class ArticlesService(BaseService):
552
565
  access_level=access_level,
553
566
  tags=tags_req,
554
567
  language=language,
568
+ shared_with=shared_with_req,
555
569
  )
556
570
  return self.update(update_req)
557
571
 
@@ -665,6 +679,7 @@ class AsyncArticlesService(AsyncBaseService):
665
679
  article_type: str | None = None,
666
680
  language: str | None = None,
667
681
  authored_by: builtins.list[str] | None = None,
682
+ shared_with: builtins.list[SetSharedWithMembership] | None = None,
668
683
  ) -> Article:
669
684
  """Create an article with content in a single operation (async).
670
685
 
@@ -740,6 +755,7 @@ class AsyncArticlesService(AsyncBaseService):
740
755
  article_type=article_type,
741
756
  language=language,
742
757
  authored_by=authored_by,
758
+ shared_with=shared_with,
743
759
  )
744
760
  return await self.create(article_req)
745
761
 
@@ -891,6 +907,7 @@ class AsyncArticlesService(AsyncBaseService):
891
907
  access_level: ArticleAccessLevel | None = None,
892
908
  tags: builtins.list[SetTagWithValue] | None = None,
893
909
  language: str | None = None,
910
+ shared_with: builtins.list[SetSharedWithMembership] | None = None,
894
911
  ) -> Article:
895
912
  """Update article metadata and/or content (async).
896
913
 
@@ -909,6 +926,7 @@ class AsyncArticlesService(AsyncBaseService):
909
926
  access_level: Optional access level (internal, external, private, public)
910
927
  tags: Optional list of tags to apply (list of SetTagWithValue objects)
911
928
  language: Optional language code (e.g., 'en')
929
+ shared_with: Optional list of shared-with memberships
912
930
 
913
931
  Returns:
914
932
  Updated article
@@ -936,6 +954,11 @@ class AsyncArticlesService(AsyncBaseService):
936
954
  if tags is not None:
937
955
  tags_req = ArticlesUpdateRequestTags(set=tags)
938
956
 
957
+ # Build shared_with wrapper if provided
958
+ shared_with_req = None
959
+ if shared_with is not None:
960
+ shared_with_req = ArticlesUpdateRequestSharedWith(set=shared_with)
961
+
939
962
  # Update metadata if any metadata fields provided
940
963
  has_metadata = (
941
964
  title is not None
@@ -945,6 +968,7 @@ class AsyncArticlesService(AsyncBaseService):
945
968
  or access_level is not None
946
969
  or tags is not None
947
970
  or language is not None
971
+ or shared_with is not None
948
972
  )
949
973
  if has_metadata:
950
974
  update_req = ArticlesUpdateRequest(
@@ -956,6 +980,7 @@ class AsyncArticlesService(AsyncBaseService):
956
980
  access_level=access_level,
957
981
  tags=tags_req,
958
982
  language=language,
983
+ shared_with=shared_with_req,
959
984
  )
960
985
  return await self.update(update_req)
961
986
 
@@ -232,9 +232,9 @@ if _config.transport != "stdio":
232
232
  # before any tool modules are imported, otherwise tool registration could
233
233
  # interact with an incompletely configured server.
234
234
  #
235
- # All tool modules are always imported. Each module internally guards
235
+ # Core tool modules are always imported. Each module internally guards
236
236
  # destructive tools (create/update/delete) using `_config.enable_destructive_tools`.
237
- # Beta tools check `_config.enable_beta_tools`.
237
+ # Beta tool modules are conditionally imported below when `_config.enable_beta_tools` is enabled.
238
238
  from devrev_mcp.tools import accounts as _accounts_tools # noqa: E402, F401
239
239
  from devrev_mcp.tools import articles as _articles_tools # noqa: E402, F401
240
240
  from devrev_mcp.tools import conversations as _conversations_tools # noqa: E402, F401
@@ -252,6 +252,7 @@ from devrev_mcp.tools import works as _works_tools # noqa: E402, F401
252
252
 
253
253
  # Beta tools (only if beta tools are enabled)
254
254
  if _config.enable_beta_tools:
255
+ from devrev_mcp.tools import question_answers as _question_answers_tools # noqa: E402, F401
255
256
  from devrev_mcp.tools import recommendations as _recommendations_tools # noqa: E402, F401
256
257
  from devrev_mcp.tools import search as _search_tools # noqa: E402, F401
257
258
 
@@ -17,6 +17,7 @@ from devrev.models.articles import (
17
17
  ArticlesGetRequest,
18
18
  ArticlesListRequest,
19
19
  ArticleStatus,
20
+ SetSharedWithMembership,
20
21
  )
21
22
  from devrev.models.base import SetTagWithValue
22
23
  from devrev_mcp.server import _config, mcp
@@ -111,6 +112,7 @@ if _config.enable_destructive_tools:
111
112
  tags: list[str] | None = None,
112
113
  language: str | None = None,
113
114
  authored_by: list[str] | None = None,
115
+ shared_with: list[dict[str, str]] | None = None,
114
116
  ) -> dict[str, Any]:
115
117
  """Create a new article with content.
116
118
 
@@ -129,6 +131,7 @@ if _config.enable_destructive_tools:
129
131
  tags: Optional list of tag IDs to apply to the article.
130
132
  language: Optional language code (e.g., 'en').
131
133
  authored_by: Optional list of user IDs who author the article.
134
+ shared_with: Optional list of dicts with 'member' (required) and 'role' (optional).
132
135
 
133
136
  Returns:
134
137
  Dictionary containing the created article details.
@@ -164,6 +167,20 @@ if _config.enable_destructive_tools:
164
167
  [SetTagWithValue(id=tag_id) for tag_id in tags] if tags is not None else None
165
168
  )
166
169
 
170
+ # Convert shared_with dicts to SetSharedWithMembership objects
171
+ shared_with_list: list[SetSharedWithMembership] | None = None
172
+ if shared_with is not None:
173
+ for entry in shared_with:
174
+ if not isinstance(entry, dict) or "member" not in entry:
175
+ raise RuntimeError(
176
+ "Each shared_with entry must be a dict containing "
177
+ "a 'member' key (and optional 'role' key)."
178
+ )
179
+ shared_with_list = [
180
+ SetSharedWithMembership(member=m["member"], role=m.get("role"))
181
+ for m in shared_with
182
+ ]
183
+
167
184
  article = await app.get_client().articles.create_with_content(
168
185
  title=title,
169
186
  content=content,
@@ -177,6 +194,7 @@ if _config.enable_destructive_tools:
177
194
  tags=tags_list,
178
195
  language=language,
179
196
  authored_by=authored_by,
197
+ shared_with=shared_with_list,
180
198
  )
181
199
  return serialize_model(article)
182
200
  except DevRevError as e:
@@ -194,6 +212,7 @@ if _config.enable_destructive_tools:
194
212
  access_level: str | None = None,
195
213
  tags: list[str] | None = None,
196
214
  language: str | None = None,
215
+ shared_with: list[dict[str, str]] | None = None,
197
216
  ) -> dict[str, Any]:
198
217
  """Update an existing article in DevRev.
199
218
 
@@ -213,6 +232,8 @@ if _config.enable_destructive_tools:
213
232
  tags: Optional list of tag IDs to apply to the article.
214
233
  Pass an empty list to remove all tags.
215
234
  language: Optional language code (e.g., 'en').
235
+ shared_with: Optional list of dicts with 'member' (required) and 'role' (optional).
236
+ Pass an empty list to remove all sharing.
216
237
 
217
238
  Returns:
218
239
  Dictionary containing the updated article details.
@@ -248,6 +269,20 @@ if _config.enable_destructive_tools:
248
269
  [SetTagWithValue(id=tag_id) for tag_id in tags] if tags is not None else None
249
270
  )
250
271
 
272
+ # Convert shared_with dicts to SetSharedWithMembership objects
273
+ shared_with_list: list[SetSharedWithMembership] | None = None
274
+ if shared_with is not None:
275
+ for entry in shared_with:
276
+ if not isinstance(entry, dict) or "member" not in entry:
277
+ raise RuntimeError(
278
+ "Each shared_with entry must be a dict containing "
279
+ "a 'member' key (and optional 'role' key)."
280
+ )
281
+ shared_with_list = [
282
+ SetSharedWithMembership(member=m["member"], role=m.get("role"))
283
+ for m in shared_with
284
+ ]
285
+
251
286
  article = await app.get_client().articles.update_with_content(
252
287
  id=id,
253
288
  title=title,
@@ -258,6 +293,7 @@ if _config.enable_destructive_tools:
258
293
  access_level=article_access_level,
259
294
  tags=tags_list,
260
295
  language=language,
296
+ shared_with=shared_with_list,
261
297
  )
262
298
  return serialize_model(article)
263
299
  except DevRevError as e:
@@ -0,0 +1,151 @@
1
+ """MCP tools for DevRev question-answer operations (beta API)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from typing import Any
7
+
8
+ from mcp.server.fastmcp import Context
9
+
10
+ from devrev.exceptions import DevRevError
11
+ from devrev.models.question_answers import (
12
+ QuestionAnswersCreateRequest,
13
+ QuestionAnswersDeleteRequest,
14
+ QuestionAnswersGetRequest,
15
+ QuestionAnswersListRequest,
16
+ QuestionAnswersUpdateRequest,
17
+ )
18
+ from devrev_mcp.server import _config, mcp
19
+ from devrev_mcp.utils.errors import format_devrev_error
20
+ from devrev_mcp.utils.formatting import serialize_model, serialize_models
21
+ from devrev_mcp.utils.pagination import clamp_page_size, paginated_response
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ @mcp.tool()
27
+ async def devrev_question_answers_list(
28
+ ctx: Context[Any, Any, Any],
29
+ cursor: str | None = None,
30
+ limit: int | None = None,
31
+ ) -> dict[str, Any]:
32
+ """List DevRev question answers.
33
+
34
+ Args:
35
+ cursor: Pagination cursor from a previous response.
36
+ limit: Maximum number of items to return (default: 25, max: 100).
37
+ """
38
+ app = ctx.request_context.lifespan_context
39
+ try:
40
+ request = QuestionAnswersListRequest(
41
+ cursor=cursor,
42
+ limit=clamp_page_size(
43
+ limit, default=app.config.default_page_size, maximum=app.config.max_page_size
44
+ ),
45
+ )
46
+ response = await app.get_client().question_answers.list(request)
47
+ items = serialize_models(response.question_answers)
48
+ return paginated_response(
49
+ items, next_cursor=response.next_cursor, total_label="question_answers"
50
+ )
51
+ except DevRevError as e:
52
+ raise RuntimeError(format_devrev_error(e)) from e
53
+
54
+
55
+ @mcp.tool()
56
+ async def devrev_question_answers_get(
57
+ ctx: Context[Any, Any, Any],
58
+ id: str,
59
+ ) -> dict[str, Any]:
60
+ """Get a DevRev question answer by ID.
61
+
62
+ Args:
63
+ id: The question answer ID.
64
+ """
65
+ app = ctx.request_context.lifespan_context
66
+ try:
67
+ request = QuestionAnswersGetRequest(id=id)
68
+ qa = await app.get_client().question_answers.get(request)
69
+ return serialize_model(qa)
70
+ except DevRevError as e:
71
+ raise RuntimeError(format_devrev_error(e)) from e
72
+
73
+
74
+ # Destructive tools (only registered when enabled)
75
+ if _config.enable_destructive_tools:
76
+
77
+ @mcp.tool()
78
+ async def devrev_question_answers_create(
79
+ ctx: Context[Any, Any, Any],
80
+ question: str,
81
+ answer: str,
82
+ applies_to_parts: list[str],
83
+ owned_by: list[str],
84
+ status: str | None = None,
85
+ ) -> dict[str, Any]:
86
+ """Create a new DevRev question answer.
87
+
88
+ Args:
89
+ question: The question text.
90
+ answer: The answer text.
91
+ applies_to_parts: List of part IDs this Q&A applies to.
92
+ owned_by: List of dev user IDs who own this Q&A.
93
+ status: Optional status (draft, published). Defaults to draft.
94
+ """
95
+ app = ctx.request_context.lifespan_context
96
+ try:
97
+ kwargs: dict[str, Any] = {
98
+ "question": question,
99
+ "answer": answer,
100
+ "applies_to_parts": applies_to_parts,
101
+ "owned_by": owned_by,
102
+ }
103
+ if status is not None:
104
+ kwargs["status"] = status
105
+ request = QuestionAnswersCreateRequest(**kwargs)
106
+ qa = await app.get_client().question_answers.create(request)
107
+ return serialize_model(qa)
108
+ except DevRevError as e:
109
+ raise RuntimeError(format_devrev_error(e)) from e
110
+
111
+ @mcp.tool()
112
+ async def devrev_question_answers_update(
113
+ ctx: Context[Any, Any, Any],
114
+ id: str,
115
+ question: str | None = None,
116
+ answer: str | None = None,
117
+ ) -> dict[str, Any]:
118
+ """Update an existing DevRev question answer.
119
+
120
+ Only provided fields will be updated; others remain unchanged.
121
+
122
+ Args:
123
+ id: The question answer ID to update.
124
+ question: New question text.
125
+ answer: New answer text.
126
+ """
127
+ app = ctx.request_context.lifespan_context
128
+ try:
129
+ request = QuestionAnswersUpdateRequest(id=id, question=question, answer=answer)
130
+ qa = await app.get_client().question_answers.update(request)
131
+ return serialize_model(qa)
132
+ except DevRevError as e:
133
+ raise RuntimeError(format_devrev_error(e)) from e
134
+
135
+ @mcp.tool()
136
+ async def devrev_question_answers_delete(
137
+ ctx: Context[Any, Any, Any],
138
+ id: str,
139
+ ) -> dict[str, Any]:
140
+ """Delete a DevRev question answer.
141
+
142
+ Args:
143
+ id: The question answer ID to delete.
144
+ """
145
+ app = ctx.request_context.lifespan_context
146
+ try:
147
+ request = QuestionAnswersDeleteRequest(id=id)
148
+ await app.get_client().question_answers.delete(request)
149
+ return {"deleted": True, "id": id}
150
+ except DevRevError as e:
151
+ raise RuntimeError(format_devrev_error(e)) from e
@@ -175,6 +175,14 @@ def mock_client():
175
175
  client.slas.update = AsyncMock()
176
176
  client.slas.transition = AsyncMock()
177
177
 
178
+ # Question Answers service
179
+ client.question_answers = AsyncMock()
180
+ client.question_answers.list = AsyncMock()
181
+ client.question_answers.get = AsyncMock()
182
+ client.question_answers.create = AsyncMock()
183
+ client.question_answers.update = AsyncMock()
184
+ client.question_answers.delete = AsyncMock()
185
+
178
186
  # Close method
179
187
  client.close = AsyncMock()
180
188