@ngocsangairvds/vsaf 4.1.7 → 4.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1063) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/dist/commands/skill.js +1 -1
  3. package/packages/cli/dist/commands/skill.js.map +1 -1
  4. package/skills/vds-skill/_shared/config-check.js +0 -76
  5. package/skills/vds-skill/_shared/credentials.js +0 -139
  6. package/skills/vds-skill/create-bitbucket-pr/SKILL.md +0 -57
  7. package/skills/vds-skill/create-bitbucket-pr/scripts/create-pr.js +0 -125
  8. package/skills/vds-skill/create-jira-epic/SKILL.md +0 -55
  9. package/skills/vds-skill/create-jira-epic/scripts/create-epic.js +0 -120
  10. package/skills/vds-skill/install-deps.mjs +0 -410
  11. package/skills/vds-skill/pack.yaml +0 -24
  12. package/skills/vds-skill/pull/SKILL.md +0 -38
  13. package/skills/vds-skill/pull/scripts/pull.js +0 -59
  14. package/skills/vds-skill/push-prd/SKILL.md +0 -227
  15. package/skills/vds-skill/push-srs/SKILL.md +0 -116
  16. package/skills/vds-skill/search-confluence/SKILL.md +0 -53
  17. package/skills/vds-skill/search-confluence/scripts/search.js +0 -114
  18. package/skills/vds-skill/vds-scripts/.claude/phase7-CLOSURE.md +0 -100
  19. package/skills/vds-skill/vds-scripts/.dockerignore +0 -62
  20. package/skills/vds-skill/vds-scripts/.github/ISSUE_TEMPLATE/cli-change.md +0 -92
  21. package/skills/vds-skill/vds-scripts/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -48
  22. package/skills/vds-skill/vds-scripts/.github/workflows/chaos-smoke.yml +0 -266
  23. package/skills/vds-skill/vds-scripts/.github/workflows/confluence-sync.yml +0 -44
  24. package/skills/vds-skill/vds-scripts/.github/workflows/docs-confluence-evidence.yml +0 -170
  25. package/skills/vds-skill/vds-scripts/.github/workflows/docs-quality.yml +0 -59
  26. package/skills/vds-skill/vds-scripts/.github/workflows/lint-and-test.yml +0 -90
  27. package/skills/vds-skill/vds-scripts/.github/workflows/scheduler-load-smoke.yml +0 -104
  28. package/skills/vds-skill/vds-scripts/.github/workflows/telegram-bridge-ci.yml +0 -131
  29. package/skills/vds-skill/vds-scripts/.graphifyignore +0 -29
  30. package/skills/vds-skill/vds-scripts/.importlinter +0 -86
  31. package/skills/vds-skill/vds-scripts/.mcp.json +0 -11
  32. package/skills/vds-skill/vds-scripts/.pre-commit-config.yaml +0 -62
  33. package/skills/vds-skill/vds-scripts/.ruffignore +0 -3
  34. package/skills/vds-skill/vds-scripts/.secrets.baseline +0 -133
  35. package/skills/vds-skill/vds-scripts/AGENTS.md +0 -250
  36. package/skills/vds-skill/vds-scripts/AGENTS.vi.md +0 -92
  37. package/skills/vds-skill/vds-scripts/ECOSYSTEM-CHANGELOG.md +0 -52
  38. package/skills/vds-skill/vds-scripts/ECOSYSTEM-DOCS.md +0 -602
  39. package/skills/vds-skill/vds-scripts/ECOSYSTEM_ALIGNMENT.md +0 -133
  40. package/skills/vds-skill/vds-scripts/Makefile +0 -119
  41. package/skills/vds-skill/vds-scripts/README.md +0 -103
  42. package/skills/vds-skill/vds-scripts/bitbucket_manifest_mapping.toml +0 -34
  43. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/ARCHITECTURE_ANALYSIS.md +0 -258
  44. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +0 -393
  45. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/EVALUATION_REPORT.md +0 -61
  46. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/FEATURES.md +0 -908
  47. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/README.md +0 -817
  48. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/pyproject.toml +0 -49
  49. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/__init__.py +0 -50
  50. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/async_client.py +0 -641
  51. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/cli.py +0 -2271
  52. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/client.py +0 -2693
  53. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/config.py +0 -186
  54. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/errors.py +0 -34
  55. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/factory.py +0 -185
  56. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/parsers.py +0 -113
  57. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/protocols.py +0 -244
  58. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/repo_ops.py +0 -325
  59. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/__init__.py +0 -8
  60. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/conftest.py +0 -65
  61. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_advanced_search.py +0 -155
  62. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_async_client.py +0 -505
  63. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_branch_permissions.py +0 -172
  64. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli.py +0 -113
  65. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli_archive.py +0 -122
  66. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli_clone.py +0 -131
  67. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client.py +0 -207
  68. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_archive.py +0 -73
  69. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_branch_conditions.py +0 -101
  70. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_code_advanced.py +0 -180
  71. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_code_file.py +0 -33
  72. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_deployment_environments.py +0 -193
  73. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_issues.py +0 -163
  74. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_pipelines_advanced.py +0 -171
  75. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_pr_blockers.py +0 -118
  76. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_repository_variables.py +0 -155
  77. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code.py +0 -98
  78. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code_advanced.py +0 -279
  79. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code_insights.py +0 -334
  80. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_conditions.py +0 -149
  81. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_config.py +0 -297
  82. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_deployment_env.py +0 -352
  83. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_errors.py +0 -67
  84. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_factory.py +0 -352
  85. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_fork_operations.py +0 -203
  86. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_issue_cli.py +0 -262
  87. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_pipeline_advanced.py +0 -265
  88. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_pr_blocker.py +0 -206
  89. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_protocols.py +0 -336
  90. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_archive.py +0 -169
  91. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_clone.py +0 -115
  92. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_parsing.py +0 -149
  93. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_settings.py +0 -336
  94. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_variables.py +0 -266
  95. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_webhooks.py +0 -188
  96. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_workspace.py +0 -234
  97. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/unit/__init__.py +0 -0
  98. package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/unit/test_parsers.py +0 -254
  99. package/skills/vds-skill/vds-scripts/brd_orchestrator/README.md +0 -29
  100. package/skills/vds-skill/vds-scripts/brd_orchestrator/pyproject.toml +0 -63
  101. package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/__init__.py +0 -17
  102. package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/cli.py +0 -187
  103. package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/validator.py +0 -121
  104. package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/__init__.py +0 -0
  105. package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/test_cli.py +0 -62
  106. package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/test_validator.py +0 -33
  107. package/skills/vds-skill/vds-scripts/code/code_evidence_pack.json +0 -435
  108. package/skills/vds-skill/vds-scripts/confluence_orchestrator/Dockerfile +0 -19
  109. package/skills/vds-skill/vds-scripts/confluence_orchestrator/README.md +0 -479
  110. package/skills/vds-skill/vds-scripts/confluence_orchestrator/SYNC_SCRIPTS.md +0 -127
  111. package/skills/vds-skill/vds-scripts/confluence_orchestrator/SYNC_STANDARDIZATION.md +0 -108
  112. package/skills/vds-skill/vds-scripts/confluence_orchestrator/pyproject.toml +0 -50
  113. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/__init__.py +0 -56
  114. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/async_client.py +0 -100
  115. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/cli.py +0 -3160
  116. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/config.py +0 -215
  117. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content.py +0 -368
  118. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content_v2.py +0 -144
  119. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/crawl_tree.py +0 -1833
  120. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/errors.py +0 -44
  121. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/eventing.py +0 -111
  122. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/http.py +0 -1850
  123. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/orchestration.py +0 -166
  124. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/protocols.py +0 -61
  125. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/reporting.py +0 -78
  126. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree.py +0 -122
  127. package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree_copier.py +0 -431
  128. package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_pdfs_from_markdown.py +0 -203
  129. package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_pdfs_to_confluence.py +0 -299
  130. package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_png_attachments.py +0 -299
  131. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/conftest.py +0 -46
  132. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_advanced_content.py +0 -252
  133. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_advanced_search.py +0 -193
  134. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_async_client.py +0 -104
  135. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_cache_management.py +0 -246
  136. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_cli.py +0 -716
  137. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_config.py +0 -130
  138. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content.py +0 -192
  139. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content_flags.py +0 -27
  140. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content_labels.py +0 -94
  141. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_crawl_tree.py +0 -2252
  142. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_degraded_write_safety.py +0 -176
  143. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_draft_management.py +0 -225
  144. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_errors.py +0 -75
  145. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing.py +0 -73
  146. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_chaos.py +0 -37
  147. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_rate_limit.py +0 -44
  148. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_timeout.py +0 -49
  149. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_export.py +0 -231
  150. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_history.py +0 -217
  151. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_http.py +0 -375
  152. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_orchestration.py +0 -93
  153. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_reporting.py +0 -24
  154. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_search_cql.py +0 -36
  155. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_space_management.py +0 -236
  156. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_space_permissions.py +0 -384
  157. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_tree_copier.py +0 -644
  158. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_tree_copier_remap.py +0 -289
  159. package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_user_group_management.py +0 -387
  160. package/skills/vds-skill/vds-scripts/diagram_generator/README.md +0 -663
  161. package/skills/vds-skill/vds-scripts/diagram_generator/ci_validate.sh +0 -16
  162. package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-component.png +0 -0
  163. package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-component.puml +0 -23
  164. package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-sequence.png +0 -0
  165. package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-sequence.puml +0 -21
  166. package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-usecase.png +0 -0
  167. package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-usecase.puml +0 -14
  168. package/skills/vds-skill/vds-scripts/diagram_generator/examples/github-actions-validate.yml +0 -39
  169. package/skills/vds-skill/vds-scripts/diagram_generator/generate_all_diagrams.py +0 -827
  170. package/skills/vds-skill/vds-scripts/diagram_generator/generate_insurance_c4_diagrams.py +0 -261
  171. package/skills/vds-skill/vds-scripts/diagram_generator/generate_insurance_c4_quick.py +0 -486
  172. package/skills/vds-skill/vds-scripts/diagram_generator/pyproject.toml +0 -28
  173. package/skills/vds-skill/vds-scripts/diagram_generator/render_png.py +0 -59
  174. package/skills/vds-skill/vds-scripts/diagram_generator/src/vds_diagram_generator/__init__.py +0 -3
  175. package/skills/vds-skill/vds-scripts/diagram_generator/src/vds_diagram_generator/cli.py +0 -50
  176. package/skills/vds-skill/vds-scripts/diagram_generator/test_c4_hierarchical.py +0 -142
  177. package/skills/vds-skill/vds-scripts/diagram_generator/test_c4_quick.py +0 -131
  178. package/skills/vds-skill/vds-scripts/diagram_generator/tests/__init__.py +0 -0
  179. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_analyzer_completeness.py +0 -260
  180. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_c4_syntax_correctness.py +0 -138
  181. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_component_coverage.py +0 -182
  182. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_mermaid_output.py +0 -80
  183. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_png_generation.py +0 -112
  184. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_scenario_templates.py +0 -15
  185. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_sequence_accuracy.py +0 -93
  186. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_structurizr_export.py +0 -177
  187. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_style_consistency.py +0 -174
  188. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_usecase_generator.py +0 -201
  189. package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_usecase_integration.py +0 -124
  190. package/skills/vds-skill/vds-scripts/docker/.dockerignore +0 -38
  191. package/skills/vds-skill/vds-scripts/docker/ADR.md +0 -392
  192. package/skills/vds-skill/vds-scripts/docker/Dockerfile +0 -68
  193. package/skills/vds-skill/vds-scripts/docker/MIGRATION.md +0 -453
  194. package/skills/vds-skill/vds-scripts/docker/README.md +0 -347
  195. package/skills/vds-skill/vds-scripts/docker/ROLLBACK.md +0 -596
  196. package/skills/vds-skill/vds-scripts/docker/compose.phase2-verification.yml +0 -31
  197. package/skills/vds-skill/vds-scripts/docker/docker-compose.cli.yml +0 -206
  198. package/skills/vds-skill/vds-scripts/docker/docker-compose.infra.yml +0 -276
  199. package/skills/vds-skill/vds-scripts/docker/docker-compose.services.yml +0 -425
  200. package/skills/vds-skill/vds-scripts/docker/infrastructure/init-schemas.sql +0 -177
  201. package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/pgbouncer.ini +0 -75
  202. package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/userlist.txt +0 -50
  203. package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/userlist.txt.template +0 -36
  204. package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/.gitkeep +0 -0
  205. package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/PREFLIGHT.md +0 -132
  206. package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/README.md +0 -84
  207. package/skills/vds-skill/vds-scripts/docs/.confluence.yaml +0 -157
  208. package/skills/vds-skill/vds-scripts/docs/.freshness.yaml +0 -54
  209. package/skills/vds-skill/vds-scripts/docs/README.md +0 -235
  210. package/skills/vds-skill/vds-scripts/docs/agents/README.md +0 -33
  211. package/skills/vds-skill/vds-scripts/docs/agents/explanation/data-flow.md +0 -132
  212. package/skills/vds-skill/vds-scripts/docs/agents/explanation/development-roadmap.md +0 -49
  213. package/skills/vds-skill/vds-scripts/docs/agents/explanation/features-overview.md +0 -62
  214. package/skills/vds-skill/vds-scripts/docs/agents/explanation/index.md +0 -36
  215. package/skills/vds-skill/vds-scripts/docs/agents/explanation/runtime-verification-and-gap-reporting.md +0 -127
  216. package/skills/vds-skill/vds-scripts/docs/agents/explanation/system-architecture.md +0 -139
  217. package/skills/vds-skill/vds-scripts/docs/agents/explanation/whats-new.md +0 -75
  218. package/skills/vds-skill/vds-scripts/docs/agents/explanation/who-ecosystem-introduction.md +0 -65
  219. package/skills/vds-skill/vds-scripts/docs/agents/explanation/who-ecosystem-model.md +0 -41
  220. package/skills/vds-skill/vds-scripts/docs/agents/how-to/02-using-vds-ai-memory.md +0 -98
  221. package/skills/vds-skill/vds-scripts/docs/agents/how-to/03-memory-cross-agent.md +0 -241
  222. package/skills/vds-skill/vds-scripts/docs/agents/how-to/04-using-progress-reports.md +0 -240
  223. package/skills/vds-skill/vds-scripts/docs/agents/how-to/08-semantic-search.md +0 -46
  224. package/skills/vds-skill/vds-scripts/docs/agents/how-to/apply-phase3-migration.md +0 -148
  225. package/skills/vds-skill/vds-scripts/docs/agents/how-to/choose-the-right-command-or-skill.md +0 -34
  226. package/skills/vds-skill/vds-scripts/docs/agents/how-to/contribute-new-orchestrator.md +0 -149
  227. package/skills/vds-skill/vds-scripts/docs/agents/how-to/decision-tree.md +0 -63
  228. package/skills/vds-skill/vds-scripts/docs/agents/how-to/first-audit-run.md +0 -83
  229. package/skills/vds-skill/vds-scripts/docs/agents/how-to/index.md +0 -49
  230. package/skills/vds-skill/vds-scripts/docs/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +0 -314
  231. package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +0 -165
  232. package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +0 -138
  233. package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +0 -130
  234. package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +0 -142
  235. package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +0 -140
  236. package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +0 -135
  237. package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-all-project-preparation.md +0 -211
  238. package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-bounded-parallel-analysis.md +0 -123
  239. package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-confluence-upload-recovery.md +0 -204
  240. package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase132-department-preparation.md +0 -144
  241. package/skills/vds-skill/vds-scripts/docs/agents/how-to/run-ecosystem-daily-report.md +0 -213
  242. package/skills/vds-skill/vds-scripts/docs/agents/how-to/tips-and-tricks.md +0 -138
  243. package/skills/vds-skill/vds-scripts/docs/agents/how-to/troubleshooting-guide.md +0 -221
  244. package/skills/vds-skill/vds-scripts/docs/agents/reference/agent-operational-contract.md +0 -162
  245. package/skills/vds-skill/vds-scripts/docs/agents/reference/alignment-phase179-report.md +0 -144
  246. package/skills/vds-skill/vds-scripts/docs/agents/reference/audit-triage-playbook.md +0 -256
  247. package/skills/vds-skill/vds-scripts/docs/agents/reference/backup-restore.md +0 -132
  248. package/skills/vds-skill/vds-scripts/docs/agents/reference/bitbucket-orchestrator.md +0 -56
  249. package/skills/vds-skill/vds-scripts/docs/agents/reference/brd-orchestrator.md +0 -52
  250. package/skills/vds-skill/vds-scripts/docs/agents/reference/capability-coverage-review.md +0 -51
  251. package/skills/vds-skill/vds-scripts/docs/agents/reference/ci-workflows.md +0 -98
  252. package/skills/vds-skill/vds-scripts/docs/agents/reference/circular-dependency-orchestrator.md +0 -55
  253. package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-commands.md +0 -583
  254. package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-development-standards.md +0 -41
  255. package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-help-matrix.md +0 -84
  256. package/skills/vds-skill/vds-scripts/docs/agents/reference/common-errors.md +0 -126
  257. package/skills/vds-skill/vds-scripts/docs/agents/reference/configuration-reference.md +0 -128
  258. package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-orchestrator.md +0 -56
  259. package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-sync-target.md +0 -111
  260. package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-sync.md +0 -46
  261. package/skills/vds-skill/vds-scripts/docs/agents/reference/db-query-orchestrator.md +0 -93
  262. package/skills/vds-skill/vds-scripts/docs/agents/reference/diagrams-orchestrator.md +0 -52
  263. package/skills/vds-skill/vds-scripts/docs/agents/reference/ecosystem-daily-report.md +0 -229
  264. package/skills/vds-skill/vds-scripts/docs/agents/reference/elastic-orchestrator.md +0 -57
  265. package/skills/vds-skill/vds-scripts/docs/agents/reference/env-git-helper.md +0 -216
  266. package/skills/vds-skill/vds-scripts/docs/agents/reference/evolution-orchestrator.md +0 -113
  267. package/skills/vds-skill/vds-scripts/docs/agents/reference/excel-orchestrator.md +0 -51
  268. package/skills/vds-skill/vds-scripts/docs/agents/reference/git-orchestrator.md +0 -62
  269. package/skills/vds-skill/vds-scripts/docs/agents/reference/google-sheets-orchestrator.md +0 -51
  270. package/skills/vds-skill/vds-scripts/docs/agents/reference/grafana-orchestrator.md +0 -52
  271. package/skills/vds-skill/vds-scripts/docs/agents/reference/hexagonal-orchestrator.md +0 -64
  272. package/skills/vds-skill/vds-scripts/docs/agents/reference/index.md +0 -36
  273. package/skills/vds-skill/vds-scripts/docs/agents/reference/infrastructure-v2.15.md +0 -67
  274. package/skills/vds-skill/vds-scripts/docs/agents/reference/intellij-orchestrator.md +0 -50
  275. package/skills/vds-skill/vds-scripts/docs/agents/reference/jira-orchestrator.md +0 -60
  276. package/skills/vds-skill/vds-scripts/docs/agents/reference/links-orchestrator.md +0 -57
  277. package/skills/vds-skill/vds-scripts/docs/agents/reference/lint-cli.md +0 -99
  278. package/skills/vds-skill/vds-scripts/docs/agents/reference/lsp-orchestrator.md +0 -51
  279. package/skills/vds-skill/vds-scripts/docs/agents/reference/markdown-orchestrator.md +0 -53
  280. package/skills/vds-skill/vds-scripts/docs/agents/reference/mcp-orchestrator.md +0 -88
  281. package/skills/vds-skill/vds-scripts/docs/agents/reference/memory-orchestrator.md +0 -53
  282. package/skills/vds-skill/vds-scripts/docs/agents/reference/metabase-orchestrator.md +0 -51
  283. package/skills/vds-skill/vds-scripts/docs/agents/reference/migration-playbook.md +0 -71
  284. package/skills/vds-skill/vds-scripts/docs/agents/reference/multi-agent-orchestrator.md +0 -52
  285. package/skills/vds-skill/vds-scripts/docs/agents/reference/openapi-orchestrator.md +0 -57
  286. package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-architecture.md +0 -194
  287. package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-comparison-matrix.md +0 -79
  288. package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-index.md +0 -73
  289. package/skills/vds-skill/vds-scripts/docs/agents/reference/pdf-orchestrator.md +0 -57
  290. package/skills/vds-skill/vds-scripts/docs/agents/reference/portable-paths-and-config.md +0 -0
  291. package/skills/vds-skill/vds-scripts/docs/agents/reference/portable-paths-validation-matrix.md +0 -129
  292. package/skills/vds-skill/vds-scripts/docs/agents/reference/progress-orchestrator.md +0 -51
  293. package/skills/vds-skill/vds-scripts/docs/agents/reference/progress-report-cli.md +0 -215
  294. package/skills/vds-skill/vds-scripts/docs/agents/reference/public-interface-orchestrator.md +0 -73
  295. package/skills/vds-skill/vds-scripts/docs/agents/reference/research-orchestrator.md +0 -53
  296. package/skills/vds-skill/vds-scripts/docs/agents/reference/schema-orchestrator.md +0 -57
  297. package/skills/vds-skill/vds-scripts/docs/agents/reference/search-tools.md +0 -34
  298. package/skills/vds-skill/vds-scripts/docs/agents/reference/skills-commands.md +0 -256
  299. package/skills/vds-skill/vds-scripts/docs/agents/reference/skills-reference.md +0 -32
  300. package/skills/vds-skill/vds-scripts/docs/agents/reference/sonarqube-orchestrator.md +0 -62
  301. package/skills/vds-skill/vds-scripts/docs/agents/reference/spec-orchestrator.md +0 -56
  302. package/skills/vds-skill/vds-scripts/docs/agents/reference/structure-orchestrator.md +0 -69
  303. package/skills/vds-skill/vds-scripts/docs/agents/reference/system-requirements.md +0 -76
  304. package/skills/vds-skill/vds-scripts/docs/agents/reference/tasks-orchestrator.md +0 -53
  305. package/skills/vds-skill/vds-scripts/docs/agents/reference/validation-and-sync-notes.md +0 -54
  306. package/skills/vds-skill/vds-scripts/docs/agents/reference/vds-ai-memory-api.md +0 -51
  307. package/skills/vds-skill/vds-scripts/docs/agents/reference/vds-cli-reference.md +0 -34
  308. package/skills/vds-skill/vds-scripts/docs/agents/reference/who-capability-inventory.md +0 -96
  309. package/skills/vds-skill/vds-scripts/docs/agents/reference/who-capability-routing-matrix.md +0 -14
  310. package/skills/vds-skill/vds-scripts/docs/agents/tutorials/feature-progression-guide.md +0 -112
  311. package/skills/vds-skill/vds-scripts/docs/agents/tutorials/index.md +0 -36
  312. package/skills/vds-skill/vds-scripts/docs/agents/tutorials/quick-start.md +0 -50
  313. package/skills/vds-skill/vds-scripts/docs/agents/tutorials/who-skills-and-scripts-onboarding.md +0 -47
  314. package/skills/vds-skill/vds-scripts/docs/agents/tutorials/zero-to-productive-developer.md +0 -339
  315. package/skills/vds-skill/vds-scripts/docs/confluence/IMPLEMENTATION-SUMMARY.md +0 -78
  316. package/skills/vds-skill/vds-scripts/docs/confluence/SYNC-GUIDE.md +0 -47
  317. package/skills/vds-skill/vds-scripts/docs/deployment/offline-docker-image-load.md +0 -59
  318. package/skills/vds-skill/vds-scripts/docs/evolution-auto-run-rollout.md +0 -325
  319. package/skills/vds-skill/vds-scripts/docs/evolution-loop-deep-integration.md +0 -496
  320. package/skills/vds-skill/vds-scripts/docs/evolution-loop-integration-guide.md +0 -359
  321. package/skills/vds-skill/vds-scripts/docs/openspace-schema-snapshot.md +0 -73
  322. package/skills/vds-skill/vds-scripts/docs/operations/sla-mttr-policy.md +0 -44
  323. package/skills/vds-skill/vds-scripts/docs/p0-closure-evidence/SUMMARY.md +0 -58
  324. package/skills/vds-skill/vds-scripts/docs/p4-closure-evidence/.gitkeep +0 -0
  325. package/skills/vds-skill/vds-scripts/docs/p4-closure-evidence/smoke-20260427T024137Z-b95b586b.json +0 -15
  326. package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/alembic-and-runtime-advisory-locks.md +0 -45
  327. package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/dbos-listen-notify.md +0 -54
  328. package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/pgbouncer-search-path-empirical.md +0 -110
  329. package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/pgvector-set-local-audit.md +0 -51
  330. package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/topology-decision-session-mode.md +0 -57
  331. package/skills/vds-skill/vds-scripts/docs/phases/CHANGELOG.md +0 -103
  332. package/skills/vds-skill/vds-scripts/docs/phases/PHASE_125_COMPLETION_AND_MERGE.md +0 -212
  333. package/skills/vds-skill/vds-scripts/docs/phases/phase125/IMPLEMENTATION_REPORT.md +0 -227
  334. package/skills/vds-skill/vds-scripts/docs/phases/phase125/TSK-125.10-11-implementation-summary.md +0 -196
  335. package/skills/vds-skill/vds-scripts/docs/phases/phase125/profile-patch-ollama-local-anthropic.md +0 -122
  336. package/skills/vds-skill/vds-scripts/docs/phases/phase125_completion_summary.md +0 -369
  337. package/skills/vds-skill/vds-scripts/docs/phases/phase125_llm_analysis_skill.md +0 -164
  338. package/skills/vds-skill/vds-scripts/docs/phases/phase125_merge_complete.md +0 -147
  339. package/skills/vds-skill/vds-scripts/docs/phases/phase125_skill_runtime_closure_20260321.md +0 -91
  340. package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/closure-handoff-summary-2026-03-23.md +0 -290
  341. package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/remaining-risk-register-2026-03-25.md +0 -143
  342. package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/verification-evidence-2026-03-23.md +0 -135
  343. package/skills/vds-skill/vds-scripts/docs/v0-sunset-known-issues.md +0 -88
  344. package/skills/vds-skill/vds-scripts/docs/vi/TRANSLATION-BACKLOG.md +0 -72
  345. package/skills/vds-skill/vds-scripts/docs/vi/agents/README.md +0 -41
  346. package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/features-overview.md +0 -29
  347. package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/index.md +0 -14
  348. package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/runtime-verification-and-gap-reporting.md +0 -129
  349. package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/whats-new.md +0 -37
  350. package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/who-ecosystem-introduction.md +0 -21
  351. package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/who-ecosystem-model.md +0 -36
  352. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/02-using-vds-ai-memory.md +0 -100
  353. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/03-memory-cross-agent.md +0 -243
  354. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/04-using-progress-reports.md +0 -242
  355. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/08-semantic-search.md +0 -16
  356. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/choose-the-right-command-or-skill.md +0 -36
  357. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/decision-tree.md +0 -77
  358. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/first-audit-run.md +0 -85
  359. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/index.md +0 -21
  360. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +0 -156
  361. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +0 -174
  362. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +0 -147
  363. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +0 -139
  364. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +0 -151
  365. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +0 -149
  366. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +0 -144
  367. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-all-project-preparation.md +0 -213
  368. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-bounded-parallel-analysis.md +0 -125
  369. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-confluence-upload-recovery.md +0 -206
  370. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase132-department-preparation.md +0 -146
  371. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/tips-and-tricks.md +0 -34
  372. package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/troubleshooting-guide.md +0 -36
  373. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/agent-operational-contract.md +0 -98
  374. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/audit-triage-playbook.md +0 -258
  375. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/bitbucket-orchestrator.md +0 -30
  376. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/brd-orchestrator.md +0 -29
  377. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/capability-coverage-review.md +0 -46
  378. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/circular-dependency-orchestrator.md +0 -29
  379. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-commands.md +0 -409
  380. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-development-standards.md +0 -19
  381. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-help-matrix.md +0 -71
  382. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/common-errors.md +0 -133
  383. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/configuration-reference.md +0 -25
  384. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/confluence-orchestrator.md +0 -30
  385. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/db-query-orchestrator.md +0 -34
  386. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/diagrams-orchestrator.md +0 -31
  387. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/elastic-orchestrator.md +0 -30
  388. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/evolution-orchestrator.md +0 -31
  389. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/excel-orchestrator.md +0 -60
  390. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/git-orchestrator.md +0 -31
  391. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/google-sheets-orchestrator.md +0 -60
  392. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/grafana-orchestrator.md +0 -30
  393. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/hexagonal-orchestrator.md +0 -73
  394. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/index.md +0 -25
  395. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/intellij-orchestrator.md +0 -59
  396. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/jira-orchestrator.md +0 -32
  397. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/links-orchestrator.md +0 -66
  398. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/lsp-orchestrator.md +0 -60
  399. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/markdown-orchestrator.md +0 -62
  400. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/mcp-orchestrator.md +0 -34
  401. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/memory-orchestrator.md +0 -45
  402. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/metabase-orchestrator.md +0 -30
  403. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/multi-agent-orchestrator.md +0 -61
  404. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/openapi-orchestrator.md +0 -66
  405. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/orchestrator-architecture.md +0 -24
  406. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/orchestrator-index.md +0 -73
  407. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/pdf-orchestrator.md +0 -30
  408. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/portable-paths-and-config.md +0 -123
  409. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/portable-paths-validation-matrix.md +0 -131
  410. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/progress-orchestrator.md +0 -43
  411. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/progress-report-cli.md +0 -217
  412. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/public-interface-orchestrator.md +0 -82
  413. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/research-orchestrator.md +0 -45
  414. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/schema-orchestrator.md +0 -66
  415. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/search-tools.md +0 -19
  416. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/skills-reference.md +0 -27
  417. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/sonarqube-orchestrator.md +0 -71
  418. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/spec-orchestrator.md +0 -56
  419. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/structure-orchestrator.md +0 -78
  420. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/system-requirements.md +0 -30
  421. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/tasks-orchestrator.md +0 -45
  422. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/validation-and-sync-notes.md +0 -26
  423. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/vds-ai-memory-api.md +0 -53
  424. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/vds-cli-reference.md +0 -34
  425. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/who-capability-inventory.md +0 -98
  426. package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/who-capability-routing-matrix.md +0 -16
  427. package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/feature-progression-guide.md +0 -124
  428. package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/index.md +0 -13
  429. package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/quick-start.md +0 -30
  430. package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/who-skills-and-scripts-onboarding.md +0 -42
  431. package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/zero-to-productive-developer.md +0 -137
  432. package/skills/vds-skill/vds-scripts/elastic_orchestrator/README.md +0 -450
  433. package/skills/vds-skill/vds-scripts/elastic_orchestrator/pyproject.toml +0 -97
  434. package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/__init__.py +0 -81
  435. package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/cli.py +0 -652
  436. package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/client.py +0 -743
  437. package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/config.py +0 -208
  438. package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/errors.py +0 -34
  439. package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/py.typed +0 -0
  440. package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/__init__.py +0 -0
  441. package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/conftest.py +0 -227
  442. package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_client.py +0 -990
  443. package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_config.py +0 -268
  444. package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_e2e_verification.py +0 -272
  445. package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_errors.py +0 -78
  446. package/skills/vds-skill/vds-scripts/excel_orchestrator/README.md +0 -288
  447. package/skills/vds-skill/vds-scripts/excel_orchestrator/RESEARCH_BASED_UPDATES_REPORT.md +0 -261
  448. package/skills/vds-skill/vds-scripts/excel_orchestrator/add_essential_missing_effort.py +0 -255
  449. package/skills/vds-skill/vds-scripts/excel_orchestrator/adjust_effort_complexity.py +0 -184
  450. package/skills/vds-skill/vds-scripts/excel_orchestrator/brd_analysis_and_task_breakdown.py +0 -632
  451. package/skills/vds-skill/vds-scripts/excel_orchestrator/brd_analysis_comprehensive.py +0 -1029
  452. package/skills/vds-skill/vds-scripts/excel_orchestrator/check_overlaps_and_brd_coverage.py +0 -570
  453. package/skills/vds-skill/vds-scripts/excel_orchestrator/clean_remarks_column.py +0 -127
  454. package/skills/vds-skill/vds-scripts/excel_orchestrator/comprehensive_brd_check.py +0 -322
  455. package/skills/vds-skill/vds-scripts/excel_orchestrator/create_buffered_summary.py +0 -119
  456. package/skills/vds-skill/vds-scripts/excel_orchestrator/create_service_totals_sheet.py +0 -118
  457. package/skills/vds-skill/vds-scripts/excel_orchestrator/examples/basic_operations.py +0 -85
  458. package/skills/vds-skill/vds-scripts/excel_orchestrator/expand_all_tasks.py +0 -341
  459. package/skills/vds-skill/vds-scripts/excel_orchestrator/expand_tasks.py +0 -304
  460. package/skills/vds-skill/vds-scripts/excel_orchestrator/fill_brd_references.py +0 -347
  461. package/skills/vds-skill/vds-scripts/excel_orchestrator/fill_remarks_and_colors.py +0 -132
  462. package/skills/vds-skill/vds-scripts/excel_orchestrator/finalize_brd_and_cleanup.py +0 -295
  463. package/skills/vds-skill/vds-scripts/excel_orchestrator/finalize_brd_coverage.py +0 -327
  464. package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_all_formulas.py +0 -99
  465. package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_detail_presentation.py +0 -113
  466. package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_presentation_and_effort.py +0 -116
  467. package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_presentation_consistency.py +0 -231
  468. package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_remarks_matching.py +0 -179
  469. package/skills/vds-skill/vds-scripts/excel_orchestrator/group_tasks_by_service_id.py +0 -210
  470. package/skills/vds-skill/vds-scripts/excel_orchestrator/increase_brd_coverage.py +0 -497
  471. package/skills/vds-skill/vds-scripts/excel_orchestrator/increase_effort_complexity.py +0 -155
  472. package/skills/vds-skill/vds-scripts/excel_orchestrator/organize_and_deduplicate.py +0 -273
  473. package/skills/vds-skill/vds-scripts/excel_orchestrator/pyproject.toml +0 -64
  474. package/skills/vds-skill/vds-scripts/excel_orchestrator/rebuild_all_formulas.py +0 -146
  475. package/skills/vds-skill/vds-scripts/excel_orchestrator/remove_base_multiplier_and_check_duplicates.py +0 -310
  476. package/skills/vds-skill/vds-scripts/excel_orchestrator/remove_duplicate_brd_tasks.py +0 -137
  477. package/skills/vds-skill/vds-scripts/excel_orchestrator/research_based_updates.py +0 -457
  478. package/skills/vds-skill/vds-scripts/excel_orchestrator/restore_e_values.py +0 -172
  479. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/__init__.py +0 -5
  480. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/cli.py +0 -746
  481. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/config.py +0 -74
  482. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/converters.py +0 -226
  483. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/errors.py +0 -88
  484. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/excel_client.py +0 -443
  485. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/formatters.py +0 -211
  486. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/logging.py +0 -57
  487. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/source_contract.py +0 -29
  488. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/target_state_status.py +0 -837
  489. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/ulnc_alignment.py +0 -1291
  490. package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/validators.py +0 -164
  491. package/skills/vds-skill/vds-scripts/excel_orchestrator/sync_detail_and_total_sheets.py +0 -211
  492. package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/__init__.py +0 -1
  493. package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/conftest.py +0 -36
  494. package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_cli.py +0 -383
  495. package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_excel_client.py +0 -129
  496. package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_ulnc_alignment.py +0 -373
  497. package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_validators.py +0 -64
  498. package/skills/vds-skill/vds-scripts/excel_orchestrator/update_api_database_effort.py +0 -261
  499. package/skills/vds-skill/vds-scripts/excel_orchestrator/update_buffers_inline.py +0 -115
  500. package/skills/vds-skill/vds-scripts/excel_orchestrator/update_complex_services_and_add_new.py +0 -336
  501. package/skills/vds-skill/vds-scripts/excel_orchestrator/update_responsibility_and_fix_rows.py +0 -208
  502. package/skills/vds-skill/vds-scripts/excel_orchestrator/update_task_breakdown_vietnamese.py +0 -309
  503. package/skills/vds-skill/vds-scripts/excel_orchestrator/update_vietnamese_and_responsibility.py +0 -415
  504. package/skills/vds-skill/vds-scripts/excel_orchestrator/verify_brd_coverage_comprehensive.py +0 -401
  505. package/skills/vds-skill/vds-scripts/git_orchestrator/ENHANCEMENT_SUMMARY.md +0 -119
  506. package/skills/vds-skill/vds-scripts/git_orchestrator/README.md +0 -286
  507. package/skills/vds-skill/vds-scripts/git_orchestrator/VERIFICATION_REPORT.md +0 -152
  508. package/skills/vds-skill/vds-scripts/git_orchestrator/pyproject.toml +0 -37
  509. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__init__.py +0 -30
  510. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__main__.py +0 -4
  511. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/branch_probe.py +0 -271
  512. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/cli.py +0 -892
  513. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/logging_config.py +0 -63
  514. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/manifest.py +0 -249
  515. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/orchestrator.py +0 -1647
  516. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/protocols.py +0 -35
  517. package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/reporting.py +0 -55
  518. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/__init__.py +0 -0
  519. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_cli_settings.py +0 -19
  520. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_integration.py +0 -79
  521. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_manifest.py +0 -79
  522. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_orchestrator.py +0 -207
  523. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_public_api.py +0 -235
  524. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_resilience.py +0 -343
  525. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/__init__.py +0 -0
  526. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/test_branch_probe.py +0 -327
  527. package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/test_protocols.py +0 -132
  528. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/README.md +0 -241
  529. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/pyproject.toml +0 -45
  530. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/__init__.py +0 -69
  531. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/cli.py +0 -568
  532. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/client.py +0 -186
  533. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/config.py +0 -46
  534. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/errors.py +0 -41
  535. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/__init__.py +0 -1
  536. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/conftest.py +0 -1
  537. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/__init__.py +0 -1
  538. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_cli.py +0 -212
  539. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_client.py +0 -24
  540. package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_config.py +0 -16
  541. package/skills/vds-skill/vds-scripts/grafana_orchestrator/README.md +0 -572
  542. package/skills/vds-skill/vds-scripts/grafana_orchestrator/pyproject.toml +0 -102
  543. package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/__init__.py +0 -78
  544. package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/cli.py +0 -455
  545. package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/client.py +0 -700
  546. package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/config.py +0 -243
  547. package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/errors.py +0 -34
  548. package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/py.typed +0 -1
  549. package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/__init__.py +0 -1
  550. package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/conftest.py +0 -308
  551. package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_client.py +0 -458
  552. package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_config.py +0 -203
  553. package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_errors.py +0 -78
  554. package/skills/vds-skill/vds-scripts/jira_orchestrator/README.md +0 -864
  555. package/skills/vds-skill/vds-scripts/jira_orchestrator/pyproject.toml +0 -43
  556. package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/__init__.py +0 -65
  557. package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/adapter.py +0 -1685
  558. package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/cli.py +0 -2806
  559. package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/config.py +0 -168
  560. package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/errors.py +0 -34
  561. package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/reporting.py +0 -66
  562. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/__init__.py +0 -1
  563. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/conftest.py +0 -86
  564. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_agile_list_payloads.py +0 -54
  565. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_bulk_operations.py +0 -91
  566. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_components.py +0 -56
  567. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_createmeta.py +0 -45
  568. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_dashboard.py +0 -119
  569. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_issue_properties.py +0 -53
  570. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_permissions_compat.py +0 -41
  571. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_reindex.py +0 -42
  572. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_remote_links.py +0 -75
  573. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_transitions.py +0 -90
  574. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_user_management.py +0 -116
  575. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_version_management.py +0 -181
  576. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_watchers.py +0 -43
  577. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_advanced_search.py +0 -179
  578. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_agile.py +0 -304
  579. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_application_properties.py +0 -243
  580. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_backlog.py +0 -91
  581. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_bulk_operations.py +0 -403
  582. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_cli.py +0 -108
  583. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_components.py +0 -119
  584. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_config.py +0 -166
  585. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_dashboard.py +0 -122
  586. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_discover_fields.py +0 -207
  587. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_errors.py +0 -72
  588. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_filter_management.py +0 -411
  589. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_archiving.py +0 -179
  590. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_links.py +0 -257
  591. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_properties.py +0 -189
  592. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_link_types.py +0 -407
  593. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_parse_set.py +0 -37
  594. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_permissions.py +0 -343
  595. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_reindex.py +0 -81
  596. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_remote_links.py +0 -269
  597. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_security_schemes.py +0 -202
  598. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_transitions_changelog.py +0 -109
  599. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_user_management.py +0 -246
  600. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_version_management.py +0 -503
  601. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_watchers.py +0 -116
  602. package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_worklog.py +0 -243
  603. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/README.md +0 -864
  604. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/pyproject.toml +0 -43
  605. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/__init__.py +0 -65
  606. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/adapter.py +0 -1689
  607. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/cli.py +0 -2799
  608. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/config.py +0 -137
  609. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/errors.py +0 -34
  610. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/reporting.py +0 -65
  611. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/__init__.py +0 -1
  612. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/conftest.py +0 -86
  613. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_agile_list_payloads.py +0 -54
  614. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_bulk_operations.py +0 -101
  615. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_components.py +0 -64
  616. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_createmeta.py +0 -45
  617. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_dashboard.py +0 -135
  618. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_issue_properties.py +0 -63
  619. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_permissions_compat.py +0 -42
  620. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_reindex.py +0 -42
  621. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_remote_links.py +0 -89
  622. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_transitions.py +0 -91
  623. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_user_management.py +0 -130
  624. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_version_management.py +0 -189
  625. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_watchers.py +0 -49
  626. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_advanced_search.py +0 -213
  627. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_agile.py +0 -334
  628. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_application_properties.py +0 -261
  629. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_backlog.py +0 -91
  630. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_bulk_operations.py +0 -443
  631. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_cli.py +0 -106
  632. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_components.py +0 -133
  633. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_config.py +0 -166
  634. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_dashboard.py +0 -130
  635. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_discover_fields.py +0 -207
  636. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_errors.py +0 -61
  637. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_filter_management.py +0 -478
  638. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_archiving.py +0 -181
  639. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_links.py +0 -257
  640. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_properties.py +0 -203
  641. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_link_types.py +0 -426
  642. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_parse_set.py +0 -37
  643. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_permissions.py +0 -358
  644. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_reindex.py +0 -81
  645. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_remote_links.py +0 -292
  646. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_security_schemes.py +0 -218
  647. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_transitions_changelog.py +0 -121
  648. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_user_management.py +0 -283
  649. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_version_management.py +0 -561
  650. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_watchers.py +0 -128
  651. package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_worklog.py +0 -265
  652. package/skills/vds-skill/vds-scripts/llms.txt +0 -159
  653. package/skills/vds-skill/vds-scripts/markdown_orchestrator/README.md +0 -72
  654. package/skills/vds-skill/vds-scripts/markdown_orchestrator/pyproject.toml +0 -39
  655. package/skills/vds-skill/vds-scripts/markdown_orchestrator/src/vds_markdown_orchestrator/__init__.py +0 -5
  656. package/skills/vds-skill/vds-scripts/markdown_orchestrator/src/vds_markdown_orchestrator/cli.py +0 -102
  657. package/skills/vds-skill/vds-scripts/mcp_server/Dockerfile +0 -63
  658. package/skills/vds-skill/vds-scripts/mcp_server/README.md +0 -140
  659. package/skills/vds-skill/vds-scripts/mcp_server/pyproject.toml +0 -41
  660. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/__init__.py +0 -3
  661. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/config.py +0 -36
  662. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/server.py +0 -111
  663. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/__init__.py +0 -15
  664. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/bitbucket_tools.py +0 -47
  665. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/confluence_tools.py +0 -53
  666. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/git_tools.py +0 -71
  667. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/jira_tools.py +0 -63
  668. package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/vidp_tools.py +0 -64
  669. package/skills/vds-skill/vds-scripts/mcp_server/tests/__init__.py +0 -1
  670. package/skills/vds-skill/vds-scripts/mcp_server/tests/conftest.py +0 -31
  671. package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/__init__.py +0 -1
  672. package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_bitbucket_tools.py +0 -28
  673. package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_confluence_tools.py +0 -28
  674. package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_git_tools.py +0 -35
  675. package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_jira_tools.py +0 -35
  676. package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/__init__.py +0 -6
  677. package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/conftest.py +0 -51
  678. package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_confluence_tools.py +0 -40
  679. package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_jira_tools.py +0 -39
  680. package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_tool_registration.py +0 -50
  681. package/skills/vds-skill/vds-scripts/pdf_orchestrator/.dockerignore +0 -93
  682. package/skills/vds-skill/vds-scripts/pdf_orchestrator/.env.example +0 -40
  683. package/skills/vds-skill/vds-scripts/pdf_orchestrator/.ruff_rules.py +0 -350
  684. package/skills/vds-skill/vds-scripts/pdf_orchestrator/.yamllint.yml +0 -43
  685. package/skills/vds-skill/vds-scripts/pdf_orchestrator/DEVELOPMENT_PLAN.md +0 -80
  686. package/skills/vds-skill/vds-scripts/pdf_orchestrator/Dockerfile +0 -87
  687. package/skills/vds-skill/vds-scripts/pdf_orchestrator/README.md +0 -608
  688. package/skills/vds-skill/vds-scripts/pdf_orchestrator/cli_verification_test/test.md +0 -6
  689. package/skills/vds-skill/vds-scripts/pdf_orchestrator/cli_verification_test/test.pdf +0 -0
  690. package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/alertmanager.yml +0 -83
  691. package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/prometheus.prod.yml +0 -98
  692. package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/prometheus.yml +0 -40
  693. package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/redis.conf +0 -78
  694. package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/COMPETITIVE_ANALYSIS_REPORT.md +0 -309
  695. package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/FEATURES_GUIDE.md +0 -518
  696. package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/MULTI_USER_DEPLOYMENT_GUIDE.md +0 -615
  697. package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/USER_GUIDE.md +0 -829
  698. package/skills/vds-skill/vds-scripts/pdf_orchestrator/pyproject.toml +0 -87
  699. package/skills/vds-skill/vds-scripts/pdf_orchestrator/pytest.ini +0 -71
  700. package/skills/vds-skill/vds-scripts/pdf_orchestrator/ruff.toml +0 -6
  701. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/debug_security_report.py +0 -59
  702. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/demo_library_selector.py +0 -109
  703. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/generate_project_stats.py +0 -52
  704. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/generate_styled_pdf.py +0 -95
  705. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/migrate_render_pdfs.py +0 -285
  706. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/setup_team.bat +0 -283
  707. package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/setup_team.sh +0 -324
  708. package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/__init__.py +0 -5
  709. package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/cli.py +0 -542
  710. package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/config.py +0 -33
  711. package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/README.md +0 -650
  712. package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/__init__.py +0 -0
  713. package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/conftest.py +0 -520
  714. package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/requirements.txt +0 -51
  715. package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/run_tests.py +0 -659
  716. package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/test_config.py +0 -36
  717. package/skills/vds-skill/vds-scripts/platform_core/pyproject.toml +0 -49
  718. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/__init__.py +0 -16
  719. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/alembic/__init__.py +0 -18
  720. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/alembic/runtime.py +0 -139
  721. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/config.py +0 -88
  722. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/credentials.py +0 -40
  723. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/env.py +0 -24
  724. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/errors.py +0 -127
  725. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/__init__.py +0 -18
  726. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/auth.py +0 -32
  727. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/errors.py +0 -47
  728. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/pagination.py +0 -65
  729. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/retry.py +0 -62
  730. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/stack.py +0 -61
  731. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/logging.py +0 -132
  732. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/protocols.py +0 -77
  733. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/serialization.py +0 -80
  734. package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/severity.py +0 -175
  735. package/skills/vds-skill/vds-scripts/platform_core/tests/__init__.py +0 -0
  736. package/skills/vds-skill/vds-scripts/platform_core/tests/conftest.py +0 -1
  737. package/skills/vds-skill/vds-scripts/platform_core/tests/test_alembic_runtime.py +0 -300
  738. package/skills/vds-skill/vds-scripts/platform_core/tests/test_auth.py +0 -84
  739. package/skills/vds-skill/vds-scripts/platform_core/tests/test_config.py +0 -83
  740. package/skills/vds-skill/vds-scripts/platform_core/tests/test_credentials.py +0 -73
  741. package/skills/vds-skill/vds-scripts/platform_core/tests/test_env.py +0 -56
  742. package/skills/vds-skill/vds-scripts/platform_core/tests/test_errors.py +0 -201
  743. package/skills/vds-skill/vds-scripts/platform_core/tests/test_errors_http.py +0 -74
  744. package/skills/vds-skill/vds-scripts/platform_core/tests/test_http_settings.py +0 -116
  745. package/skills/vds-skill/vds-scripts/platform_core/tests/test_logging.py +0 -148
  746. package/skills/vds-skill/vds-scripts/platform_core/tests/test_pagination.py +0 -153
  747. package/skills/vds-skill/vds-scripts/platform_core/tests/test_protocols.py +0 -132
  748. package/skills/vds-skill/vds-scripts/platform_core/tests/test_retry.py +0 -151
  749. package/skills/vds-skill/vds-scripts/platform_core/tests/test_serialization.py +0 -92
  750. package/skills/vds-skill/vds-scripts/platform_core/tests/test_severity.py +0 -178
  751. package/skills/vds-skill/vds-scripts/platform_core/tests/test_stack.py +0 -130
  752. package/skills/vds-skill/vds-scripts/platform_core/uv.lock +0 -341
  753. package/skills/vds-skill/vds-scripts/pyproject.toml +0 -145
  754. package/skills/vds-skill/vds-scripts/pyrightconfig.json +0 -82
  755. package/skills/vds-skill/vds-scripts/repo-manifest.yaml +0 -380
  756. package/skills/vds-skill/vds-scripts/repo-manifest.yaml.example +0 -25
  757. package/skills/vds-skill/vds-scripts/ruff.toml +0 -100
  758. package/skills/vds-skill/vds-scripts/scripts/BRD-Validation-API.postman_collection.json +0 -706
  759. package/skills/vds-skill/vds-scripts/scripts/BRD-Validation-README.md +0 -308
  760. package/skills/vds-skill/vds-scripts/scripts/README.md +0 -271
  761. package/skills/vds-skill/vds-scripts/scripts/_validate_alias_phase2.py +0 -137
  762. package/skills/vds-skill/vds-scripts/scripts/audit-cli-patterns.sh +0 -135
  763. package/skills/vds-skill/vds-scripts/scripts/audit-dashboard.sh +0 -525
  764. package/skills/vds-skill/vds-scripts/scripts/backup.sh +0 -123
  765. package/skills/vds-skill/vds-scripts/scripts/bootstrap_uv.sh +0 -69
  766. package/skills/vds-skill/vds-scripts/scripts/brd-validation-environment.json +0 -51
  767. package/skills/vds-skill/vds-scripts/scripts/brd-validation-test-results.json +0 -13023
  768. package/skills/vds-skill/vds-scripts/scripts/brd_coverage_report.json +0 -276
  769. package/skills/vds-skill/vds-scripts/scripts/check-future-annotations.py +0 -22
  770. package/skills/vds-skill/vds-scripts/scripts/check-invalid-symlinks.py +0 -183
  771. package/skills/vds-skill/vds-scripts/scripts/check-no-debug-markers.py +0 -21
  772. package/skills/vds-skill/vds-scripts/scripts/check-no-unittest.py +0 -21
  773. package/skills/vds-skill/vds-scripts/scripts/ci/assert_no_openspace_commits.sh +0 -37
  774. package/skills/vds-skill/vds-scripts/scripts/ci/verify_branch_protection.sh +0 -64
  775. package/skills/vds-skill/vds-scripts/scripts/closure/phase1_check.sh +0 -483
  776. package/skills/vds-skill/vds-scripts/scripts/closure/phase2_check.sh +0 -500
  777. package/skills/vds-skill/vds-scripts/scripts/create_memory_session.py +0 -36
  778. package/skills/vds-skill/vds-scripts/scripts/deploy-bootstrap.sh +0 -201
  779. package/skills/vds-skill/vds-scripts/scripts/deployment/load_docker_images_offline.sh +0 -90
  780. package/skills/vds-skill/vds-scripts/scripts/dev/cli_smoke.sh +0 -259
  781. package/skills/vds-skill/vds-scripts/scripts/final_completion_report.md +0 -139
  782. package/skills/vds-skill/vds-scripts/scripts/folder_structure_report.json +0 -321
  783. package/skills/vds-skill/vds-scripts/scripts/generate_completion_report.py +0 -132
  784. package/skills/vds-skill/vds-scripts/scripts/generate_intellij_modules.py +0 -154
  785. package/skills/vds-skill/vds-scripts/scripts/init-pgbouncer-userlist.sh +0 -154
  786. package/skills/vds-skill/vds-scripts/scripts/link_integrity_report.json +0 -807
  787. package/skills/vds-skill/vds-scripts/scripts/move_audit_artifact_pages.py +0 -252
  788. package/skills/vds-skill/vds-scripts/scripts/move_audit_artifact_pages_rest.py +0 -165
  789. package/skills/vds-skill/vds-scripts/scripts/move_wrong_dept_pages.py +0 -235
  790. package/skills/vds-skill/vds-scripts/scripts/openspace_bootstrap.sh +0 -56
  791. package/skills/vds-skill/vds-scripts/scripts/openspace_common.sh +0 -75
  792. package/skills/vds-skill/vds-scripts/scripts/openspace_doctor.sh +0 -61
  793. package/skills/vds-skill/vds-scripts/scripts/openspace_sync_shadow.sh +0 -65
  794. package/skills/vds-skill/vds-scripts/scripts/phase7-baseline.sh +0 -77
  795. package/skills/vds-skill/vds-scripts/scripts/preflight/env_check.sh +0 -102
  796. package/skills/vds-skill/vds-scripts/scripts/repair_autopay_reports.sh +0 -173
  797. package/skills/vds-skill/vds-scripts/scripts/rollback_drill.sh +0 -659
  798. package/skills/vds-skill/vds-scripts/scripts/run-audit-in-tmux.sh +0 -286
  799. package/skills/vds-skill/vds-scripts/scripts/run-department-audit.sh +0 -495
  800. package/skills/vds-skill/vds-scripts/scripts/run-project-audit.sh +0 -267
  801. package/skills/vds-skill/vds-scripts/scripts/save_intellij_memories.py +0 -112
  802. package/skills/vds-skill/vds-scripts/scripts/save_memories_to_vds_ai.py +0 -81
  803. package/skills/vds-skill/vds-scripts/scripts/save_memories_vds_style.py +0 -133
  804. package/skills/vds-skill/vds-scripts/scripts/search_intellij_memories.py +0 -48
  805. package/skills/vds-skill/vds-scripts/scripts/setup_intellij_workspace.py +0 -71
  806. package/skills/vds-skill/vds-scripts/scripts/smoke-test-deploy.sh +0 -137
  807. package/skills/vds-skill/vds-scripts/scripts/smoke_deploy_lib.py +0 -205
  808. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/README.md +0 -89
  809. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/confluence_sync_coordinator.sh +0 -27
  810. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/coordination.sh +0 -114
  811. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/diagram_coordinator.sh +0 -25
  812. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/docs_root.sh +0 -22
  813. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/generate_diagrams.sh +0 -22
  814. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/markdown_coordinator.sh +0 -25
  815. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/progress_dashboard.sh +0 -17
  816. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/schema_coordinator.sh +0 -25
  817. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/sync_confluence.sh +0 -30
  818. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/update_dependencies.sh +0 -19
  819. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_links.sh +0 -86
  820. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_markdown.sh +0 -52
  821. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_schemas.sh +0 -26
  822. package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_structure.sh +0 -98
  823. package/skills/vds-skill/vds-scripts/scripts/tests/__init__.py +0 -1
  824. package/skills/vds-skill/vds-scripts/scripts/tests/test_dockerfile_correctness.py +0 -815
  825. package/skills/vds-skill/vds-scripts/scripts/tests/test_makefile_loadouts.py +0 -560
  826. package/skills/vds-skill/vds-scripts/scripts/tests/test_smoke_deploy.py +0 -313
  827. package/skills/vds-skill/vds-scripts/scripts/tests/test_verify_alembic.py +0 -581
  828. package/skills/vds-skill/vds-scripts/scripts/tests/test_verify_infra_topology.py +0 -254
  829. package/skills/vds-skill/vds-scripts/scripts/update_modules_xml.py +0 -194
  830. package/skills/vds-skill/vds-scripts/scripts/uv-workspace-alignment-verification-2026-03-25.md +0 -128
  831. package/skills/vds-skill/vds-scripts/scripts/uv-workspace-alignment-verification-2026-04-18.md +0 -100
  832. package/skills/vds-skill/vds-scripts/scripts/validate-cli-standardization.sh +0 -188
  833. package/skills/vds-skill/vds-scripts/scripts/validate_brd_coverage.py +0 -197
  834. package/skills/vds-skill/vds-scripts/scripts/validate_folder_structure.py +0 -234
  835. package/skills/vds-skill/vds-scripts/scripts/validate_link_integrity.py +0 -274
  836. package/skills/vds-skill/vds-scripts/scripts/vami017-caller-compat-report.md +0 -62
  837. package/skills/vds-skill/vds-scripts/scripts/vami017-phase-b-scaffold-notes.md +0 -79
  838. package/skills/vds-skill/vds-scripts/scripts/vds_sh_helpers.sh +0 -180
  839. package/skills/vds-skill/vds-scripts/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +0 -26
  840. package/skills/vds-skill/vds-scripts/scripts/verify-infra-topology.py +0 -868
  841. package/skills/vds-skill/vds-scripts/scripts/verify-memory-cli-e2e.sh +0 -598
  842. package/skills/vds-skill/vds-scripts/scripts/verify-worktree-features.sh +0 -306
  843. package/skills/vds-skill/vds-scripts/scripts/worktree-add.sh +0 -128
  844. package/skills/vds-skill/vds-scripts/scripts/worktree-remove.sh +0 -112
  845. package/skills/vds-skill/vds-scripts/scripts/worktree_compose.sh +0 -269
  846. package/skills/vds-skill/vds-scripts/scripts/worktree_uv.sh +0 -77
  847. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/IMPLEMENTATION_AUDIT.md +0 -376
  848. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/README.md +0 -507
  849. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/pyproject.toml +0 -106
  850. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/scripts/ensure_symlink.sh +0 -38
  851. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/__init__.py +0 -164
  852. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/batch.py +0 -212
  853. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/cli.py +0 -1407
  854. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/client.py +0 -608
  855. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/config.py +0 -260
  856. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/diff.py +0 -220
  857. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/errors.py +0 -34
  858. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/external_sca.py +0 -932
  859. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/portfolio.py +0 -225
  860. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/pr.py +0 -505
  861. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/reports.py +0 -342
  862. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/scanner.py +0 -351
  863. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/webhooks.py +0 -269
  864. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/__init__.py +0 -0
  865. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/conftest.py +0 -134
  866. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_batch.py +0 -419
  867. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_config.py +0 -145
  868. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_errors.py +0 -78
  869. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_external_sca.py +0 -466
  870. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_pr.py +0 -471
  871. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_reports.py +0 -511
  872. package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_webhooks.py +0 -660
  873. package/skills/vds-skill/vds-scripts/uv.lock +0 -5046
  874. package/skills/vds-skill/vds-scripts/vds_agent_core/CHANGELOG.md +0 -36
  875. package/skills/vds-skill/vds-scripts/vds_agent_core/README.md +0 -453
  876. package/skills/vds-skill/vds-scripts/vds_agent_core/docs/PHASE9A_ASSESSMENT.md +0 -50
  877. package/skills/vds-skill/vds-scripts/vds_agent_core/docs/embedding.md +0 -468
  878. package/skills/vds-skill/vds-scripts/vds_agent_core/pyproject.toml +0 -51
  879. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/__init__.py +0 -29
  880. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/__init__.py +0 -26
  881. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/hooks.py +0 -119
  882. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/loop.py +0 -864
  883. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/tools.py +0 -41
  884. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/config.py +0 -252
  885. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/__init__.py +0 -55
  886. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/_cascade.py +0 -143
  887. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/budget.py +0 -353
  888. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/cache.py +0 -373
  889. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/embedding.py +0 -815
  890. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/provider.py +0 -173
  891. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/schemas.py +0 -45
  892. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/__init__.py +0 -77
  893. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/decorators.py +0 -258
  894. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/jsonl_exporter.py +0 -236
  895. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/tracer.py +0 -497
  896. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/profiles.py +0 -2015
  897. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/runtime/__init__.py +0 -0
  898. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/runtime/agent_id.py +0 -60
  899. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/security/__init__.py +0 -13
  900. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/security/credentials.py +0 -106
  901. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/__init__.py +0 -1
  902. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/executor.py +0 -238
  903. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/manager.py +0 -381
  904. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/policy.py +0 -568
  905. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/__init__.py +0 -19
  906. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/langgraph_runner.py +0 -102
  907. package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/protocols.py +0 -81
  908. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/__init__.py +0 -0
  909. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/conftest.py +0 -62
  910. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/__init__.py +0 -0
  911. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_audit_loop_hooks_integration.py +0 -135
  912. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_audit_observability_integration.py +0 -246
  913. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_public_api_stability.py +0 -91
  914. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/__init__.py +0 -0
  915. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/__init__.py +0 -0
  916. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_call_site_parallelism.py +0 -30
  917. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_dimension_guardrail.py +0 -25
  918. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_drop_in_provider_extensibility.py +0 -76
  919. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding.py +0 -393
  920. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_cache.py +0 -302
  921. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_extra.py +0 -696
  922. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_subclass.py +0 -49
  923. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_no_provider_leakage_in_env.py +0 -34
  924. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_provider_auto_route.py +0 -48
  925. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_runtime_log_clean.py +0 -111
  926. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_w7_logic_fixes.py +0 -219
  927. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/__init__.py +0 -0
  928. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_embedding_block_parser.py +0 -194
  929. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_env_resolver_allowlist.py +0 -141
  930. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_profile_authorization.py +0 -158
  931. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_profiles_w3_extra.py +0 -547
  932. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_real_audit_profile_compat.py +0 -129
  933. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/__init__.py +0 -0
  934. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/test_for_agent.py +0 -322
  935. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/test_w9_cascade_edges.py +0 -369
  936. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/security/__init__.py +0 -0
  937. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/security/test_credentials.py +0 -132
  938. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agent_loop.py +0 -663
  939. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agent_loop_coverage.py +0 -429
  940. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agents_hooks_defaults.py +0 -22
  941. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget.py +0 -155
  942. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget_coverage.py +0 -264
  943. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget_tracking_only.py +0 -71
  944. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_cache.py +0 -251
  945. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_cache_context.py +0 -62
  946. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_config.py +0 -155
  947. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_langgraph_runner.py +0 -45
  948. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_langgraph_runner_coverage.py +0 -98
  949. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_llm_cache_deep.py +0 -113
  950. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_decorators.py +0 -697
  951. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_hooks.py +0 -217
  952. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_jsonl_exporter.py +0 -542
  953. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_jsonl_wiring.py +0 -313
  954. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_tracer.py +0 -896
  955. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_profiles.py +0 -1571
  956. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_profiles_coverage.py +0 -444
  957. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_provider.py +0 -316
  958. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_schemas.py +0 -63
  959. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_executor.py +0 -297
  960. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_manager.py +0 -370
  961. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_manager_coverage.py +0 -364
  962. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_policy.py +0 -402
  963. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_rubric.py +0 -47
  964. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_tools.py +0 -51
  965. package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_workflow_protocols.py +0 -136
  966. package/skills/vds-skill/vds-scripts/vds_cli/README.md +0 -201
  967. package/skills/vds-skill/vds-scripts/vds_cli/VERIFICATION_REPORT.md +0 -41
  968. package/skills/vds-skill/vds-scripts/vds_cli/pyproject.toml +0 -50
  969. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/__init__.py +0 -3
  970. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/assets/git-credential-helper.py +0 -235
  971. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/cli.py +0 -1126
  972. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/commands/__init__.py +0 -1
  973. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/commands/lint_cli.py +0 -389
  974. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/confluence_sync.py +0 -846
  975. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/__init__.py +0 -7
  976. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/funnel.py +0 -105
  977. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/scanner.py +0 -211
  978. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/freshness/report.py +0 -90
  979. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/types.py +0 -27
  980. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_cmd.py +0 -672
  981. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_metrics.py +0 -75
  982. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_sync.py +0 -1171
  983. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem/__init__.py +0 -39
  984. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem/report.py +0 -439
  985. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem_docs.py +0 -164
  986. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/env.py +0 -111
  987. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/env_git_helper.py +0 -281
  988. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/__init__.py +0 -3
  989. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/google_sheets_orchestrator.py +0 -173
  990. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/router.py +0 -232
  991. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/skills_cmd.py +0 -274
  992. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/sync_api.py +0 -613
  993. package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/sync_service.py +0 -283
  994. package/skills/vds-skill/vds-scripts/vds_cli/tests/conftest.py +0 -62
  995. package/skills/vds-skill/vds-scripts/vds_cli/tests/test_env_git_helper_lifecycle.py +0 -261
  996. package/skills/vds-skill/vds-scripts/vds_cli/tests/test_git_credential_helper.py +0 -240
  997. package/skills/vds-skill/vds-scripts/vds_cli/tests/test_router_help_proxy.py +0 -43
  998. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_cli.py +0 -241
  999. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_cli_DOC004.py +0 -110
  1000. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_confluence_sync.py +0 -315
  1001. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_confluence_sync_wave7.py +0 -375
  1002. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_consumption_funnel.py +0 -106
  1003. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_consumption_scanner.py +0 -144
  1004. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_cmd.py +0 -89
  1005. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_cmd_wave8.py +0 -161
  1006. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_metrics.py +0 -16
  1007. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_quality_score.py +0 -61
  1008. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_sync.py +0 -417
  1009. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_cli_dashboard.py +0 -667
  1010. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_cli_dashboard_rendering.py +0 -143
  1011. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_docs.py +0 -63
  1012. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_env.py +0 -85
  1013. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_freshness_report.py +0 -125
  1014. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_lint_cli.py +0 -224
  1015. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_router.py +0 -101
  1016. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_skills_cmd.py +0 -419
  1017. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_sync_api.py +0 -357
  1018. package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_sync_service.py +0 -170
  1019. package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/conftest.py +0 -51
  1020. package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_bitbucket_real.py +0 -32
  1021. package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_confluence_real.py +0 -32
  1022. package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_jira_real.py +0 -40
  1023. package/skills/vds-skill/vds-scripts/vds_cli_common/README.md +0 -190
  1024. package/skills/vds-skill/vds-scripts/vds_cli_common/pyproject.toml +0 -96
  1025. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/__init__.py +0 -36
  1026. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/app.py +0 -55
  1027. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/completers.py +0 -139
  1028. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/context.py +0 -201
  1029. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/env.py +0 -163
  1030. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/errors.py +0 -440
  1031. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/output.py +0 -284
  1032. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/paths.py +0 -78
  1033. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/testing.py +0 -211
  1034. package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/version.py +0 -85
  1035. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/__init__.py +0 -0
  1036. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_app.py +0 -126
  1037. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_completers.py +0 -148
  1038. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_context.py +0 -192
  1039. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_env.py +0 -235
  1040. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_errors.py +0 -275
  1041. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_output.py +0 -229
  1042. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_paths.py +0 -61
  1043. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_testing.py +0 -138
  1044. package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_version.py +0 -64
  1045. package/skills/vds-skill/vds-scripts/vidp_orchestrator/README.md +0 -31
  1046. package/skills/vds-skill/vds-scripts/vidp_orchestrator/pyproject.toml +0 -50
  1047. package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/__init__.py +0 -26
  1048. package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/cli.py +0 -246
  1049. package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/client.py +0 -104
  1050. package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/config.py +0 -82
  1051. package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/workflows.json +0 -3
  1052. package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/workflows.py +0 -130
  1053. package/skills/vds-skill/vds-scripts-skill/.openskills.json +0 -6
  1054. package/skills/vds-skill/vds-scripts-skill/QUALITY.md +0 -44
  1055. package/skills/vds-skill/vds-scripts-skill/SKILL.md +0 -132
  1056. package/skills/vds-skill/vds-scripts-skill/references/audit-commands.md +0 -171
  1057. package/skills/vds-skill/vds-scripts-skill/references/capability-index.md +0 -34
  1058. package/skills/vds-skill/vds-scripts-skill/references/development-commands.md +0 -12
  1059. package/skills/vds-skill/vds-scripts-skill/references/google-sheets.md +0 -71
  1060. package/skills/vds-skill/vds-scripts-skill/references/integration-commands.md +0 -17
  1061. package/skills/vds-skill/vds-scripts-skill/references/platform-bootstrap.md +0 -31
  1062. package/skills/vds-skill/vds-scripts-skill/references/specialist-routing.md +0 -14
  1063. package/skills/vds-skill/vds-scripts-skill/references/validation-commands.md +0 -15
