@ngocsangairvds/vsaf 3.1.26 → 3.2.1
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.
- package/package.json +2 -2
- package/src/global.js +70 -10
- package/tools/skills/vds-scripts-skill/.openskills.json +6 -0
- package/tools/skills/vds-scripts-skill/QUALITY.md +44 -0
- package/tools/skills/vds-scripts-skill/SKILL.md +135 -0
- package/tools/skills/vds-scripts-skill/references/audit-commands.md +171 -0
- package/tools/skills/vds-scripts-skill/references/capability-index.md +34 -0
- package/tools/skills/vds-scripts-skill/references/development-commands.md +12 -0
- package/tools/skills/vds-scripts-skill/references/google-sheets.md +73 -0
- package/tools/skills/vds-scripts-skill/references/integration-commands.md +17 -0
- package/tools/skills/vds-scripts-skill/references/platform-bootstrap.md +31 -0
- package/tools/skills/vds-scripts-skill/references/specialist-routing.md +14 -0
- package/tools/skills/vds-scripts-skill/references/validation-commands.md +15 -0
- package/tools/skills/vsaf-build/SKILL.md +32 -2
- package/tools/skills/vsaf-push-prd/SKILL.md +43 -40
- package/tools/skills/vsaf-push-srs/SKILL.md +44 -41
- package/tools/skills/vsaf-ship/SKILL.md +41 -10
- package/tools/skills/vsaf-test/SKILL.md +8 -0
- package/tools/vds-scripts/.mcp.json +11 -0
- package/tools/vds-scripts/.secrets.baseline +133 -0
- package/tools/vds-scripts/AGENTS.md +152 -0
- package/tools/vds-scripts/CLAUDE.md +101 -0
- package/tools/vds-scripts/CLI_COMMAND_OPTIMIZATION.md +156 -0
- package/tools/vds-scripts/PACKAGE_P125B_IMPLEMENTATION_SUMMARY.md +131 -0
- package/tools/vds-scripts/PROJECT_COMPLETION_SUMMARY.md +45 -0
- package/tools/vds-scripts/README.md +97 -0
- package/tools/vds-scripts/bitbucket_manifest_mapping.toml +34 -0
- package/tools/vds-scripts/bitbucket_orchestrator/ARCHITECTURE_ANALYSIS.md +258 -0
- package/tools/vds-scripts/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +393 -0
- package/tools/vds-scripts/bitbucket_orchestrator/EVALUATION_REPORT.md +61 -0
- package/tools/vds-scripts/bitbucket_orchestrator/FEATURES.md +908 -0
- package/tools/vds-scripts/bitbucket_orchestrator/README.md +687 -0
- package/tools/vds-scripts/bitbucket_orchestrator/pyproject.toml +40 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/__init__.py +20 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/async_client.py +657 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/cli.py +2108 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/client.py +2534 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/config.py +171 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/errors.py +67 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/factory.py +185 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/protocols.py +244 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/__init__.py +8 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/conftest.py +65 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_advanced_search.py +151 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_async_client.py +546 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_branch_permissions.py +145 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_cli.py +115 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client.py +157 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_branch_conditions.py +79 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_code_advanced.py +163 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_code_file.py +32 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_deployment_environments.py +194 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_issues.py +164 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_pipelines_advanced.py +179 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_pr_blockers.py +119 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_repository_variables.py +156 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code.py +98 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code_advanced.py +282 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code_insights.py +335 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_conditions.py +147 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_config.py +131 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_deployment_env.py +352 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_factory.py +371 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_fork_operations.py +204 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_issue_cli.py +261 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_pipeline_advanced.py +270 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_pr_blocker.py +204 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_protocols.py +334 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_repo_settings.py +343 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_repo_variables.py +270 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_webhooks.py +189 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_workspace.py +233 -0
- package/tools/vds-scripts/bitbucket_orchestrator/uv.lock +742 -0
- package/tools/vds-scripts/confluence_orchestrator/Dockerfile +19 -0
- package/tools/vds-scripts/confluence_orchestrator/README.md +412 -0
- package/tools/vds-scripts/confluence_orchestrator/SYNC_SCRIPTS.md +127 -0
- package/tools/vds-scripts/confluence_orchestrator/SYNC_STANDARDIZATION.md +108 -0
- package/tools/vds-scripts/confluence_orchestrator/pyproject.toml +48 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/__init__.py +20 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/cli.py +2532 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/config.py +175 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content.py +290 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content_v2.py +94 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/crawl_tree.py +1835 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/errors.py +80 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/eventing.py +109 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/http.py +1114 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/orchestration.py +165 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/reporting.py +78 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree.py +121 -0
- package/tools/vds-scripts/confluence_orchestrator/sync_pdfs_from_markdown.py +213 -0
- package/tools/vds-scripts/confluence_orchestrator/sync_pdfs_to_confluence.py +305 -0
- package/tools/vds-scripts/confluence_orchestrator/sync_png_attachments.py +305 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/__init__.py +0 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/conftest.py +8 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_advanced_content.py +224 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_advanced_search.py +188 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_cache_management.py +247 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_cli.py +499 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_config.py +83 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_content.py +186 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_content_flags.py +27 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_crawl_tree.py +2250 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_draft_management.py +223 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing.py +71 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_chaos.py +37 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_rate_limit.py +44 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_timeout.py +49 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_export.py +230 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_history.py +204 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_http.py +117 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_orchestration.py +91 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_reporting.py +24 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_search_cql.py +34 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_space_management.py +237 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_space_permissions.py +332 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_user_group_management.py +388 -0
- package/tools/vds-scripts/confluence_orchestrator/uv.lock +1023 -0
- package/tools/vds-scripts/git_orchestrator/ENHANCEMENT_SUMMARY.md +119 -0
- package/tools/vds-scripts/git_orchestrator/README.md +280 -0
- package/tools/vds-scripts/git_orchestrator/VERIFICATION_REPORT.md +152 -0
- package/tools/vds-scripts/git_orchestrator/pyproject.toml +35 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__init__.py +7 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__main__.py +4 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/cli.py +847 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/logging_config.py +63 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/manifest.py +129 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/orchestrator.py +819 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/reporting.py +53 -0
- package/tools/vds-scripts/git_orchestrator/tests/__init__.py +0 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_cli_settings.py +21 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_integration.py +74 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_manifest.py +79 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_orchestrator.py +204 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_public_api.py +236 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_resilience.py +345 -0
- package/tools/vds-scripts/git_orchestrator/uv.lock +271 -0
- package/tools/vds-scripts/jira_orchestrator/README.md +770 -0
- package/tools/vds-scripts/jira_orchestrator/pyproject.toml +39 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/__init__.py +1 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/adapter.py +1320 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/cli.py +2271 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/config.py +138 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/errors.py +67 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/reporting.py +65 -0
- package/tools/vds-scripts/jira_orchestrator/tests/__init__.py +1 -0
- package/tools/vds-scripts/jira_orchestrator/tests/conftest.py +86 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_bulk_operations.py +69 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_components.py +57 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_createmeta.py +45 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_dashboard.py +117 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_issue_properties.py +54 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_permissions_compat.py +42 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_reindex.py +42 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_remote_links.py +76 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_transitions.py +91 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_user_management.py +110 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_version_management.py +133 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_watchers.py +41 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_advanced_search.py +164 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_agile.py +256 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_application_properties.py +193 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_backlog.py +91 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_bulk_operations.py +277 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_cli.py +106 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_components.py +106 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_config.py +164 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_dashboard.py +122 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_discover_fields.py +207 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_filter_management.py +333 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_issue_archiving.py +164 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_issue_links.py +257 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_issue_properties.py +171 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_link_types.py +314 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_parse_set.py +37 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_permissions.py +273 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_reindex.py +81 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_remote_links.py +254 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_security_schemes.py +170 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_transitions_changelog.py +114 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_user_management.py +226 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_version_management.py +339 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_watchers.py +101 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_worklog.py +223 -0
- package/tools/vds-scripts/jira_orchestrator/uv.lock +738 -0
- package/tools/vds-scripts/mcp_server/Dockerfile +34 -0
- package/tools/vds-scripts/mcp_server/README.md +140 -0
- package/tools/vds-scripts/mcp_server/pyproject.toml +42 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/__init__.py +4 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/config.py +36 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/server.py +66 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/__init__.py +14 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/bitbucket_tools.py +47 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/confluence_tools.py +59 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/git_tools.py +71 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/jira_tools.py +63 -0
- package/tools/vds-scripts/mcp_server/tests/__init__.py +2 -0
- package/tools/vds-scripts/mcp_server/tests/conftest.py +29 -0
- package/tools/vds-scripts/mcp_server/tests/unit/__init__.py +2 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_bitbucket_tools.py +25 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_confluence_tools.py +25 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_git_tools.py +32 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_jira_tools.py +32 -0
- package/tools/vds-scripts/mcp_server/tests/verification/__init__.py +2 -0
- package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_confluence_tools.py +40 -0
- package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_jira_tools.py +37 -0
- package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_tool_registration.py +47 -0
- package/tools/vds-scripts/mcp_server/uv.lock +1032 -0
- package/tools/vds-scripts/mypy.ini +5 -0
- package/tools/vds-scripts/pyproject.toml +29 -0
- package/tools/vds-scripts/repo-manifest.yaml +273 -0
- package/tools/vds-scripts/repo-manifest.yaml.example +25 -0
- package/tools/vds-scripts/scripts/BRD-Validation-API.postman_collection.json +706 -0
- package/tools/vds-scripts/scripts/BRD-Validation-README.md +308 -0
- package/tools/vds-scripts/scripts/README.md +162 -0
- package/tools/vds-scripts/scripts/bootstrap_uv.sh +30 -0
- package/tools/vds-scripts/scripts/brd-validation-environment.json +51 -0
- package/tools/vds-scripts/scripts/brd-validation-test-results.json +13023 -0
- package/tools/vds-scripts/scripts/brd_coverage_report.json +276 -0
- package/tools/vds-scripts/scripts/create_memory_session.py +35 -0
- package/tools/vds-scripts/scripts/deployment/load_docker_images_offline.sh +90 -0
- package/tools/vds-scripts/scripts/final_completion_report.md +139 -0
- package/tools/vds-scripts/scripts/folder_structure_report.json +321 -0
- package/tools/vds-scripts/scripts/generate_completion_report.py +125 -0
- package/tools/vds-scripts/scripts/generate_intellij_modules.py +150 -0
- package/tools/vds-scripts/scripts/link_integrity_report.json +807 -0
- package/tools/vds-scripts/scripts/move_audit_artifact_pages.py +255 -0
- package/tools/vds-scripts/scripts/move_audit_artifact_pages_rest.py +165 -0
- package/tools/vds-scripts/scripts/move_wrong_dept_pages.py +216 -0
- package/tools/vds-scripts/scripts/save_intellij_memories.py +120 -0
- package/tools/vds-scripts/scripts/save_memories_to_vds_ai.py +83 -0
- package/tools/vds-scripts/scripts/save_memories_vds_style.py +129 -0
- package/tools/vds-scripts/scripts/search_intellij_memories.py +50 -0
- package/tools/vds-scripts/scripts/setup_intellij_workspace.py +65 -0
- package/tools/vds-scripts/scripts/target-state-automation/README.md +89 -0
- package/tools/vds-scripts/scripts/target-state-automation/confluence_sync_coordinator.sh +27 -0
- package/tools/vds-scripts/scripts/target-state-automation/coordination.sh +114 -0
- package/tools/vds-scripts/scripts/target-state-automation/diagram_coordinator.sh +25 -0
- package/tools/vds-scripts/scripts/target-state-automation/docs_root.sh +22 -0
- package/tools/vds-scripts/scripts/target-state-automation/generate_diagrams.sh +22 -0
- package/tools/vds-scripts/scripts/target-state-automation/markdown_coordinator.sh +25 -0
- package/tools/vds-scripts/scripts/target-state-automation/progress_dashboard.sh +17 -0
- package/tools/vds-scripts/scripts/target-state-automation/schema_coordinator.sh +25 -0
- package/tools/vds-scripts/scripts/target-state-automation/sync_confluence.sh +30 -0
- package/tools/vds-scripts/scripts/target-state-automation/update_dependencies.sh +19 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_links.sh +86 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_markdown.sh +52 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_schemas.sh +26 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_structure.sh +98 -0
- package/tools/vds-scripts/scripts/update_modules_xml.py +190 -0
- package/tools/vds-scripts/scripts/uv-workspace-alignment-verification-2026-03-25.md +128 -0
- package/tools/vds-scripts/scripts/validate_brd_coverage.py +179 -0
- package/tools/vds-scripts/scripts/validate_folder_structure.py +240 -0
- package/tools/vds-scripts/scripts/validate_link_integrity.py +272 -0
- package/tools/vds-scripts/scripts/vds_sh_helpers.sh +180 -0
- package/tools/vds-scripts/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +26 -0
- package/tools/vds-scripts/scripts/worktree_uv.sh +48 -0
- package/tools/vds-scripts/uv.lock +8 -0
- package/tools/vds-scripts/vds_cli/README.md +126 -0
- package/tools/vds-scripts/vds_cli/VERIFICATION_REPORT.md +41 -0
- package/tools/vds-scripts/vds_cli/pyproject.toml +38 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/__init__.py +3 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/cli.py +173 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/docs_sync.py +1203 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/env.py +41 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/__init__.py +3 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/google_sheets_orchestrator.py +198 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/router.py +93 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/sync_api.py +647 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/sync_service.py +266 -0
- package/tools/vds-scripts/vds_cli/tests/__init__.py +2 -0
- package/tools/vds-scripts/vds_cli/tests/conftest.py +49 -0
- package/tools/vds-scripts/vds_cli/tests/unit/__init__.py +2 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_cli.py +143 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_docs_sync.py +422 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_env.py +51 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_router.py +72 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_sync_api.py +357 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_sync_service.py +160 -0
- package/tools/vds-scripts/vds_cli/tests/verification/__init__.py +2 -0
- package/tools/vds-scripts/vds_cli/tests/verification/test_bitbucket_real.py +33 -0
- package/tools/vds-scripts/vds_cli/tests/verification/test_confluence_real.py +35 -0
- package/tools/vds-scripts/vds_cli/tests/verification/test_jira_real.py +41 -0
- package/tools/vds-scripts/vds_cli/uv.lock +524 -0
- package/tools/vds-scripts/vds_cli_common/README.md +190 -0
- package/tools/vds-scripts/vds_cli_common/pyproject.toml +92 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/__init__.py +34 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/completers.py +139 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/context.py +201 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/env.py +119 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/errors.py +318 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/output.py +284 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/paths.py +78 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/testing.py +213 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/version.py +85 -0
- package/tools/vds-scripts/vds_cli_common/tests/__init__.py +1 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_completers.py +148 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_context.py +192 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_env.py +102 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_errors.py +186 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_output.py +229 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_paths.py +61 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_testing.py +138 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_version.py +64 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
FROM python:3.12-slim
|
|
3
|
+
|
|
4
|
+
# Install system dependencies
|
|
5
|
+
RUN apt-get update && apt-get install -y \
|
|
6
|
+
curl \
|
|
7
|
+
ca-certificates \
|
|
8
|
+
git \
|
|
9
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
10
|
+
|
|
11
|
+
# Install uv
|
|
12
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
13
|
+
|
|
14
|
+
# Set PATH for uv
|
|
15
|
+
ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH"
|
|
16
|
+
ENV UV_SYSTEM_PYTHON=1
|
|
17
|
+
|
|
18
|
+
# Set working directory
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
|
|
21
|
+
# Copy MCP server
|
|
22
|
+
COPY mcp_server /app/mcp_server
|
|
23
|
+
|
|
24
|
+
# Install MCP server
|
|
25
|
+
RUN cd /app/mcp_server && \
|
|
26
|
+
uv sync --frozen --project /app/mcp_server
|
|
27
|
+
|
|
28
|
+
# Health check
|
|
29
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
|
30
|
+
CMD uv run --project /app/mcp_server vds-mcp-server --help || exit 1
|
|
31
|
+
|
|
32
|
+
# Default command
|
|
33
|
+
ENTRYPOINT ["uv", "run", "--project", "/app/mcp_server", "vds-mcp-server"]
|
|
34
|
+
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# VDS MCP Server
|
|
2
|
+
|
|
3
|
+
Model Context Protocol (MCP) server for VDS Platform operations, enabling AI agents to interact with JIRA, Confluence,
|
|
4
|
+
Bitbucket, and Git through a standardized interface.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
cd vds-scripts
|
|
10
|
+
# Optional: sync every package once
|
|
11
|
+
./scripts/bootstrap_uv.sh
|
|
12
|
+
|
|
13
|
+
# Package-specific sync (only when you need dev extras)
|
|
14
|
+
uv sync --project mcp_server
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Start MCP Server
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Using stdio transport (default)
|
|
23
|
+
uv run vds-mcp-server
|
|
24
|
+
|
|
25
|
+
# Or directly
|
|
26
|
+
uv run --project mcp_server python -m vds_mcp_server.server
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Available Tools
|
|
30
|
+
|
|
31
|
+
The MCP server exposes the following tools:
|
|
32
|
+
|
|
33
|
+
#### JIRA Tools
|
|
34
|
+
|
|
35
|
+
- `jira_search` - Search JIRA issues using JQL query
|
|
36
|
+
- `jira_get_issue` - Get JIRA issue details
|
|
37
|
+
- `jira_list_projects` - List all JIRA projects
|
|
38
|
+
|
|
39
|
+
#### Confluence Tools
|
|
40
|
+
|
|
41
|
+
- `confluence_search` - Search Confluence content using CQL query
|
|
42
|
+
- `confluence_get_page` - Get Confluence page content
|
|
43
|
+
|
|
44
|
+
#### Bitbucket Tools
|
|
45
|
+
|
|
46
|
+
- `bitbucket_list_projects` - List all Bitbucket projects
|
|
47
|
+
- `bitbucket_list_repositories` - List repositories in a project
|
|
48
|
+
|
|
49
|
+
#### Git Tools
|
|
50
|
+
|
|
51
|
+
- `git_clone` - Clone a VDS project repository
|
|
52
|
+
- `git_status` - Get Git repository status
|
|
53
|
+
- `git_pull` - Pull latest changes from Git repositories
|
|
54
|
+
|
|
55
|
+
## Client Integration
|
|
56
|
+
|
|
57
|
+
### Claude Desktop Configuration
|
|
58
|
+
|
|
59
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"vds-orchestrator": {
|
|
65
|
+
"command": "uv",
|
|
66
|
+
"args": [
|
|
67
|
+
"run",
|
|
68
|
+
"--project",
|
|
69
|
+
"/path/to/vds-scripts/mcp_server",
|
|
70
|
+
"vds-mcp-server"
|
|
71
|
+
],
|
|
72
|
+
"env": {
|
|
73
|
+
"VDS_USERNAME": "${VDS_USERNAME}",
|
|
74
|
+
"VDS_PASSWORD": "${VDS_PASSWORD}",
|
|
75
|
+
"BITBUCKET_ACCESS_TOKEN": "${BITBUCKET_ACCESS_TOKEN}",
|
|
76
|
+
"INTERNAL_CONFLUENCE_TOKEN": "${INTERNAL_CONFLUENCE_TOKEN}",
|
|
77
|
+
"EXTERNAL_CONFLUENCE_TOKEN": "${EXTERNAL_CONFLUENCE_TOKEN}"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Using with Docker
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
cd vds-scripts/docker
|
|
88
|
+
docker-compose up -d mcp-server
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Development
|
|
92
|
+
|
|
93
|
+
### Running Tests
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Unit tests
|
|
97
|
+
uv run --project mcp_server pytest tests/unit/ -v
|
|
98
|
+
|
|
99
|
+
# Verification tests (requires credentials)
|
|
100
|
+
uv run --project mcp_server pytest tests/verification/ -v
|
|
101
|
+
|
|
102
|
+
# With coverage
|
|
103
|
+
uv run --project mcp_server pytest tests/ -v --cov=vds_mcp_server --cov-report=term-missing
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Code Quality
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Lint check
|
|
110
|
+
uv run --project mcp_server ruff check src/
|
|
111
|
+
|
|
112
|
+
# Format code
|
|
113
|
+
uv run --project mcp_server ruff format src/
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Architecture
|
|
117
|
+
|
|
118
|
+
The MCP server uses:
|
|
119
|
+
|
|
120
|
+
- **FastMCP**: High-level MCP server interface from official Python SDK
|
|
121
|
+
- **VDS CLI**: Executes commands via `vds-cli` subprocess
|
|
122
|
+
- **Tool Registration**: All tools registered at server startup
|
|
123
|
+
|
|
124
|
+
## Requirements
|
|
125
|
+
|
|
126
|
+
- Python >= 3.11
|
|
127
|
+
- uv (for package management)
|
|
128
|
+
- vds-cli (must be installed and available in PATH)
|
|
129
|
+
- Environment file at `~/.vds/.env` with credentials
|
|
130
|
+
|
|
131
|
+
## Dependencies
|
|
132
|
+
|
|
133
|
+
- **mcp** >= 1.0.0 - Official MCP Python SDK (Context7: `/modelcontextprotocol/python-sdk`)
|
|
134
|
+
- **typer** >= 0.20.0 - CLI framework
|
|
135
|
+
- **pydantic** >= 2.12.3 - Data validation
|
|
136
|
+
- **pydantic-settings** >= 2.12.0 - Settings management
|
|
137
|
+
|
|
138
|
+
______________________________________________________________________
|
|
139
|
+
|
|
140
|
+
*Last updated: 2025-11-12*
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "vds-mcp-server"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
description = "Model Context Protocol server for VDS Platform operations"
|
|
5
|
+
requires-python = ">=3.11"
|
|
6
|
+
dependencies = [
|
|
7
|
+
"mcp>=1.0.0", # Official MCP Python SDK - Context7: /modelcontextprotocol/python-sdk
|
|
8
|
+
"typer>=0.20.0", # CLI framework
|
|
9
|
+
"pydantic>=2.12.3", # Data validation
|
|
10
|
+
"pydantic-settings>=2.12.0", # Settings management
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[project.scripts]
|
|
14
|
+
vds-mcp-server = "vds_mcp_server.server:main"
|
|
15
|
+
|
|
16
|
+
[build-system]
|
|
17
|
+
requires = ["hatchling>=1.20.0"]
|
|
18
|
+
build-backend = "hatchling.build"
|
|
19
|
+
|
|
20
|
+
[project.optional-dependencies]
|
|
21
|
+
dev = [
|
|
22
|
+
"pytest>=9.0.1",
|
|
23
|
+
"pytest-cov>=5.0.0",
|
|
24
|
+
"pytest-asyncio>=0.24.0",
|
|
25
|
+
"ruff>=0.14.5",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[tool.uv]
|
|
29
|
+
package = true
|
|
30
|
+
|
|
31
|
+
[tool.uv.sources]
|
|
32
|
+
vds_mcp_server = { path = "src" }
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
[dependency-groups]
|
|
36
|
+
dev = [
|
|
37
|
+
"pytest>=9.0.1",
|
|
38
|
+
"pytest-cov>=5.0.0",
|
|
39
|
+
"pytest-asyncio>=0.24.0",
|
|
40
|
+
"ruff>=0.14.5",
|
|
41
|
+
]
|
|
42
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Configuration management for MCP server.
|
|
2
|
+
|
|
3
|
+
Based on pydantic-settings v2.12.0+ API
|
|
4
|
+
Context7: /pydantic/pydantic-settings
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MCPServerSettings(BaseSettings):
|
|
13
|
+
"""MCP server configuration settings."""
|
|
14
|
+
|
|
15
|
+
model_config = SettingsConfigDict(
|
|
16
|
+
env_file=Path.home() / ".vds" / ".env",
|
|
17
|
+
env_file_encoding="utf-8",
|
|
18
|
+
case_sensitive=False,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# VDS credentials (required for orchestrator operations)
|
|
22
|
+
vds_username: str | None = None
|
|
23
|
+
vds_password: str | None = None
|
|
24
|
+
bitbucket_access_token: str | None = None
|
|
25
|
+
internal_confluence_token: str | None = None
|
|
26
|
+
external_confluence_token: str | None = None
|
|
27
|
+
|
|
28
|
+
# MCP server settings
|
|
29
|
+
server_name: str = "vds-orchestrator"
|
|
30
|
+
server_version: str = "1.0.0"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def load_settings() -> MCPServerSettings:
|
|
34
|
+
"""Load MCP server settings from environment."""
|
|
35
|
+
return MCPServerSettings()
|
|
36
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""MCP Server for VDS Platform operations.
|
|
2
|
+
|
|
3
|
+
Based on MCP Python SDK v1.0.0+
|
|
4
|
+
Context7: /modelcontextprotocol/python-sdk
|
|
5
|
+
Key Features: FastMCP, tool registration, stdio transport
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import subprocess
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from mcp.server.fastmcp import FastMCP
|
|
12
|
+
|
|
13
|
+
from .config import load_settings
|
|
14
|
+
from .tools import (
|
|
15
|
+
register_bitbucket_tools,
|
|
16
|
+
register_confluence_tools,
|
|
17
|
+
register_git_tools,
|
|
18
|
+
register_jira_tools,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Initialize FastMCP server
|
|
22
|
+
mcp = FastMCP("VDS Orchestrator")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def execute_vds_cli(*args: str) -> dict[str, Any]:
|
|
26
|
+
"""Execute VDS CLI command via subprocess.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
*args: Command arguments to pass to vds-cli
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
dict: Command execution result with stdout, stderr, returncode
|
|
33
|
+
"""
|
|
34
|
+
cmd = ["vds-cli"] + list(args)
|
|
35
|
+
result = subprocess.run(
|
|
36
|
+
cmd,
|
|
37
|
+
capture_output=True,
|
|
38
|
+
text=True,
|
|
39
|
+
check=False,
|
|
40
|
+
)
|
|
41
|
+
return {
|
|
42
|
+
"stdout": result.stdout,
|
|
43
|
+
"stderr": result.stderr,
|
|
44
|
+
"returncode": result.returncode,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Register all tool modules
|
|
49
|
+
register_jira_tools(mcp, execute_vds_cli)
|
|
50
|
+
register_confluence_tools(mcp, execute_vds_cli)
|
|
51
|
+
register_bitbucket_tools(mcp, execute_vds_cli)
|
|
52
|
+
register_git_tools(mcp, execute_vds_cli)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def main() -> None:
|
|
56
|
+
"""Main entry point for MCP server."""
|
|
57
|
+
# Load settings to ensure environment is configured
|
|
58
|
+
load_settings()
|
|
59
|
+
|
|
60
|
+
# Run server with stdio transport (default)
|
|
61
|
+
mcp.run()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
if __name__ == "__main__":
|
|
65
|
+
main()
|
|
66
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""MCP tools for VDS Platform orchestrators."""
|
|
2
|
+
|
|
3
|
+
from .bitbucket_tools import register_bitbucket_tools
|
|
4
|
+
from .confluence_tools import register_confluence_tools
|
|
5
|
+
from .git_tools import register_git_tools
|
|
6
|
+
from .jira_tools import register_jira_tools
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"register_jira_tools",
|
|
10
|
+
"register_confluence_tools",
|
|
11
|
+
"register_bitbucket_tools",
|
|
12
|
+
"register_git_tools",
|
|
13
|
+
]
|
|
14
|
+
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Bitbucket tools for MCP server.
|
|
2
|
+
|
|
3
|
+
Based on MCP Python SDK v1.0.0+
|
|
4
|
+
Context7: /modelcontextprotocol/python-sdk
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from mcp.server.fastmcp import FastMCP
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def register_bitbucket_tools(mcp: FastMCP, execute_cli: Callable[..., Any]) -> None:
|
|
14
|
+
"""Register Bitbucket tools with MCP server.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
mcp: FastMCP server instance
|
|
18
|
+
execute_cli: Function to execute VDS CLI commands
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
async def bitbucket_list_projects() -> str:
|
|
23
|
+
"""List all Bitbucket projects.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
str: JSON-formatted list of projects
|
|
27
|
+
"""
|
|
28
|
+
result = await execute_cli("bitbucket", "projects")
|
|
29
|
+
if result["returncode"] != 0:
|
|
30
|
+
return f"Error: {result['stderr']}"
|
|
31
|
+
return result["stdout"]
|
|
32
|
+
|
|
33
|
+
@mcp.tool()
|
|
34
|
+
async def bitbucket_list_repositories(project_key: str) -> str:
|
|
35
|
+
"""List repositories in a Bitbucket project.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
project_key: Project key (e.g., "LEP")
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
str: JSON-formatted list of repositories
|
|
42
|
+
"""
|
|
43
|
+
result = await execute_cli("bitbucket", "repositories", project_key)
|
|
44
|
+
if result["returncode"] != 0:
|
|
45
|
+
return f"Error: {result['stderr']}"
|
|
46
|
+
return result["stdout"]
|
|
47
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Confluence tools for MCP server.
|
|
2
|
+
|
|
3
|
+
Based on MCP Python SDK v1.0.0+
|
|
4
|
+
Context7: /modelcontextprotocol/python-sdk
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from mcp.server.fastmcp import FastMCP
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def register_confluence_tools(mcp: FastMCP, execute_cli: Callable[..., Any]) -> None:
|
|
14
|
+
"""Register Confluence tools with MCP server.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
mcp: FastMCP server instance
|
|
18
|
+
execute_cli: Function to execute VDS CLI commands
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
async def confluence_search(
|
|
23
|
+
query: str, server: str = "internal", limit: int = 10
|
|
24
|
+
) -> str:
|
|
25
|
+
"""Search Confluence content using CQL query.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
query: CQL query string (e.g., "space = TDOV")
|
|
29
|
+
server: Server to query ("internal" or "external", default: "internal")
|
|
30
|
+
limit: Maximum number of results (default: 10)
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
str: JSON-formatted search results
|
|
34
|
+
"""
|
|
35
|
+
result = await execute_cli(
|
|
36
|
+
"confluence", "content", "search", query, f"--server={server}", f"--limit={limit}"
|
|
37
|
+
)
|
|
38
|
+
if result["returncode"] != 0:
|
|
39
|
+
return f"Error: {result['stderr']}"
|
|
40
|
+
return result["stdout"]
|
|
41
|
+
|
|
42
|
+
@mcp.tool()
|
|
43
|
+
async def confluence_get_page(page_id: str, server: str = "internal") -> str:
|
|
44
|
+
"""Get Confluence page content.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
page_id: Page ID (e.g., "99647801")
|
|
48
|
+
server: Server to query ("internal" or "external", default: "internal")
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
str: JSON-formatted page content
|
|
52
|
+
"""
|
|
53
|
+
result = await execute_cli(
|
|
54
|
+
"confluence", "content", "page", page_id, f"--server={server}"
|
|
55
|
+
)
|
|
56
|
+
if result["returncode"] != 0:
|
|
57
|
+
return f"Error: {result['stderr']}"
|
|
58
|
+
return result["stdout"]
|
|
59
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Git tools for MCP server.
|
|
2
|
+
|
|
3
|
+
Based on MCP Python SDK v1.0.0+
|
|
4
|
+
Context7: /modelcontextprotocol/python-sdk
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from mcp.server.fastmcp import FastMCP
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def register_git_tools(mcp: FastMCP, execute_cli: Callable[..., Any]) -> None:
|
|
14
|
+
"""Register Git tools with MCP server.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
mcp: FastMCP server instance
|
|
18
|
+
execute_cli: Function to execute VDS CLI commands
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
async def git_clone(project: str) -> str:
|
|
23
|
+
"""Clone a VDS project repository.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
project: Project name (e.g., "lep", "insurance")
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
str: Clone operation result
|
|
30
|
+
"""
|
|
31
|
+
result = await execute_cli("git", "clone", project)
|
|
32
|
+
if result["returncode"] != 0:
|
|
33
|
+
return f"Error: {result['stderr']}"
|
|
34
|
+
return result["stdout"]
|
|
35
|
+
|
|
36
|
+
@mcp.tool()
|
|
37
|
+
async def git_status(match: str | None = None) -> str:
|
|
38
|
+
"""Get Git repository status.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
match: Pattern to match repositories (e.g., "*service*")
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
str: Status information for matching repositories
|
|
45
|
+
"""
|
|
46
|
+
args = ["git", "status"]
|
|
47
|
+
if match:
|
|
48
|
+
args.extend(["--match", match])
|
|
49
|
+
result = await execute_cli(*args)
|
|
50
|
+
if result["returncode"] != 0:
|
|
51
|
+
return f"Error: {result['stderr']}"
|
|
52
|
+
return result["stdout"]
|
|
53
|
+
|
|
54
|
+
@mcp.tool()
|
|
55
|
+
async def git_pull(project: str | None = None) -> str:
|
|
56
|
+
"""Pull latest changes from Git repositories.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
project: Project name to pull (optional, pulls all if not specified)
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
str: Pull operation result
|
|
63
|
+
"""
|
|
64
|
+
args = ["git", "pull"]
|
|
65
|
+
if project:
|
|
66
|
+
args.extend(["--project", project])
|
|
67
|
+
result = await execute_cli(*args)
|
|
68
|
+
if result["returncode"] != 0:
|
|
69
|
+
return f"Error: {result['stderr']}"
|
|
70
|
+
return result["stdout"]
|
|
71
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""JIRA tools for MCP server.
|
|
2
|
+
|
|
3
|
+
Based on MCP Python SDK v1.0.0+
|
|
4
|
+
Context7: /modelcontextprotocol/python-sdk
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from mcp.server.fastmcp import FastMCP
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def register_jira_tools(mcp: FastMCP, execute_cli: Callable[..., Any]) -> None:
|
|
14
|
+
"""Register JIRA tools with MCP server.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
mcp: FastMCP server instance
|
|
18
|
+
execute_cli: Function to execute VDS CLI commands
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
async def jira_search(query: str, limit: int = 20) -> str:
|
|
23
|
+
"""Search JIRA issues using JQL query.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
query: JQL query string (e.g., "project = NTTC")
|
|
27
|
+
limit: Maximum number of results (default: 20)
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
str: JSON-formatted search results
|
|
31
|
+
"""
|
|
32
|
+
result = await execute_cli("jira", "search", query, f"--limit={limit}")
|
|
33
|
+
if result["returncode"] != 0:
|
|
34
|
+
return f"Error: {result['stderr']}"
|
|
35
|
+
return result["stdout"]
|
|
36
|
+
|
|
37
|
+
@mcp.tool()
|
|
38
|
+
async def jira_get_issue(issue_key: str) -> str:
|
|
39
|
+
"""Get JIRA issue details.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
issue_key: Issue key (e.g., "NTTC-123")
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
str: JSON-formatted issue details
|
|
46
|
+
"""
|
|
47
|
+
result = await execute_cli("jira", "issue", issue_key)
|
|
48
|
+
if result["returncode"] != 0:
|
|
49
|
+
return f"Error: {result['stderr']}"
|
|
50
|
+
return result["stdout"]
|
|
51
|
+
|
|
52
|
+
@mcp.tool()
|
|
53
|
+
async def jira_list_projects() -> str:
|
|
54
|
+
"""List all JIRA projects.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
str: JSON-formatted list of projects
|
|
58
|
+
"""
|
|
59
|
+
result = await execute_cli("jira", "projects")
|
|
60
|
+
if result["returncode"] != 0:
|
|
61
|
+
return f"Error: {result['stderr']}"
|
|
62
|
+
return result["stdout"]
|
|
63
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Pytest configuration and fixtures for MCP server tests."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncGenerator
|
|
4
|
+
from unittest.mock import Mock
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
from mcp.client.session import ClientSession
|
|
8
|
+
from mcp.shared.memory import create_connected_server_and_client_session
|
|
9
|
+
from vds_mcp_server.server import mcp
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.fixture
|
|
13
|
+
def anyio_backend() -> str:
|
|
14
|
+
"""Use asyncio backend for tests."""
|
|
15
|
+
return "asyncio"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.fixture
|
|
19
|
+
async def client_session() -> AsyncGenerator[ClientSession]:
|
|
20
|
+
"""Create in-memory MCP client session for testing."""
|
|
21
|
+
async with create_connected_server_and_client_session(mcp, raise_exceptions=True) as session:
|
|
22
|
+
yield session
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.fixture
|
|
26
|
+
def mock_execute_cli() -> Mock:
|
|
27
|
+
"""Mock CLI execution function."""
|
|
28
|
+
return Mock(return_value={"stdout": "test output", "stderr": "", "returncode": 0})
|
|
29
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Unit tests for Bitbucket tools.
|
|
2
|
+
|
|
3
|
+
Based on pytest v8.3.3+ API
|
|
4
|
+
Context7: /pytest-dev/pytest
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
from mcp.client.session import ClientSession
|
|
9
|
+
|
|
10
|
+
pytestmark = pytest.mark.anyio
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def test_bitbucket_list_projects_tool(client_session: ClientSession) -> None:
|
|
14
|
+
"""Test bitbucket_list_projects tool is available."""
|
|
15
|
+
tools = await client_session.list_tools()
|
|
16
|
+
tool_names = [tool.name for tool in tools.tools]
|
|
17
|
+
assert "bitbucket_list_projects" in tool_names
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def test_bitbucket_list_repositories_tool(client_session: ClientSession) -> None:
|
|
21
|
+
"""Test bitbucket_list_repositories tool is available."""
|
|
22
|
+
tools = await client_session.list_tools()
|
|
23
|
+
tool_names = [tool.name for tool in tools.tools]
|
|
24
|
+
assert "bitbucket_list_repositories" in tool_names
|
|
25
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Unit tests for Confluence tools.
|
|
2
|
+
|
|
3
|
+
Based on pytest v8.3.3+ API
|
|
4
|
+
Context7: /pytest-dev/pytest
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
from mcp.client.session import ClientSession
|
|
9
|
+
|
|
10
|
+
pytestmark = pytest.mark.anyio
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def test_confluence_search_tool(client_session: ClientSession) -> None:
|
|
14
|
+
"""Test confluence_search tool is available."""
|
|
15
|
+
tools = await client_session.list_tools()
|
|
16
|
+
tool_names = [tool.name for tool in tools.tools]
|
|
17
|
+
assert "confluence_search" in tool_names
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def test_confluence_get_page_tool(client_session: ClientSession) -> None:
|
|
21
|
+
"""Test confluence_get_page tool is available."""
|
|
22
|
+
tools = await client_session.list_tools()
|
|
23
|
+
tool_names = [tool.name for tool in tools.tools]
|
|
24
|
+
assert "confluence_get_page" in tool_names
|
|
25
|
+
|