@ngocsangairvds/vsaf 3.1.27 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/package.json +2 -2
  2. package/src/global.js +70 -10
  3. package/tools/skills/vds-scripts-skill/.openskills.json +6 -0
  4. package/tools/skills/vds-scripts-skill/QUALITY.md +44 -0
  5. package/tools/skills/vds-scripts-skill/SKILL.md +135 -0
  6. package/tools/skills/vds-scripts-skill/references/audit-commands.md +171 -0
  7. package/tools/skills/vds-scripts-skill/references/capability-index.md +34 -0
  8. package/tools/skills/vds-scripts-skill/references/development-commands.md +12 -0
  9. package/tools/skills/vds-scripts-skill/references/google-sheets.md +73 -0
  10. package/tools/skills/vds-scripts-skill/references/integration-commands.md +17 -0
  11. package/tools/skills/vds-scripts-skill/references/platform-bootstrap.md +31 -0
  12. package/tools/skills/vds-scripts-skill/references/specialist-routing.md +14 -0
  13. package/tools/skills/vds-scripts-skill/references/validation-commands.md +15 -0
  14. package/tools/skills/vsaf-build/SKILL.md +32 -2
  15. package/tools/skills/vsaf-ship/SKILL.md +41 -10
  16. package/tools/skills/vsaf-test/SKILL.md +8 -0
  17. package/tools/vds-scripts/.mcp.json +11 -0
  18. package/tools/vds-scripts/.secrets.baseline +133 -0
  19. package/tools/vds-scripts/AGENTS.md +152 -0
  20. package/tools/vds-scripts/CLAUDE.md +101 -0
  21. package/tools/vds-scripts/CLI_COMMAND_OPTIMIZATION.md +156 -0
  22. package/tools/vds-scripts/PACKAGE_P125B_IMPLEMENTATION_SUMMARY.md +131 -0
  23. package/tools/vds-scripts/PROJECT_COMPLETION_SUMMARY.md +45 -0
  24. package/tools/vds-scripts/README.md +97 -0
  25. package/tools/vds-scripts/bitbucket_manifest_mapping.toml +34 -0
  26. package/tools/vds-scripts/bitbucket_orchestrator/ARCHITECTURE_ANALYSIS.md +258 -0
  27. package/tools/vds-scripts/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +393 -0
  28. package/tools/vds-scripts/bitbucket_orchestrator/EVALUATION_REPORT.md +61 -0
  29. package/tools/vds-scripts/bitbucket_orchestrator/FEATURES.md +908 -0
  30. package/tools/vds-scripts/bitbucket_orchestrator/README.md +687 -0
  31. package/tools/vds-scripts/bitbucket_orchestrator/pyproject.toml +40 -0
  32. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/__init__.py +20 -0
  33. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/async_client.py +657 -0
  34. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/cli.py +2108 -0
  35. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/client.py +2534 -0
  36. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/config.py +171 -0
  37. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/errors.py +67 -0
  38. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/factory.py +185 -0
  39. package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/protocols.py +244 -0
  40. package/tools/vds-scripts/bitbucket_orchestrator/tests/__init__.py +8 -0
  41. package/tools/vds-scripts/bitbucket_orchestrator/tests/conftest.py +65 -0
  42. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_advanced_search.py +151 -0
  43. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_async_client.py +546 -0
  44. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_branch_permissions.py +145 -0
  45. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_cli.py +115 -0
  46. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client.py +157 -0
  47. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_branch_conditions.py +79 -0
  48. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_code_advanced.py +163 -0
  49. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_code_file.py +32 -0
  50. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_deployment_environments.py +194 -0
  51. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_issues.py +164 -0
  52. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_pipelines_advanced.py +179 -0
  53. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_pr_blockers.py +119 -0
  54. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_repository_variables.py +156 -0
  55. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code.py +98 -0
  56. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code_advanced.py +282 -0
  57. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code_insights.py +335 -0
  58. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_conditions.py +147 -0
  59. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_config.py +131 -0
  60. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_deployment_env.py +352 -0
  61. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_factory.py +371 -0
  62. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_fork_operations.py +204 -0
  63. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_issue_cli.py +261 -0
  64. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_pipeline_advanced.py +270 -0
  65. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_pr_blocker.py +204 -0
  66. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_protocols.py +334 -0
  67. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_repo_settings.py +343 -0
  68. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_repo_variables.py +270 -0
  69. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_webhooks.py +189 -0
  70. package/tools/vds-scripts/bitbucket_orchestrator/tests/test_workspace.py +233 -0
  71. package/tools/vds-scripts/bitbucket_orchestrator/uv.lock +742 -0
  72. package/tools/vds-scripts/confluence_orchestrator/Dockerfile +19 -0
  73. package/tools/vds-scripts/confluence_orchestrator/README.md +412 -0
  74. package/tools/vds-scripts/confluence_orchestrator/SYNC_SCRIPTS.md +127 -0
  75. package/tools/vds-scripts/confluence_orchestrator/SYNC_STANDARDIZATION.md +108 -0
  76. package/tools/vds-scripts/confluence_orchestrator/pyproject.toml +48 -0
  77. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/__init__.py +20 -0
  78. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/cli.py +2532 -0
  79. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/config.py +175 -0
  80. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content.py +290 -0
  81. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content_v2.py +94 -0
  82. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/crawl_tree.py +1835 -0
  83. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/errors.py +80 -0
  84. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/eventing.py +109 -0
  85. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/http.py +1114 -0
  86. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/orchestration.py +165 -0
  87. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/reporting.py +78 -0
  88. package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree.py +121 -0
  89. package/tools/vds-scripts/confluence_orchestrator/sync_pdfs_from_markdown.py +213 -0
  90. package/tools/vds-scripts/confluence_orchestrator/sync_pdfs_to_confluence.py +305 -0
  91. package/tools/vds-scripts/confluence_orchestrator/sync_png_attachments.py +305 -0
  92. package/tools/vds-scripts/confluence_orchestrator/tests/__init__.py +0 -0
  93. package/tools/vds-scripts/confluence_orchestrator/tests/conftest.py +8 -0
  94. package/tools/vds-scripts/confluence_orchestrator/tests/test_advanced_content.py +224 -0
  95. package/tools/vds-scripts/confluence_orchestrator/tests/test_advanced_search.py +188 -0
  96. package/tools/vds-scripts/confluence_orchestrator/tests/test_cache_management.py +247 -0
  97. package/tools/vds-scripts/confluence_orchestrator/tests/test_cli.py +499 -0
  98. package/tools/vds-scripts/confluence_orchestrator/tests/test_config.py +83 -0
  99. package/tools/vds-scripts/confluence_orchestrator/tests/test_content.py +186 -0
  100. package/tools/vds-scripts/confluence_orchestrator/tests/test_content_flags.py +27 -0
  101. package/tools/vds-scripts/confluence_orchestrator/tests/test_crawl_tree.py +2250 -0
  102. package/tools/vds-scripts/confluence_orchestrator/tests/test_draft_management.py +223 -0
  103. package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing.py +71 -0
  104. package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_chaos.py +37 -0
  105. package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_rate_limit.py +44 -0
  106. package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_timeout.py +49 -0
  107. package/tools/vds-scripts/confluence_orchestrator/tests/test_export.py +230 -0
  108. package/tools/vds-scripts/confluence_orchestrator/tests/test_history.py +204 -0
  109. package/tools/vds-scripts/confluence_orchestrator/tests/test_http.py +117 -0
  110. package/tools/vds-scripts/confluence_orchestrator/tests/test_orchestration.py +91 -0
  111. package/tools/vds-scripts/confluence_orchestrator/tests/test_reporting.py +24 -0
  112. package/tools/vds-scripts/confluence_orchestrator/tests/test_search_cql.py +34 -0
  113. package/tools/vds-scripts/confluence_orchestrator/tests/test_space_management.py +237 -0
  114. package/tools/vds-scripts/confluence_orchestrator/tests/test_space_permissions.py +332 -0
  115. package/tools/vds-scripts/confluence_orchestrator/tests/test_user_group_management.py +388 -0
  116. package/tools/vds-scripts/confluence_orchestrator/uv.lock +1023 -0
  117. package/tools/vds-scripts/git_orchestrator/ENHANCEMENT_SUMMARY.md +119 -0
  118. package/tools/vds-scripts/git_orchestrator/README.md +280 -0
  119. package/tools/vds-scripts/git_orchestrator/VERIFICATION_REPORT.md +152 -0
  120. package/tools/vds-scripts/git_orchestrator/pyproject.toml +35 -0
  121. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__init__.py +7 -0
  122. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__main__.py +4 -0
  123. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/cli.py +847 -0
  124. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/logging_config.py +63 -0
  125. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/manifest.py +129 -0
  126. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/orchestrator.py +819 -0
  127. package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/reporting.py +53 -0
  128. package/tools/vds-scripts/git_orchestrator/tests/__init__.py +0 -0
  129. package/tools/vds-scripts/git_orchestrator/tests/test_cli_settings.py +21 -0
  130. package/tools/vds-scripts/git_orchestrator/tests/test_integration.py +74 -0
  131. package/tools/vds-scripts/git_orchestrator/tests/test_manifest.py +79 -0
  132. package/tools/vds-scripts/git_orchestrator/tests/test_orchestrator.py +204 -0
  133. package/tools/vds-scripts/git_orchestrator/tests/test_public_api.py +236 -0
  134. package/tools/vds-scripts/git_orchestrator/tests/test_resilience.py +345 -0
  135. package/tools/vds-scripts/git_orchestrator/uv.lock +271 -0
  136. package/tools/vds-scripts/jira_orchestrator/README.md +770 -0
  137. package/tools/vds-scripts/jira_orchestrator/pyproject.toml +39 -0
  138. package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/__init__.py +1 -0
  139. package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/adapter.py +1320 -0
  140. package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/cli.py +2271 -0
  141. package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/config.py +138 -0
  142. package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/errors.py +67 -0
  143. package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/reporting.py +65 -0
  144. package/tools/vds-scripts/jira_orchestrator/tests/__init__.py +1 -0
  145. package/tools/vds-scripts/jira_orchestrator/tests/conftest.py +86 -0
  146. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
  147. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_bulk_operations.py +69 -0
  148. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_components.py +57 -0
  149. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_createmeta.py +45 -0
  150. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_dashboard.py +117 -0
  151. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_issue_properties.py +54 -0
  152. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_permissions_compat.py +42 -0
  153. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_reindex.py +42 -0
  154. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_remote_links.py +76 -0
  155. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_transitions.py +91 -0
  156. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_user_management.py +110 -0
  157. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_version_management.py +133 -0
  158. package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_watchers.py +41 -0
  159. package/tools/vds-scripts/jira_orchestrator/tests/test_advanced_search.py +164 -0
  160. package/tools/vds-scripts/jira_orchestrator/tests/test_agile.py +256 -0
  161. package/tools/vds-scripts/jira_orchestrator/tests/test_application_properties.py +193 -0
  162. package/tools/vds-scripts/jira_orchestrator/tests/test_backlog.py +91 -0
  163. package/tools/vds-scripts/jira_orchestrator/tests/test_bulk_operations.py +277 -0
  164. package/tools/vds-scripts/jira_orchestrator/tests/test_cli.py +106 -0
  165. package/tools/vds-scripts/jira_orchestrator/tests/test_components.py +106 -0
  166. package/tools/vds-scripts/jira_orchestrator/tests/test_config.py +164 -0
  167. package/tools/vds-scripts/jira_orchestrator/tests/test_dashboard.py +122 -0
  168. package/tools/vds-scripts/jira_orchestrator/tests/test_discover_fields.py +207 -0
  169. package/tools/vds-scripts/jira_orchestrator/tests/test_filter_management.py +333 -0
  170. package/tools/vds-scripts/jira_orchestrator/tests/test_issue_archiving.py +164 -0
  171. package/tools/vds-scripts/jira_orchestrator/tests/test_issue_links.py +257 -0
  172. package/tools/vds-scripts/jira_orchestrator/tests/test_issue_properties.py +171 -0
  173. package/tools/vds-scripts/jira_orchestrator/tests/test_link_types.py +314 -0
  174. package/tools/vds-scripts/jira_orchestrator/tests/test_parse_set.py +37 -0
  175. package/tools/vds-scripts/jira_orchestrator/tests/test_permissions.py +273 -0
  176. package/tools/vds-scripts/jira_orchestrator/tests/test_reindex.py +81 -0
  177. package/tools/vds-scripts/jira_orchestrator/tests/test_remote_links.py +254 -0
  178. package/tools/vds-scripts/jira_orchestrator/tests/test_security_schemes.py +170 -0
  179. package/tools/vds-scripts/jira_orchestrator/tests/test_transitions_changelog.py +114 -0
  180. package/tools/vds-scripts/jira_orchestrator/tests/test_user_management.py +226 -0
  181. package/tools/vds-scripts/jira_orchestrator/tests/test_version_management.py +339 -0
  182. package/tools/vds-scripts/jira_orchestrator/tests/test_watchers.py +101 -0
  183. package/tools/vds-scripts/jira_orchestrator/tests/test_worklog.py +223 -0
  184. package/tools/vds-scripts/jira_orchestrator/uv.lock +738 -0
  185. package/tools/vds-scripts/mcp_server/Dockerfile +34 -0
  186. package/tools/vds-scripts/mcp_server/README.md +140 -0
  187. package/tools/vds-scripts/mcp_server/pyproject.toml +42 -0
  188. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/__init__.py +4 -0
  189. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/config.py +36 -0
  190. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/server.py +66 -0
  191. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/__init__.py +14 -0
  192. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/bitbucket_tools.py +47 -0
  193. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/confluence_tools.py +59 -0
  194. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/git_tools.py +71 -0
  195. package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/jira_tools.py +63 -0
  196. package/tools/vds-scripts/mcp_server/tests/__init__.py +2 -0
  197. package/tools/vds-scripts/mcp_server/tests/conftest.py +29 -0
  198. package/tools/vds-scripts/mcp_server/tests/unit/__init__.py +2 -0
  199. package/tools/vds-scripts/mcp_server/tests/unit/test_bitbucket_tools.py +25 -0
  200. package/tools/vds-scripts/mcp_server/tests/unit/test_confluence_tools.py +25 -0
  201. package/tools/vds-scripts/mcp_server/tests/unit/test_git_tools.py +32 -0
  202. package/tools/vds-scripts/mcp_server/tests/unit/test_jira_tools.py +32 -0
  203. package/tools/vds-scripts/mcp_server/tests/verification/__init__.py +2 -0
  204. package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_confluence_tools.py +40 -0
  205. package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_jira_tools.py +37 -0
  206. package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_tool_registration.py +47 -0
  207. package/tools/vds-scripts/mcp_server/uv.lock +1032 -0
  208. package/tools/vds-scripts/mypy.ini +5 -0
  209. package/tools/vds-scripts/pyproject.toml +29 -0
  210. package/tools/vds-scripts/repo-manifest.yaml +273 -0
  211. package/tools/vds-scripts/repo-manifest.yaml.example +25 -0
  212. package/tools/vds-scripts/scripts/BRD-Validation-API.postman_collection.json +706 -0
  213. package/tools/vds-scripts/scripts/BRD-Validation-README.md +308 -0
  214. package/tools/vds-scripts/scripts/README.md +162 -0
  215. package/tools/vds-scripts/scripts/bootstrap_uv.sh +30 -0
  216. package/tools/vds-scripts/scripts/brd-validation-environment.json +51 -0
  217. package/tools/vds-scripts/scripts/brd-validation-test-results.json +13023 -0
  218. package/tools/vds-scripts/scripts/brd_coverage_report.json +276 -0
  219. package/tools/vds-scripts/scripts/create_memory_session.py +35 -0
  220. package/tools/vds-scripts/scripts/deployment/load_docker_images_offline.sh +90 -0
  221. package/tools/vds-scripts/scripts/final_completion_report.md +139 -0
  222. package/tools/vds-scripts/scripts/folder_structure_report.json +321 -0
  223. package/tools/vds-scripts/scripts/generate_completion_report.py +125 -0
  224. package/tools/vds-scripts/scripts/generate_intellij_modules.py +150 -0
  225. package/tools/vds-scripts/scripts/link_integrity_report.json +807 -0
  226. package/tools/vds-scripts/scripts/move_audit_artifact_pages.py +255 -0
  227. package/tools/vds-scripts/scripts/move_audit_artifact_pages_rest.py +165 -0
  228. package/tools/vds-scripts/scripts/move_wrong_dept_pages.py +216 -0
  229. package/tools/vds-scripts/scripts/save_intellij_memories.py +120 -0
  230. package/tools/vds-scripts/scripts/save_memories_to_vds_ai.py +83 -0
  231. package/tools/vds-scripts/scripts/save_memories_vds_style.py +129 -0
  232. package/tools/vds-scripts/scripts/search_intellij_memories.py +50 -0
  233. package/tools/vds-scripts/scripts/setup_intellij_workspace.py +65 -0
  234. package/tools/vds-scripts/scripts/target-state-automation/README.md +89 -0
  235. package/tools/vds-scripts/scripts/target-state-automation/confluence_sync_coordinator.sh +27 -0
  236. package/tools/vds-scripts/scripts/target-state-automation/coordination.sh +114 -0
  237. package/tools/vds-scripts/scripts/target-state-automation/diagram_coordinator.sh +25 -0
  238. package/tools/vds-scripts/scripts/target-state-automation/docs_root.sh +22 -0
  239. package/tools/vds-scripts/scripts/target-state-automation/generate_diagrams.sh +22 -0
  240. package/tools/vds-scripts/scripts/target-state-automation/markdown_coordinator.sh +25 -0
  241. package/tools/vds-scripts/scripts/target-state-automation/progress_dashboard.sh +17 -0
  242. package/tools/vds-scripts/scripts/target-state-automation/schema_coordinator.sh +25 -0
  243. package/tools/vds-scripts/scripts/target-state-automation/sync_confluence.sh +30 -0
  244. package/tools/vds-scripts/scripts/target-state-automation/update_dependencies.sh +19 -0
  245. package/tools/vds-scripts/scripts/target-state-automation/validate_links.sh +86 -0
  246. package/tools/vds-scripts/scripts/target-state-automation/validate_markdown.sh +52 -0
  247. package/tools/vds-scripts/scripts/target-state-automation/validate_schemas.sh +26 -0
  248. package/tools/vds-scripts/scripts/target-state-automation/validate_structure.sh +98 -0
  249. package/tools/vds-scripts/scripts/update_modules_xml.py +190 -0
  250. package/tools/vds-scripts/scripts/uv-workspace-alignment-verification-2026-03-25.md +128 -0
  251. package/tools/vds-scripts/scripts/validate_brd_coverage.py +179 -0
  252. package/tools/vds-scripts/scripts/validate_folder_structure.py +240 -0
  253. package/tools/vds-scripts/scripts/validate_link_integrity.py +272 -0
  254. package/tools/vds-scripts/scripts/vds_sh_helpers.sh +180 -0
  255. package/tools/vds-scripts/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +26 -0
  256. package/tools/vds-scripts/scripts/worktree_uv.sh +48 -0
  257. package/tools/vds-scripts/uv.lock +8 -0
  258. package/tools/vds-scripts/vds_cli/README.md +126 -0
  259. package/tools/vds-scripts/vds_cli/VERIFICATION_REPORT.md +41 -0
  260. package/tools/vds-scripts/vds_cli/pyproject.toml +38 -0
  261. package/tools/vds-scripts/vds_cli/src/vds_cli/__init__.py +3 -0
  262. package/tools/vds-scripts/vds_cli/src/vds_cli/cli.py +173 -0
  263. package/tools/vds-scripts/vds_cli/src/vds_cli/docs_sync.py +1203 -0
  264. package/tools/vds-scripts/vds_cli/src/vds_cli/env.py +41 -0
  265. package/tools/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/__init__.py +3 -0
  266. package/tools/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/google_sheets_orchestrator.py +198 -0
  267. package/tools/vds-scripts/vds_cli/src/vds_cli/router.py +93 -0
  268. package/tools/vds-scripts/vds_cli/src/vds_cli/sync_api.py +647 -0
  269. package/tools/vds-scripts/vds_cli/src/vds_cli/sync_service.py +266 -0
  270. package/tools/vds-scripts/vds_cli/tests/__init__.py +2 -0
  271. package/tools/vds-scripts/vds_cli/tests/conftest.py +49 -0
  272. package/tools/vds-scripts/vds_cli/tests/unit/__init__.py +2 -0
  273. package/tools/vds-scripts/vds_cli/tests/unit/test_cli.py +143 -0
  274. package/tools/vds-scripts/vds_cli/tests/unit/test_docs_sync.py +422 -0
  275. package/tools/vds-scripts/vds_cli/tests/unit/test_env.py +51 -0
  276. package/tools/vds-scripts/vds_cli/tests/unit/test_router.py +72 -0
  277. package/tools/vds-scripts/vds_cli/tests/unit/test_sync_api.py +357 -0
  278. package/tools/vds-scripts/vds_cli/tests/unit/test_sync_service.py +160 -0
  279. package/tools/vds-scripts/vds_cli/tests/verification/__init__.py +2 -0
  280. package/tools/vds-scripts/vds_cli/tests/verification/test_bitbucket_real.py +33 -0
  281. package/tools/vds-scripts/vds_cli/tests/verification/test_confluence_real.py +35 -0
  282. package/tools/vds-scripts/vds_cli/tests/verification/test_jira_real.py +41 -0
  283. package/tools/vds-scripts/vds_cli/uv.lock +524 -0
  284. package/tools/vds-scripts/vds_cli_common/README.md +190 -0
  285. package/tools/vds-scripts/vds_cli_common/pyproject.toml +92 -0
  286. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/__init__.py +34 -0
  287. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/completers.py +139 -0
  288. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/context.py +201 -0
  289. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/env.py +119 -0
  290. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/errors.py +318 -0
  291. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/output.py +284 -0
  292. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/paths.py +78 -0
  293. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/testing.py +213 -0
  294. package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/version.py +85 -0
  295. package/tools/vds-scripts/vds_cli_common/tests/__init__.py +1 -0
  296. package/tools/vds-scripts/vds_cli_common/tests/test_completers.py +148 -0
  297. package/tools/vds-scripts/vds_cli_common/tests/test_context.py +192 -0
  298. package/tools/vds-scripts/vds_cli_common/tests/test_env.py +102 -0
  299. package/tools/vds-scripts/vds_cli_common/tests/test_errors.py +186 -0
  300. package/tools/vds-scripts/vds_cli_common/tests/test_output.py +229 -0
  301. package/tools/vds-scripts/vds_cli_common/tests/test_paths.py +61 -0
  302. package/tools/vds-scripts/vds_cli_common/tests/test_testing.py +138 -0
  303. package/tools/vds-scripts/vds_cli_common/tests/test_version.py +64 -0
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Script to update the IntelliJ IDEA modules.xml file with all VDS projects.
4
+ This makes it easier to work with the monorepo as a multi-project workspace.
5
+ """
6
+
7
+ import os
8
+ import xml.etree.ElementTree as ET
9
+
10
+ # Define the project structure
11
+ PROJECT_GROUPS = {
12
+ "LEP-Project": [
13
+ "document-management",
14
+ "document-mgmt",
15
+ "file-management",
16
+ "lending-application-service",
17
+ "lending-basecode",
18
+ "lending-channel-mgmt",
19
+ "lending-cms-be",
20
+ "lending-cms-fe",
21
+ "lending-customer-screening-service",
22
+ "lending-customer-service",
23
+ "lending-decision-service",
24
+ "lending-ekyc-business",
25
+ "lending-ekyc-service",
26
+ "lending-event-backbone",
27
+ "lending-lender-process",
28
+ "lending-lender-service",
29
+ "lending-limit-mgmt",
30
+ "lending-miniapp-fe",
31
+ "lending-notification-service",
32
+ "lending-payment-service",
33
+ "lending-product-mgmt",
34
+ "lending-reconcile-service",
35
+ "lending-refund-service",
36
+ "lending-reminder-process"
37
+ ],
38
+ "INSURANCE-Project": [
39
+ "insurance-authentication-sync-process",
40
+ "insurance-auto-underwriting-process",
41
+ "insurance-centralized-sync-service",
42
+ "insurance-claim-business",
43
+ "insurance-cms-be",
44
+ "insurance-common",
45
+ "insurance-customer-business",
46
+ "insurance-customer-webview",
47
+ "insurance-insurer-service",
48
+ "insurance-job-scheduler",
49
+ "insurance-notification-spi",
50
+ "insurance-ocr-service",
51
+ "insurance-payment-service",
52
+ "insurance-payment-service-v2",
53
+ "insurance-policy-business",
54
+ "insurance-promotion-business",
55
+ "insurance-proposal-business",
56
+ "insurance-reconcile-process",
57
+ "insurance-renewal-process",
58
+ "insurance-socialized-insurance-service",
59
+ "insurance-timeout-process"
60
+ ],
61
+ "SAVING-Project": [
62
+ "saving-account",
63
+ "saving-business",
64
+ "saving-features-management",
65
+ "saving-job-management",
66
+ "saving-order",
67
+ "saving-promotion",
68
+ "saving-refund-process",
69
+ "saving-spi",
70
+ "saving-timeout-process",
71
+ "saving-transaction"
72
+ ],
73
+ "EKYC-Project": [
74
+ "ekyc-business",
75
+ "ekyc-service"
76
+ ],
77
+ "Infrastructure": [
78
+ "VDS-AI-Memory",
79
+ "vds-scripts"
80
+ ],
81
+ "Documentation": [
82
+ "docs-nttc"
83
+ ]
84
+ }
85
+
86
+ def update_modules_xml(vds_root):
87
+ """
88
+ Update the IntelliJ IDEA modules.xml file with all projects.
89
+ """
90
+ # Path to modules.xml
91
+ modules_xml_path = os.path.join(vds_root, ".idea", "modules.xml")
92
+
93
+ # Parse existing modules.xml
94
+ try:
95
+ tree = ET.parse(modules_xml_path)
96
+ root = tree.getroot()
97
+ except FileNotFoundError:
98
+ # Create new modules.xml if it doesn't exist
99
+ root = ET.Element("project", {"version": "4"})
100
+ component = ET.SubElement(root, "component", {"name": "ProjectModuleManager"})
101
+ modules = ET.SubElement(component, "modules")
102
+ tree = ET.ElementTree(root)
103
+
104
+ # Find the modules element
105
+ modules_element = root.find(".//modules")
106
+ if modules_element is None:
107
+ component = root.find(".//component[@name='ProjectModuleManager']")
108
+ if component is None:
109
+ component = ET.SubElement(root, "component", {"name": "ProjectModuleManager"})
110
+ modules_element = ET.SubElement(component, "modules")
111
+
112
+ # Clear existing VDS module entries (but keep the main vds.iml)
113
+ existing_modules = modules_element.findall("module")
114
+ for module in existing_modules:
115
+ file_path = module.get("filepath", "")
116
+ # Remove any existing VDS project module entries to avoid duplicates
117
+ if any(project_dir in file_path for project_dir in [
118
+ "LEP-project", "INSURANCE-project", "SAVING-project", "EKYC-project",
119
+ "VDS-AI-Memory", "vds-scripts", "docs-nttc"
120
+ ]):
121
+ modules_element.remove(module)
122
+
123
+ # Add modules for each project
124
+ for group_name, projects in PROJECT_GROUPS.items():
125
+ for project in projects:
126
+ # Construct the module file path
127
+ if project in ["VDS-AI-Memory", "vds-scripts", "docs-nttc"]:
128
+ # These are top-level directories
129
+ module_file_path = f"$PROJECT_DIR$/{project}/.idea/{project}.iml"
130
+ module_file_url = f"file://$PROJECT_DIR$/{project}/.idea/{project}.iml"
131
+ else:
132
+ # These are in project directories
133
+ module_file_path = f"$PROJECT_DIR$/{group_name.split('-')[0]}-project/{project}/{project}.iml"
134
+ module_file_url = f"file://$PROJECT_DIR$/{group_name.split('-')[0]}-project/{project}/{project}.iml"
135
+
136
+ # Check if module entry already exists
137
+ existing = False
138
+ for module in modules_element.findall("module"):
139
+ if module.get("filepath") == module_file_path:
140
+ existing = True
141
+ break
142
+
143
+ # Add module entry if it doesn't exist
144
+ if not existing:
145
+ module_element = ET.SubElement(modules_element, "module", {
146
+ "fileurl": module_file_url,
147
+ "filepath": module_file_path,
148
+ "group": group_name
149
+ })
150
+
151
+ # Write updated modules.xml with proper formatting
152
+ # Create a temporary file with proper formatting
153
+ temp_file = modules_xml_path + ".tmp"
154
+ tree.write(temp_file, encoding="UTF-8", xml_declaration=True)
155
+
156
+ # Read and format the XML properly
157
+ with open(temp_file, 'r') as f:
158
+ content = f.read()
159
+
160
+ # Parse and reformat with proper indentation
161
+ import xml.dom.minidom
162
+ dom = xml.dom.minidom.parseString(content)
163
+ pretty_xml = dom.toprettyxml(indent=" ")
164
+
165
+ # Remove extra blank lines
166
+ lines = [line for line in pretty_xml.split('\n') if line.strip()]
167
+ pretty_xml = '\n'.join(lines)
168
+
169
+ with open(modules_xml_path, 'w') as f:
170
+ f.write(pretty_xml)
171
+
172
+ # Remove temporary file
173
+ os.remove(temp_file)
174
+
175
+ print(f"Updated modules.xml: {modules_xml_path}")
176
+
177
+ def main():
178
+ """
179
+ Main function to update modules.xml.
180
+ """
181
+ vds_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
182
+
183
+ print(f"Updating IntelliJ IDEA modules.xml in: {vds_root}")
184
+
185
+ update_modules_xml(vds_root)
186
+
187
+ print("modules.xml update complete!")
188
+
189
+ if __name__ == "__main__":
190
+ main()
@@ -0,0 +1,128 @@
1
+ # Scripts UV Workspace Alignment Verification Note
2
+
3
+ Date: 2026-03-25
4
+ Branch: `feat/scripts-uv-workspace-alignment`
5
+ Scope: helper/bootstrap/script-shell alignment for `WHO-project/vds-scripts/scripts/`
6
+
7
+ ## Summary
8
+
9
+ This note records the bounded verification run for the current implementation lane.
10
+ The purpose is to prove that the updated shell contract works across the main
11
+ contexts called out by the spec:
12
+
13
+ - clean shell execution
14
+ - polluted parent environment execution
15
+ - non-standard nested caller path execution
16
+
17
+ It also records one helper portability fix discovered during verification.
18
+
19
+ ## Verified contract
20
+
21
+ The current intended contract is:
22
+
23
+ - maintained scripts use `scripts/worktree_uv.sh` through `scripts/vds_sh_helpers.sh`
24
+ - helper-driven invocations bind the workspace explicitly with `--directory <vds-scripts-root>`
25
+ - helper-driven package targeting resolves workspace member directories to uv project names for `--package`
26
+ - canonical integrated bootstrap assumes Python 3.14+
27
+
28
+ ## Three-context regression matrix
29
+
30
+ ### Context 1 — clean shell
31
+
32
+ Command class verified:
33
+ - helper-driven spec package help surface
34
+
35
+ Observed result:
36
+ - passed
37
+
38
+ Notes:
39
+ - `vds_uv_run_package spec_orchestrator vds-spec --help` succeeded from the implementation worktree with no inherited environment state.
40
+
41
+ ### Context 2 — polluted parent environment
42
+
43
+ Command class verified:
44
+ - helper-driven routed CLI command with fake parent environment values
45
+
46
+ Injected environment:
47
+ - `VIRTUAL_ENV=/tmp/fake-venv`
48
+ - `UV_PROJECT_ENVIRONMENT=/tmp/fake-project-env`
49
+ - `CONDA_PREFIX=/tmp/fake-conda`
50
+
51
+ Observed result:
52
+ - passed
53
+
54
+ Notes:
55
+ - `vds_uv_run_package vds_cli vds-cli doctor` succeeded.
56
+ - The wrapper/helper path remained functional despite the polluted parent environment.
57
+
58
+ ### Context 3 — non-standard nested caller path
59
+
60
+ Command class verified:
61
+ - targeted sync helper script launched from `scripts/target-state-automation/`
62
+
63
+ Observed result:
64
+ - passed
65
+
66
+ Notes:
67
+ - `UV_SYNC_FLAGS=--dry-run ./update_dependencies.sh` succeeded when launched from the nested target-state-automation directory.
68
+ - This confirms root resolution and wrapper binding do not depend on the older hardcoded 4-level traversal pattern.
69
+
70
+ ## Additional bounded verification already passed in this lane
71
+
72
+ Previously verified in this worktree:
73
+
74
+ - helper-driven `vds-spec --help`
75
+ - helper-driven `vds-cli status`
76
+ - helper-driven `vds-cli doctor`
77
+ - helper-driven `vds-markdown --help`
78
+ - targeted bootstrap dry-run
79
+ - full bootstrap dry-run
80
+ - updated shell scripts syntax-check cleanly
81
+
82
+ ## Helper portability fix discovered during verification
83
+
84
+ ### Issue
85
+
86
+ The initial helper implementation used host `python3` plus `tomllib` to resolve
87
+ workspace member directory names to uv package names.
88
+
89
+ That failed in a shell path where `python3` did not provide `tomllib`.
90
+
91
+ ### Fix
92
+
93
+ The helper was updated to parse `[project].name` from member `pyproject.toml`
94
+ using shell/awk logic instead of host Python.
95
+
96
+ ### Outcome
97
+
98
+ Package-name resolution no longer depends on a host Python 3.11+ runtime just to
99
+ run the shell helper layer.
100
+
101
+ ## Known follow-up outside helper-layer closure
102
+
103
+ ### `scripts/target-state-automation/validate_schemas.sh`
104
+
105
+ The script now routes through the helper correctly, but the underlying schema
106
+ command shape appears stale relative to the current `vds-cli schema` /
107
+ `vds-schema-convert` compatibility surface.
108
+
109
+ The script has therefore been updated to fail explicitly and truthfully with a
110
+ clear follow-up message instead of forwarding operators into a stale command and
111
+ producing a confusing CLI option error.
112
+
113
+ This remains classified as:
114
+ - schema-command drift follow-up
115
+ - not a helper-layer regression
116
+
117
+ ## Closure assessment for this lane
118
+
119
+ For the shell/uv alignment scope covered by this branch:
120
+ - helper consolidation: complete
121
+ - bootstrap alignment: complete
122
+ - maintained script migration in scope: complete
123
+ - docs alignment in scope: complete
124
+ - three-context regression matrix: complete
125
+
126
+ This branch is ready for review/merge for the intended helper/bootstrap/docs
127
+ alignment scope, with `validate_schemas.sh` command-surface drift explicitly
128
+ left as separate follow-up work.
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ BRD Coverage Validation Script
4
+ Validates that all required BRD sections (3.1-3.5 and 4.1-4.11) are mapped to services.
5
+ """
6
+
7
+ import os
8
+ import re
9
+ from pathlib import Path
10
+ from typing import Dict, List, Set
11
+ import json
12
+
13
+ # Required BRD sections
14
+ REQUIRED_BRD_SECTIONS = [
15
+ # Customer features
16
+ "3.1", "3.2", "3.3", "3.4", "3.5",
17
+ # Admin features
18
+ "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9", "4.10", "4.11"
19
+ ]
20
+
21
+ # High-priority services with known BRD mappings
22
+ HIGH_PRIORITY_SERVICES = {
23
+ "insurance-policy-business": ["3.4", "4.5"],
24
+ "insurance-proposal-business": ["3.3.5", "3.3.6", "3.3.7", "3.3.8"],
25
+ "insurance-claim-business": ["3.5", "4.6"],
26
+ "insurance-customer-business": ["3.1", "3.2", "4.4"],
27
+ "insurance-product-catalog": ["4.3", "4.3.1"],
28
+ "insurance-rating-engine": ["3.3.5", "4.3.3"],
29
+ "insurance-renewal-process": ["3.4.2", "3.4.3", "3.4.4"]
30
+ }
31
+
32
+ def find_brd_references_in_file(file_path: Path) -> Set[str]:
33
+ """Find all BRD section references in a file."""
34
+ brd_refs = set()
35
+ try:
36
+ with open(file_path, 'r', encoding='utf-8') as f:
37
+ content = f.read()
38
+
39
+ # Pattern to match BRD references like "3.1", "4.5", "3.3.5", etc.
40
+ pattern = r'BRD.*?([34]\.\d+(?:\.\d+)*)'
41
+ matches = re.findall(pattern, content, re.IGNORECASE)
42
+
43
+ for match in matches:
44
+ brd_refs.add(match)
45
+
46
+ except Exception as e:
47
+ print(f"Error reading {file_path}: {e}")
48
+
49
+ return brd_refs
50
+
51
+ def scan_documentation_for_brd_refs(docs_root: Path) -> Dict[str, Set[str]]:
52
+ """Scan all documentation files for BRD references."""
53
+ brd_coverage = {}
54
+
55
+ # Scan markdown files
56
+ for md_file in docs_root.rglob("*.md"):
57
+ if md_file.is_file():
58
+ refs = find_brd_references_in_file(md_file)
59
+ if refs:
60
+ relative_path = str(md_file.relative_to(docs_root))
61
+ brd_coverage[relative_path] = refs
62
+
63
+ return brd_coverage
64
+
65
+ def validate_brd_coverage() -> Dict:
66
+ """Validate BRD coverage completeness."""
67
+
68
+ # Get the documentation root
69
+ script_dir = Path(__file__).parent
70
+ docs_root = script_dir.parent / "insurance-document"
71
+
72
+ if not docs_root.exists():
73
+ docs_root = script_dir.parent.parent / "insurance-document"
74
+
75
+ if not docs_root.exists():
76
+ print(f"āŒ Documentation root not found at {docs_root}")
77
+ return {"error": "Documentation root not found"}
78
+
79
+ print(f"šŸ” Scanning documentation at: {docs_root}")
80
+
81
+ # Scan for BRD references
82
+ brd_coverage = scan_documentation_for_brd_refs(docs_root)
83
+
84
+ # Collect all found BRD sections
85
+ found_sections = set()
86
+ for file_refs in brd_coverage.values():
87
+ found_sections.update(file_refs)
88
+
89
+ # Check coverage
90
+ required_sections = set(REQUIRED_BRD_SECTIONS)
91
+ covered_sections = set()
92
+
93
+ # Map found sections to required sections
94
+ for found in found_sections:
95
+ for required in required_sections:
96
+ if found.startswith(required):
97
+ covered_sections.add(required)
98
+
99
+ missing_sections = required_sections - covered_sections
100
+
101
+ # Generate report
102
+ report = {
103
+ "total_required": len(required_sections),
104
+ "total_covered": len(covered_sections),
105
+ "coverage_percentage": (len(covered_sections) / len(required_sections)) * 100,
106
+ "covered_sections": sorted(list(covered_sections)),
107
+ "missing_sections": sorted(list(missing_sections)),
108
+ "found_references": dict((k, sorted(list(v))) for k, v in brd_coverage.items()),
109
+ "high_priority_services": HIGH_PRIORITY_SERVICES
110
+ }
111
+
112
+ return report
113
+
114
+ def print_coverage_report(report: Dict):
115
+ """Print a formatted coverage report."""
116
+
117
+ if "error" in report:
118
+ print(f"āŒ {report['error']}")
119
+ return
120
+
121
+ print("\n" + "="*60)
122
+ print("šŸ“Š BRD COVERAGE VALIDATION REPORT")
123
+ print("="*60)
124
+
125
+ print(f"\nšŸ“ˆ Coverage Summary:")
126
+ print(f" Total Required Sections: {report['total_required']}")
127
+ print(f" Covered Sections: {report['total_covered']}")
128
+ print(f" Coverage Percentage: {report['coverage_percentage']:.1f}%")
129
+
130
+ if report['coverage_percentage'] >= 100:
131
+ print(" āœ… 100% BRD coverage achieved!")
132
+ elif report['coverage_percentage'] >= 80:
133
+ print(" āš ļø Good coverage, but some sections missing")
134
+ else:
135
+ print(" āŒ Insufficient BRD coverage")
136
+
137
+ print(f"\nāœ… Covered Sections ({len(report['covered_sections'])}):")
138
+ for section in report['covered_sections']:
139
+ print(f" • {section}")
140
+
141
+ if report['missing_sections']:
142
+ print(f"\nāŒ Missing Sections ({len(report['missing_sections'])}):")
143
+ for section in report['missing_sections']:
144
+ print(f" • {section}")
145
+
146
+ print(f"\nšŸ” High-Priority Service Mappings:")
147
+ for service, sections in report['high_priority_services'].items():
148
+ print(f" • {service}: {', '.join(sections)}")
149
+
150
+ print(f"\nšŸ“ Files with BRD References ({len(report['found_references'])}):")
151
+ for file_path, refs in list(report['found_references'].items())[:10]: # Show first 10
152
+ print(f" • {file_path}: {', '.join(refs)}")
153
+
154
+ if len(report['found_references']) > 10:
155
+ print(f" ... and {len(report['found_references']) - 10} more files")
156
+
157
+ if __name__ == "__main__":
158
+ print("šŸš€ Starting BRD Coverage Validation...")
159
+ report = validate_brd_coverage()
160
+ print_coverage_report(report)
161
+
162
+ # Save report to file
163
+ script_dir = Path(__file__).parent
164
+ report_file = script_dir / "brd_coverage_report.json"
165
+
166
+ with open(report_file, 'w') as f:
167
+ json.dump(report, f, indent=2)
168
+
169
+ print(f"\nšŸ’¾ Report saved to: {report_file}")
170
+
171
+ # Exit with appropriate code
172
+ if "error" in report:
173
+ exit(1)
174
+ elif report['coverage_percentage'] < 100:
175
+ print(f"\nāš ļø BRD coverage incomplete: {report['coverage_percentage']:.1f}%")
176
+ exit(1)
177
+ else:
178
+ print(f"\nāœ… BRD coverage validation passed: {report['coverage_percentage']:.1f}%")
179
+ exit(0)