devrev-Python-SDK 2.9.0__tar.gz → 2.10.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/ci.yml +1 -1
  2. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/deploy.yml +1 -1
  3. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/release.yml +2 -2
  4. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/PKG-INFO +11 -1
  5. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/README.md +10 -0
  6. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/articles.md +12 -0
  7. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/changelog.md +24 -0
  8. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/tools-reference.md +2 -0
  9. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/pyproject.toml +1 -1
  10. devrev_python_sdk-2.10.1/scripts/debug_articles.py +200 -0
  11. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/articles.py +34 -0
  12. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/articles.py +44 -5
  13. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_articles.py +177 -2
  14. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_articles_unified.py +163 -0
  15. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/uv.lock +32 -4
  16. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/bug-fixer.md +0 -0
  17. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/builder.md +0 -0
  18. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/documentation.md +0 -0
  19. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/foreman.md +0 -0
  20. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/pr-review-boss.md +0 -0
  21. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/release-manager.md +0 -0
  22. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/simplifier.md +0 -0
  23. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/tester.md +0 -0
  24. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/foreman-work.md +0 -0
  25. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/release-prepare.md +0 -0
  26. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/review-start.md +0 -0
  27. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/simplify-code.md +0 -0
  28. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/code-quality.md +0 -0
  29. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/data-modeling.md +0 -0
  30. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/devrev-sdk.md +0 -0
  31. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/git-workflow.md +0 -0
  32. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/pull-requests.md +0 -0
  33. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/python-development.md +0 -0
  34. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/security.md +0 -0
  35. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/testing.md +0 -0
  36. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.dockerignore +0 -0
  37. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.env.sample +0 -0
  38. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
  39. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  40. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  41. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  42. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  43. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/dependabot.yml +0 -0
  44. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/pull_request_template.md +0 -0
  45. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/api-check.yml +0 -0
  46. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/claude-code-review.yml +0 -0
  47. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/claude.yml +0 -0
  48. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/docs.yml +0 -0
  49. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/integration-tests.yml +0 -0
  50. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/sync-openapi.yml +0 -0
  51. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.gitignore +0 -0
  52. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.pre-commit-config.yaml +0 -0
  53. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/CLAUDE.md +0 -0
  54. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/CODE_OF_CONDUCT.md +0 -0
  55. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/CONTRIBUTING.md +0 -0
  56. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/DEPRECATIONS.md +0 -0
  57. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/Dockerfile +0 -0
  58. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/KNOWN_ISSUES.md +0 -0
  59. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
  60. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/SECURITY.md +0 -0
  61. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/augment-mcp-config-remote.json +0 -0
  62. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/augment-mcp-config.json +0 -0
  63. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/augment-settings.json +0 -0
  64. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/README.md +0 -0
  65. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/bench_http_client.py +0 -0
  66. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/bench_models.py +0 -0
  67. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/bench_pagination.py +0 -0
  68. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/conftest.py +0 -0
  69. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/context7.json +0 -0
  70. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/README.md +0 -0
  71. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/audit-logging-setup.sh +0 -0
  72. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/cloudbuild.yaml +0 -0
  73. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/README.md +0 -0
  74. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/alert-policies.yaml +0 -0
  75. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/dashboard.json +0 -0
  76. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/validate-config.sh +0 -0
  77. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/service.yaml +0 -0
  78. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docker-compose.yml +0 -0
  79. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/brands.md +0 -0
  80. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/engagements.md +0 -0
  81. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/incidents.md +0 -0
  82. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/index.md +0 -0
  83. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/question-answers.md +0 -0
  84. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/recommendations.md +0 -0
  85. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/search.md +0 -0
  86. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/uoms.md +0 -0
  87. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta-api-differences.md +0 -0
  88. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/client.md +0 -0
  89. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/config.md +0 -0
  90. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/exceptions.md +0 -0
  91. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/index.md +0 -0
  92. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/accounts.md +0 -0
  93. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/base.md +0 -0
  94. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/index.md +0 -0
  95. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/users.md +0 -0
  96. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/works.md +0 -0
  97. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/accounts.md +0 -0
  98. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/code-changes.md +0 -0
  99. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/conversations.md +0 -0
  100. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/dev-users.md +0 -0
  101. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/groups.md +0 -0
  102. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/index.md +0 -0
  103. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/links.md +0 -0
  104. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/parts.md +0 -0
  105. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/rev-users.md +0 -0
  106. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/slas.md +0 -0
  107. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/tags.md +0 -0
  108. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/timeline-entries.md +0 -0
  109. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/webhooks.md +0 -0
  110. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/works.md +0 -0
  111. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/advanced.md +0 -0
  112. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/basic.md +0 -0
  113. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/beta-features.md +0 -0
  114. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/index.md +0 -0
  115. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/integrations.md +0 -0
  116. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/authentication.md +0 -0
  117. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/index.md +0 -0
  118. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/installation.md +0 -0
  119. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/quickstart.md +0 -0
  120. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/beta-api.md +0 -0
  121. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/compatibility.md +0 -0
  122. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/configuration.md +0 -0
  123. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/error-handling.md +0 -0
  124. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/github-actions-setup.md +0 -0
  125. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/index.md +0 -0
  126. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/logging.md +0 -0
  127. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/pagination.md +0 -0
  128. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/sync-vs-async.md +0 -0
  129. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/testing.md +0 -0
  130. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/version-support.md +0 -0
  131. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/write-integration-testing-strategy.md +0 -0
  132. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/hooks/copy_llms.py +0 -0
  133. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/index.md +0 -0
  134. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/deployment.md +0 -0
  135. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/index.md +0 -0
  136. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/quickstart.md +0 -0
  137. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/stylesheets/extra.css +0 -0
  138. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/README.md +0 -0
  139. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/README.md +0 -0
  140. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/async_example.py +0 -0
  141. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/create_work.py +0 -0
  142. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/error_handling.py +0 -0
  143. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/list_accounts.py +0 -0
  144. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/pagination.py +0 -0
  145. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/search_users.py +0 -0
  146. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/cloud_functions/README.md +0 -0
  147. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/cloud_functions/main.py +0 -0
  148. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/cloud_functions/requirements.txt +0 -0
  149. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/fastapi/README.md +0 -0
  150. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/fastapi/main.py +0 -0
  151. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/fastapi/requirements.txt +0 -0
  152. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/flask/README.md +0 -0
  153. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/flask/app.py +0 -0
  154. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/flask/requirements.txt +0 -0
  155. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms-ctx-full.txt +0 -0
  156. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms-ctx.txt +0 -0
  157. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms-mcp.txt +0 -0
  158. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms.txt +0 -0
  159. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/mkdocs.yml +0 -0
  160. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/openapi-beta.yaml +0 -0
  161. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/openapi-public.yaml +0 -0
  162. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/openapi-spec-corrections.yaml +0 -0
  163. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/scripts/build_ai_docs.py +0 -0
  164. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/scripts/setup-github-secrets.sh +0 -0
  165. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/__init__.py +0 -0
  166. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/client.py +0 -0
  167. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/config.py +0 -0
  168. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/exceptions.py +0 -0
  169. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/__init__.py +0 -0
  170. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/accounts.py +0 -0
  171. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/articles.py +0 -0
  172. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/artifacts.py +0 -0
  173. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/base.py +0 -0
  174. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/brands.py +0 -0
  175. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/code_changes.py +0 -0
  176. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/conversations.py +0 -0
  177. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/dev_users.py +0 -0
  178. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/engagements.py +0 -0
  179. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/groups.py +0 -0
  180. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/incidents.py +0 -0
  181. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/links.py +0 -0
  182. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/notifications.py +0 -0
  183. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/parts.py +0 -0
  184. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/preferences.py +0 -0
  185. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/question_answers.py +0 -0
  186. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/recommendations.py +0 -0
  187. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/rev_users.py +0 -0
  188. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/search.py +0 -0
  189. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/slas.py +0 -0
  190. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/sync.py +0 -0
  191. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/tags.py +0 -0
  192. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/tasks.py +0 -0
  193. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/timeline_entries.py +0 -0
  194. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/timeline_events.py +0 -0
  195. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/track_events.py +0 -0
  196. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/uoms.py +0 -0
  197. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/webhooks.py +0 -0
  198. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/widgets.py +0 -0
  199. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/works.py +0 -0
  200. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/py.typed +0 -0
  201. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/__init__.py +0 -0
  202. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/accounts.py +0 -0
  203. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/artifacts.py +0 -0
  204. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/base.py +0 -0
  205. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/brands.py +0 -0
  206. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/code_changes.py +0 -0
  207. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/conversations.py +0 -0
  208. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/dev_users.py +0 -0
  209. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/engagements.py +0 -0
  210. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/groups.py +0 -0
  211. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/incidents.py +0 -0
  212. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/links.py +0 -0
  213. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/notifications.py +0 -0
  214. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/parts.py +0 -0
  215. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/preferences.py +0 -0
  216. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/question_answers.py +0 -0
  217. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/recommendations.py +0 -0
  218. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/rev_users.py +0 -0
  219. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/search.py +0 -0
  220. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/slas.py +0 -0
  221. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/tags.py +0 -0
  222. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/timeline_entries.py +0 -0
  223. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/track_events.py +0 -0
  224. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/uoms.py +0 -0
  225. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/webhooks.py +0 -0
  226. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/works.py +0 -0
  227. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/__init__.py +0 -0
  228. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/content_converter.py +0 -0
  229. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/deprecation.py +0 -0
  230. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/http.py +0 -0
  231. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/logging.py +0 -0
  232. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/pagination.py +0 -0
  233. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/__init__.py +0 -0
  234. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/__main__.py +0 -0
  235. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/config.py +0 -0
  236. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/__init__.py +0 -0
  237. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/audit.py +0 -0
  238. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/auth.py +0 -0
  239. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/health.py +0 -0
  240. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/rate_limit.py +0 -0
  241. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/__init__.py +0 -0
  242. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/escalation.py +0 -0
  243. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/investigate.py +0 -0
  244. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/response.py +0 -0
  245. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/summarize.py +0 -0
  246. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/triage.py +0 -0
  247. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/__init__.py +0 -0
  248. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/account.py +0 -0
  249. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/article.py +0 -0
  250. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/conversation.py +0 -0
  251. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/part.py +0 -0
  252. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/server_info.py +0 -0
  253. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/ticket.py +0 -0
  254. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/user.py +0 -0
  255. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/server.py +0 -0
  256. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/__init__.py +0 -0
  257. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/accounts.py +0 -0
  258. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/conversations.py +0 -0
  259. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/engagements.py +0 -0
  260. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/groups.py +0 -0
  261. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/incidents.py +0 -0
  262. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/links.py +0 -0
  263. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/parts.py +0 -0
  264. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/recommendations.py +0 -0
  265. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/search.py +0 -0
  266. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/server_info.py +0 -0
  267. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/slas.py +0 -0
  268. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/tags.py +0 -0
  269. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/timeline.py +0 -0
  270. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/users.py +0 -0
  271. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/works.py +0 -0
  272. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/__init__.py +0 -0
  273. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/errors.py +0 -0
  274. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/formatting.py +0 -0
  275. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/pagination.py +0 -0
  276. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/__init__.py +0 -0
  277. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/conftest.py +0 -0
  278. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/__init__.py +0 -0
  279. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/conftest.py +0 -0
  280. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_accounts_e2e.py +0 -0
  281. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_all_readonly_endpoints.py +0 -0
  282. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_articles_lifecycle.py +0 -0
  283. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_backwards_compatibility.py +0 -0
  284. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_contacts_e2e.py +0 -0
  285. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_core_services_phase1.py +0 -0
  286. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_extended_services_phase2.py +0 -0
  287. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_get_endpoints.py +0 -0
  288. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_issues_e2e.py +0 -0
  289. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_kb_articles_e2e.py +0 -0
  290. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_mcp_articles.py +0 -0
  291. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_ping.py +0 -0
  292. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_question_answers_e2e.py +0 -0
  293. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_readonly_endpoints.py +0 -0
  294. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_specialized_services_phase3.py +0 -0
  295. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_tickets_e2e.py +0 -0
  296. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_write_operations.py +0 -0
  297. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/__init__.py +0 -0
  298. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/cleanup.py +0 -0
  299. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/constants.py +0 -0
  300. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/data_manager.py +0 -0
  301. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/performance/__init__.py +0 -0
  302. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/performance/test_articles_performance.py +0 -0
  303. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/__init__.py +0 -0
  304. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/__init__.py +0 -0
  305. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/conftest.py +0 -0
  306. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_audit.py +0 -0
  307. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_config.py +0 -0
  308. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_phase4_transport.py +0 -0
  309. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_prompts.py +0 -0
  310. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_resources.py +0 -0
  311. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_server_info.py +0 -0
  312. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_accounts.py +0 -0
  313. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_conversations.py +0 -0
  314. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_engagements.py +0 -0
  315. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_groups.py +0 -0
  316. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_incidents.py +0 -0
  317. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_links.py +0 -0
  318. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_parts.py +0 -0
  319. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_recommendations.py +0 -0
  320. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_search.py +0 -0
  321. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_slas.py +0 -0
  322. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_tags.py +0 -0
  323. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_timeline.py +0 -0
  324. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_users.py +0 -0
  325. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_works.py +0 -0
  326. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_utils.py +0 -0
  327. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/models/__init__.py +0 -0
  328. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/models/test_user_state_regression.py +0 -0
  329. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/__init__.py +0 -0
  330. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/conftest.py +0 -0
  331. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_articles.py +0 -0
  332. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_async_services.py +0 -0
  333. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_brands.py +0 -0
  334. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_code_changes.py +0 -0
  335. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_conversations.py +0 -0
  336. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_engagements.py +0 -0
  337. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_groups.py +0 -0
  338. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_incidents.py +0 -0
  339. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_links.py +0 -0
  340. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_notifications.py +0 -0
  341. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_parts.py +0 -0
  342. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_preferences.py +0 -0
  343. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_question_answers.py +0 -0
  344. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_recommendations.py +0 -0
  345. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_search.py +0 -0
  346. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_slas.py +0 -0
  347. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_tags.py +0 -0
  348. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_timeline_entries.py +0 -0
  349. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_track_events.py +0 -0
  350. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_uoms.py +0 -0
  351. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_webhooks.py +0 -0
  352. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_works.py +0 -0
  353. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_artifacts.py +0 -0
  354. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_backward_compatibility.py +0 -0
  355. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_base_service.py +0 -0
  356. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_client.py +0 -0
  357. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_config.py +0 -0
  358. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_content_converter.py +0 -0
  359. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_deprecation.py +0 -0
  360. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_error_handling.py +0 -0
  361. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_exceptions.py +0 -0
  362. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_http.py +0 -0
  363. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_logging.py +0 -0
  364. {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_pagination.py +0 -0
@@ -52,7 +52,7 @@ jobs:
52
52
  fi
53
53
 
54
54
  - name: Upload coverage
55
- uses: codecov/codecov-action@v3
55
+ uses: codecov/codecov-action@v5
56
56
  with:
57
57
  files: ./coverage.xml
58
58
  fail_ci_if_error: false
@@ -42,7 +42,7 @@ jobs:
42
42
  echo "Deploying version: $VERSION"
43
43
 
44
44
  - name: Authenticate to Google Cloud (WIF)
45
- uses: google-github-actions/auth@v2
45
+ uses: google-github-actions/auth@v3
46
46
  with:
47
47
  workload_identity_provider: ${{ secrets.WIF_PROVIDER }}
48
48
  service_account: ${{ secrets.WIF_SERVICE_ACCOUNT }}
@@ -93,7 +93,7 @@ jobs:
93
93
  url: https://pypi.org/project/py-devrev/
94
94
  steps:
95
95
  - name: Download artifacts
96
- uses: actions/download-artifact@v7
96
+ uses: actions/download-artifact@v8
97
97
  with:
98
98
  name: dist
99
99
  path: dist/
@@ -115,7 +115,7 @@ jobs:
115
115
  fetch-depth: 0
116
116
 
117
117
  - name: Download artifacts
118
- uses: actions/download-artifact@v7
118
+ uses: actions/download-artifact@v8
119
119
  with:
120
120
  name: dist
121
121
  path: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devrev-Python-SDK
3
- Version: 2.9.0
3
+ Version: 2.10.1
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
@@ -545,6 +545,16 @@ client.articles.update_with_content(
545
545
  applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
546
546
  )
547
547
 
548
+ # Update access level and tags
549
+ from devrev.models.articles import ArticleAccessLevel
550
+ from devrev.models.base import SetTagWithValue
551
+
552
+ client.articles.update_with_content(
553
+ id=article.id,
554
+ access_level=ArticleAccessLevel.INTERNAL, # internal, external, private, public
555
+ tags=[SetTagWithValue(id="don:core:dvrv-us-1:devo/1:tag/123")],
556
+ )
557
+
548
558
  # List published articles (metadata only)
549
559
  published = client.articles.list(limit=20)
550
560
  for article in published:
@@ -470,6 +470,16 @@ client.articles.update_with_content(
470
470
  applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
471
471
  )
472
472
 
473
+ # Update access level and tags
474
+ from devrev.models.articles import ArticleAccessLevel
475
+ from devrev.models.base import SetTagWithValue
476
+
477
+ client.articles.update_with_content(
478
+ id=article.id,
479
+ access_level=ArticleAccessLevel.INTERNAL, # internal, external, private, public
480
+ tags=[SetTagWithValue(id="don:core:dvrv-us-1:devo/1:tag/123")],
481
+ )
482
+
473
483
  # List published articles (metadata only)
474
484
  published = client.articles.list(limit=20)
475
485
  for article in published:
@@ -94,6 +94,8 @@ article = client.articles.create_with_content(
94
94
  status=ArticleStatus.PUBLISHED, # Optional: draft, published, archived
95
95
  content_format="text/html", # Optional: default is text/html
96
96
  applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
97
+ scope=1, # Optional: 1=internal, 2=external (API default is external)
98
+ tags=[SetTagWithValue(id="don:core:dvrv-us-1:devo/1:tag/123")], # Optional: apply tags
97
99
  )
98
100
  print(f"Created article with content: {article.id}")
99
101
  ```
@@ -188,6 +190,16 @@ updated_article = client.articles.update_with_content(
188
190
  id="don:core:dvrv-us-1:devo/1:article/123",
189
191
  applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
190
192
  )
193
+
194
+ # Update access level and tags
195
+ from devrev.models.articles import ArticleAccessLevel
196
+ from devrev.models.base import SetTagWithValue
197
+
198
+ updated_article = client.articles.update_with_content(
199
+ id="don:core:dvrv-us-1:devo/1:article/123",
200
+ access_level=ArticleAccessLevel.INTERNAL, # Change to internal visibility
201
+ tags=[SetTagWithValue(id="don:core:dvrv-us-1:devo/1:tag/123")], # Apply tags
202
+ )
191
203
  ```
192
204
 
193
205
  ### Async Usage
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.10.1] - 2026-03-10
11
+
12
+ ### Fixed
13
+
14
+ - **MCP articles_list bug** (#170) — Fixed `'tuple' object has no attribute 'model_dump'` error in `devrev_articles_list` MCP tool by correctly accessing `response.articles` instead of calling `list()` on the Pydantic response model. Added `paginated_response()` helper for consistent pagination handling.
15
+ - **CI formatting** (#175) — Resolved formatting check failures in `scripts/debug_articles.py`.
16
+
17
+ ### Maintenance
18
+
19
+ - **Dependency updates** (#177) — Consolidated Dependabot updates:
20
+ - `actions/download-artifact` v7 → v8
21
+ - `codecov/codecov-action` v3 → v5
22
+ - `google-github-actions/auth` v2 → v3
23
+ - `authlib` 1.6.6 → 1.6.9 (security fix: removes "none" algorithm from default JWT instance)
24
+
25
+ ## [2.10.0] - 2026-03-09
26
+
27
+ ### Added
28
+
29
+ - **Article Scope and Tags** (#173) — Added visibility and tagging parameters to MCP article tools:
30
+ - `devrev_articles_create`: Added `scope` (1=internal, 2=external) and `tags` (list of tag IDs) parameters
31
+ - `devrev_articles_update`: Added `access_level` (internal, external, private, public) and `tags` parameters
32
+ - SDK `update_with_content`: Added `access_level` and `tags` parameters for both sync and async methods
33
+
10
34
  ## [2.9.0] - 2026-03-09
11
35
 
12
36
  ### Added
@@ -57,6 +57,8 @@ Tools are the primary way AI assistants interact with DevRev. Each tool maps to
57
57
  - **Optional Content Loading**: Use `include_content=true` in `get` to fetch article body
58
58
  - **Clear Parameters**: `content` for article body, `description` for metadata summary
59
59
  - **Part Association**: Use `applies_to_parts` to natively associate articles with products, capabilities, features, or enhancements
60
+ - **Visibility Control**: Use `scope` (1=internal, 2=external) on create or `access_level` (internal, external, private, public) on update
61
+ - **Tagging**: Apply tags using the `tags` parameter (list of tag IDs)
60
62
 
61
63
  ### Conversations
62
64
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "devrev-Python-SDK"
7
- version = "2.9.0"
7
+ version = "2.10.1"
8
8
  description = "A modern, type-safe Python SDK for the DevRev API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env python3
2
+ """Debug script for article content creation and inspection.
3
+
4
+ Usage: python3 scripts/debug_articles.py
5
+ Requires: DEVREV_API_TOKEN environment variable
6
+ """
7
+
8
+ import json
9
+ import os
10
+ import sys
11
+
12
+ # Add src to path
13
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
14
+
15
+ from devrev.client import DevRevClient # noqa: E402
16
+ from devrev.models.articles import ( # noqa: E402
17
+ ArticlesGetRequest,
18
+ ArticleStatus,
19
+ )
20
+ from devrev.models.artifacts import ArtifactGetRequest # noqa: E402
21
+
22
+
23
+ def inspect_article(client: DevRevClient, article_id: str) -> None:
24
+ """Inspect an article and its artifact content."""
25
+ print("\n" + "=" * 60)
26
+ print(f"INSPECTING ARTICLE: {article_id}")
27
+ print("=" * 60)
28
+
29
+ # Get article metadata
30
+ article = client.articles.get(ArticlesGetRequest(id=article_id))
31
+ print(f"\nTitle: {article.title}")
32
+ print(f"Status: {article.status}")
33
+ print(f"Description: {article.description}")
34
+ print(f"Resource: {json.dumps(article.resource, indent=2, default=str)}")
35
+
36
+ # Try to get content artifact
37
+ if article.resource:
38
+ # Check for artifacts array (how DevRev stores them)
39
+ artifacts = article.resource.get("artifacts", [])
40
+ if artifacts:
41
+ for art_info in artifacts:
42
+ art_id = art_info.get("id", "")
43
+ file_info = art_info.get("file", {})
44
+ print(f"\n--- Artifact: {art_id} ---")
45
+ print(f" File name: {file_info.get('name')}")
46
+ print(f" File type: {file_info.get('type')}")
47
+ print(f" File size: {file_info.get('size')}")
48
+
49
+ # Get full artifact metadata
50
+ try:
51
+ artifact = client.artifacts.get(ArtifactGetRequest(id=art_id))
52
+ print(f" Artifact metadata - file_name: {artifact.file_name}")
53
+ print(f" Artifact metadata - file_type: {artifact.file_type}")
54
+ print(f" Artifact metadata - version: {artifact.version}")
55
+ except Exception as e:
56
+ print(f" Error getting artifact metadata: {e}")
57
+
58
+ # Download content
59
+ try:
60
+ content_bytes = client.artifacts.download(art_id)
61
+ content = content_bytes.decode("utf-8")
62
+ print(f" Content length: {len(content)}")
63
+ print(" Content preview (first 2000 chars):")
64
+ print(f" {content[:2000]}")
65
+ if len(content) > 2000:
66
+ print(f" ... ({len(content) - 2000} more chars)")
67
+ except Exception as e:
68
+ print(f" Error downloading content: {e}")
69
+
70
+ # Check for content_artifact reference (how our SDK stores them)
71
+ content_artifact_id = article.resource.get("content_artifact")
72
+ if content_artifact_id:
73
+ print(f"\n--- Content Artifact (SDK style): {content_artifact_id} ---")
74
+ try:
75
+ content_bytes = client.artifacts.download(content_artifact_id)
76
+ content = content_bytes.decode("utf-8")
77
+ print(f" Content length: {len(content)}")
78
+ print(f" Content preview: {content[:1000]}")
79
+ except Exception as e:
80
+ print(f" Error: {e}")
81
+
82
+
83
+ def test_create_article(client: DevRevClient, owner_id: str) -> None:
84
+ """Test creating an article with HTML content."""
85
+ print("\n" + "=" * 60)
86
+ print("TEST: Creating article with HTML content")
87
+ print("=" * 60)
88
+
89
+ html_content = """<h1>Test Article from py-dev-rev SDK</h1>
90
+ <p>This is a <strong>test article</strong> created via the py-dev-rev SDK.</p>
91
+ <h2>Features</h2>
92
+ <ul>
93
+ <li>Rich <em>formatted</em> text</li>
94
+ <li>Lists and headings</li>
95
+ <li>Code: <code>print("hello")</code></li>
96
+ </ul>
97
+ <p>Created at: 2026-03-07 for debugging purposes.</p>"""
98
+
99
+ try:
100
+ article = client.articles.create_with_content(
101
+ title="SDK Test - Rich Content Article",
102
+ content=html_content,
103
+ owned_by=[owner_id],
104
+ description="Test article created by py-dev-rev SDK debug script",
105
+ status=ArticleStatus.DRAFT,
106
+ content_format="text/html",
107
+ )
108
+ print(f"✅ Article created: {article.id} (display: {article.display_id})")
109
+ print(f" Title: {article.title}")
110
+ print(f" Resource: {json.dumps(article.resource, indent=2, default=str)}")
111
+
112
+ # Now test get_with_content on the new article
113
+ test_get_with_content(client, article.id)
114
+
115
+ # Now test update_content
116
+ test_update_content(client, article.id)
117
+
118
+ except Exception as e:
119
+ print(f"❌ Failed to create article: {e}")
120
+ import traceback
121
+
122
+ traceback.print_exc()
123
+
124
+
125
+ def test_get_with_content(client: DevRevClient, article_id: str) -> None:
126
+ """Test the get_with_content method."""
127
+ print("\n" + "=" * 60)
128
+ print(f"TEST: get_with_content for {article_id}")
129
+ print("=" * 60)
130
+
131
+ try:
132
+ result = client.articles.get_with_content(article_id)
133
+ print("✅ get_with_content succeeded!")
134
+ print(f" Title: {result.article.title}")
135
+ print(f" Content format: {result.content_format}")
136
+ print(f" Content version: {result.content_version}")
137
+ print(f" Content length: {len(result.content)}")
138
+ print(f" Content preview: {result.content[:500]}")
139
+ except Exception as e:
140
+ print(f"❌ get_with_content failed: {e}")
141
+ import traceback
142
+
143
+ traceback.print_exc()
144
+
145
+
146
+ def test_update_content(client: DevRevClient, article_id: str) -> None:
147
+ """Test updating article content."""
148
+ print("\n" + "=" * 60)
149
+ print(f"TEST: update_content for {article_id}")
150
+ print("=" * 60)
151
+
152
+ updated_html = """<h1>Updated Article</h1>
153
+ <p>This content was <strong>updated</strong> by the py-dev-rev SDK.</p>
154
+ <p>Updated at: 2026-03-07</p>"""
155
+
156
+ try:
157
+ article = client.articles.update_content(article_id, updated_html)
158
+ print("✅ update_content succeeded!")
159
+ print(f" Title: {article.title}")
160
+ print(f" Resource: {json.dumps(article.resource, indent=2, default=str)}")
161
+
162
+ # Verify by re-reading
163
+ result = client.articles.get_with_content(article_id)
164
+ print(f" Verified content length: {len(result.content)}")
165
+ print(f" Verified content: {result.content[:300]}")
166
+ except Exception as e:
167
+ print(f"❌ update_content failed: {e}")
168
+ import traceback
169
+
170
+ traceback.print_exc()
171
+
172
+
173
+ def main() -> None:
174
+ """Run article diagnostics."""
175
+ token = os.environ.get("DEVREV_API_TOKEN")
176
+ if not token:
177
+ print("ERROR: DEVREV_API_TOKEN environment variable not set")
178
+ sys.exit(1)
179
+
180
+ client = DevRevClient()
181
+
182
+ # 1. Inspect the known working article ART-2817
183
+ art_2817_id = "don:core:dvrv-us-1:devo/11Ca9baGrM:article/2817"
184
+ inspect_article(client, art_2817_id)
185
+
186
+ # 2. Test get_with_content on ART-2817
187
+ test_get_with_content(client, art_2817_id)
188
+
189
+ # 3. Get owner ID for creating test articles
190
+ owner_id = "don:identity:dvrv-us-1:devo/11Ca9baGrM:devu/4" # MGM
191
+
192
+ # 4. Try creating a new article with HTML content
193
+ test_create_article(client, owner_id)
194
+
195
+ # 5. Test get_with_content on the newly created article
196
+ # (test_create_article already inspects it, but let's also test the unified method)
197
+
198
+
199
+ if __name__ == "__main__":
200
+ main()
@@ -9,6 +9,7 @@ from collections.abc import Sequence
9
9
  from devrev.exceptions import DevRevError
10
10
  from devrev.models.articles import (
11
11
  Article,
12
+ ArticleAccessLevel,
12
13
  ArticlesCountRequest,
13
14
  ArticlesCountResponse,
14
15
  ArticlesCreateRequest,
@@ -22,6 +23,7 @@ from devrev.models.articles import (
22
23
  ArticleStatus,
23
24
  ArticlesUpdateRequest,
24
25
  ArticlesUpdateRequestAppliesToParts,
26
+ ArticlesUpdateRequestTags,
25
27
  ArticlesUpdateResponse,
26
28
  ArticleType,
27
29
  ArticleWithContent,
@@ -439,6 +441,8 @@ class ArticlesService(BaseService):
439
441
  description: str | None = None,
440
442
  status: ArticleStatus | None = None,
441
443
  applies_to_parts: builtins.list[str] | None = None,
444
+ access_level: ArticleAccessLevel | None = None,
445
+ tags: builtins.list[SetTagWithValue] | None = None,
442
446
  ) -> Article:
443
447
  """Update article metadata and/or content.
444
448
 
@@ -454,6 +458,8 @@ class ArticlesService(BaseService):
454
458
  description: Optional new metadata description
455
459
  status: Optional new status
456
460
  applies_to_parts: Optional list of part IDs to associate with
461
+ access_level: Optional access level (internal, external, private, public)
462
+ tags: Optional list of tags to apply (list of SetTagWithValue objects)
457
463
 
458
464
  Returns:
459
465
  Updated article
@@ -487,6 +493,12 @@ class ArticlesService(BaseService):
487
493
  ... "ART-123",
488
494
  ... applies_to_parts=["don:core:...:capability/6"]
489
495
  ... )
496
+ >>>
497
+ >>> # Update access level to internal
498
+ >>> article = client.articles.update_with_content(
499
+ ... "ART-123",
500
+ ... access_level=ArticleAccessLevel.INTERNAL
501
+ ... )
490
502
  """
491
503
  if not self._parent_client:
492
504
  raise DevRevError(
@@ -503,12 +515,19 @@ class ArticlesService(BaseService):
503
515
  if applies_to_parts is not None:
504
516
  applies_to_parts_req = ArticlesUpdateRequestAppliesToParts(set=applies_to_parts)
505
517
 
518
+ # Build tags wrapper if provided
519
+ tags_req = None
520
+ if tags is not None:
521
+ tags_req = ArticlesUpdateRequestTags(set=tags)
522
+
506
523
  # Update metadata if any metadata fields provided
507
524
  has_metadata = (
508
525
  title is not None
509
526
  or description is not None
510
527
  or status is not None
511
528
  or applies_to_parts is not None
529
+ or access_level is not None
530
+ or tags is not None
512
531
  )
513
532
  if has_metadata:
514
533
  update_req = ArticlesUpdateRequest(
@@ -517,6 +536,8 @@ class ArticlesService(BaseService):
517
536
  description=description,
518
537
  status=status,
519
538
  applies_to_parts=applies_to_parts_req,
539
+ access_level=access_level,
540
+ tags=tags_req,
520
541
  )
521
542
  return self.update(update_req)
522
543
 
@@ -844,6 +865,8 @@ class AsyncArticlesService(AsyncBaseService):
844
865
  description: str | None = None,
845
866
  status: ArticleStatus | None = None,
846
867
  applies_to_parts: builtins.list[str] | None = None,
868
+ access_level: ArticleAccessLevel | None = None,
869
+ tags: builtins.list[SetTagWithValue] | None = None,
847
870
  ) -> Article:
848
871
  """Update article metadata and/or content (async).
849
872
 
@@ -859,6 +882,8 @@ class AsyncArticlesService(AsyncBaseService):
859
882
  description: Optional new metadata description
860
883
  status: Optional new status
861
884
  applies_to_parts: Optional list of part IDs to associate with
885
+ access_level: Optional access level (internal, external, private, public)
886
+ tags: Optional list of tags to apply (list of SetTagWithValue objects)
862
887
 
863
888
  Returns:
864
889
  Updated article
@@ -881,12 +906,19 @@ class AsyncArticlesService(AsyncBaseService):
881
906
  if applies_to_parts is not None:
882
907
  applies_to_parts_req = ArticlesUpdateRequestAppliesToParts(set=applies_to_parts)
883
908
 
909
+ # Build tags wrapper if provided
910
+ tags_req = None
911
+ if tags is not None:
912
+ tags_req = ArticlesUpdateRequestTags(set=tags)
913
+
884
914
  # Update metadata if any metadata fields provided
885
915
  has_metadata = (
886
916
  title is not None
887
917
  or description is not None
888
918
  or status is not None
889
919
  or applies_to_parts is not None
920
+ or access_level is not None
921
+ or tags is not None
890
922
  )
891
923
  if has_metadata:
892
924
  update_req = ArticlesUpdateRequest(
@@ -895,6 +927,8 @@ class AsyncArticlesService(AsyncBaseService):
895
927
  description=description,
896
928
  status=status,
897
929
  applies_to_parts=applies_to_parts_req,
930
+ access_level=access_level,
931
+ tags=tags_req,
898
932
  )
899
933
  return await self.update(update_req)
900
934
 
@@ -12,15 +12,17 @@ from mcp.server.fastmcp import Context
12
12
 
13
13
  from devrev.exceptions import DevRevError
14
14
  from devrev.models.articles import (
15
+ ArticleAccessLevel,
15
16
  ArticlesDeleteRequest,
16
17
  ArticlesGetRequest,
17
18
  ArticlesListRequest,
18
19
  ArticleStatus,
19
20
  )
21
+ from devrev.models.base import SetTagWithValue
20
22
  from devrev_mcp.server import _config, mcp
21
23
  from devrev_mcp.utils.errors import format_devrev_error
22
24
  from devrev_mcp.utils.formatting import serialize_model, serialize_models
23
- from devrev_mcp.utils.pagination import clamp_page_size
25
+ from devrev_mcp.utils.pagination import clamp_page_size, paginated_response
24
26
 
25
27
  logger = logging.getLogger(__name__)
26
28
 
@@ -39,7 +41,8 @@ async def devrev_articles_list(
39
41
  limit: Maximum number of articles to return.
40
42
 
41
43
  Returns:
42
- Dictionary containing count and list of articles.
44
+ Dictionary containing count, list of articles, and optional next_cursor
45
+ for pagination.
43
46
 
44
47
  Raises:
45
48
  RuntimeError: If the DevRev API call fails.
@@ -52,9 +55,9 @@ async def devrev_articles_list(
52
55
  limit, default=app.config.default_page_size, maximum=app.config.max_page_size
53
56
  ),
54
57
  )
55
- articles = await app.get_client().articles.list(request)
56
- items = serialize_models(list(articles))
57
- return {"count": len(items), "articles": items}
58
+ response = await app.get_client().articles.list(request)
59
+ items = serialize_models(response.articles)
60
+ return paginated_response(items, next_cursor=response.next_cursor, total_label="articles")
58
61
  except DevRevError as e:
59
62
  raise RuntimeError(format_devrev_error(e)) from e
60
63
 
@@ -103,6 +106,8 @@ if _config.enable_destructive_tools:
103
106
  status: str | None = None,
104
107
  content_format: str = "text/html",
105
108
  applies_to_parts: list[str] | None = None,
109
+ scope: int | None = None,
110
+ tags: list[str] | None = None,
106
111
  ) -> dict[str, Any]:
107
112
  """Create a new article with content.
108
113
 
@@ -116,6 +121,8 @@ if _config.enable_destructive_tools:
116
121
  content_format: Content MIME type (default: text/html).
117
122
  applies_to_parts: Optional list of part IDs (products, capabilities,
118
123
  features, enhancements) to associate the article with.
124
+ scope: Optional visibility scope (1=internal, 2=external).
125
+ tags: Optional list of tag IDs to apply to the article.
119
126
 
120
127
  Returns:
121
128
  Dictionary containing the created article details.
@@ -135,6 +142,11 @@ if _config.enable_destructive_tools:
135
142
  f"Valid statuses: {', '.join(s.name for s in ArticleStatus)}"
136
143
  ) from e
137
144
 
145
+ # Convert tag IDs to SetTagWithValue objects
146
+ tags_list = (
147
+ [SetTagWithValue(id=tag_id) for tag_id in tags] if tags is not None else None
148
+ )
149
+
138
150
  article = await app.get_client().articles.create_with_content(
139
151
  title=title,
140
152
  content=content,
@@ -143,6 +155,8 @@ if _config.enable_destructive_tools:
143
155
  status=article_status,
144
156
  content_format=content_format,
145
157
  applies_to_parts=applies_to_parts,
158
+ scope=scope,
159
+ tags=tags_list,
146
160
  )
147
161
  return serialize_model(article)
148
162
  except DevRevError as e:
@@ -157,6 +171,8 @@ if _config.enable_destructive_tools:
157
171
  description: str | None = None,
158
172
  status: str | None = None,
159
173
  applies_to_parts: list[str] | None = None,
174
+ access_level: str | None = None,
175
+ tags: list[str] | None = None,
160
176
  ) -> dict[str, Any]:
161
177
  """Update an existing article in DevRev.
162
178
 
@@ -170,6 +186,11 @@ if _config.enable_destructive_tools:
170
186
  applies_to_parts: Optional list of part IDs (products, capabilities,
171
187
  features, enhancements) to associate the article with.
172
188
  Pass an empty list to remove all associations.
189
+ access_level: Optional access level (internal, external, private, public).
190
+ Note: For updates, use ``access_level`` (string enum). For creation,
191
+ use the ``scope`` parameter (integer: 1=internal, 2=external).
192
+ tags: Optional list of tag IDs to apply to the article.
193
+ Pass an empty list to remove all tags.
173
194
 
174
195
  Returns:
175
196
  Dictionary containing the updated article details.
@@ -189,6 +210,22 @@ if _config.enable_destructive_tools:
189
210
  f"Valid statuses: {', '.join(s.name for s in ArticleStatus)}"
190
211
  ) from e
191
212
 
213
+ # Convert access_level string to ArticleAccessLevel enum
214
+ article_access_level = None
215
+ if access_level:
216
+ try:
217
+ article_access_level = ArticleAccessLevel[access_level.upper()]
218
+ except KeyError as e:
219
+ raise RuntimeError(
220
+ f"Invalid access level: {e.args[0]}. "
221
+ f"Valid levels: {', '.join(a.name for a in ArticleAccessLevel)}"
222
+ ) from e
223
+
224
+ # Convert tag IDs to SetTagWithValue objects
225
+ tags_list = (
226
+ [SetTagWithValue(id=tag_id) for tag_id in tags] if tags is not None else None
227
+ )
228
+
192
229
  article = await app.get_client().articles.update_with_content(
193
230
  id=id,
194
231
  title=title,
@@ -196,6 +233,8 @@ if _config.enable_destructive_tools:
196
233
  description=description,
197
234
  status=article_status,
198
235
  applies_to_parts=applies_to_parts,
236
+ access_level=article_access_level,
237
+ tags=tags_list,
199
238
  )
200
239
  return serialize_model(article)
201
240
  except DevRevError as e: