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.
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/ci.yml +1 -1
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/deploy.yml +1 -1
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/release.yml +2 -2
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/PKG-INFO +11 -1
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/README.md +10 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/articles.md +12 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/changelog.md +24 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/tools-reference.md +2 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/pyproject.toml +1 -1
- devrev_python_sdk-2.10.1/scripts/debug_articles.py +200 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/articles.py +34 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/articles.py +44 -5
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_articles.py +177 -2
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_articles_unified.py +163 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/uv.lock +32 -4
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/bug-fixer.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/builder.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/documentation.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/foreman.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/pr-review-boss.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/release-manager.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/simplifier.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/agents/tester.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/foreman-work.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/release-prepare.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/review-start.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/commands/simplify-code.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/code-quality.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/data-modeling.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/devrev-sdk.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/git-workflow.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/pull-requests.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/python-development.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/security.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.augment/rules/testing.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.dockerignore +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.env.sample +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/dependabot.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/pull_request_template.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/api-check.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/claude-code-review.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/claude.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/docs.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/integration-tests.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.github/workflows/sync-openapi.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.gitignore +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/.pre-commit-config.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/CLAUDE.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/CODE_OF_CONDUCT.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/CONTRIBUTING.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/DEPRECATIONS.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/Dockerfile +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/KNOWN_ISSUES.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/SECURITY.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/augment-mcp-config-remote.json +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/augment-mcp-config.json +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/augment-settings.json +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/bench_http_client.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/bench_models.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/bench_pagination.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/benchmarks/conftest.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/context7.json +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/audit-logging-setup.sh +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/cloudbuild.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/alert-policies.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/dashboard.json +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/monitoring/validate-config.sh +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/deploy/service.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docker-compose.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/brands.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/engagements.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/incidents.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/question-answers.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/recommendations.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/search.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta/uoms.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/beta-api-differences.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/client.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/config.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/exceptions.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/accounts.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/base.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/users.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/models/works.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/accounts.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/code-changes.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/conversations.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/dev-users.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/groups.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/links.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/parts.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/rev-users.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/slas.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/tags.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/timeline-entries.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/webhooks.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/api/services/works.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/advanced.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/basic.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/beta-features.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/examples/integrations.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/authentication.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/installation.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/getting-started/quickstart.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/beta-api.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/compatibility.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/configuration.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/error-handling.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/github-actions-setup.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/logging.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/pagination.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/sync-vs-async.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/testing.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/version-support.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/guides/write-integration-testing-strategy.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/hooks/copy_llms.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/deployment.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/index.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/mcp/quickstart.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/docs/stylesheets/extra.css +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/async_example.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/create_work.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/error_handling.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/list_accounts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/pagination.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/basic/search_users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/cloud_functions/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/cloud_functions/main.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/cloud_functions/requirements.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/fastapi/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/fastapi/main.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/fastapi/requirements.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/flask/README.md +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/flask/app.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/examples/integrations/flask/requirements.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms-ctx-full.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms-ctx.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms-mcp.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/llms.txt +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/mkdocs.yml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/openapi-beta.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/openapi-public.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/openapi-spec-corrections.yaml +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/scripts/build_ai_docs.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/scripts/setup-github-secrets.sh +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/client.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/config.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/exceptions.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/accounts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/articles.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/artifacts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/base.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/brands.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/code_changes.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/conversations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/dev_users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/engagements.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/groups.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/incidents.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/links.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/notifications.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/parts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/preferences.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/question_answers.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/recommendations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/rev_users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/search.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/slas.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/sync.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/tags.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/tasks.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/timeline_entries.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/timeline_events.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/track_events.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/uoms.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/webhooks.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/widgets.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/models/works.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/py.typed +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/accounts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/artifacts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/base.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/brands.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/code_changes.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/conversations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/dev_users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/engagements.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/groups.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/incidents.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/links.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/notifications.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/parts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/preferences.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/question_answers.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/recommendations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/rev_users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/search.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/slas.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/tags.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/timeline_entries.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/track_events.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/uoms.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/webhooks.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/services/works.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/content_converter.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/deprecation.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/http.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/logging.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev/utils/pagination.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/__main__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/config.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/audit.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/auth.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/health.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/middleware/rate_limit.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/escalation.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/investigate.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/response.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/summarize.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/prompts/triage.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/account.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/article.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/conversation.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/part.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/server_info.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/ticket.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/resources/user.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/server.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/accounts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/conversations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/engagements.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/groups.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/incidents.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/links.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/parts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/recommendations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/search.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/server_info.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/slas.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/tags.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/timeline.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/tools/works.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/errors.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/formatting.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/src/devrev_mcp/utils/pagination.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/conftest.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/conftest.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_accounts_e2e.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_all_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_articles_lifecycle.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_backwards_compatibility.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_contacts_e2e.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_core_services_phase1.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_extended_services_phase2.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_get_endpoints.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_issues_e2e.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_kb_articles_e2e.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_mcp_articles.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_ping.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_question_answers_e2e.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_specialized_services_phase3.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_tickets_e2e.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/test_write_operations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/cleanup.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/constants.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/integration/utils/data_manager.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/performance/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/performance/test_articles_performance.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/conftest.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_audit.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_config.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_phase4_transport.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_prompts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_resources.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_server_info.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_accounts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_conversations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_engagements.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_groups.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_incidents.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_links.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_parts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_recommendations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_search.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_slas.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_tags.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_timeline.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_users.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_tools_works.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/mcp/test_utils.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/models/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/models/test_user_state_regression.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/__init__.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/conftest.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_articles.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_async_services.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_brands.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_code_changes.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_conversations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_engagements.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_groups.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_incidents.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_links.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_notifications.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_parts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_preferences.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_question_answers.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_recommendations.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_search.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_slas.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_tags.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_timeline_entries.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_track_events.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_uoms.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_webhooks.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/services/test_works.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_artifacts.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_backward_compatibility.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_base_service.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_client.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_config.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_content_converter.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_deprecation.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_error_handling.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_exceptions.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_http.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_logging.py +0 -0
- {devrev_python_sdk-2.9.0 → devrev_python_sdk-2.10.1}/tests/unit/test_pagination.py +0 -0
|
@@ -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@
|
|
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@
|
|
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@
|
|
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.
|
|
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
|
|
|
@@ -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
|
|
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
|
-
|
|
56
|
-
items = serialize_models(
|
|
57
|
-
return
|
|
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:
|