@@ -1,2693 +0,0 @@
1
- """Bitbucket client wrapper using atlassian-python-api for consistency."""
2
-
3
- from __future__ import annotations
4
-
5
- import time
6
- from itertools import islice
7
- from typing import TYPE_CHECKING, Any
8
-
9
- import requests
10
- import structlog
11
- from atlassian import Bitbucket as AtlassianBitbucket
12
-
13
- from .errors import (
14
- AuthError,
15
- ConflictError,
16
- NotFoundError,
17
- RateLimitError,
18
- ResponseError,
19
- RetryError,
20
- TransportError,
21
- VDSClientError,
22
- )
23
-
24
- if TYPE_CHECKING:
25
- from .config import BitbucketSettings
26
-
27
-
28
- class BitbucketClient:
29
- """Bitbucket client wrapper using atlassian-python-api SDK.
30
-
31
- This class implements the following protocols for dependency injection:
32
- - BitbucketRepositoryClient: Repository operations (list_projects, get_project, etc.)
33
- - BitbucketBranchClient: Branch and permission operations (get_branches, list_branch_permissions)
34
- - BitbucketCodeClient: Code operations (get_content_of_file, get_commits)
35
- - BitbucketFullClient: Combined protocol (union of all above)
36
-
37
- The protocols enable type-safe dependency injection and mock implementations for testing.
38
- See protocols.py for protocol definitions.
39
-
40
- Example:
41
- from vds_bitbucket_orchestrator import BitbucketClient, BitbucketFullClient
42
-
43
- def audit_repo(client: BitbucketFullClient, project: str, repo: str) -> dict:
44
- # Type-safe access to all client methods
45
- return {
46
- "repo": client.get_repository(project, repo),
47
- "permissions": client.list_branch_permissions(project, repo),
48
- "readme": client.get_content_of_file(project, repo, "README.md"),
49
- }
50
-
51
- # BitbucketClient satisfies BitbucketFullClient protocol
52
- client = BitbucketClient(settings)
53
- result = audit_repo(client, "INS", "insurance-core")
54
- """
55
-
56
- def __init__(
57
- self,
58
- settings: BitbucketSettings,
59
- *,
60
- timeout: int | None = 30,
61
- ) -> None:
62
- self._settings = settings
63
- self._timeout = timeout or 30
64
-
65
- # Validate credentials
66
- settings.require_basic_or_token()
67
-
68
- try:
69
- auth_kwargs = settings.get_auth_kwargs()
70
- url = settings.get_url()
71
-
72
- if settings.is_cloud_mode:
73
- # For Bitbucket Cloud, we need to use the cloud API
74
- self._client = AtlassianBitbucket(
75
- url=url, timeout=self._timeout, cloud=True, workspace=settings.cloud_workspace, **auth_kwargs
76
- )
77
- else:
78
- # For Bitbucket Server/Data Center
79
- self._client = AtlassianBitbucket(url=url, timeout=self._timeout, **auth_kwargs)
80
-
81
- except Exception as exc:
82
- raise TransportError(
83
- f"Failed to initialize Bitbucket client: {exc}",
84
- context={"mode": settings.mode, "url": settings.get_url()},
85
- ) from exc
86
-
87
- self._log = structlog.get_logger(__name__).bind(mode=settings.mode, url=settings.get_url())
88
-
89
- # Store retry settings
90
- self._max_retries = settings.max_retries
91
- self._retry_backoff_factor = settings.retry_backoff_factor
92
-
93
- def _with_retry(self, operation, operation_name: str):
94
- """Execute an operation with retry logic using instance settings."""
95
- for attempt in range(self._max_retries + 1):
96
- try:
97
- result = operation()
98
- return result or []
99
- except Exception as exc:
100
- try:
101
- self._handle_api_error(exc, operation_name)
102
- except (TransportError, RateLimitError) as retry_exc:
103
- if attempt == self._max_retries:
104
- self._log.error(
105
- "retry_attempts_exhausted",
106
- operation=operation_name,
107
- attempts=self._max_retries,
108
- final_error=str(retry_exc),
109
- )
110
- raise RetryError(
111
- f"Retry attempts exhausted: {retry_exc}",
112
- context={
113
- "original_error": str(retry_exc),
114
- "operation": operation_name,
115
- "attempts": self._max_retries,
116
- },
117
- ) from retry_exc
118
-
119
- wait_time = self._retry_backoff_factor * (2**attempt)
120
- self._log.warning(
121
- "retry_attempt",
122
- operation=operation_name,
123
- attempt=attempt + 1,
124
- max_retries=self._max_retries,
125
- wait_time=wait_time,
126
- error=str(retry_exc),
127
- )
128
- time.sleep(wait_time)
129
- except VDSClientError:
130
- # Don't retry on client errors (auth, not found, etc.)
131
- raise
132
-
133
- def _handle_api_error(self, error: Exception, operation: str) -> None:
134
- """Convert atlassian-python-api errors to our standardized errors."""
135
- error_str = str(error).lower()
136
- transport_markers = (
137
- "timed out",
138
- "timeout",
139
- "connection error",
140
- "connection reset",
141
- "connection refused",
142
- "name or service not known",
143
- "temporary failure in name resolution",
144
- "max retries exceeded",
145
- )
146
-
147
- if "unauthorized" in error_str or "authentication" in error_str or "401" in error_str:
148
- raise AuthError(f"Authentication failed during {operation}", context={"error": str(error)})
149
- elif "forbidden" in error_str or "403" in error_str:
150
- raise AuthError(f"Access forbidden during {operation}", context={"error": str(error)})
151
- elif "not found" in error_str or "404" in error_str:
152
- raise NotFoundError(f"Resource not found during {operation}", context={"error": str(error)})
153
- elif "rate limit" in error_str or "429" in error_str:
154
- raise RateLimitError(f"Rate limited during {operation}", context={"error": str(error)})
155
- elif "conflict" in error_str or "409" in error_str:
156
- raise ConflictError(f"Conflict during {operation}", context={"error": str(error)})
157
- elif "server error" in error_str or "500" in error_str:
158
- raise ResponseError(f"Server error during {operation}", context={"error": str(error)})
159
- elif any(marker in error_str for marker in transport_markers):
160
- raise TransportError(f"Transport error during {operation}: {error}", context={"error": str(error)})
161
- else:
162
- raise VDSClientError(f"API error during {operation}: {error}", context={"error": str(error)})
163
-
164
- # Project Management
165
- def list_projects(self, limit: int = 25) -> list[dict[str, Any]]:
166
- """List all projects."""
167
- return self._with_retry(lambda: list(self._client.project_list(limit=limit)), "list_projects")
168
-
169
- def get_project(self, project_key: str) -> dict[str, Any]:
170
- """Get project information."""
171
- try:
172
- result = self._client.project(project_key)
173
- self._log.debug("project_retrieved", project_key=project_key)
174
- return result
175
- except Exception as exc:
176
- self._handle_api_error(exc, f"get_project {project_key}")
177
-
178
- def create_project(
179
- self, key: str, name: str, description: str = "Project created via VDS orchestrator"
180
- ) -> dict[str, Any]:
181
- """Create a new project."""
182
- try:
183
- result = self._client.create_project(key, name, description)
184
- self._log.info("project_created", key=key, name=name)
185
- return result
186
- except Exception as exc:
187
- self._handle_api_error(exc, f"create_project {key}")
188
-
189
- # Repository Management
190
- def list_repositories(self, project_key: str, limit: int = 25) -> list[dict[str, Any]]:
191
- """List repositories in a project."""
192
- return self._with_retry(
193
- lambda: list(self._client.repo_list(project_key, limit=limit)), f"list_repositories {project_key}"
194
- )
195
-
196
- def get_repository(self, project_key: str, repository_slug: str) -> dict[str, Any]:
197
- """Get repository information."""
198
- try:
199
- result = self._client.get_repo(project_key, repository_slug)
200
- self._log.debug("repository_retrieved", project_key=project_key, repository=repository_slug)
201
- return result
202
- except Exception as exc:
203
- self._handle_api_error(exc, f"get_repository {project_key}/{repository_slug}")
204
-
205
- def create_repository(
206
- self, project_key: str, repository: str, forkable: bool = False, is_private: bool = True
207
- ) -> dict[str, Any]:
208
- """Create a new repository."""
209
- try:
210
- result = self._client.create_repo(project_key, repository, forkable=forkable, is_private=is_private)
211
- self._log.info("repository_created", project_key=project_key, repository=repository)
212
- return result
213
- except Exception as exc:
214
- self._handle_api_error(exc, f"create_repository {repository}")
215
-
216
- def update_repository(
217
- self, project_key: str, repository_slug: str, description: str | None = None
218
- ) -> dict[str, Any]:
219
- """Update repository information."""
220
- try:
221
- result = self._client.update_repo(project_key, repository_slug, description=description or "")
222
- self._log.info("repository_updated", project_key=project_key, repository=repository_slug)
223
- return result
224
- except Exception as exc:
225
- self._handle_api_error(exc, f"update_repository {repository_slug}")
226
-
227
- def delete_repository(self, project_key: str, repository_slug: str) -> None:
228
- """Delete a repository (DANGER!).
229
-
230
- Reference: https://atlassian-python-api.readthedocs.io/bitbucket.html#delete-a-repository-danger
231
- """
232
- try:
233
- self._client.delete_repo(project_key, repository_slug)
234
- self._log.warning("repository_deleted", project_key=project_key, repository=repository_slug)
235
- except Exception as exc:
236
- self._handle_api_error(exc, f"delete_repository {repository_slug}")
237
-
238
- def get_repository_labels(self, project_key: str, repository_slug: str) -> list[str]:
239
- """Get labels for a repository."""
240
- try:
241
- result = self._client.get_repo_labels(project_key, repository_slug)
242
- self._log.debug("repository_labels_retrieved", project_key=project_key, repository=repository_slug)
243
- return result if isinstance(result, list) else []
244
- except Exception as exc:
245
- self._handle_api_error(exc, f"get_repository_labels {repository_slug}")
246
-
247
- def fork_repository(
248
- self,
249
- project_key: str,
250
- repository_slug: str,
251
- new_project_key: str | None = None,
252
- new_repository_slug: str | None = None,
253
- ) -> dict[str, Any]:
254
- """Fork a repository.
255
-
256
- Args:
257
- project_key: Source project key
258
- repository_slug: Source repository slug
259
- new_project_key: Target project key (if forking to new project). If None, forks within same project.
260
- new_repository_slug: Target repository slug. If None, uses same name as source.
261
- """
262
- try:
263
- if new_project_key:
264
- # Fork to new project
265
- if not new_repository_slug:
266
- new_repository_slug = repository_slug
267
- result = self._client.fork_repository_new_project( # type: ignore[attr-defined]
268
- project_key, repository_slug, new_project_key, new_repository_slug
269
- )
270
- self._log.info(
271
- "repository_forked_to_new_project",
272
- source_project=project_key,
273
- source_repo=repository_slug,
274
- target_project=new_project_key,
275
- target_repo=new_repository_slug,
276
- )
277
- else:
278
- # Fork within same project
279
- if not new_repository_slug:
280
- new_repository_slug = f"{repository_slug}-fork"
281
- result = self._client.fork_repository(project_key, repository_slug, new_repository_slug) # type: ignore[attr-defined]
282
- self._log.info(
283
- "repository_forked",
284
- project_key=project_key,
285
- source_repo=repository_slug,
286
- target_repo=new_repository_slug,
287
- )
288
- return result
289
- except Exception as exc:
290
- self._handle_api_error(exc, f"fork_repository {project_key}/{repository_slug}")
291
-
292
- def get_forked_repositories(self, project_key: str, repository_slug: str) -> list[dict[str, Any]]:
293
- """Get list of repositories forked from a source repository.
294
-
295
- Note: SDK doesn't have a direct method for this. We use repository list and filter.
296
- This may not be perfect but provides a way to discover forks.
297
- """
298
- try:
299
- # List all repositories in the project and filter for forks
300
- # Note: This is a workaround - actual fork relationship may need to be checked via repository metadata
301
- repos = self.list_repositories(project_key, limit=99999)
302
- # Filter repositories that might be forks (this is heuristic-based)
303
- # In practice, you may need to check repository origin or fork metadata
304
- forks = [repo for repo in repos if repository_slug.lower() in repo.get("slug", "").lower()]
305
- self._log.debug(
306
- "forked_repositories_retrieved", project_key=project_key, source_repo=repository_slug, count=len(forks)
307
- )
308
- return forks
309
- except Exception as exc:
310
- self._handle_api_error(exc, f"get_forked_repositories {project_key}/{repository_slug}")
311
-
312
- def set_repository_label(self, project_key: str, repository_slug: str, label_name: str) -> dict[str, Any]:
313
- """Set a label for a repository."""
314
- try:
315
- result = self._client.set_repo_label(project_key, repository_slug, label_name)
316
- self._log.info(
317
- "repository_label_set", project_key=project_key, repository=repository_slug, label=label_name
318
- )
319
- return result
320
- except Exception as exc:
321
- self._handle_api_error(exc, f"set_repository_label {repository_slug}")
322
-
323
- # Pull Request Management
324
- def list_pull_requests(
325
- self,
326
- project_key: str,
327
- repository_slug: str,
328
- state: str = "OPEN",
329
- order: str = "newest",
330
- limit: int = 100,
331
- start: int = 0,
332
- ) -> list[dict[str, Any]]:
333
- """List pull requests.
334
-
335
- Args:
336
- project_key: Project key
337
- repository_slug: Repository slug
338
- state: PR state (OPEN, MERGED, DECLINED)
339
- order: Sort order (newest, oldest)
340
- limit: Maximum number of PRs to return
341
- start: Start index for pagination
342
- """
343
- return self._with_retry(
344
- lambda: list(
345
- self._client.get_pull_requests(
346
- project_key, repository_slug, state=state, order=order, limit=limit, start=start
347
- )
348
- ),
349
- f"list_pull_requests {project_key}/{repository_slug}",
350
- )
351
-
352
- def create_pull_request(
353
- self,
354
- source_project: str,
355
- source_repo: str,
356
- dest_project: str,
357
- dest_repo: str,
358
- source_branch: str,
359
- destination_branch: str,
360
- title: str,
361
- description: str,
362
- reviewers: list[str] | None = None,
363
- ) -> dict[str, Any]:
364
- """Create a pull request."""
365
- try:
366
- kwargs = {}
367
- if reviewers:
368
- kwargs["reviewers"] = reviewers
369
-
370
- result = self._client.open_pull_request(
371
- source_project,
372
- source_repo,
373
- dest_project,
374
- dest_repo,
375
- source_branch,
376
- destination_branch,
377
- title,
378
- description,
379
- **kwargs,
380
- )
381
- self._log.info("pull_request_created", title=title, source=source_branch, dest=destination_branch)
382
- return result
383
- except Exception as exc:
384
- self._handle_api_error(exc, f"create_pull_request {title}")
385
-
386
- def get_pull_request(self, project_key: str, repository_slug: str, pull_request_id: str) -> dict[str, Any]:
387
- """Get a specific pull request."""
388
- try:
389
- # Get all PRs and find the one matching the ID
390
- prs = self._client.get_pull_requests(project_key, repository_slug, limit=1000)
391
- for pr in prs:
392
- if str(pr.get("id")) == str(pull_request_id):
393
- self._log.debug(
394
- "pull_request_retrieved",
395
- project_key=project_key,
396
- repository=repository_slug,
397
- pr_id=pull_request_id,
398
- )
399
- return pr
400
- raise NotFoundError(
401
- f"Pull request {pull_request_id} not found",
402
- context={"project_key": project_key, "repository_slug": repository_slug},
403
- )
404
- except Exception as exc:
405
- self._handle_api_error(exc, f"get_pull_request {pull_request_id}")
406
-
407
- def add_pull_request_comment(
408
- self, project_key: str, repository_slug: str, pull_request_id: str, text: str, parent_id: str | None = None
409
- ) -> dict[str, Any]:
410
- """Add a comment to a pull request.
411
-
412
- Args:
413
- project_key: Project key
414
- repository_slug: Repository slug
415
- pull_request_id: Pull request ID
416
- text: Comment text
417
- parent_id: Optional parent comment ID for replies
418
- """
419
- try:
420
- result = self._client.add_pull_request_comment(
421
- project_key, repository_slug, pull_request_id, text, parent_id=parent_id
422
- )
423
- self._log.info(
424
- "pull_request_comment_added",
425
- project_key=project_key,
426
- repository=repository_slug,
427
- pr_id=pull_request_id,
428
- )
429
- return result
430
- except Exception as exc:
431
- self._handle_api_error(exc, f"add_pull_request_comment {pull_request_id}")
432
-
433
- def get_pull_request_activities(
434
- self, project_key: str, repository_slug: str, pull_request_id: str
435
- ) -> list[dict[str, Any]]:
436
- """Get pull request activities."""
437
- try:
438
- result = self._client.get_pull_requests_activities(project_key, repository_slug, pull_request_id)
439
- self._log.debug(
440
- "pull_request_activities_retrieved",
441
- project_key=project_key,
442
- repository=repository_slug,
443
- pr_id=pull_request_id,
444
- )
445
- return result if isinstance(result, list) else [result]
446
- except Exception as exc:
447
- self._handle_api_error(exc, f"get_pull_request_activities {pull_request_id}")
448
-
449
- def get_pull_request_changes(
450
- self, project_key: str, repository_slug: str, pull_request_id: str
451
- ) -> list[dict[str, Any]]:
452
- """Get pull request changes."""
453
- try:
454
- result = self._client.get_pull_requests_changes(project_key, repository_slug, pull_request_id)
455
- self._log.debug(
456
- "pull_request_changes_retrieved",
457
- project_key=project_key,
458
- repository=repository_slug,
459
- pr_id=pull_request_id,
460
- )
461
- return result if isinstance(result, list) else [result]
462
- except Exception as exc:
463
- self._handle_api_error(exc, f"get_pull_request_changes {pull_request_id}")
464
-
465
- def delete_pull_request(
466
- self, project_key: str, repository_slug: str, pull_request_id: str, pull_request_version: int
467
- ) -> dict[str, Any]:
468
- """Delete a pull request."""
469
- try:
470
- result = self._client.delete_pull_request(
471
- project_key, repository_slug, pull_request_id, pull_request_version
472
- )
473
- self._log.info(
474
- "pull_request_deleted",
475
- project_key=project_key,
476
- repository=repository_slug,
477
- pr_id=pull_request_id,
478
- )
479
- return result
480
- except Exception as exc:
481
- self._handle_api_error(exc, f"delete_pull_request {pull_request_id}")
482
-
483
- def merge_pull_request(self, project_key: str, repository_slug: str, pull_request_id: str) -> dict[str, Any]:
484
- """Merge a pull request.
485
-
486
- Note: This method attempts to use merge_pull_request if available in the SDK.
487
- If it fails, consider using PR state transitions or activities API.
488
- """
489
- try:
490
- # Try the direct merge method first
491
- if hasattr(self._client, "merge_pull_request"):
492
- result = self._client.merge_pull_request(project_key, repository_slug, pull_request_id)
493
- else:
494
- # Fallback: Use PR activities to merge (may require different approach)
495
- raise VDSClientError(
496
- "merge_pull_request method not available in SDK. Use PR state transitions or activities API.",
497
- context={"project_key": project_key, "repository_slug": repository_slug, "pr_id": pull_request_id},
498
- )
499
- self._log.info(
500
- "pull_request_merged", project_key=project_key, repository=repository_slug, pr_id=pull_request_id
501
- )
502
- return result
503
- except Exception as exc:
504
- self._handle_api_error(exc, f"merge_pull_request {pull_request_id}")
505
-
506
- # Pipeline Management (for Bitbucket Cloud)
507
- def list_pipelines(self, workspace: str, repository: str, limit: int = 10) -> list[dict[str, Any]]:
508
- """List pipelines (Bitbucket Cloud only)."""
509
- if not self._settings.is_cloud_mode:
510
- raise VDSClientError("Pipelines are only available in Bitbucket Cloud mode")
511
-
512
- return self._with_retry(
513
- lambda: list(self._client.get_pipelines(workspace, repository, limit=limit)),
514
- f"list_pipelines {workspace}/{repository}",
515
- )
516
-
517
- def trigger_pipeline(self, workspace: str, repository: str, branch: str = "master") -> dict[str, Any]:
518
- """Trigger a pipeline (Bitbucket Cloud only)."""
519
- try:
520
- if not self._settings.is_cloud_mode:
521
- raise VDSClientError("Pipelines are only available in Bitbucket Cloud mode")
522
-
523
- result = self._client.trigger_pipeline(workspace, repository, branch=branch)
524
- self._log.info("pipeline_triggered", workspace=workspace, repository=repository, branch=branch)
525
- return result
526
- except Exception as exc:
527
- self._handle_api_error(exc, f"trigger_pipeline {workspace}/{repository}")
528
-
529
- # Branch Management
530
- def get_branches(
531
- self,
532
- project_key: str,
533
- repository_slug: str,
534
- filter: str = "",
535
- limit: int = 99999,
536
- details: bool = True,
537
- ) -> list[dict[str, Any]]:
538
- """Get branches from a repository."""
539
- try:
540
- result = self._client.get_branches(
541
- project_key, repository_slug, filter=filter, limit=limit, details=details
542
- )
543
- self._log.debug("branches_retrieved", project_key=project_key, repository=repository_slug)
544
- return result if isinstance(result, list) else []
545
- except Exception as exc:
546
- self._handle_api_error(exc, f"get_branches {project_key}/{repository_slug}")
547
-
548
- def create_branch(
549
- self, project_key: str, repository_slug: str, name: str, start_point: str, message: str | None = None
550
- ) -> dict[str, Any]:
551
- """Create a branch."""
552
- try:
553
- result = self._client.create_branch(project_key, repository_slug, name, start_point, message or "")
554
- self._log.info("branch_created", project_key=project_key, repository=repository_slug, branch=name)
555
- return result
556
- except Exception as exc:
557
- self._handle_api_error(exc, f"create_branch {name}")
558
-
559
- def delete_branch(
560
- self, project_key: str, repository_slug: str, name: str, end_point: str | None = None
561
- ) -> dict[str, Any]:
562
- """Delete a branch."""
563
- try:
564
- result = self._client.delete_branch(project_key, repository_slug, name, end_point=end_point)
565
- self._log.info("branch_deleted", project_key=project_key, repository=repository_slug, branch=name)
566
- return result
567
- except Exception as exc:
568
- self._handle_api_error(exc, f"delete_branch {name}")
569
-
570
- # Tag Management
571
- def get_tags(
572
- self, project_key: str, repository_slug: str, filter: str = "", limit: int = 99999
573
- ) -> list[dict[str, Any]]:
574
- """Get tags for a repository."""
575
- try:
576
- result = self._client.get_tags(project_key, repository_slug, filter=filter, limit=limit)
577
- self._log.debug("tags_retrieved", project_key=project_key, repository=repository_slug)
578
- return result if isinstance(result, list) else []
579
- except Exception as exc:
580
- self._handle_api_error(exc, f"get_tags {project_key}/{repository_slug}")
581
-
582
- def set_tag(
583
- self,
584
- project_key: str,
585
- repository_slug: str,
586
- tag_name: str,
587
- commit_revision: str,
588
- description: str | None = None,
589
- ) -> dict[str, Any]:
590
- """Set a tag."""
591
- try:
592
- result = self._client.set_tag(
593
- project_key, repository_slug, tag_name, commit_revision, description=description
594
- )
595
- self._log.info("tag_set", project_key=project_key, repository=repository_slug, tag=tag_name)
596
- return result
597
- except Exception as exc:
598
- self._handle_api_error(exc, f"set_tag {tag_name}")
599
-
600
- def delete_tag(self, project_key: str, repository_slug: str, tag_name: str) -> dict[str, Any]:
601
- """Delete a tag."""
602
- try:
603
- result = self._client.delete_tag(project_key, repository_slug, tag_name)
604
- self._log.info("tag_deleted", project_key=project_key, repository=repository_slug, tag=tag_name)
605
- return result
606
- except Exception as exc:
607
- self._handle_api_error(exc, f"delete_tag {tag_name}")
608
-
609
- # User and Group Management
610
- def list_groups(self, group_filter: str | None = None, limit: int = 25) -> list[dict[str, Any]]:
611
- """List all available groups.
612
-
613
- Args:
614
- group_filter: Optional filter string to search for specific groups
615
- limit: Maximum number of groups to return
616
- """
617
- try:
618
- # Use get_groups with optional filter parameter
619
- if group_filter:
620
- result = list(self._client.get_groups(group_filter=group_filter, limit=limit))
621
- else:
622
- result = list(self._client.get_groups(limit=limit))
623
- self._log.debug("groups_listed", count=len(result) if result else 0, filter=group_filter)
624
- return result or []
625
- except Exception as exc:
626
- self._handle_api_error(exc, "list_groups")
627
-
628
- def list_project_users(
629
- self, project_key: str, filter_str: str | None = None, limit: int = 25
630
- ) -> list[dict[str, Any]]:
631
- """List users in a project.
632
-
633
- Args:
634
- project_key: Project key
635
- filter_str: Optional filter string to search for specific users
636
- limit: Maximum number of users to return
637
- """
638
- try:
639
- result = list(self._client.project_users(project_key, limit=limit, filter_str=filter_str))
640
- self._log.debug(
641
- "project_users_listed", project_key=project_key, count=len(result) if result else 0, filter=filter_str
642
- )
643
- return result or []
644
- except Exception as exc:
645
- self._handle_api_error(exc, f"list_project_users {project_key}")
646
-
647
- def list_project_groups(
648
- self, project_key: str, filter_str: str | None = None, limit: int = 25
649
- ) -> list[dict[str, Any]]:
650
- """List groups in a project.
651
-
652
- Args:
653
- project_key: Project key
654
- filter_str: Optional filter string to search for specific groups
655
- limit: Maximum number of groups to return
656
- """
657
- try:
658
- result = list(self._client.project_groups(project_key, limit=limit, filter_str=filter_str))
659
- self._log.debug(
660
- "project_groups_listed", project_key=project_key, count=len(result) if result else 0, filter=filter_str
661
- )
662
- return result or []
663
- except Exception as exc:
664
- self._handle_api_error(exc, f"list_project_groups {project_key}")
665
-
666
- def grant_user_repository_permissions(
667
- self, project_key: str, repository_slug: str, username: str, permission: str
668
- ) -> dict[str, Any]:
669
- """Grant repository permissions to a user."""
670
- try:
671
- result = self._client.repo_grant_user_permissions(project_key, repository_slug, username, permission)
672
- self._log.info(
673
- "user_repository_permissions_granted",
674
- project_key=project_key,
675
- repository_slug=repository_slug,
676
- username=username,
677
- permission=permission,
678
- )
679
- return result
680
- except Exception as exc:
681
- self._handle_api_error(
682
- exc, f"grant_user_repository_permissions {project_key}/{repository_slug} for {username}"
683
- )
684
-
685
- def grant_user_project_permissions(self, project_key: str, username: str, permission: str) -> dict[str, Any]:
686
- """Grant project permissions to a user."""
687
- try:
688
- result = self._client.project_grant_user_permissions(project_key, username, permission)
689
- self._log.info(
690
- "user_project_permissions_granted", project_key=project_key, username=username, permission=permission
691
- )
692
- return result
693
- except Exception as exc:
694
- self._handle_api_error(exc, f"grant_user_project_permissions {project_key} for {username}")
695
-
696
- def grant_group_project_permissions(self, project_key: str, group_name: str, permission: str) -> dict[str, Any]:
697
- """Grant project permissions to a group."""
698
- try:
699
- result = self._client.project_grant_group_permissions(project_key, group_name, permission)
700
- self._log.info(
701
- "group_project_permissions_granted",
702
- project_key=project_key,
703
- group=group_name,
704
- permission=permission,
705
- )
706
- return result
707
- except Exception as exc:
708
- self._handle_api_error(exc, f"grant_group_project_permissions {project_key} for {group_name}")
709
-
710
- def grant_group_repository_permissions(
711
- self, project_key: str, repository_slug: str, group: str, permission: str
712
- ) -> dict[str, Any]:
713
- """Grant repository permissions to a group."""
714
- try:
715
- result = self._client.repo_grant_group_permissions(project_key, repository_slug, group, permission)
716
- self._log.info(
717
- "group_repository_permissions_granted",
718
- project_key=project_key,
719
- repository_slug=repository_slug,
720
- group=group,
721
- permission=permission,
722
- )
723
- return result
724
- except Exception as exc:
725
- self._handle_api_error(
726
- exc, f"grant_group_repository_permissions {project_key}/{repository_slug} for {group}"
727
- )
728
-
729
- # Branch Permissions
730
- def set_branches_permissions(
731
- self,
732
- project_key: str,
733
- multiple_permissions: bool = False,
734
- matcher_type: str | None = None,
735
- matcher_value: str | None = None,
736
- permission_type: str | None = None,
737
- repository_slug: str | None = None,
738
- except_users: list[str] | None = None,
739
- except_groups: list[str] | None = None,
740
- except_access_keys: list[str] | None = None,
741
- start: int = 0,
742
- limit: int = 25,
743
- ) -> dict[str, Any]:
744
- """Set branch permissions."""
745
- try:
746
- result = self._client.set_branches_permissions(
747
- project_key,
748
- multiple_permissions=multiple_permissions,
749
- matcher_type=matcher_type,
750
- matcher_value=matcher_value,
751
- permission_type=permission_type,
752
- repository_slug=repository_slug,
753
- except_users=except_users or [],
754
- except_groups=except_groups or [],
755
- except_access_keys=except_access_keys or [],
756
- start=start,
757
- limit=limit,
758
- )
759
- self._log.info(
760
- "branch_permissions_set",
761
- project_key=project_key,
762
- repository_slug=repository_slug,
763
- permission_type=permission_type,
764
- )
765
- return result
766
- except Exception as exc:
767
- self._handle_api_error(exc, f"set_branches_permissions {project_key}")
768
-
769
- def list_branch_permissions(
770
- self,
771
- project_key: str,
772
- repository_slug: str | None = None,
773
- start: int = 0,
774
- limit: int = 25,
775
- ) -> list[dict[str, Any]]:
776
- """List branch permissions (server and cloud).
777
-
778
- Returns a normalized list of branch restriction objects (payload["values"] when present).
779
- """
780
-
781
- def _fetch_permissions() -> list[dict[str, Any]]:
782
- settings = self._settings
783
- if settings.is_cloud_mode:
784
- if not repository_slug:
785
- raise VDSClientError("repository_slug is required for cloud branch permissions list")
786
- if not settings.cloud_workspace:
787
- raise VDSClientError("BITBUCKET_CLOUD_WORKSPACE is required for cloud mode")
788
-
789
- # Bitbucket Cloud uses page/pagelen rather than start/limit.
790
- page = 1 + (start // max(1, limit))
791
- url = (
792
- f"https://api.bitbucket.org/2.0/repositories/"
793
- f"{settings.cloud_workspace}/{repository_slug}/branch-restrictions"
794
- )
795
- params = {"page": page, "pagelen": limit}
796
- else:
797
- base_url = settings.get_url().rstrip("/")
798
- if repository_slug:
799
- path = f"/rest/branch-permissions/2.0/projects/{project_key}/repos/{repository_slug}/restrictions"
800
- else:
801
- path = f"/rest/branch-permissions/2.0/projects/{project_key}/restrictions"
802
- url = f"{base_url}{path}"
803
- params = {"start": start, "limit": limit}
804
-
805
- headers = {"Accept": "application/json"}
806
- auth = None
807
-
808
- if settings.token:
809
- headers["Authorization"] = f"Bearer {settings.token}"
810
- elif settings.username and settings.password:
811
- auth = (settings.username, settings.password)
812
-
813
- try:
814
- response = requests.get(
815
- url,
816
- headers=headers,
817
- params=params,
818
- auth=auth,
819
- timeout=self._timeout,
820
- )
821
- except requests.exceptions.Timeout as exc:
822
- raise TransportError(
823
- f"Branch permissions request timed out: {exc}",
824
- context={"url": url, "project_key": project_key, "repo": repository_slug},
825
- ) from exc
826
- except requests.exceptions.RequestException as exc:
827
- raise TransportError(
828
- f"Branch permissions request failed: {exc}",
829
- context={"url": url, "project_key": project_key, "repo": repository_slug},
830
- ) from exc
831
-
832
- status = response.status_code
833
- try:
834
- payload: Any = response.json() if response.content else {}
835
- except ValueError:
836
- payload = {"raw": response.text}
837
-
838
- if status in (401, 403):
839
- raise AuthError(
840
- "Authentication failed while listing branch permissions",
841
- context={"status_code": status, "response": payload},
842
- )
843
- if status == 404:
844
- raise NotFoundError(
845
- "Branch permissions not found",
846
- context={"status_code": status, "response": payload},
847
- )
848
- if status == 429:
849
- raise RateLimitError(
850
- "Rate limited while listing branch permissions",
851
- context={"status_code": status, "response": payload},
852
- )
853
- if status == 409:
854
- raise ConflictError(
855
- "Conflict while listing branch permissions",
856
- context={"status_code": status, "response": payload},
857
- )
858
- if status >= 500:
859
- raise ResponseError(
860
- "Server error while listing branch permissions",
861
- context={"status_code": status, "response": payload},
862
- )
863
- if status >= 400:
864
- raise VDSClientError(
865
- "Failed to list branch permissions",
866
- context={"status_code": status, "response": payload},
867
- )
868
-
869
- if isinstance(payload, dict):
870
- values = payload.get("values")
871
- return values if isinstance(values, list) else []
872
- if isinstance(payload, list):
873
- return payload
874
- return []
875
-
876
- result = self._with_retry(_fetch_permissions, f"list_branch_permissions {project_key}")
877
- self._log.debug(
878
- "branch_permissions_listed",
879
- project_key=project_key,
880
- repository_slug=repository_slug,
881
- count=len(result),
882
- )
883
- return result
884
-
885
- def get_branch_permission(
886
- self, project_key: str, permission_id: int, repository_slug: str | None = None
887
- ) -> dict[str, Any]:
888
- """Get a single branch permission by permission ID."""
889
- try:
890
- result = self._client.get_branch_permission(project_key, permission_id, repository_slug=repository_slug)
891
- self._log.debug(
892
- "branch_permission_retrieved",
893
- project_key=project_key,
894
- permission_id=permission_id,
895
- repository_slug=repository_slug,
896
- )
897
- return result
898
- except Exception as exc:
899
- self._handle_api_error(exc, f"get_branch_permission {permission_id}")
900
-
901
- def delete_branch_permission(
902
- self, project_key: str, permission_id: int, repository_slug: str | None = None
903
- ) -> None:
904
- """Delete a single branch permission by permission ID."""
905
- try:
906
- self._client.delete_branch_permission(project_key, permission_id, repository_slug=repository_slug)
907
- self._log.info(
908
- "branch_permission_deleted",
909
- project_key=project_key,
910
- permission_id=permission_id,
911
- repository_slug=repository_slug,
912
- )
913
- except Exception as exc:
914
- self._handle_api_error(exc, f"delete_branch_permission {permission_id}")
915
-
916
- # Webhook Management (Bitbucket Cloud only)
917
- def list_webhooks(
918
- self,
919
- project_key: str,
920
- repository_slug: str,
921
- *,
922
- event: str | None = None,
923
- statistics: bool = False,
924
- ) -> list[dict[str, Any]]:
925
- """List repository webhooks."""
926
- try:
927
- result = self._client.get_webhooks(project_key, repository_slug, event=event, statistics=statistics)
928
- self._log.debug(
929
- "webhooks_listed",
930
- project_key=project_key,
931
- repository_slug=repository_slug,
932
- event=event,
933
- statistics=statistics,
934
- count=len(result) if isinstance(result, list) else 0,
935
- )
936
- return result if isinstance(result, list) else [result] if result else []
937
- except Exception as exc:
938
- self._handle_api_error(exc, f"list_webhooks {project_key}/{repository_slug}")
939
-
940
- def get_webhook(self, project_key: str, repository_slug: str, webhook_id: int) -> dict[str, Any]:
941
- """Retrieve a specific webhook."""
942
- try:
943
- result = self._client.get_webhook(project_key, repository_slug, webhook_id)
944
- self._log.debug(
945
- "webhook_retrieved",
946
- project_key=project_key,
947
- repository_slug=repository_slug,
948
- webhook_id=webhook_id,
949
- )
950
- return result
951
- except Exception as exc:
952
- self._handle_api_error(exc, f"get_webhook {project_key}/{repository_slug}/{webhook_id}")
953
-
954
- def create_webhook(
955
- self,
956
- project_key: str,
957
- repository_slug: str,
958
- name: str,
959
- events: list[str],
960
- webhook_url: str,
961
- *,
962
- active: bool = True,
963
- secret: str | None = None,
964
- ) -> dict[str, Any]:
965
- """Create a repository webhook."""
966
- try:
967
- result = self._client.create_webhook(
968
- project_key,
969
- repository_slug,
970
- name,
971
- events,
972
- webhook_url,
973
- active,
974
- secret=secret,
975
- )
976
- self._log.info(
977
- "webhook_created",
978
- project_key=project_key,
979
- repository_slug=repository_slug,
980
- name=name,
981
- events=events,
982
- active=active,
983
- )
984
- return result
985
- except Exception as exc:
986
- self._handle_api_error(exc, f"create_webhook {project_key}/{repository_slug}")
987
-
988
- def update_webhook(
989
- self,
990
- project_key: str,
991
- repository_slug: str,
992
- webhook_id: int,
993
- *,
994
- name: str | None = None,
995
- events: list[str] | None = None,
996
- webhook_url: str | None = None,
997
- active: bool | None = None,
998
- secret: str | None = None,
999
- ) -> dict[str, Any]:
1000
- """Update a repository webhook."""
1001
- try:
1002
- params: dict[str, Any] = {}
1003
- if name is not None:
1004
- params["name"] = name
1005
- if events is not None:
1006
- params["events"] = events
1007
- if webhook_url is not None:
1008
- params["url"] = webhook_url
1009
- if active is not None:
1010
- params["active"] = active
1011
- if secret is not None:
1012
- params["secret"] = secret
1013
-
1014
- result = self._client.update_webhook(project_key, repository_slug, webhook_id, **params)
1015
- self._log.info(
1016
- "webhook_updated",
1017
- project_key=project_key,
1018
- repository_slug=repository_slug,
1019
- webhook_id=webhook_id,
1020
- updated_fields=list(params.keys()),
1021
- )
1022
- return result
1023
- except Exception as exc:
1024
- self._handle_api_error(exc, f"update_webhook {project_key}/{repository_slug}/{webhook_id}")
1025
-
1026
- def delete_webhook(self, project_key: str, repository_slug: str, webhook_id: int) -> None:
1027
- """Delete a repository webhook."""
1028
- try:
1029
- self._client.delete_webhook(project_key, repository_slug, webhook_id)
1030
- self._log.info(
1031
- "webhook_deleted",
1032
- project_key=project_key,
1033
- repository_slug=repository_slug,
1034
- webhook_id=webhook_id,
1035
- )
1036
- except Exception as exc:
1037
- self._handle_api_error(exc, f"delete_webhook {project_key}/{repository_slug}/{webhook_id}")
1038
-
1039
- # Conditions-Reviewers Management
1040
- def get_project_conditions(self, project_key: str) -> list[dict[str, Any]]:
1041
- """Get all project conditions with reviewers list."""
1042
- try:
1043
- result = self._client.get_project_conditions(project_key)
1044
- self._log.debug("project_conditions_retrieved", project_key=project_key, count=len(result) if result else 0)
1045
- return result if isinstance(result, list) else [result] if result else []
1046
- except Exception as exc:
1047
- self._handle_api_error(exc, f"get_project_conditions {project_key}")
1048
-
1049
- def get_project_condition(self, project_key: str, condition_id: int) -> dict[str, Any]:
1050
- """Get a project condition with reviewers list."""
1051
- try:
1052
- result = self._client.get_project_condition(project_key, condition_id)
1053
- self._log.debug("project_condition_retrieved", project_key=project_key, condition_id=condition_id)
1054
- return result
1055
- except Exception as exc:
1056
- self._handle_api_error(exc, f"get_project_condition {condition_id}")
1057
-
1058
- def create_project_condition(self, project_key: str, condition: dict[str, Any]) -> dict[str, Any]:
1059
- """Create project condition with reviewers."""
1060
- try:
1061
- result = self._client.create_project_condition(project_key, condition)
1062
- self._log.info("project_condition_created", project_key=project_key)
1063
- return result
1064
- except Exception as exc:
1065
- self._handle_api_error(exc, f"create_project_condition {project_key}")
1066
-
1067
- def update_project_condition(
1068
- self, project_key: str, condition: dict[str, Any], condition_id: int
1069
- ) -> dict[str, Any]:
1070
- """Update a project condition with reviewers."""
1071
- try:
1072
- result = self._client.update_project_condition(project_key, condition, condition_id)
1073
- self._log.info("project_condition_updated", project_key=project_key, condition_id=condition_id)
1074
- return result
1075
- except Exception as exc:
1076
- self._handle_api_error(exc, f"update_project_condition {condition_id}")
1077
-
1078
- def delete_project_condition(self, project_key: str, condition_id: int) -> None:
1079
- """Delete a project condition."""
1080
- try:
1081
- self._client.delete_project_condition(project_key, condition_id)
1082
- self._log.info("project_condition_deleted", project_key=project_key, condition_id=condition_id)
1083
- except Exception as exc:
1084
- self._handle_api_error(exc, f"delete_project_condition {condition_id}")
1085
-
1086
- def get_repo_conditions(self, project_key: str, repository_slug: str) -> list[dict[str, Any]]:
1087
- """Get all repository conditions with reviewers list."""
1088
- try:
1089
- result = self._client.get_repo_conditions(project_key, repository_slug)
1090
- self._log.debug(
1091
- "repo_conditions_retrieved",
1092
- project_key=project_key,
1093
- repository_slug=repository_slug,
1094
- count=len(result) if result else 0,
1095
- )
1096
- return result if isinstance(result, list) else [result] if result else []
1097
- except Exception as exc:
1098
- self._handle_api_error(exc, f"get_repo_conditions {project_key}/{repository_slug}")
1099
-
1100
- def get_repo_condition(self, project_key: str, repository_slug: str, condition_id: int) -> dict[str, Any]:
1101
- """Get a repository condition with reviewers list."""
1102
- try:
1103
- result = self._client.get_repo_condition(project_key, repository_slug, condition_id)
1104
- self._log.debug(
1105
- "repo_condition_retrieved",
1106
- project_key=project_key,
1107
- repository_slug=repository_slug,
1108
- condition_id=condition_id,
1109
- )
1110
- return result
1111
- except Exception as exc:
1112
- self._handle_api_error(exc, f"get_repo_condition {condition_id}")
1113
-
1114
- def create_repo_condition(
1115
- self, project_key: str, repository_slug: str, condition: dict[str, Any]
1116
- ) -> dict[str, Any]:
1117
- """Create repository condition with reviewers."""
1118
- try:
1119
- result = self._client.create_repo_condition(project_key, repository_slug, condition)
1120
- self._log.info("repo_condition_created", project_key=project_key, repository_slug=repository_slug)
1121
- return result
1122
- except Exception as exc:
1123
- self._handle_api_error(exc, f"create_repo_condition {project_key}/{repository_slug}")
1124
-
1125
- def update_repo_condition(
1126
- self, project_key: str, repository_slug: str, condition: dict[str, Any], condition_id: int
1127
- ) -> dict[str, Any]:
1128
- """Update a repository condition with reviewers."""
1129
- try:
1130
- result = self._client.update_repo_condition(project_key, repository_slug, condition, condition_id)
1131
- self._log.info(
1132
- "repo_condition_updated",
1133
- project_key=project_key,
1134
- repository_slug=repository_slug,
1135
- condition_id=condition_id,
1136
- )
1137
- return result
1138
- except Exception as exc:
1139
- self._handle_api_error(exc, f"update_repo_condition {condition_id}")
1140
-
1141
- def delete_repo_condition(self, project_key: str, repository_slug: str, condition_id: int) -> None:
1142
- """Delete a repository condition."""
1143
- try:
1144
- self._client.delete_repo_condition(project_key, repository_slug, condition_id)
1145
- self._log.info(
1146
- "repo_condition_deleted",
1147
- project_key=project_key,
1148
- repository_slug=repository_slug,
1149
- condition_id=condition_id,
1150
- )
1151
- except Exception as exc:
1152
- self._handle_api_error(exc, f"delete_repo_condition {condition_id}")
1153
-
1154
- # Code Management
1155
- def get_content_of_file(
1156
- self, project_key: str, repository_slug: str, filename: str, at: str | None = None, markup: str | None = None
1157
- ) -> str:
1158
- """Get raw content of the file from repository."""
1159
- try:
1160
- result = self._client.get_content_of_file(project_key, repository_slug, filename, at=at, markup=markup)
1161
- self._log.debug(
1162
- "file_content_retrieved",
1163
- project_key=project_key,
1164
- repository_slug=repository_slug,
1165
- filename=filename,
1166
- )
1167
- # The upstream SDK may return bytes; normalize to text so CLI can write safely.
1168
- if isinstance(result, bytes):
1169
- return result.decode("utf-8", errors="replace")
1170
- return str(result) if result is not None else ""
1171
- except Exception as exc:
1172
- self._handle_api_error(exc, f"get_content_of_file {filename}")
1173
-
1174
- def get_commits(
1175
- self,
1176
- project_key: str,
1177
- repository_slug: str,
1178
- hash_oldest: str | None = None,
1179
- hash_newest: str | None = None,
1180
- limit: int = 99999,
1181
- ) -> list[dict[str, Any]]:
1182
- """Get commit list from repository."""
1183
- try:
1184
- result = self._client.get_commits(project_key, repository_slug, hash_oldest, hash_newest, limit=limit)
1185
- # atlassian-python-api returns a paged iterator; consuming it directly may fetch the
1186
- # entire history even when `limit` is small. Cap local iteration to the requested limit.
1187
- if isinstance(result, list):
1188
- commits_list = result[:limit] if limit and limit > 0 else result
1189
- elif result:
1190
- commits_list = list(islice(result, limit)) if limit and limit > 0 else list(result)
1191
- else:
1192
- commits_list = []
1193
- self._log.debug(
1194
- "commits_retrieved",
1195
- project_key=project_key,
1196
- repository_slug=repository_slug,
1197
- count=len(commits_list),
1198
- )
1199
- return commits_list
1200
- except Exception as exc:
1201
- self._handle_api_error(exc, f"get_commits {project_key}/{repository_slug}")
1202
-
1203
- def get_diff(
1204
- self, project_key: str, repository_slug: str, path: str, hash_oldest: str, hash_newest: str
1205
- ) -> dict[str, Any]:
1206
- """Get diff between two commits."""
1207
- try:
1208
- result = self._client.get_diff(project_key, repository_slug, path, hash_oldest, hash_newest)
1209
- self._log.debug(
1210
- "diff_retrieved",
1211
- project_key=project_key,
1212
- repository_slug=repository_slug,
1213
- path=path,
1214
- )
1215
- return result
1216
- except Exception as exc:
1217
- self._handle_api_error(exc, f"get_diff {path}")
1218
-
1219
- def get_changelog(
1220
- self, project_key: str, repository_slug: str, ref_from: str, ref_to: str, limit: int = 99999
1221
- ) -> list[dict[str, Any]]:
1222
- """Get change log between 2 refs."""
1223
- try:
1224
- result = self._client.get_changelog(project_key, repository_slug, ref_from, ref_to, limit=limit)
1225
- # SDK may return a generator, convert to list first
1226
- changelog_list = result if isinstance(result, list) else list(result) if result else []
1227
- self._log.debug(
1228
- "changelog_retrieved",
1229
- project_key=project_key,
1230
- repository_slug=repository_slug,
1231
- count=len(changelog_list),
1232
- )
1233
- return changelog_list
1234
- except Exception as exc:
1235
- self._handle_api_error(exc, f"get_changelog {project_key}/{repository_slug}")
1236
-
1237
- # Code Insights Operations (Cloud-only)
1238
- def create_code_insights_report(
1239
- self,
1240
- project_key: str,
1241
- repository_slug: str,
1242
- commit_id: str,
1243
- report_key: str,
1244
- report_title: str,
1245
- reporter: str,
1246
- result: str,
1247
- data: list[dict[str, Any]] | None = None,
1248
- **report_params: Any,
1249
- ) -> dict[str, Any]:
1250
- """Create a Code Insights report.
1251
-
1252
- Args:
1253
- project_key: Project key
1254
- repository_slug: Repository slug
1255
- commit_id: Commit hash
1256
- report_key: Unique report key
1257
- report_title: Report title
1258
- reporter: Reporter name
1259
- result: Report result ('PASSED', 'FAILED', 'PENDING')
1260
- data: Optional report data (list of data items)
1261
- **report_params: Additional report parameters (e.g., report_type, details, link)
1262
- """
1263
- if not self._settings.is_cloud_mode:
1264
- raise VDSClientError(
1265
- "Code Insights is only available in Bitbucket Cloud mode",
1266
- context={"mode": self._settings.mode},
1267
- )
1268
- try:
1269
- params: dict[str, Any] = {
1270
- "reporter": reporter,
1271
- "result": result,
1272
- }
1273
- if data:
1274
- params["data"] = data
1275
- params.update(report_params)
1276
-
1277
- result_obj = self._client.create_code_insights_report(
1278
- project_key, repository_slug, commit_id, report_key, report_title, **params
1279
- )
1280
- self._log.info(
1281
- "code_insights_report_created",
1282
- project_key=project_key,
1283
- repository_slug=repository_slug,
1284
- commit_id=commit_id,
1285
- report_key=report_key,
1286
- )
1287
- return result_obj
1288
- except Exception as exc:
1289
- self._handle_api_error(
1290
- exc, f"create_code_insights_report {project_key}/{repository_slug}/{commit_id}/{report_key}"
1291
- )
1292
-
1293
- def get_code_insights_report(
1294
- self, project_key: str, repository_slug: str, commit_id: str, report_key: str
1295
- ) -> dict[str, Any]:
1296
- """Get a Code Insights report."""
1297
- if not self._settings.is_cloud_mode:
1298
- raise VDSClientError(
1299
- "Code Insights is only available in Bitbucket Cloud mode",
1300
- context={"mode": self._settings.mode},
1301
- )
1302
- try:
1303
- result = self._client.get_code_insights_report(project_key, repository_slug, commit_id, report_key)
1304
- self._log.debug(
1305
- "code_insights_report_retrieved",
1306
- project_key=project_key,
1307
- repository_slug=repository_slug,
1308
- commit_id=commit_id,
1309
- report_key=report_key,
1310
- )
1311
- return result
1312
- except Exception as exc:
1313
- self._handle_api_error(
1314
- exc, f"get_code_insights_report {project_key}/{repository_slug}/{commit_id}/{report_key}"
1315
- )
1316
-
1317
- def add_code_insights_annotations_to_report(
1318
- self,
1319
- project_key: str,
1320
- repository_slug: str,
1321
- commit_id: str,
1322
- report_key: str,
1323
- annotations: list[dict[str, Any]],
1324
- ) -> dict[str, Any]:
1325
- """Add annotations to a Code Insights report."""
1326
- if not self._settings.is_cloud_mode:
1327
- raise VDSClientError(
1328
- "Code Insights is only available in Bitbucket Cloud mode",
1329
- context={"mode": self._settings.mode},
1330
- )
1331
- try:
1332
- result = self._client.add_code_insights_annotations_to_report(
1333
- project_key, repository_slug, commit_id, report_key, annotations
1334
- )
1335
- self._log.info(
1336
- "code_insights_annotations_added",
1337
- project_key=project_key,
1338
- repository_slug=repository_slug,
1339
- commit_id=commit_id,
1340
- report_key=report_key,
1341
- annotation_count=len(annotations),
1342
- )
1343
- return result
1344
- except Exception as exc:
1345
- self._handle_api_error(
1346
- exc, f"add_code_insights_annotations_to_report {project_key}/{repository_slug}/{commit_id}/{report_key}"
1347
- )
1348
-
1349
- def delete_code_insights_report(
1350
- self, project_key: str, repository_slug: str, commit_id: str, report_key: str
1351
- ) -> None:
1352
- """Delete a Code Insights report."""
1353
- if not self._settings.is_cloud_mode:
1354
- raise VDSClientError(
1355
- "Code Insights is only available in Bitbucket Cloud mode",
1356
- context={"mode": self._settings.mode},
1357
- )
1358
- try:
1359
- self._client.delete_code_insights_report(project_key, repository_slug, commit_id, report_key)
1360
- self._log.info(
1361
- "code_insights_report_deleted",
1362
- project_key=project_key,
1363
- repository_slug=repository_slug,
1364
- commit_id=commit_id,
1365
- report_key=report_key,
1366
- )
1367
- except Exception as exc:
1368
- self._handle_api_error(
1369
- exc, f"delete_code_insights_report {project_key}/{repository_slug}/{commit_id}/{report_key}"
1370
- )
1371
-
1372
- # Repository Settings Operations
1373
- def get_branching_model(self, project_key: str, repository_slug: str) -> dict[str, Any]:
1374
- """Get branching model configuration."""
1375
- try:
1376
- result = self._client.get_branching_model(project_key, repository_slug)
1377
- self._log.debug(
1378
- "branching_model_retrieved",
1379
- project_key=project_key,
1380
- repository_slug=repository_slug,
1381
- )
1382
- return result
1383
- except Exception as exc:
1384
- self._handle_api_error(exc, f"get_branching_model {project_key}/{repository_slug}")
1385
-
1386
- def set_branching_model(self, project_key: str, repository_slug: str, model: dict[str, Any]) -> dict[str, Any]:
1387
- """Set branching model configuration."""
1388
- try:
1389
- result = self._client.set_branching_model(project_key, repository_slug, model)
1390
- self._log.info(
1391
- "branching_model_set",
1392
- project_key=project_key,
1393
- repository_slug=repository_slug,
1394
- )
1395
- return result
1396
- except Exception as exc:
1397
- self._handle_api_error(exc, f"set_branching_model {project_key}/{repository_slug}")
1398
-
1399
- def enable_branching_model(self, project_key: str, repository_slug: str) -> dict[str, Any]:
1400
- """Enable branching model."""
1401
- try:
1402
- result = self._client.enable_branching_model(project_key, repository_slug)
1403
- self._log.info(
1404
- "branching_model_enabled",
1405
- project_key=project_key,
1406
- repository_slug=repository_slug,
1407
- )
1408
- return result
1409
- except Exception as exc:
1410
- self._handle_api_error(exc, f"enable_branching_model {project_key}/{repository_slug}")
1411
-
1412
- def disable_branching_model(self, project_key: str, repository_slug: str) -> dict[str, Any]:
1413
- """Disable branching model."""
1414
- try:
1415
- result = self._client.disable_branching_model(project_key, repository_slug)
1416
- self._log.info(
1417
- "branching_model_disabled",
1418
- project_key=project_key,
1419
- repository_slug=repository_slug,
1420
- )
1421
- return result
1422
- except Exception as exc:
1423
- self._handle_api_error(exc, f"disable_branching_model {project_key}/{repository_slug}")
1424
-
1425
- def get_default_branch(self, project_key: str, repository_slug: str) -> dict[str, Any]:
1426
- """Get default branch."""
1427
- try:
1428
- result = self._client.get_default_branch(project_key, repository_slug)
1429
- self._log.debug(
1430
- "default_branch_retrieved",
1431
- project_key=project_key,
1432
- repository_slug=repository_slug,
1433
- )
1434
- return result
1435
- except Exception as exc:
1436
- self._handle_api_error(exc, f"get_default_branch {project_key}/{repository_slug}")
1437
-
1438
- def set_default_branch(self, project_key: str, repository_slug: str, branch: str) -> dict[str, Any]:
1439
- """Set default branch."""
1440
- try:
1441
- result = self._client.set_default_branch(project_key, repository_slug, branch)
1442
- self._log.info(
1443
- "default_branch_set",
1444
- project_key=project_key,
1445
- repository_slug=repository_slug,
1446
- branch=branch,
1447
- )
1448
- return result
1449
- except Exception as exc:
1450
- self._handle_api_error(exc, f"set_default_branch {project_key}/{repository_slug}")
1451
-
1452
- def get_repo_hook_settings(
1453
- self,
1454
- project_key: str,
1455
- repository_slug: str,
1456
- start: int = 0,
1457
- limit: int | None = None,
1458
- filter_type: str | None = None,
1459
- ) -> list[dict[str, Any]]:
1460
- """Get repository hook settings."""
1461
- try:
1462
- result = self._client.all_repo_hook_settings(
1463
- project_key, repository_slug, start=start, limit=limit, filter_type=filter_type
1464
- )
1465
- # SDK may return a generator, convert to list first
1466
- hooks_list = result if isinstance(result, list) else list(result) if result else []
1467
- self._log.debug(
1468
- "repo_hook_settings_retrieved",
1469
- project_key=project_key,
1470
- repository_slug=repository_slug,
1471
- count=len(hooks_list),
1472
- )
1473
- return hooks_list
1474
- except Exception as exc:
1475
- self._handle_api_error(exc, f"get_repo_hook_settings {project_key}/{repository_slug}")
1476
-
1477
- def enable_repo_hook_settings(self, project_key: str, repository_slug: str, hook_key: str) -> dict[str, Any]:
1478
- """Enable repository hook."""
1479
- try:
1480
- result = self._client.enable_repo_hook_settings(project_key, repository_slug, hook_key)
1481
- self._log.info(
1482
- "repo_hook_enabled",
1483
- project_key=project_key,
1484
- repository_slug=repository_slug,
1485
- hook_key=hook_key,
1486
- )
1487
- return result
1488
- except Exception as exc:
1489
- self._handle_api_error(exc, f"enable_repo_hook_settings {project_key}/{repository_slug}/{hook_key}")
1490
-
1491
- def disable_repo_hook_settings(self, project_key: str, repository_slug: str, hook_key: str) -> dict[str, Any]:
1492
- """Disable repository hook."""
1493
- try:
1494
- result = self._client.disable_repo_hook_settings(project_key, repository_slug, hook_key)
1495
- self._log.info(
1496
- "repo_hook_disabled",
1497
- project_key=project_key,
1498
- repository_slug=repository_slug,
1499
- hook_key=hook_key,
1500
- )
1501
- return result
1502
- except Exception as exc:
1503
- self._handle_api_error(exc, f"disable_repo_hook_settings {project_key}/{repository_slug}/{hook_key}")
1504
-
1505
- def get_lfs_repo_status(self, project_key: str, repository_slug: str) -> dict[str, Any]:
1506
- """Get Git LFS repository status."""
1507
- try:
1508
- result = self._client.get_lfs_repo_status(project_key, repository_slug)
1509
- self._log.debug(
1510
- "lfs_repo_status_retrieved",
1511
- project_key=project_key,
1512
- repository_slug=repository_slug,
1513
- )
1514
- return result
1515
- except Exception as exc:
1516
- self._handle_api_error(exc, f"get_lfs_repo_status {project_key}/{repository_slug}")
1517
-
1518
- def set_lfs_repo_status(self, project_key: str, repository_slug: str, enabled: bool) -> dict[str, Any]:
1519
- """Set Git LFS repository status."""
1520
- try:
1521
- result = self._client.set_lfs_repo_status(project_key, repository_slug, enabled)
1522
- self._log.info(
1523
- "lfs_repo_status_set",
1524
- project_key=project_key,
1525
- repository_slug=repository_slug,
1526
- enabled=enabled,
1527
- )
1528
- return result
1529
- except Exception as exc:
1530
- self._handle_api_error(exc, f"set_lfs_repo_status {project_key}/{repository_slug}")
1531
-
1532
- # Advanced Code Operations
1533
- def get_file_list(
1534
- self,
1535
- project_key: str,
1536
- repository_slug: str,
1537
- sub_folder: str | None = None,
1538
- query: str | None = None,
1539
- start: int = 0,
1540
- limit: int | None = None,
1541
- ) -> list[dict[str, Any]]:
1542
- """Get file list from repository.
1543
-
1544
- Args:
1545
- project_key: Project key
1546
- repository_slug: Repository slug
1547
- sub_folder: Optional subfolder path
1548
- query: Optional query string for filtering
1549
- start: Start index for pagination
1550
- limit: Maximum number of results
1551
- """
1552
- try:
1553
- result = self._client.get_file_list(
1554
- project_key, repository_slug, sub_folder=sub_folder, query=query, start=start, limit=limit
1555
- )
1556
- self._log.debug(
1557
- "file_list_retrieved",
1558
- project_key=project_key,
1559
- repository_slug=repository_slug,
1560
- sub_folder=sub_folder,
1561
- count=len(result) if result else 0,
1562
- )
1563
- return result if isinstance(result, list) else [result] if result else []
1564
- except Exception as exc:
1565
- self._handle_api_error(exc, f"get_file_list {project_key}/{repository_slug}")
1566
-
1567
- def get_commit_info(
1568
- self, project_key: str, repository_slug: str, commit: str, path: str | None = None
1569
- ) -> dict[str, Any]:
1570
- """Get commit information.
1571
-
1572
- Args:
1573
- project_key: Project key
1574
- repository_slug: Repository slug
1575
- commit: Commit hash
1576
- path: Optional file path
1577
- """
1578
- try:
1579
- result = self._client.get_commit_info(project_key, repository_slug, commit, path=path)
1580
- self._log.debug(
1581
- "commit_info_retrieved",
1582
- project_key=project_key,
1583
- repository_slug=repository_slug,
1584
- commit=commit,
1585
- path=path,
1586
- )
1587
- return result
1588
- except Exception as exc:
1589
- self._handle_api_error(exc, f"get_commit_info {project_key}/{repository_slug}/{commit}")
1590
-
1591
- def get_commit_changes(
1592
- self,
1593
- project_key: str,
1594
- repository_slug: str,
1595
- commit_id: str | None = None,
1596
- hash_newest: str | None = None,
1597
- merges: str = "include",
1598
- ) -> dict[str, Any]:
1599
- """Get commit changes.
1600
-
1601
- Args:
1602
- project_key: Project key
1603
- repository_slug: Repository slug
1604
- commit_id: Commit ID (preferred)
1605
- hash_newest: Newest commit hash (alternative to commit_id)
1606
- merges: How to handle merges ('include', 'exclude', 'only')
1607
- """
1608
- try:
1609
- result = self._client.get_commit_changes(
1610
- project_key, repository_slug, hash_newest=hash_newest, merges=merges, commit_id=commit_id
1611
- )
1612
- self._log.debug(
1613
- "commit_changes_retrieved",
1614
- project_key=project_key,
1615
- repository_slug=repository_slug,
1616
- commit_id=commit_id,
1617
- hash_newest=hash_newest,
1618
- )
1619
- return result
1620
- except Exception as exc:
1621
- self._handle_api_error(exc, f"get_commit_changes {project_key}/{repository_slug}")
1622
-
1623
- def search_code(self, team: str, search_query: str, page: int = 1, limit: int = 10) -> dict[str, Any]:
1624
- """Search code (Cloud-only).
1625
-
1626
- Args:
1627
- team: Team/workspace name (Cloud only)
1628
- search_query: Search query string
1629
- page: Page number for pagination
1630
- limit: Maximum number of results per page
1631
- """
1632
- if not self._settings.is_cloud_mode:
1633
- raise VDSClientError(
1634
- "Code search is only available in Bitbucket Cloud mode",
1635
- context={"mode": self._settings.mode},
1636
- )
1637
- try:
1638
- result = self._client.search_code(team, search_query, page=page, limit=limit)
1639
- self._log.debug(
1640
- "code_search_performed",
1641
- team=team,
1642
- search_query=search_query,
1643
- page=page,
1644
- )
1645
- return result
1646
- except Exception as exc:
1647
- self._handle_api_error(exc, f"search_code {team}")
1648
-
1649
- def search_code_advanced(
1650
- self,
1651
- team: str,
1652
- search_query: str,
1653
- *,
1654
- page: int = 1,
1655
- limit: int = 10,
1656
- repository: str | None = None,
1657
- **kwargs: Any,
1658
- ) -> dict[str, Any]:
1659
- """Advanced code search with additional filters (Cloud-only).
1660
-
1661
- Args:
1662
- team: Team/workspace name (Cloud only)
1663
- search_query: Search query string
1664
- page: Page number for pagination (default: 1)
1665
- limit: Maximum number of results per page (default: 10)
1666
- repository: Optional repository slug to filter by
1667
- **kwargs: Additional search parameters (if supported by SDK)
1668
-
1669
- Note: Code search is only available in Bitbucket Cloud. Server/DC instances
1670
- do not have code search capabilities via the REST API.
1671
- """
1672
- if not self._settings.is_cloud_mode:
1673
- raise VDSClientError(
1674
- "Code search is only available in Bitbucket Cloud mode",
1675
- context={"mode": self._settings.mode},
1676
- )
1677
- try:
1678
- # SDK search_code may support additional parameters via kwargs
1679
- result = self._client.search_code(team, search_query, page=page, limit=limit, **kwargs) # type: ignore[call-arg]
1680
- self._log.debug(
1681
- "code_search_advanced_performed",
1682
- team=team,
1683
- search_query=search_query,
1684
- page=page,
1685
- limit=limit,
1686
- repository=repository,
1687
- )
1688
- # If repository filter is provided, filter results client-side
1689
- # (SDK may not support repository parameter directly)
1690
- if repository and isinstance(result, dict) and "values" in result:
1691
- filtered = [
1692
- item for item in result.get("values", []) if item.get("repository", {}).get("slug") == repository
1693
- ]
1694
- result["values"] = filtered
1695
- result["size"] = len(filtered)
1696
- return result
1697
- except Exception as exc:
1698
- self._handle_api_error(exc, f"search_code_advanced {team}")
1699
-
1700
- def _get_cloud_repository(self, workspace: str, repository_slug: str):
1701
- """Retrieve a repository object using the cloud API."""
1702
- if not self._settings.is_cloud_mode:
1703
- raise VDSClientError(
1704
- "Repository variable operations are only available in Bitbucket Cloud mode",
1705
- context={"mode": self._settings.mode},
1706
- )
1707
- try:
1708
- return self._client.cloud.repositories.get(workspace, repository_slug) # type: ignore[attr-defined]
1709
- except Exception as exc:
1710
- self._handle_api_error(exc, f"cloud_repository {workspace}/{repository_slug}")
1711
-
1712
- # --- Repository Variables (Cloud-only) ---
1713
- @staticmethod
1714
- def _variable_to_dict(variable: Any) -> dict[str, Any]:
1715
- """Convert a repository variable object or dict to a plain dictionary."""
1716
- data = getattr(variable, "data", None)
1717
- if callable(data):
1718
- data = data()
1719
- if isinstance(data, dict):
1720
- return dict(data)
1721
- if isinstance(variable, dict):
1722
- return dict(variable)
1723
- return {}
1724
-
1725
- @staticmethod
1726
- def _deployment_environment_to_dict(environment: Any) -> dict[str, Any]:
1727
- """Convert a deployment environment object to a dict."""
1728
- data = getattr(environment, "data", None)
1729
- if callable(data):
1730
- data = data()
1731
- if isinstance(data, dict):
1732
- return dict(data)
1733
- if isinstance(environment, dict):
1734
- return dict(environment)
1735
- return {}
1736
-
1737
- @staticmethod
1738
- def _issue_to_dict(issue: Any) -> dict[str, Any]:
1739
- """Convert an issue object to a dict."""
1740
- data = getattr(issue, "data", None)
1741
- if callable(data):
1742
- data = data()
1743
- if isinstance(data, dict):
1744
- return dict(data)
1745
- if isinstance(issue, dict):
1746
- return dict(issue)
1747
- return {}
1748
-
1749
- def _get_pull_request(
1750
- self,
1751
- workspace: str,
1752
- repository_slug: str,
1753
- pull_request_id: str | int,
1754
- ):
1755
- """Retrieve a pull request object."""
1756
- repository = self._get_cloud_repository(workspace, repository_slug)
1757
- try:
1758
- return repository.pullrequests.get(pull_request_id) # type: ignore[attr-defined]
1759
- except Exception as exc:
1760
- self._handle_api_error(exc, f"pull_request {workspace}/{repository_slug}/{pull_request_id}")
1761
-
1762
- def _get_issue(
1763
- self,
1764
- workspace: str,
1765
- repository_slug: str,
1766
- issue_id: str | int,
1767
- ):
1768
- """Retrieve an issue object."""
1769
- repository = self._get_cloud_repository(workspace, repository_slug)
1770
- try:
1771
- return repository.issues.get(issue_id) # type: ignore[attr-defined]
1772
- except Exception as exc:
1773
- self._handle_api_error(exc, f"repository_issue {workspace}/{repository_slug}/{issue_id}")
1774
-
1775
- @staticmethod
1776
- def _pipeline_to_dict(pipeline: Any) -> dict[str, Any]:
1777
- """Convert a pipeline object to a plain dictionary."""
1778
- data = getattr(pipeline, "data", None)
1779
- if callable(data):
1780
- data = data()
1781
- if isinstance(data, dict):
1782
- return dict(data)
1783
- if isinstance(pipeline, dict):
1784
- return dict(pipeline)
1785
- return {}
1786
-
1787
- @staticmethod
1788
- def _pipeline_step_to_dict(step: Any) -> dict[str, Any]:
1789
- """Convert a pipeline step object to a plain dictionary."""
1790
- data = getattr(step, "data", None)
1791
- if callable(data):
1792
- data = data()
1793
- if isinstance(data, dict):
1794
- return dict(data)
1795
- if isinstance(step, dict):
1796
- return dict(step)
1797
- return {}
1798
-
1799
- def list_repository_variables(self, workspace: str, repository_slug: str) -> list[dict[str, Any]]:
1800
- """List repository variables."""
1801
- repository = self._get_cloud_repository(workspace, repository_slug)
1802
- try:
1803
- variables = [
1804
- self._variable_to_dict(variable)
1805
- for variable in repository.repository_variables.each() # type: ignore[attr-defined]
1806
- ]
1807
- self._log.debug(
1808
- "repo_variables_listed",
1809
- workspace=workspace,
1810
- repository_slug=repository_slug,
1811
- count=len(variables),
1812
- )
1813
- return variables
1814
- except Exception as exc:
1815
- self._handle_api_error(exc, f"list_repository_variables {workspace}/{repository_slug}")
1816
-
1817
- def get_repository_variable(self, workspace: str, repository_slug: str, variable_uuid: str) -> dict[str, Any]:
1818
- """Get a repository variable by UUID."""
1819
- repository = self._get_cloud_repository(workspace, repository_slug)
1820
- try:
1821
- variable = repository.repository_variables.get(variable_uuid) # type: ignore[attr-defined]
1822
- data = self._variable_to_dict(variable)
1823
- self._log.debug(
1824
- "repo_variable_retrieved",
1825
- workspace=workspace,
1826
- repository_slug=repository_slug,
1827
- variable_uuid=variable_uuid,
1828
- )
1829
- return data
1830
- except Exception as exc:
1831
- self._handle_api_error(exc, f"get_repository_variable {workspace}/{repository_slug}/{variable_uuid}")
1832
-
1833
- def create_repository_variable(
1834
- self,
1835
- workspace: str,
1836
- repository_slug: str,
1837
- key: str,
1838
- value: str,
1839
- secured: bool = False,
1840
- ) -> dict[str, Any]:
1841
- """Create a repository variable."""
1842
- repository = self._get_cloud_repository(workspace, repository_slug)
1843
- try:
1844
- variable = repository.repository_variables.create(key, value, secured) # type: ignore[attr-defined]
1845
- data = self._variable_to_dict(variable)
1846
- self._log.info(
1847
- "repo_variable_created",
1848
- workspace=workspace,
1849
- repository_slug=repository_slug,
1850
- key=key,
1851
- secured=secured,
1852
- )
1853
- return data
1854
- except Exception as exc:
1855
- self._handle_api_error(exc, f"create_repository_variable {workspace}/{repository_slug}")
1856
-
1857
- def update_repository_variable(
1858
- self,
1859
- workspace: str,
1860
- repository_slug: str,
1861
- variable_uuid: str,
1862
- *,
1863
- key: str | None = None,
1864
- value: str | None = None,
1865
- secured: bool | None = None,
1866
- ) -> dict[str, Any]:
1867
- """Update a repository variable."""
1868
- repository = self._get_cloud_repository(workspace, repository_slug)
1869
- update_payload: dict[str, Any] = {}
1870
- if key is not None:
1871
- update_payload["key"] = key
1872
- if value is not None:
1873
- update_payload["value"] = value
1874
- if secured is not None:
1875
- update_payload["secured"] = secured
1876
- if not update_payload:
1877
- raise VDSClientError(
1878
- "Provide at least one of --key/--value/--secured to update repository variable",
1879
- context={"workspace": workspace, "repository": repository_slug, "variable_uuid": variable_uuid},
1880
- )
1881
- try:
1882
- variable = repository.repository_variables.get(variable_uuid) # type: ignore[attr-defined]
1883
- variable.update(**update_payload) # type: ignore[attr-defined]
1884
- data = self._variable_to_dict(variable)
1885
- self._log.info(
1886
- "repo_variable_updated",
1887
- workspace=workspace,
1888
- repository_slug=repository_slug,
1889
- variable_uuid=variable_uuid,
1890
- fields=list(update_payload.keys()),
1891
- )
1892
- return data
1893
- except Exception as exc:
1894
- self._handle_api_error(exc, f"update_repository_variable {workspace}/{repository_slug}/{variable_uuid}")
1895
-
1896
- def delete_repository_variable(self, workspace: str, repository_slug: str, variable_uuid: str) -> None:
1897
- """Delete a repository variable."""
1898
- repository = self._get_cloud_repository(workspace, repository_slug)
1899
- try:
1900
- variable = repository.repository_variables.get(variable_uuid) # type: ignore[attr-defined]
1901
- variable.delete() # type: ignore[attr-defined]
1902
- self._log.info(
1903
- "repo_variable_deleted",
1904
- workspace=workspace,
1905
- repository_slug=repository_slug,
1906
- variable_uuid=variable_uuid,
1907
- )
1908
- except Exception as exc:
1909
- self._handle_api_error(exc, f"delete_repository_variable {workspace}/{repository_slug}/{variable_uuid}")
1910
-
1911
- # --- Deployment Environments (Cloud-only) ---
1912
- def list_deployment_environments(self, workspace: str, repository_slug: str) -> list[dict[str, Any]]:
1913
- """List deployment environments."""
1914
- repository = self._get_cloud_repository(workspace, repository_slug)
1915
- try:
1916
- environments = [
1917
- self._deployment_environment_to_dict(env)
1918
- for env in repository.deployment_environments.each() # type: ignore[attr-defined]
1919
- ]
1920
- self._log.debug(
1921
- "deployment_environments_listed",
1922
- workspace=workspace,
1923
- repository_slug=repository_slug,
1924
- count=len(environments),
1925
- )
1926
- return environments
1927
- except Exception as exc:
1928
- self._handle_api_error(exc, f"list_deployment_environments {workspace}/{repository_slug}")
1929
-
1930
- def get_deployment_environment(self, workspace: str, repository_slug: str, environment_uuid: str) -> dict[str, Any]:
1931
- """Retrieve a deployment environment."""
1932
- repository = self._get_cloud_repository(workspace, repository_slug)
1933
- try:
1934
- environment = repository.deployment_environments.get(environment_uuid) # type: ignore[attr-defined]
1935
- data = self._deployment_environment_to_dict(environment)
1936
- self._log.debug(
1937
- "deployment_environment_retrieved",
1938
- workspace=workspace,
1939
- repository_slug=repository_slug,
1940
- environment_uuid=environment_uuid,
1941
- )
1942
- return data
1943
- except Exception as exc:
1944
- self._handle_api_error(exc, f"get_deployment_environment {workspace}/{repository_slug}/{environment_uuid}")
1945
-
1946
- def list_deployment_environment_variables(
1947
- self,
1948
- workspace: str,
1949
- repository_slug: str,
1950
- environment_uuid: str,
1951
- *,
1952
- pagelen: int = 10,
1953
- ) -> list[dict[str, Any]]:
1954
- """List variables for a deployment environment."""
1955
- repository = self._get_cloud_repository(workspace, repository_slug)
1956
- try:
1957
- environment = repository.deployment_environments.get(environment_uuid) # type: ignore[attr-defined]
1958
- variables = [
1959
- self._variable_to_dict(variable)
1960
- for variable in environment.deployment_environment_variables.each(pagelen=pagelen) # type: ignore[attr-defined]
1961
- ]
1962
- self._log.debug(
1963
- "deployment_env_variables_listed",
1964
- workspace=workspace,
1965
- repository_slug=repository_slug,
1966
- environment_uuid=environment_uuid,
1967
- count=len(variables),
1968
- )
1969
- return variables
1970
- except Exception as exc:
1971
- self._handle_api_error(
1972
- exc,
1973
- f"list_deployment_environment_variables {workspace}/{repository_slug}/{environment_uuid}",
1974
- )
1975
-
1976
- def create_deployment_environment_variable(
1977
- self,
1978
- workspace: str,
1979
- repository_slug: str,
1980
- environment_uuid: str,
1981
- key: str,
1982
- value: str,
1983
- secured: bool = False,
1984
- ) -> dict[str, Any]:
1985
- """Create a deployment environment variable."""
1986
- repository = self._get_cloud_repository(workspace, repository_slug)
1987
- try:
1988
- environment = repository.deployment_environments.get(environment_uuid) # type: ignore[attr-defined]
1989
- variable = environment.deployment_environment_variables.create(key, value, secured) # type: ignore[attr-defined]
1990
- data = self._variable_to_dict(variable)
1991
- self._log.info(
1992
- "deployment_env_variable_created",
1993
- workspace=workspace,
1994
- repository_slug=repository_slug,
1995
- environment_uuid=environment_uuid,
1996
- key=key,
1997
- secured=secured,
1998
- )
1999
- return data
2000
- except Exception as exc:
2001
- self._handle_api_error(
2002
- exc,
2003
- f"create_deployment_environment_variable {workspace}/{repository_slug}/{environment_uuid}",
2004
- )
2005
-
2006
- def update_deployment_environment_variable(
2007
- self,
2008
- workspace: str,
2009
- repository_slug: str,
2010
- environment_uuid: str,
2011
- variable_uuid: str,
2012
- *,
2013
- key: str | None = None,
2014
- value: str | None = None,
2015
- secured: bool | None = None,
2016
- ) -> dict[str, Any]:
2017
- """Update a deployment environment variable."""
2018
- repository = self._get_cloud_repository(workspace, repository_slug)
2019
- update_payload: dict[str, Any] = {}
2020
- if key is not None:
2021
- update_payload["key"] = key
2022
- if value is not None:
2023
- update_payload["value"] = value
2024
- if secured is not None:
2025
- update_payload["secured"] = secured
2026
- if not update_payload:
2027
- raise VDSClientError(
2028
- "Provide at least one of --key/--value/--secured to update deployment environment variable",
2029
- context={
2030
- "workspace": workspace,
2031
- "repository": repository_slug,
2032
- "environment_uuid": environment_uuid,
2033
- "variable_uuid": variable_uuid,
2034
- },
2035
- )
2036
- try:
2037
- environment = repository.deployment_environments.get(environment_uuid) # type: ignore[attr-defined]
2038
- variable = environment.deployment_environment_variables.get(variable_uuid) # type: ignore[attr-defined]
2039
- variable.update(**update_payload) # type: ignore[attr-defined]
2040
- data = self._variable_to_dict(variable)
2041
- self._log.info(
2042
- "deployment_env_variable_updated",
2043
- workspace=workspace,
2044
- repository_slug=repository_slug,
2045
- environment_uuid=environment_uuid,
2046
- variable_uuid=variable_uuid,
2047
- fields=list(update_payload.keys()),
2048
- )
2049
- return data
2050
- except Exception as exc:
2051
- self._handle_api_error(
2052
- exc,
2053
- f"update_deployment_environment_variable {workspace}/{repository_slug}/{environment_uuid}/{variable_uuid}",
2054
- )
2055
-
2056
- def delete_deployment_environment_variable(
2057
- self,
2058
- workspace: str,
2059
- repository_slug: str,
2060
- environment_uuid: str,
2061
- variable_uuid: str,
2062
- ) -> None:
2063
- """Delete a deployment environment variable."""
2064
- repository = self._get_cloud_repository(workspace, repository_slug)
2065
- try:
2066
- environment = repository.deployment_environments.get(environment_uuid) # type: ignore[attr-defined]
2067
- variable = environment.deployment_environment_variables.get(variable_uuid) # type: ignore[attr-defined]
2068
- variable.delete() # type: ignore[attr-defined]
2069
- self._log.info(
2070
- "deployment_env_variable_deleted",
2071
- workspace=workspace,
2072
- repository_slug=repository_slug,
2073
- environment_uuid=environment_uuid,
2074
- variable_uuid=variable_uuid,
2075
- )
2076
- except Exception as exc:
2077
- self._handle_api_error(
2078
- exc,
2079
- f"delete_deployment_environment_variable {workspace}/{repository_slug}/{environment_uuid}/{variable_uuid}",
2080
- )
2081
-
2082
- # --- Repository Issues (Cloud-only) ---
2083
- def list_repository_issues(
2084
- self,
2085
- workspace: str,
2086
- repository_slug: str,
2087
- *,
2088
- query: str | None = None,
2089
- sort: str | None = None,
2090
- ) -> list[dict[str, Any]]:
2091
- """List repository issues."""
2092
- repository = self._get_cloud_repository(workspace, repository_slug)
2093
- try:
2094
- issues = [
2095
- self._issue_to_dict(issue)
2096
- for issue in repository.issues.each(q=query, sort=sort) # type: ignore[attr-defined]
2097
- ]
2098
- self._log.debug(
2099
- "repository_issues_listed",
2100
- workspace=workspace,
2101
- repository_slug=repository_slug,
2102
- count=len(issues),
2103
- query=query,
2104
- sort=sort,
2105
- )
2106
- return issues
2107
- except Exception as exc:
2108
- self._handle_api_error(exc, f"list_repository_issues {workspace}/{repository_slug}")
2109
-
2110
- def create_repository_issue(
2111
- self,
2112
- workspace: str,
2113
- repository_slug: str,
2114
- title: str,
2115
- description: str = "",
2116
- *,
2117
- kind: str = "task",
2118
- priority: str = "major",
2119
- ) -> dict[str, Any]:
2120
- """Create an issue."""
2121
- if not title:
2122
- raise VDSClientError(
2123
- "Issue title must not be empty",
2124
- context={"workspace": workspace, "repository": repository_slug},
2125
- )
2126
- repository = self._get_cloud_repository(workspace, repository_slug)
2127
- try:
2128
- issue = repository.issues.create(title, description, kind, priority) # type: ignore[attr-defined]
2129
- issue_data = self._issue_to_dict(issue)
2130
- self._log.info(
2131
- "repository_issue_created",
2132
- workspace=workspace,
2133
- repository_slug=repository_slug,
2134
- issue_id=issue_data.get("id"),
2135
- kind=kind,
2136
- priority=priority,
2137
- )
2138
- return issue_data
2139
- except Exception as exc:
2140
- self._handle_api_error(exc, f"create_repository_issue {workspace}/{repository_slug}")
2141
-
2142
- def get_repository_issue(
2143
- self,
2144
- workspace: str,
2145
- repository_slug: str,
2146
- issue_id: str | int,
2147
- ) -> dict[str, Any]:
2148
- """Get a single issue."""
2149
- issue = self._get_issue(workspace, repository_slug, issue_id)
2150
- data = self._issue_to_dict(issue)
2151
- self._log.debug(
2152
- "repository_issue_retrieved",
2153
- workspace=workspace,
2154
- repository_slug=repository_slug,
2155
- issue_id=issue_id,
2156
- )
2157
- return data
2158
-
2159
- def update_repository_issue(
2160
- self,
2161
- workspace: str,
2162
- repository_slug: str,
2163
- issue_id: str | int,
2164
- *,
2165
- title: str | None = None,
2166
- description: str | None = None,
2167
- kind: str | None = None,
2168
- priority: str | None = None,
2169
- state: str | None = None,
2170
- ) -> dict[str, Any]:
2171
- """Update an issue."""
2172
- payload: dict[str, Any] = {}
2173
- if title is not None:
2174
- payload["title"] = title
2175
- if kind is not None:
2176
- payload["kind"] = kind
2177
- if priority is not None:
2178
- payload["priority"] = priority
2179
- if state is not None:
2180
- payload["state"] = state
2181
- if description is not None:
2182
- payload["content"] = {"raw": description}
2183
- if not payload:
2184
- raise VDSClientError(
2185
- "Provide at least one field to update issue",
2186
- context={
2187
- "workspace": workspace,
2188
- "repository": repository_slug,
2189
- "issue_id": issue_id,
2190
- },
2191
- )
2192
- issue = self._get_issue(workspace, repository_slug, issue_id)
2193
- try:
2194
- issue.update(**payload) # type: ignore[attr-defined]
2195
- data = self._issue_to_dict(issue)
2196
- self._log.info(
2197
- "repository_issue_updated",
2198
- workspace=workspace,
2199
- repository_slug=repository_slug,
2200
- issue_id=issue_id,
2201
- fields=list(payload.keys()),
2202
- )
2203
- return data
2204
- except Exception as exc:
2205
- self._handle_api_error(
2206
- exc,
2207
- f"update_repository_issue {workspace}/{repository_slug}/{issue_id}",
2208
- )
2209
-
2210
- def delete_repository_issue(
2211
- self,
2212
- workspace: str,
2213
- repository_slug: str,
2214
- issue_id: str | int,
2215
- ) -> None:
2216
- """Delete an issue."""
2217
- issue = self._get_issue(workspace, repository_slug, issue_id)
2218
- try:
2219
- issue.delete() # type: ignore[attr-defined]
2220
- self._log.info(
2221
- "repository_issue_deleted",
2222
- workspace=workspace,
2223
- repository_slug=repository_slug,
2224
- issue_id=issue_id,
2225
- )
2226
- except Exception as exc:
2227
- self._handle_api_error(
2228
- exc,
2229
- f"delete_repository_issue {workspace}/{repository_slug}/{issue_id}",
2230
- )
2231
-
2232
- # --- Pull Request Blockers (Cloud-only) ---
2233
- def list_pull_request_blockers(
2234
- self,
2235
- workspace: str,
2236
- repository_slug: str,
2237
- pull_request_id: str | int,
2238
- *,
2239
- query: str | None = None,
2240
- ) -> list[dict[str, Any]]:
2241
- """List pull request blockers."""
2242
- pull_request = self._get_pull_request(workspace, repository_slug, pull_request_id)
2243
- params = {"q": query} if query else None
2244
- try:
2245
- result = pull_request.get("blockers", params=params) # type: ignore[attr-defined]
2246
- if isinstance(result, dict) and "values" in result:
2247
- blockers = result.get("values", [])
2248
- elif isinstance(result, list):
2249
- blockers = result
2250
- else:
2251
- blockers = [result] if result else []
2252
- blockers_data = [self._variable_to_dict(blocker) for blocker in blockers]
2253
- self._log.debug(
2254
- "pull_request_blockers_listed",
2255
- workspace=workspace,
2256
- repository_slug=repository_slug,
2257
- pull_request_id=pull_request_id,
2258
- count=len(blockers_data),
2259
- query=query,
2260
- )
2261
- return blockers_data
2262
- except Exception as exc:
2263
- self._handle_api_error(
2264
- exc,
2265
- f"list_pull_request_blockers {workspace}/{repository_slug}/{pull_request_id}",
2266
- )
2267
-
2268
- def add_pull_request_blocker(
2269
- self,
2270
- workspace: str,
2271
- repository_slug: str,
2272
- pull_request_id: str | int,
2273
- message: str,
2274
- *,
2275
- reason: str | None = None,
2276
- severity: str | None = None,
2277
- ) -> dict[str, Any]:
2278
- """Add a blocker to a pull request."""
2279
- if not message:
2280
- raise VDSClientError(
2281
- "Blocker message must not be empty",
2282
- context={
2283
- "workspace": workspace,
2284
- "repository": repository_slug,
2285
- "pull_request_id": pull_request_id,
2286
- },
2287
- )
2288
- pull_request = self._get_pull_request(workspace, repository_slug, pull_request_id)
2289
- payload: dict[str, Any] = {"message": message}
2290
- if reason:
2291
- payload["reason"] = reason
2292
- if severity:
2293
- payload["severity"] = severity
2294
- try:
2295
- blocker = pull_request.post("blockers", payload) # type: ignore[attr-defined]
2296
- blocker_data = self._variable_to_dict(blocker)
2297
- self._log.info(
2298
- "pull_request_blocker_added",
2299
- workspace=workspace,
2300
- repository_slug=repository_slug,
2301
- pull_request_id=pull_request_id,
2302
- blocker_uuid=blocker_data.get("uuid"),
2303
- )
2304
- return blocker_data
2305
- except Exception as exc:
2306
- self._handle_api_error(
2307
- exc,
2308
- f"add_pull_request_blocker {workspace}/{repository_slug}/{pull_request_id}",
2309
- )
2310
-
2311
- def delete_pull_request_blocker(
2312
- self,
2313
- workspace: str,
2314
- repository_slug: str,
2315
- pull_request_id: str | int,
2316
- blocker_uuid: str,
2317
- ) -> None:
2318
- """Delete a pull request blocker."""
2319
- if not blocker_uuid:
2320
- raise VDSClientError(
2321
- "Blocker UUID is required",
2322
- context={
2323
- "workspace": workspace,
2324
- "repository": repository_slug,
2325
- "pull_request_id": pull_request_id,
2326
- },
2327
- )
2328
- pull_request = self._get_pull_request(workspace, repository_slug, pull_request_id)
2329
- try:
2330
- pull_request.delete(f"blockers/{blocker_uuid}") # type: ignore[attr-defined]
2331
- self._log.info(
2332
- "pull_request_blocker_deleted",
2333
- workspace=workspace,
2334
- repository_slug=repository_slug,
2335
- pull_request_id=pull_request_id,
2336
- blocker_uuid=blocker_uuid,
2337
- )
2338
- except Exception as exc:
2339
- self._handle_api_error(
2340
- exc,
2341
- f"delete_pull_request_blocker {workspace}/{repository_slug}/{pull_request_id}/{blocker_uuid}",
2342
- )
2343
-
2344
- def _get_pipeline(self, workspace: str, repository_slug: str, pipeline_uuid: str):
2345
- """Retrieve a pipeline object using the cloud API."""
2346
- repository = self._get_cloud_repository(workspace, repository_slug)
2347
- try:
2348
- return repository.pipelines.get(pipeline_uuid) # type: ignore[attr-defined]
2349
- except Exception as exc:
2350
- self._handle_api_error(exc, f"pipeline {workspace}/{repository_slug}/{pipeline_uuid}")
2351
-
2352
- def get_pipeline(self, workspace: str, repository_slug: str, pipeline_uuid: str) -> dict[str, Any]:
2353
- """Get pipeline details."""
2354
- pipeline = self._get_pipeline(workspace, repository_slug, pipeline_uuid)
2355
- data = self._pipeline_to_dict(pipeline)
2356
- self._log.debug(
2357
- "pipeline_retrieved",
2358
- workspace=workspace,
2359
- repository_slug=repository_slug,
2360
- pipeline_uuid=pipeline_uuid,
2361
- )
2362
- return data
2363
-
2364
- def list_pipeline_steps(
2365
- self,
2366
- workspace: str,
2367
- repository_slug: str,
2368
- pipeline_uuid: str,
2369
- ) -> list[dict[str, Any]]:
2370
- """List steps for a pipeline."""
2371
- pipeline = self._get_pipeline(workspace, repository_slug, pipeline_uuid)
2372
- try:
2373
- steps = [
2374
- self._pipeline_step_to_dict(step)
2375
- for step in pipeline.steps() # type: ignore[attr-defined]
2376
- ]
2377
- self._log.debug(
2378
- "pipeline_steps_listed",
2379
- workspace=workspace,
2380
- repository_slug=repository_slug,
2381
- pipeline_uuid=pipeline_uuid,
2382
- count=len(steps),
2383
- )
2384
- return steps
2385
- except Exception as exc:
2386
- self._handle_api_error(
2387
- exc,
2388
- f"list_pipeline_steps {workspace}/{repository_slug}/{pipeline_uuid}",
2389
- )
2390
-
2391
- def get_pipeline_step(
2392
- self,
2393
- workspace: str,
2394
- repository_slug: str,
2395
- pipeline_uuid: str,
2396
- step_uuid: str,
2397
- ) -> dict[str, Any]:
2398
- """Get details for a pipeline step."""
2399
- pipeline = self._get_pipeline(workspace, repository_slug, pipeline_uuid)
2400
- try:
2401
- step = pipeline.step(step_uuid) # type: ignore[attr-defined]
2402
- data = self._pipeline_step_to_dict(step)
2403
- self._log.debug(
2404
- "pipeline_step_retrieved",
2405
- workspace=workspace,
2406
- repository_slug=repository_slug,
2407
- pipeline_uuid=pipeline_uuid,
2408
- step_uuid=step_uuid,
2409
- )
2410
- return data
2411
- except Exception as exc:
2412
- self._handle_api_error(
2413
- exc,
2414
- f"get_pipeline_step {workspace}/{repository_slug}/{pipeline_uuid}/{step_uuid}",
2415
- )
2416
-
2417
- def get_pipeline_step_log(
2418
- self,
2419
- workspace: str,
2420
- repository_slug: str,
2421
- pipeline_uuid: str,
2422
- step_uuid: str,
2423
- *,
2424
- start: int | None = None,
2425
- end: int | None = None,
2426
- ) -> dict[str, Any]:
2427
- """Get log output for a pipeline step."""
2428
- pipeline = self._get_pipeline(workspace, repository_slug, pipeline_uuid)
2429
- try:
2430
- step = pipeline.step(step_uuid) # type: ignore[attr-defined]
2431
- result = step.log(start=start, end=end) # type: ignore[attr-defined]
2432
- total_size: int | None = None
2433
- content_bytes: bytes = b""
2434
- if isinstance(result, tuple):
2435
- total_size_raw, chunk = result
2436
- if isinstance(total_size_raw, (bytes, bytearray)):
2437
- try:
2438
- total_size = int(total_size_raw.decode())
2439
- except (ValueError, AttributeError):
2440
- total_size = None
2441
- else:
2442
- try:
2443
- total_size = int(total_size_raw)
2444
- except (ValueError, TypeError):
2445
- total_size = None
2446
- content_bytes = chunk or b""
2447
- elif isinstance(result, (bytes, bytearray)):
2448
- content_bytes = bytes(result)
2449
- elif result is None:
2450
- content_bytes = b""
2451
- else:
2452
- # Unknown type, attempt to convert to bytes
2453
- try:
2454
- content_bytes = bytes(result)
2455
- except Exception: # pragma: no cover - defensive
2456
- content_bytes = str(result).encode("utf-8", errors="replace")
2457
-
2458
- content_text = content_bytes.decode("utf-8", errors="replace")
2459
- size = total_size if total_size is not None else len(content_bytes)
2460
- payload = {
2461
- "workspace": workspace,
2462
- "repository": repository_slug,
2463
- "pipeline_uuid": pipeline_uuid,
2464
- "step_uuid": step_uuid,
2465
- "size": size,
2466
- "content": content_text,
2467
- "range_start": start,
2468
- "range_end": end,
2469
- }
2470
- self._log.debug(
2471
- "pipeline_step_log_retrieved",
2472
- workspace=workspace,
2473
- repository_slug=repository_slug,
2474
- pipeline_uuid=pipeline_uuid,
2475
- step_uuid=step_uuid,
2476
- size=size,
2477
- )
2478
- return payload
2479
- except Exception as exc:
2480
- self._handle_api_error(
2481
- exc,
2482
- f"get_pipeline_step_log {workspace}/{repository_slug}/{pipeline_uuid}/{step_uuid}",
2483
- )
2484
-
2485
- def stop_pipeline(
2486
- self,
2487
- workspace: str,
2488
- repository_slug: str,
2489
- pipeline_uuid: str,
2490
- ) -> dict[str, Any]:
2491
- """Stop a running pipeline."""
2492
- pipeline = self._get_pipeline(workspace, repository_slug, pipeline_uuid)
2493
- try:
2494
- pipeline.stop() # type: ignore[attr-defined]
2495
- self._log.info(
2496
- "pipeline_stopped",
2497
- workspace=workspace,
2498
- repository_slug=repository_slug,
2499
- pipeline_uuid=pipeline_uuid,
2500
- )
2501
- return {
2502
- "workspace": workspace,
2503
- "repository": repository_slug,
2504
- "pipeline_uuid": pipeline_uuid,
2505
- "status": "stopped",
2506
- }
2507
- except Exception as exc:
2508
- self._handle_api_error(exc, f"stop_pipeline {workspace}/{repository_slug}/{pipeline_uuid}")
2509
-
2510
- # --- Cloud Workspace Operations (Cloud-only) ---
2511
- def list_workspaces(self) -> list[dict[str, Any]]:
2512
- """List all workspaces (Cloud-only).
2513
-
2514
- Returns:
2515
- List of workspace dictionaries
2516
- """
2517
- if not self._settings.is_cloud_mode:
2518
- raise VDSClientError(
2519
- "Workspace operations are only available in Bitbucket Cloud mode",
2520
- context={"mode": self._settings.mode},
2521
- )
2522
- try:
2523
- # Access cloud API: cloud.workspaces.each()
2524
- workspaces = list(self._client.cloud.workspaces.each()) # type: ignore[attr-defined]
2525
- self._log.debug("workspaces_listed", count=len(workspaces))
2526
- return workspaces
2527
- except Exception as exc:
2528
- self._handle_api_error(exc, "list_workspaces")
2529
-
2530
- def get_workspace(self, workspace_slug: str) -> dict[str, Any]:
2531
- """Get workspace by slug (Cloud-only).
2532
-
2533
- Args:
2534
- workspace_slug: Workspace slug/identifier
2535
- """
2536
- if not self._settings.is_cloud_mode:
2537
- raise VDSClientError(
2538
- "Workspace operations are only available in Bitbucket Cloud mode",
2539
- context={"mode": self._settings.mode},
2540
- )
2541
- try:
2542
- # Access cloud API: cloud.workspaces.get(workspace_slug)
2543
- workspace = self._client.cloud.workspaces.get(workspace_slug) # type: ignore[attr-defined]
2544
- self._log.debug("workspace_retrieved", workspace_slug=workspace_slug)
2545
- return workspace
2546
- except Exception as exc:
2547
- self._handle_api_error(exc, f"get_workspace {workspace_slug}")
2548
-
2549
- def get_workspace_permissions(self, workspace_slug: str) -> list[dict[str, Any]]:
2550
- """Get workspace permissions (Cloud-only).
2551
-
2552
- Args:
2553
- workspace_slug: Workspace slug/identifier
2554
- """
2555
- if not self._settings.is_cloud_mode:
2556
- raise VDSClientError(
2557
- "Workspace operations are only available in Bitbucket Cloud mode",
2558
- context={"mode": self._settings.mode},
2559
- )
2560
- try:
2561
- workspace = self._client.cloud.workspaces.get(workspace_slug) # type: ignore[attr-defined]
2562
- # Access: workplace.permissions.each()
2563
- permissions = list(workspace.permissions.each()) # type: ignore[attr-defined]
2564
- self._log.debug("workspace_permissions_retrieved", workspace_slug=workspace_slug, count=len(permissions))
2565
- return permissions
2566
- except Exception as exc:
2567
- self._handle_api_error(exc, f"get_workspace_permissions {workspace_slug}")
2568
-
2569
- def get_workspace_repository_permissions(
2570
- self, workspace_slug: str, repo_slug: str | None = None
2571
- ) -> dict[str, Any] | list[dict[str, Any]]:
2572
- """Get workspace repository permissions (Cloud-only).
2573
-
2574
- Args:
2575
- workspace_slug: Workspace slug/identifier
2576
- repo_slug: Optional repository slug. If provided, returns permissions for that repo only.
2577
- If None, returns all repository permissions.
2578
- """
2579
- if not self._settings.is_cloud_mode:
2580
- raise VDSClientError(
2581
- "Workspace operations are only available in Bitbucket Cloud mode",
2582
- context={"mode": self._settings.mode},
2583
- )
2584
- try:
2585
- workspace = self._client.cloud.workspaces.get(workspace_slug) # type: ignore[attr-defined]
2586
- if repo_slug:
2587
- # Access: workplace.permissions.repositories(repo_slug)
2588
- permissions = workspace.permissions.repositories(repo_slug) # type: ignore[attr-defined]
2589
- else:
2590
- # Access: workplace.permissions.repositories()
2591
- permissions = list(workspace.permissions.repositories()) # type: ignore[attr-defined]
2592
- self._log.debug(
2593
- "workspace_repository_permissions_retrieved",
2594
- workspace_slug=workspace_slug,
2595
- repo_slug=repo_slug,
2596
- is_list=repo_slug is None,
2597
- )
2598
- return permissions
2599
- except Exception as exc:
2600
- self._handle_api_error(exc, f"get_workspace_repository_permissions {workspace_slug}/{repo_slug}")
2601
-
2602
- def list_workspace_projects(self, workspace_slug: str) -> list[dict[str, Any]]:
2603
- """List projects in workspace (Cloud-only).
2604
-
2605
- Args:
2606
- workspace_slug: Workspace slug/identifier
2607
- """
2608
- if not self._settings.is_cloud_mode:
2609
- raise VDSClientError(
2610
- "Workspace operations are only available in Bitbucket Cloud mode",
2611
- context={"mode": self._settings.mode},
2612
- )
2613
- try:
2614
- workspace = self._client.cloud.workspaces.get(workspace_slug) # type: ignore[attr-defined]
2615
- # Access: workplace.projects.each()
2616
- projects = list(workspace.projects.each()) # type: ignore[attr-defined]
2617
- self._log.debug("workspace_projects_listed", workspace_slug=workspace_slug, count=len(projects))
2618
- return projects
2619
- except Exception as exc:
2620
- self._handle_api_error(exc, f"list_workspace_projects {workspace_slug}")
2621
-
2622
- def get_workspace_project(self, workspace_slug: str, project_key: str) -> dict[str, Any]:
2623
- """Get project from workspace (Cloud-only).
2624
-
2625
- Args:
2626
- workspace_slug: Workspace slug/identifier
2627
- project_key: Project key
2628
- """
2629
- if not self._settings.is_cloud_mode:
2630
- raise VDSClientError(
2631
- "Workspace operations are only available in Bitbucket Cloud mode",
2632
- context={"mode": self._settings.mode},
2633
- )
2634
- try:
2635
- workspace = self._client.cloud.workspaces.get(workspace_slug) # type: ignore[attr-defined]
2636
- # Access: workplace.projects.get(project_key)
2637
- project = workspace.projects.get(project_key) # type: ignore[attr-defined]
2638
- self._log.debug("workspace_project_retrieved", workspace_slug=workspace_slug, project_key=project_key)
2639
- return project
2640
- except Exception as exc:
2641
- self._handle_api_error(exc, f"get_workspace_project {workspace_slug}/{project_key}")
2642
-
2643
- def download_archive(
2644
- self,
2645
- project_key: str,
2646
- repo_slug: str,
2647
- dest_fd: Any,
2648
- *,
2649
- at: str | None = None,
2650
- format: str = "zip",
2651
- path: str | None = None,
2652
- prefix: str | None = None,
2653
- chunk_size: int = 8192,
2654
- ) -> None:
2655
- """Download a repository archive to a file-like object.
2656
-
2657
- Args:
2658
- project_key: Bitbucket project key.
2659
- repo_slug: Repository slug.
2660
- dest_fd: Writable binary file-like object (e.g. open file or BytesIO).
2661
- at: Commit/tag/branch reference (optional).
2662
- format: Archive format — "zip", "tar.gz", "tar", "tgz" (default "zip").
2663
- path: Limit archive to a specific path prefix (optional).
2664
- prefix: Custom top-level directory prefix inside the archive (optional).
2665
- chunk_size: Bytes per read chunk (default 8192).
2666
- """
2667
- try:
2668
- self._client.download_repo_archive(
2669
- project_key=project_key,
2670
- repository_slug=repo_slug,
2671
- dest_fd=dest_fd,
2672
- at=at,
2673
- format=format,
2674
- path=path,
2675
- prefix=prefix,
2676
- chunk_size=chunk_size,
2677
- )
2678
- except Exception as exc:
2679
- raise VDSClientError(str(exc)) from exc
2680
-
2681
- def close(self) -> None:
2682
- """Close client (cleanup method for compatibility)."""
2683
- # atlassian-python-api doesn't require explicit cleanup
2684
- pass
2685
-
2686
- def __enter__(self) -> BitbucketClient:
2687
- return self
2688
-
2689
- def __exit__(self, exc_type, exc, tb) -> None:
2690
- self.close()
2691
-
2692
-
2693
- __all__ = ["BitbucketClient"]