@ngocsangairvds/vsaf 3.1.26 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/global.js +70 -10
- package/tools/skills/vds-scripts-skill/.openskills.json +6 -0
- package/tools/skills/vds-scripts-skill/QUALITY.md +44 -0
- package/tools/skills/vds-scripts-skill/SKILL.md +135 -0
- package/tools/skills/vds-scripts-skill/references/audit-commands.md +171 -0
- package/tools/skills/vds-scripts-skill/references/capability-index.md +34 -0
- package/tools/skills/vds-scripts-skill/references/development-commands.md +12 -0
- package/tools/skills/vds-scripts-skill/references/google-sheets.md +73 -0
- package/tools/skills/vds-scripts-skill/references/integration-commands.md +17 -0
- package/tools/skills/vds-scripts-skill/references/platform-bootstrap.md +31 -0
- package/tools/skills/vds-scripts-skill/references/specialist-routing.md +14 -0
- package/tools/skills/vds-scripts-skill/references/validation-commands.md +15 -0
- package/tools/skills/vsaf-build/SKILL.md +32 -2
- package/tools/skills/vsaf-push-prd/SKILL.md +43 -40
- package/tools/skills/vsaf-push-srs/SKILL.md +44 -41
- package/tools/skills/vsaf-ship/SKILL.md +41 -10
- package/tools/skills/vsaf-test/SKILL.md +8 -0
- package/tools/vds-scripts/.mcp.json +11 -0
- package/tools/vds-scripts/.secrets.baseline +133 -0
- package/tools/vds-scripts/AGENTS.md +152 -0
- package/tools/vds-scripts/CLAUDE.md +101 -0
- package/tools/vds-scripts/CLI_COMMAND_OPTIMIZATION.md +156 -0
- package/tools/vds-scripts/PACKAGE_P125B_IMPLEMENTATION_SUMMARY.md +131 -0
- package/tools/vds-scripts/PROJECT_COMPLETION_SUMMARY.md +45 -0
- package/tools/vds-scripts/README.md +97 -0
- package/tools/vds-scripts/bitbucket_manifest_mapping.toml +34 -0
- package/tools/vds-scripts/bitbucket_orchestrator/ARCHITECTURE_ANALYSIS.md +258 -0
- package/tools/vds-scripts/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +393 -0
- package/tools/vds-scripts/bitbucket_orchestrator/EVALUATION_REPORT.md +61 -0
- package/tools/vds-scripts/bitbucket_orchestrator/FEATURES.md +908 -0
- package/tools/vds-scripts/bitbucket_orchestrator/README.md +687 -0
- package/tools/vds-scripts/bitbucket_orchestrator/pyproject.toml +40 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/__init__.py +20 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/async_client.py +657 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/cli.py +2108 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/client.py +2534 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/config.py +171 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/errors.py +67 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/factory.py +185 -0
- package/tools/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/protocols.py +244 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/__init__.py +8 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/conftest.py +65 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_advanced_search.py +151 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_async_client.py +546 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_branch_permissions.py +145 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_cli.py +115 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client.py +157 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_branch_conditions.py +79 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_code_advanced.py +163 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_code_file.py +32 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_deployment_environments.py +194 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_issues.py +164 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_pipelines_advanced.py +179 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_pr_blockers.py +119 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_client_repository_variables.py +156 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code.py +98 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code_advanced.py +282 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_code_insights.py +335 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_conditions.py +147 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_config.py +131 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_deployment_env.py +352 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_factory.py +371 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_fork_operations.py +204 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_issue_cli.py +261 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_pipeline_advanced.py +270 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_pr_blocker.py +204 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_protocols.py +334 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_repo_settings.py +343 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_repo_variables.py +270 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_webhooks.py +189 -0
- package/tools/vds-scripts/bitbucket_orchestrator/tests/test_workspace.py +233 -0
- package/tools/vds-scripts/bitbucket_orchestrator/uv.lock +742 -0
- package/tools/vds-scripts/confluence_orchestrator/Dockerfile +19 -0
- package/tools/vds-scripts/confluence_orchestrator/README.md +412 -0
- package/tools/vds-scripts/confluence_orchestrator/SYNC_SCRIPTS.md +127 -0
- package/tools/vds-scripts/confluence_orchestrator/SYNC_STANDARDIZATION.md +108 -0
- package/tools/vds-scripts/confluence_orchestrator/pyproject.toml +48 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/__init__.py +20 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/cli.py +2532 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/config.py +175 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content.py +290 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content_v2.py +94 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/crawl_tree.py +1835 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/errors.py +80 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/eventing.py +109 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/http.py +1114 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/orchestration.py +165 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/reporting.py +78 -0
- package/tools/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree.py +121 -0
- package/tools/vds-scripts/confluence_orchestrator/sync_pdfs_from_markdown.py +213 -0
- package/tools/vds-scripts/confluence_orchestrator/sync_pdfs_to_confluence.py +305 -0
- package/tools/vds-scripts/confluence_orchestrator/sync_png_attachments.py +305 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/__init__.py +0 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/conftest.py +8 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_advanced_content.py +224 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_advanced_search.py +188 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_cache_management.py +247 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_cli.py +499 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_config.py +83 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_content.py +186 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_content_flags.py +27 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_crawl_tree.py +2250 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_draft_management.py +223 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing.py +71 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_chaos.py +37 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_rate_limit.py +44 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_eventing_timeout.py +49 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_export.py +230 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_history.py +204 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_http.py +117 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_orchestration.py +91 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_reporting.py +24 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_search_cql.py +34 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_space_management.py +237 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_space_permissions.py +332 -0
- package/tools/vds-scripts/confluence_orchestrator/tests/test_user_group_management.py +388 -0
- package/tools/vds-scripts/confluence_orchestrator/uv.lock +1023 -0
- package/tools/vds-scripts/git_orchestrator/ENHANCEMENT_SUMMARY.md +119 -0
- package/tools/vds-scripts/git_orchestrator/README.md +280 -0
- package/tools/vds-scripts/git_orchestrator/VERIFICATION_REPORT.md +152 -0
- package/tools/vds-scripts/git_orchestrator/pyproject.toml +35 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__init__.py +7 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__main__.py +4 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/cli.py +847 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/logging_config.py +63 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/manifest.py +129 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/orchestrator.py +819 -0
- package/tools/vds-scripts/git_orchestrator/src/vds_git_orchestrator/reporting.py +53 -0
- package/tools/vds-scripts/git_orchestrator/tests/__init__.py +0 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_cli_settings.py +21 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_integration.py +74 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_manifest.py +79 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_orchestrator.py +204 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_public_api.py +236 -0
- package/tools/vds-scripts/git_orchestrator/tests/test_resilience.py +345 -0
- package/tools/vds-scripts/git_orchestrator/uv.lock +271 -0
- package/tools/vds-scripts/jira_orchestrator/README.md +770 -0
- package/tools/vds-scripts/jira_orchestrator/pyproject.toml +39 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/__init__.py +1 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/adapter.py +1320 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/cli.py +2271 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/config.py +138 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/errors.py +67 -0
- package/tools/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/reporting.py +65 -0
- package/tools/vds-scripts/jira_orchestrator/tests/__init__.py +1 -0
- package/tools/vds-scripts/jira_orchestrator/tests/conftest.py +86 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_bulk_operations.py +69 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_components.py +57 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_createmeta.py +45 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_dashboard.py +117 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_issue_properties.py +54 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_permissions_compat.py +42 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_reindex.py +42 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_remote_links.py +76 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_transitions.py +91 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_user_management.py +110 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_version_management.py +133 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_adapter_watchers.py +41 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_advanced_search.py +164 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_agile.py +256 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_application_properties.py +193 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_backlog.py +91 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_bulk_operations.py +277 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_cli.py +106 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_components.py +106 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_config.py +164 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_dashboard.py +122 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_discover_fields.py +207 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_filter_management.py +333 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_issue_archiving.py +164 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_issue_links.py +257 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_issue_properties.py +171 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_link_types.py +314 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_parse_set.py +37 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_permissions.py +273 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_reindex.py +81 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_remote_links.py +254 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_security_schemes.py +170 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_transitions_changelog.py +114 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_user_management.py +226 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_version_management.py +339 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_watchers.py +101 -0
- package/tools/vds-scripts/jira_orchestrator/tests/test_worklog.py +223 -0
- package/tools/vds-scripts/jira_orchestrator/uv.lock +738 -0
- package/tools/vds-scripts/mcp_server/Dockerfile +34 -0
- package/tools/vds-scripts/mcp_server/README.md +140 -0
- package/tools/vds-scripts/mcp_server/pyproject.toml +42 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/__init__.py +4 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/config.py +36 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/server.py +66 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/__init__.py +14 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/bitbucket_tools.py +47 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/confluence_tools.py +59 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/git_tools.py +71 -0
- package/tools/vds-scripts/mcp_server/src/vds_mcp_server/tools/jira_tools.py +63 -0
- package/tools/vds-scripts/mcp_server/tests/__init__.py +2 -0
- package/tools/vds-scripts/mcp_server/tests/conftest.py +29 -0
- package/tools/vds-scripts/mcp_server/tests/unit/__init__.py +2 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_bitbucket_tools.py +25 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_confluence_tools.py +25 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_git_tools.py +32 -0
- package/tools/vds-scripts/mcp_server/tests/unit/test_jira_tools.py +32 -0
- package/tools/vds-scripts/mcp_server/tests/verification/__init__.py +2 -0
- package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_confluence_tools.py +40 -0
- package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_jira_tools.py +37 -0
- package/tools/vds-scripts/mcp_server/tests/verification/test_mcp_tool_registration.py +47 -0
- package/tools/vds-scripts/mcp_server/uv.lock +1032 -0
- package/tools/vds-scripts/mypy.ini +5 -0
- package/tools/vds-scripts/pyproject.toml +29 -0
- package/tools/vds-scripts/repo-manifest.yaml +273 -0
- package/tools/vds-scripts/repo-manifest.yaml.example +25 -0
- package/tools/vds-scripts/scripts/BRD-Validation-API.postman_collection.json +706 -0
- package/tools/vds-scripts/scripts/BRD-Validation-README.md +308 -0
- package/tools/vds-scripts/scripts/README.md +162 -0
- package/tools/vds-scripts/scripts/bootstrap_uv.sh +30 -0
- package/tools/vds-scripts/scripts/brd-validation-environment.json +51 -0
- package/tools/vds-scripts/scripts/brd-validation-test-results.json +13023 -0
- package/tools/vds-scripts/scripts/brd_coverage_report.json +276 -0
- package/tools/vds-scripts/scripts/create_memory_session.py +35 -0
- package/tools/vds-scripts/scripts/deployment/load_docker_images_offline.sh +90 -0
- package/tools/vds-scripts/scripts/final_completion_report.md +139 -0
- package/tools/vds-scripts/scripts/folder_structure_report.json +321 -0
- package/tools/vds-scripts/scripts/generate_completion_report.py +125 -0
- package/tools/vds-scripts/scripts/generate_intellij_modules.py +150 -0
- package/tools/vds-scripts/scripts/link_integrity_report.json +807 -0
- package/tools/vds-scripts/scripts/move_audit_artifact_pages.py +255 -0
- package/tools/vds-scripts/scripts/move_audit_artifact_pages_rest.py +165 -0
- package/tools/vds-scripts/scripts/move_wrong_dept_pages.py +216 -0
- package/tools/vds-scripts/scripts/save_intellij_memories.py +120 -0
- package/tools/vds-scripts/scripts/save_memories_to_vds_ai.py +83 -0
- package/tools/vds-scripts/scripts/save_memories_vds_style.py +129 -0
- package/tools/vds-scripts/scripts/search_intellij_memories.py +50 -0
- package/tools/vds-scripts/scripts/setup_intellij_workspace.py +65 -0
- package/tools/vds-scripts/scripts/target-state-automation/README.md +89 -0
- package/tools/vds-scripts/scripts/target-state-automation/confluence_sync_coordinator.sh +27 -0
- package/tools/vds-scripts/scripts/target-state-automation/coordination.sh +114 -0
- package/tools/vds-scripts/scripts/target-state-automation/diagram_coordinator.sh +25 -0
- package/tools/vds-scripts/scripts/target-state-automation/docs_root.sh +22 -0
- package/tools/vds-scripts/scripts/target-state-automation/generate_diagrams.sh +22 -0
- package/tools/vds-scripts/scripts/target-state-automation/markdown_coordinator.sh +25 -0
- package/tools/vds-scripts/scripts/target-state-automation/progress_dashboard.sh +17 -0
- package/tools/vds-scripts/scripts/target-state-automation/schema_coordinator.sh +25 -0
- package/tools/vds-scripts/scripts/target-state-automation/sync_confluence.sh +30 -0
- package/tools/vds-scripts/scripts/target-state-automation/update_dependencies.sh +19 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_links.sh +86 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_markdown.sh +52 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_schemas.sh +26 -0
- package/tools/vds-scripts/scripts/target-state-automation/validate_structure.sh +98 -0
- package/tools/vds-scripts/scripts/update_modules_xml.py +190 -0
- package/tools/vds-scripts/scripts/uv-workspace-alignment-verification-2026-03-25.md +128 -0
- package/tools/vds-scripts/scripts/validate_brd_coverage.py +179 -0
- package/tools/vds-scripts/scripts/validate_folder_structure.py +240 -0
- package/tools/vds-scripts/scripts/validate_link_integrity.py +272 -0
- package/tools/vds-scripts/scripts/vds_sh_helpers.sh +180 -0
- package/tools/vds-scripts/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +26 -0
- package/tools/vds-scripts/scripts/worktree_uv.sh +48 -0
- package/tools/vds-scripts/uv.lock +8 -0
- package/tools/vds-scripts/vds_cli/README.md +126 -0
- package/tools/vds-scripts/vds_cli/VERIFICATION_REPORT.md +41 -0
- package/tools/vds-scripts/vds_cli/pyproject.toml +38 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/__init__.py +3 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/cli.py +173 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/docs_sync.py +1203 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/env.py +41 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/__init__.py +3 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/google_sheets_orchestrator.py +198 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/router.py +93 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/sync_api.py +647 -0
- package/tools/vds-scripts/vds_cli/src/vds_cli/sync_service.py +266 -0
- package/tools/vds-scripts/vds_cli/tests/__init__.py +2 -0
- package/tools/vds-scripts/vds_cli/tests/conftest.py +49 -0
- package/tools/vds-scripts/vds_cli/tests/unit/__init__.py +2 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_cli.py +143 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_docs_sync.py +422 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_env.py +51 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_router.py +72 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_sync_api.py +357 -0
- package/tools/vds-scripts/vds_cli/tests/unit/test_sync_service.py +160 -0
- package/tools/vds-scripts/vds_cli/tests/verification/__init__.py +2 -0
- package/tools/vds-scripts/vds_cli/tests/verification/test_bitbucket_real.py +33 -0
- package/tools/vds-scripts/vds_cli/tests/verification/test_confluence_real.py +35 -0
- package/tools/vds-scripts/vds_cli/tests/verification/test_jira_real.py +41 -0
- package/tools/vds-scripts/vds_cli/uv.lock +524 -0
- package/tools/vds-scripts/vds_cli_common/README.md +190 -0
- package/tools/vds-scripts/vds_cli_common/pyproject.toml +92 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/__init__.py +34 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/completers.py +139 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/context.py +201 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/env.py +119 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/errors.py +318 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/output.py +284 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/paths.py +78 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/testing.py +213 -0
- package/tools/vds-scripts/vds_cli_common/src/vds_cli_common/version.py +85 -0
- package/tools/vds-scripts/vds_cli_common/tests/__init__.py +1 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_completers.py +148 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_context.py +192 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_env.py +102 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_errors.py +186 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_output.py +229 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_paths.py +61 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_testing.py +138 -0
- package/tools/vds-scripts/vds_cli_common/tests/test_version.py +64 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Validation Commands
|
|
2
|
+
|
|
3
|
+
Representative WHO validation and docs command families:
|
|
4
|
+
|
|
5
|
+
- `vds-cli openapi ...`
|
|
6
|
+
- `vds-cli links ...`
|
|
7
|
+
- `vds-cli structure ...`
|
|
8
|
+
- `vds-cli schema ...`
|
|
9
|
+
- `vds-cli pdf ...`
|
|
10
|
+
- `vds-cli diagrams ...`
|
|
11
|
+
- `vds-cli excel ...`
|
|
12
|
+
- `vds-cli google-sheets ...`
|
|
13
|
+
- `vds-markdown ...`
|
|
14
|
+
|
|
15
|
+
Use specialist docs or package READMEs for deeper command coverage.
|
|
@@ -5,6 +5,16 @@ description: Implement code following existing PRD + SRS + testcases. Use after
|
|
|
5
5
|
|
|
6
6
|
# VSAF Build
|
|
7
7
|
|
|
8
|
+
## Applied Rules
|
|
9
|
+
|
|
10
|
+
> These rules apply to all code implemented through this flow. Read the full rule before proceeding.
|
|
11
|
+
|
|
12
|
+
| Rule | File | Applies to |
|
|
13
|
+
|------|------|------------|
|
|
14
|
+
| Run Verification After Coding | `.vsaf/rules/dev/java/run_verification_after_coding.md` | Every task implementation |
|
|
15
|
+
| SonarQube Coding Standard | `.vsaf/rules/dev/java/sonarqube_coding_standard.md` | Java projects only |
|
|
16
|
+
| Java Project Development Rules | `.vsaf/rules/dev/java/java_Project_Development_Rules.md` | Java projects only |
|
|
17
|
+
|
|
8
18
|
## Objective
|
|
9
19
|
Implement code strictly following PRD, SRS, and testcases, one task at a time, with TDD — ensuring each commit has tests passing AND is verified against spec.
|
|
10
20
|
|
|
@@ -57,6 +67,21 @@ Implement code strictly following PRD, SRS, and testcases, one task at a time, w
|
|
|
57
67
|
- Have a clear verification step
|
|
58
68
|
- Be small enough for 1 commit
|
|
59
69
|
|
|
70
|
+
### Step 2.5 — Code Quality Gate (mandatory for Java projects)
|
|
71
|
+
|
|
72
|
+
Before writing any code, confirm the quality baseline:
|
|
73
|
+
|
|
74
|
+
- Read `.vsaf/rules/dev/java/sonarqube_coding_standard.md` — internalize all rules (zero Critical/Blocker, ≥80% new-code coverage, no `System.out`, no hardcoded credentials, etc.)
|
|
75
|
+
- Read `.vsaf/rules/dev/java/java_Project_Development_Rules.md` — enforce: methods ≤40 lines, nesting ≤3 levels, `@Transactional` at service layer only, coverage ≥70%
|
|
76
|
+
- During every task implementation, actively prevent violations:
|
|
77
|
+
- Use SLF4J logger — never `System.out.println` / `e.printStackTrace()`
|
|
78
|
+
- Use try-with-resources for all closeable resources
|
|
79
|
+
- Null-check before dereferencing, use `Optional.orElseThrow()` not `.get()`
|
|
80
|
+
- Extract constants for string literals repeated ≥3 times
|
|
81
|
+
- Keep cognitive complexity ≤15 and cyclomatic complexity ≤10 per method
|
|
82
|
+
- After each task commit: mentally verify no SonarQube Blocker/Critical rules were introduced
|
|
83
|
+
- If the project is **not Java**: skip this step
|
|
84
|
+
|
|
60
85
|
### Step 2b — Subagent dispatch (large plans, optional)
|
|
61
86
|
- If plan has ≥ 20 tasks AND HAS_SUPERPOWERS: use `superpowers:subagent-driven-development`
|
|
62
87
|
- Dispatch tasks to sub-agents with a two-phase review pipeline
|
|
@@ -73,9 +98,14 @@ Implement code strictly following PRD, SRS, and testcases, one task at a time, w
|
|
|
73
98
|
|
|
74
99
|
- After each task, run sequentially:
|
|
75
100
|
1. `mcp__gitnexus__detect_changes` — verify only the expected files changed
|
|
76
|
-
2. **Verification against spec** (mandatory)
|
|
77
|
-
-
|
|
101
|
+
2. **Verification against spec** (mandatory) — follow `.vsaf/rules/dev/java/run_verification_after_coding.md`:
|
|
102
|
+
- Compile with zero errors (`mvn clean compile` for Maven, equivalent for other build tools)
|
|
103
|
+
- Run all tests — all must pass (`mvn test`)
|
|
104
|
+
- Start the application — confirm it boots with no errors
|
|
105
|
+
- Trigger the changed endpoint/logic with a real request and confirm the response
|
|
106
|
+
- **If HAS_SUPERPOWERS**: additionally use `superpowers:verification-before-completion` — confirm outcome matches SRS intent
|
|
78
107
|
- **If not**: self-verify: re-read the corresponding FR/NFR in SRS, confirm behavior is correct, record verification result
|
|
108
|
+
- If full environment is unavailable: use Docker Compose / Testcontainers / mock boundary — do NOT skip verification
|
|
79
109
|
3. Commit: `git commit -m "<type>: <task description>"`
|
|
80
110
|
|
|
81
111
|
### Step 3.5 — Checkpoint review (every 3-5 tasks)
|
|
@@ -9,7 +9,7 @@ description: Push PRD document to Confluence. Use after /vsaf-doc-prd or /vsaf-d
|
|
|
9
9
|
Publish the current PRD to Confluence — create a new page if it doesn't exist, or update the existing one. The comment becomes the Confluence version note.
|
|
10
10
|
|
|
11
11
|
## Input
|
|
12
|
-
- `[file]` — optional path to a specific markdown file (defaults to scanning `.vsaf/docs/planning-artifacts/prd-*.md`)
|
|
12
|
+
- `[file]` — optional path to a specific markdown file or directory (defaults to scanning `.vsaf/docs/planning-artifacts/prd-*.md`)
|
|
13
13
|
- `[comment]` — optional version note (e.g. "Initial draft", "Updated scope after stakeholder review")
|
|
14
14
|
|
|
15
15
|
## Prerequisites
|
|
@@ -18,11 +18,12 @@ Publish the current PRD to Confluence — create a new page if it doesn't exist,
|
|
|
18
18
|
|
|
19
19
|
## Steps
|
|
20
20
|
|
|
21
|
-
### Step 1 — Find PRD file
|
|
22
|
-
- If a
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- If
|
|
21
|
+
### Step 1 — Find PRD file(s)
|
|
22
|
+
- If a **directory path** was given (e.g. `@docs/architecture/`): read all `*.md` files in that directory and combine them into a single page body, separated by `<hr/>`. Use the directory name as the page title base.
|
|
23
|
+
- If a **specific file path** was given: use that file directly.
|
|
24
|
+
- Otherwise: list files in `.vsaf/docs/planning-artifacts/` matching `prd-*.md`
|
|
25
|
+
- If multiple found: ask user which one to push
|
|
26
|
+
- If none found: STOP — tell user to run `/vsaf-doc-prd` first
|
|
26
27
|
- Read full file content
|
|
27
28
|
|
|
28
29
|
### Step 2 — Load Confluence config
|
|
@@ -35,16 +36,23 @@ If either field is missing or empty:
|
|
|
35
36
|
- Ask user: "Enter parent page title in Confluence (blank = root of space):"
|
|
36
37
|
- Save answers back to config so the user is not asked again
|
|
37
38
|
|
|
38
|
-
### Step 3 — Determine page title
|
|
39
|
+
### Step 3 — Determine page title and parent page ID
|
|
39
40
|
- If file is from `prd-*.md`: title = `[PRD] {Feature Name}` (derive from filename: `prd-user-management.md` → `[PRD] User Management`)
|
|
41
|
+
- If input was a directory: title = the numbered section label provided by the user (e.g. `3.4.2.12 VRoute — Architecture Design`)
|
|
40
42
|
- Otherwise: use the first `# Heading` in the file as the page title, or the filename stem if no heading found
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
**Resolve parent page ID:**
|
|
45
|
+
Use `confluence_search_pages` to search for the parent page title in the configured space. Extract the `id` field from the result — this is the `parentId` needed for page creation. Do NOT skip this step.
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
**CRITICAL: Do NOT wrap the entire page body in `<![CDATA[...]]>`. CDATA is only valid inside `<ac:plain-text-body>` for code blocks.**
|
|
47
|
+
### Step 4 — Convert markdown → Confluence storage format
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
**CRITICAL RULES — read before writing a single tag:**
|
|
50
|
+
|
|
51
|
+
1. **Never send raw markdown.** All content must be converted to Confluence Storage Format (XHTML).
|
|
52
|
+
2. **Never wrap the entire body in `<![CDATA[...]]>`.** CDATA is ONLY valid inside `<ac:plain-text-body>` within code macros.
|
|
53
|
+
3. **All Confluence macro attributes MUST use the `ac:` namespace prefix.** The tag is `<ac:parameter ac:name="...">`, never `<parameter name="...">`. Wrong namespace = XML parse error.
|
|
54
|
+
4. **Escape HTML entities in regular text:** `&` → `&`, `<` → `<`, `>` → `>`.
|
|
55
|
+
5. **Every opened tag must be closed.** Confluence's XML parser is strict — an unclosed tag aborts the entire page push.
|
|
48
56
|
|
|
49
57
|
**Block elements:**
|
|
50
58
|
```
|
|
@@ -72,19 +80,20 @@ paragraph text → <p>paragraph text</p>
|
|
|
72
80
|
|
|
73
81
|
**Tables:**
|
|
74
82
|
```
|
|
75
|
-
| H1 | H2 |
|
|
76
|
-
|----|----|
|
|
77
|
-
| a | b |
|
|
78
|
-
|
|
83
|
+
| H1 | H2 | → <table><tbody>
|
|
84
|
+
|----|----| → <tr><th>H1</th><th>H2</th></tr>
|
|
85
|
+
| a | b | <tr><td>a</td><td>b</td></tr>
|
|
86
|
+
</tbody></table>
|
|
79
87
|
```
|
|
80
88
|
|
|
81
|
-
**Code blocks — the ONLY place CDATA
|
|
82
|
-
|
|
83
|
-
```lang
|
|
84
|
-
code here
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
**Code blocks — the ONLY correct place for CDATA:**
|
|
90
|
+
```
|
|
91
|
+
```lang → <ac:structured-macro ac:name="code">
|
|
92
|
+
code here <ac:parameter ac:name="language">lang</ac:parameter>
|
|
93
|
+
``` <ac:plain-text-body><![CDATA[code here]]></ac:plain-text-body>
|
|
94
|
+
</ac:structured-macro>
|
|
95
|
+
```
|
|
96
|
+
⚠️ The attribute is `ac:name` not `name`. Using `<ac:parameter name="language">` will cause an XML parse error.
|
|
88
97
|
|
|
89
98
|
**Info/warning/tip boxes:**
|
|
90
99
|
```
|
|
@@ -102,33 +111,27 @@ code here <ac:parameter ac:name="language">lang</ac:parameter>
|
|
|
102
111
|
> text → <blockquote><p>text</p></blockquote>
|
|
103
112
|
```
|
|
104
113
|
|
|
105
|
-
When calling the Confluence MCP create/update tool, set the content representation to **`storage`**.
|
|
106
|
-
|
|
107
114
|
### Step 5 — Check if page exists
|
|
108
|
-
Use
|
|
109
|
-
```
|
|
110
|
-
CQL: title = "{page_title}" AND space = "{space_key}"
|
|
111
|
-
```
|
|
115
|
+
Use `confluence_search_pages` to search for a page with that exact title in the configured space.
|
|
112
116
|
- **Found** → proceed to Step 6 (update)
|
|
113
117
|
- **Not found** → proceed to Step 7 (create)
|
|
114
118
|
|
|
115
119
|
### Step 6 — Update existing page
|
|
116
|
-
Call
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
- Representation: `wiki`
|
|
120
|
+
Call `confluence_update_page` with:
|
|
121
|
+
- `pageId`: the ID from the search result
|
|
122
|
+
- `bodyStorageValue`: the **storage format HTML** converted in Step 4
|
|
120
123
|
- Version comment: the `[comment]` argument (or "Updated via vsaf-push-prd" if blank)
|
|
121
124
|
|
|
122
125
|
Confirm the two-stage update prompt if the MCP requires it.
|
|
123
126
|
|
|
124
127
|
### Step 7 — Create new page
|
|
125
|
-
Call
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
Call `confluence_create_page` with:
|
|
129
|
+
- `spaceKey`: the space key from config
|
|
130
|
+
- `parentId`: the parent page ID resolved in Step 3
|
|
131
|
+
- `title`: the page title determined in Step 3
|
|
132
|
+
- `bodyStorageValue`: the **storage format HTML** converted in Step 4
|
|
133
|
+
|
|
134
|
+
> The `bodyStorageValue` parameter takes Confluence Storage Format (XHTML) directly — do not add a separate `representation` field.
|
|
132
135
|
|
|
133
136
|
### Step 8 — Output to user
|
|
134
137
|
```
|
|
@@ -148,4 +151,4 @@ Run /vsaf-push-srs to also publish the SRS, or continue with /vsaf-build
|
|
|
148
151
|
- Never push a PRD that has failed `/vsaf-validate-prd` validation
|
|
149
152
|
- If the Confluence MCP is not configured, tell the user to run `vsaf init` and enter their token
|
|
150
153
|
- Do not modify the local file during this step
|
|
151
|
-
- The file argument accepts any markdown file path, not just files under `.vsaf/`
|
|
154
|
+
- The file argument accepts any markdown file path or directory, not just files under `.vsaf/`
|
|
@@ -9,7 +9,7 @@ description: Push SRS document to Confluence. Use after /vsaf-doc-srs or SRS edi
|
|
|
9
9
|
Publish the current SRS to Confluence — create a new page if it doesn't exist, or update the existing one. The comment becomes the Confluence version note.
|
|
10
10
|
|
|
11
11
|
## Input
|
|
12
|
-
- `[file]` — optional path to a specific markdown file (defaults to scanning `.vsaf/docs/srs/*.md`)
|
|
12
|
+
- `[file]` — optional path to a specific markdown file or directory (defaults to scanning `.vsaf/docs/srs/*.md`)
|
|
13
13
|
- `[comment]` — optional version note (e.g. "Initial draft", "Revised after tech review")
|
|
14
14
|
|
|
15
15
|
## Prerequisites
|
|
@@ -18,11 +18,12 @@ Publish the current SRS to Confluence — create a new page if it doesn't exist,
|
|
|
18
18
|
|
|
19
19
|
## Steps
|
|
20
20
|
|
|
21
|
-
### Step 1 — Find SRS file
|
|
22
|
-
- If a
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- If
|
|
21
|
+
### Step 1 — Find SRS file(s)
|
|
22
|
+
- If a **directory path** was given (e.g. `@docs/srs/`): read all `*.md` files in that directory (excluding `*-results.md`) and combine them into a single page body, separated by `<hr/>`. Use the directory name as the page title base.
|
|
23
|
+
- If a **specific file path** was given: use that file directly.
|
|
24
|
+
- Otherwise: list files in `.vsaf/docs/srs/` matching `*.md` (exclude `*-results.md`)
|
|
25
|
+
- If multiple found: ask user which one to push
|
|
26
|
+
- If none found: STOP — tell user to run `/vsaf-doc-srs` first
|
|
26
27
|
- Read full file content
|
|
27
28
|
|
|
28
29
|
### Step 2 — Load Confluence config
|
|
@@ -35,16 +36,23 @@ If either field is missing or empty:
|
|
|
35
36
|
- Ask user: "Enter parent page title in Confluence (blank = root of space):"
|
|
36
37
|
- Save answers back to config so the user is not asked again
|
|
37
38
|
|
|
38
|
-
### Step 3 — Determine page title
|
|
39
|
+
### Step 3 — Determine page title and parent page ID
|
|
39
40
|
- If file is from `srs-*.md` or `SRS-*.md`: title = `[SRS] {Feature Name}` (derive from filename)
|
|
41
|
+
- If input was a directory: title = the numbered section label provided by the user
|
|
40
42
|
- Otherwise: use the first `# Heading` in the file as the page title, or the filename stem if no heading found
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
**Resolve parent page ID:**
|
|
45
|
+
Use `confluence_search_pages` to search for the parent page title in the configured space. Extract the `id` field from the result — this is the `parentId` needed for page creation. Do NOT skip this step.
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
**CRITICAL: Do NOT wrap the entire page body in `<![CDATA[...]]>`. CDATA is only valid inside `<ac:plain-text-body>` for code blocks.**
|
|
47
|
+
### Step 4 — Convert markdown → Confluence storage format
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
**CRITICAL RULES — read before writing a single tag:**
|
|
50
|
+
|
|
51
|
+
1. **Never send raw markdown.** All content must be converted to Confluence Storage Format (XHTML).
|
|
52
|
+
2. **Never wrap the entire body in `<![CDATA[...]]>`.** CDATA is ONLY valid inside `<ac:plain-text-body>` within code macros.
|
|
53
|
+
3. **All Confluence macro attributes MUST use the `ac:` namespace prefix.** The tag is `<ac:parameter ac:name="...">`, never `<parameter name="...">`. Wrong namespace = XML parse error.
|
|
54
|
+
4. **Escape HTML entities in regular text:** `&` → `&`, `<` → `<`, `>` → `>`.
|
|
55
|
+
5. **Every opened tag must be closed.** Confluence's XML parser is strict — an unclosed tag aborts the entire page push.
|
|
48
56
|
|
|
49
57
|
**Block elements:**
|
|
50
58
|
```
|
|
@@ -72,19 +80,20 @@ paragraph text → <p>paragraph text</p>
|
|
|
72
80
|
|
|
73
81
|
**Tables:**
|
|
74
82
|
```
|
|
75
|
-
| H1 | H2 |
|
|
76
|
-
|----|----|
|
|
77
|
-
| a | b |
|
|
78
|
-
|
|
83
|
+
| H1 | H2 | → <table><tbody>
|
|
84
|
+
|----|----| → <tr><th>H1</th><th>H2</th></tr>
|
|
85
|
+
| a | b | <tr><td>a</td><td>b</td></tr>
|
|
86
|
+
</tbody></table>
|
|
79
87
|
```
|
|
80
88
|
|
|
81
|
-
**Code blocks — the ONLY place CDATA
|
|
82
|
-
|
|
83
|
-
```lang
|
|
84
|
-
code here
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
**Code blocks — the ONLY correct place for CDATA:**
|
|
90
|
+
```
|
|
91
|
+
```lang → <ac:structured-macro ac:name="code">
|
|
92
|
+
code here <ac:parameter ac:name="language">lang</ac:parameter>
|
|
93
|
+
``` <ac:plain-text-body><![CDATA[code here]]></ac:plain-text-body>
|
|
94
|
+
</ac:structured-macro>
|
|
95
|
+
```
|
|
96
|
+
⚠️ The attribute is `ac:name` not `name`. Using `<ac:parameter name="language">` will cause an XML parse error.
|
|
88
97
|
|
|
89
98
|
**Info/warning/tip boxes:**
|
|
90
99
|
```
|
|
@@ -102,37 +111,31 @@ code here <ac:parameter ac:name="language">lang</ac:parameter>
|
|
|
102
111
|
> text → <blockquote><p>text</p></blockquote>
|
|
103
112
|
```
|
|
104
113
|
|
|
105
|
-
When calling the Confluence MCP create/update tool, set the content representation to **`storage`**.
|
|
106
|
-
|
|
107
114
|
### Step 5 — Check if page exists
|
|
108
|
-
Use
|
|
109
|
-
```
|
|
110
|
-
CQL: title = "{page_title}" AND space = "{space_key}"
|
|
111
|
-
```
|
|
115
|
+
Use `confluence_search_pages` to search for a page with that exact title in the configured space.
|
|
112
116
|
- **Found** → proceed to Step 6 (update)
|
|
113
117
|
- **Not found** → proceed to Step 7 (create)
|
|
114
118
|
|
|
115
119
|
### Step 6 — Update existing page
|
|
116
|
-
Call
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
- Representation: `wiki`
|
|
120
|
+
Call `confluence_update_page` with:
|
|
121
|
+
- `pageId`: the ID from the search result
|
|
122
|
+
- `bodyStorageValue`: the **storage format HTML** converted in Step 4
|
|
120
123
|
- Version comment: the `[comment]` argument (or "Updated via vsaf-push-srs" if blank)
|
|
121
124
|
|
|
122
125
|
Confirm the two-stage update prompt if the MCP requires it.
|
|
123
126
|
|
|
124
127
|
### Step 7 — Create new page
|
|
125
|
-
Call
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
Call `confluence_create_page` with:
|
|
129
|
+
- `spaceKey`: the space key from config
|
|
130
|
+
- `parentId`: the parent page ID resolved in Step 3
|
|
131
|
+
- `title`: the page title determined in Step 3
|
|
132
|
+
- `bodyStorageValue`: the **storage format HTML** converted in Step 4
|
|
133
|
+
|
|
134
|
+
> The `bodyStorageValue` parameter takes Confluence Storage Format (XHTML) directly — do not add a separate `representation` field.
|
|
132
135
|
|
|
133
136
|
### Step 8 — Link SRS page to PRD page (if PRD page exists)
|
|
134
137
|
- Search Confluence for the corresponding `[PRD] {feature-name}` page
|
|
135
|
-
- If found: prepend this
|
|
138
|
+
- If found: prepend this block at the top of the SRS content before pushing:
|
|
136
139
|
```xml
|
|
137
140
|
<ac:structured-macro ac:name="info">
|
|
138
141
|
<ac:parameter ac:name="title">Related Documents</ac:parameter>
|
|
@@ -160,4 +163,4 @@ Run /vsaf-test to generate testcases from this SRS, or /vsaf-build to implement
|
|
|
160
163
|
- If the Confluence MCP is not configured, tell the user to run `vsaf init` and enter their token
|
|
161
164
|
- Do not modify the local file during this step
|
|
162
165
|
- SRS result files (`*-results.md`) are test outputs — push those separately if needed
|
|
163
|
-
- The file argument accepts any markdown file path, not just files under `.vsaf/`
|
|
166
|
+
- The file argument accepts any markdown file path or directory, not just files under `.vsaf/`
|
|
@@ -5,6 +5,16 @@ description: Multi-layer review + ship code. Used after /vsaf-build and /vsaf-te
|
|
|
5
5
|
|
|
6
6
|
# VSAF Ship
|
|
7
7
|
|
|
8
|
+
## Applied Rules
|
|
9
|
+
|
|
10
|
+
> These rules are enforced as gates before shipping. Code that violates them cannot be merged.
|
|
11
|
+
|
|
12
|
+
| Rule | File | Gate |
|
|
13
|
+
|------|------|------|
|
|
14
|
+
| Run Verification After Coding | `.vsaf/rules/dev/java/run_verification_after_coding.md` | Step 1 (pre-review) |
|
|
15
|
+
| SonarQube Coding Standard | `.vsaf/rules/dev/java/sonarqube_coding_standard.md` | Step 2 (code review) |
|
|
16
|
+
| Java Project Development Rules | `.vsaf/rules/dev/java/java_Project_Development_Rules.md` | Step 2 (code review) |
|
|
17
|
+
|
|
8
18
|
## Objective
|
|
9
19
|
Multi-layer review, verify scope, validate architecture, push PR. Ensure code has passed all gates before shipping.
|
|
10
20
|
|
|
@@ -21,25 +31,44 @@ Multi-layer review, verify scope, validate architecture, push PR. Ensure code ha
|
|
|
21
31
|
- Confirm only the expected files/symbols have changed
|
|
22
32
|
- If unexpected changes are detected: **STOP** — review before proceeding
|
|
23
33
|
|
|
24
|
-
### Step 1 —
|
|
34
|
+
### Step 1 — Verification gate (mandatory — before any review)
|
|
35
|
+
- Read `.vsaf/rules/dev/java/run_verification_after_coding.md` and confirm all 5 acceptance criteria are met:
|
|
36
|
+
- [ ] Code compiles with zero errors
|
|
37
|
+
- [ ] All existing tests pass
|
|
38
|
+
- [ ] Application starts without errors
|
|
39
|
+
- [ ] The changed feature/endpoint was manually triggered and returned the expected result
|
|
40
|
+
- [ ] No new `ERROR` log lines appear on the happy path
|
|
41
|
+
- If any criterion is NOT met: **STOP** — fix before proceeding to review
|
|
42
|
+
|
|
43
|
+
### Step 2 — Structured review handoff (Superpowers)
|
|
25
44
|
- Use `superpowers:requesting-code-review` to create a structured handoff:
|
|
26
45
|
- What changed and why
|
|
27
46
|
- What to watch for (risk areas)
|
|
28
47
|
- Context for the reviewer
|
|
29
48
|
- This handoff is the input for the subsequent review layers
|
|
30
49
|
|
|
31
|
-
### Step
|
|
50
|
+
### Step 3 — Review Layer 1: Code Review + SonarQube Gate
|
|
32
51
|
- **If Superpowers is available**: use `superpowers:code-review`
|
|
33
52
|
- **If not**: use skill `bmad-code-review`
|
|
34
53
|
- Check: code structure, naming, patterns, SOLID principles
|
|
54
|
+
- **SonarQube gate** (mandatory for Java projects — read `.vsaf/rules/dev/java/sonarqube_coding_standard.md`):
|
|
55
|
+
- Zero Blocker or Critical issues — must fix before merge, no exceptions
|
|
56
|
+
- Zero bugs (`squid:S2259` null deref, `squid:S2095` unclosed resources, `squid:S3655` Optional.get without check)
|
|
57
|
+
- Zero vulnerabilities (no hardcoded credentials, no SQL injection, no sensitive data in logs)
|
|
58
|
+
- No `System.out.println` / `e.printStackTrace()` — use SLF4J
|
|
59
|
+
- Coverage ≥80% on new code; Technical Debt Ratio ≤5%
|
|
60
|
+
- Duplications <3% on new code
|
|
61
|
+
- Run locally: `mvn clean verify sonar:sonar -Dsonar.projectKey=<key> -Dsonar.host.url=http://localhost:9000 -Dsonar.login=<token>`
|
|
62
|
+
- **Java rules gate** (mandatory for Java projects — read `.vsaf/rules/dev/java/java_Project_Development_Rules.md`):
|
|
63
|
+
- Methods ≤40 lines, nesting ≤3 levels, `@Transactional` only at service layer
|
|
35
64
|
- Fix issues if any, re-commit
|
|
36
65
|
|
|
37
|
-
#### Step
|
|
66
|
+
#### Step 3b — Handle reviewer feedback (if any)
|
|
38
67
|
- If the review has feedback that needs to be addressed:
|
|
39
68
|
- Use `superpowers:receiving-code-review` — systematic response, no ad-hoc fixes
|
|
40
69
|
- Fix → re-commit → re-review if needed
|
|
41
70
|
|
|
42
|
-
### Step
|
|
71
|
+
### Step 4 — Review Layer 1.5: Adversarial Review
|
|
43
72
|
- Use skill `bmad-review-adversarial-general` — cynical attack on new code
|
|
44
73
|
- Look for: logic flaws, security holes, performance traps, silent failures
|
|
45
74
|
- Use skill `bmad-review-edge-case-hunter` — exhaustive boundary analysis
|
|
@@ -49,21 +78,21 @@ Multi-layer review, verify scope, validate architecture, push PR. Ensure code ha
|
|
|
49
78
|
- **SHOULD FIX**: create a follow-up task
|
|
50
79
|
- **NOTED**: acknowledged, no action needed
|
|
51
80
|
|
|
52
|
-
### Step
|
|
81
|
+
### Step 5 — Architectural constraint check (GitNexus)
|
|
53
82
|
- Run `gitnexus_shape_check` — validate no architectural constraints are violated
|
|
54
83
|
- If there are violations: **STOP** — fix before proceeding
|
|
55
84
|
|
|
56
|
-
### Step
|
|
85
|
+
### Step 6 — Review Layer 2: Knowledge graph sync
|
|
57
86
|
- Run `vsaf index` (= `gitnexus analyze`)
|
|
58
87
|
- Update the call graph to reflect the new code
|
|
59
88
|
- This is the final layer — ensure the index accurately reflects the current code state
|
|
60
89
|
|
|
61
|
-
### Step
|
|
90
|
+
### Step 7 — Final verification gate (Superpowers)
|
|
62
91
|
- Use `superpowers:verification-before-completion`
|
|
63
92
|
- Confirm all deliverables match the spec — not just "tests pass"
|
|
64
93
|
- This is the final gate before PR
|
|
65
94
|
|
|
66
|
-
### Step
|
|
95
|
+
### Step 8 — Pre-PR checklist (Superpowers)
|
|
67
96
|
- **If Superpowers is available**: use `superpowers:finishing-a-development-branch` — automated pre-PR checklist
|
|
68
97
|
- **If not**: check manually:
|
|
69
98
|
- [ ] Tests pass
|
|
@@ -72,7 +101,7 @@ Multi-layer review, verify scope, validate architecture, push PR. Ensure code ha
|
|
|
72
101
|
- [ ] Test results file exists
|
|
73
102
|
- [ ] All MUST FIX resolved
|
|
74
103
|
|
|
75
|
-
### Step
|
|
104
|
+
### Step 9 — Push PR
|
|
76
105
|
```bash
|
|
77
106
|
git push origin feature/<name>
|
|
78
107
|
```
|
|
@@ -82,13 +111,15 @@ PR description must include:
|
|
|
82
111
|
- Adversarial triage: MUST FIX: 0, SHOULD FIX: N, NOTED: N
|
|
83
112
|
- Shape check result
|
|
84
113
|
|
|
85
|
-
### Step
|
|
114
|
+
### Step 10 — Output to user
|
|
86
115
|
```
|
|
87
116
|
## Ship Complete: [feature]
|
|
88
117
|
|
|
89
118
|
### Reviews
|
|
90
119
|
- Scope check (detect_changes): PASS — [N files, N symbols changed]
|
|
120
|
+
- Verification gate: PASS [compile ✓, tests ✓, run ✓, endpoint ✓]
|
|
91
121
|
- Layer 1 (Code Review): PASS [superpowers / bmad-code-review]
|
|
122
|
+
- SonarQube gate: PASS [Blockers: 0, Criticals: 0, Coverage: X%]
|
|
92
123
|
- Layer 1.5 (Adversarial): PASS [MUST FIX: 0, SHOULD FIX: N, NOTED: N]
|
|
93
124
|
- Shape check: PASS
|
|
94
125
|
- Layer 2 (Graph sync): PASS
|
|
@@ -5,6 +5,14 @@ description: "Two modes: (1) generate testcases from SRS — used after /vsaf-do
|
|
|
5
5
|
|
|
6
6
|
# VSAF Test
|
|
7
7
|
|
|
8
|
+
## Applied Rules
|
|
9
|
+
|
|
10
|
+
> The run-verification rule applies to **Mode 2 (run)** only. Test generation (Mode 1) is a documentation activity.
|
|
11
|
+
|
|
12
|
+
| Rule | File | Applies to |
|
|
13
|
+
|------|------|------------|
|
|
14
|
+
| Run Verification After Coding | `.vsaf/rules/dev/java/run_verification_after_coding.md` | Mode 2: Run — executing tests + recording results |
|
|
15
|
+
|
|
8
16
|
## Mode distinction
|
|
9
17
|
|
|
10
18
|
| Command | Mode | Goal |
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.5.0",
|
|
3
|
+
"plugins_used": [
|
|
4
|
+
{
|
|
5
|
+
"name": "ArtifactoryDetector"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "AWSKeyDetector"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "AzureStorageKeyDetector"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "Base64HighEntropyString",
|
|
15
|
+
"limit": 4.5
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "BasicAuthDetector"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "CloudantDetector"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "DiscordBotTokenDetector"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "GitHubTokenDetector"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "GitLabTokenDetector"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "HexHighEntropyString",
|
|
34
|
+
"limit": 3.0
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "IbmCloudIamDetector"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "IbmCosHmacDetector"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "IPPublicDetector"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "JwtTokenDetector"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "KeywordDetector",
|
|
50
|
+
"keyword_exclude": ""
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "MailchimpDetector"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "NpmDetector"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "OpenAIDetector"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "PrivateKeyDetector"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "PypiTokenDetector"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "SendGridDetector"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "SlackDetector"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "SoftlayerDetector"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "SquareOAuthDetector"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "StripeDetector"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "TelegramBotTokenDetector"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "TwilioKeyDetector"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"filters_used": [
|
|
90
|
+
{
|
|
91
|
+
"path": "detect_secrets.filters.allowlist.is_line_allowlisted"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
|
|
95
|
+
"min_level": 2
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"path": "detect_secrets.filters.heuristic.is_indirect_reference"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"path": "detect_secrets.filters.heuristic.is_likely_id_string"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"path": "detect_secrets.filters.heuristic.is_lock_file"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"path": "detect_secrets.filters.heuristic.is_potential_uuid"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"path": "detect_secrets.filters.heuristic.is_sequential_string"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"path": "detect_secrets.filters.heuristic.is_swagger_file"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"path": "detect_secrets.filters.heuristic.is_templated_secret"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"path": "detect_secrets.filters.regex.should_exclude_file",
|
|
126
|
+
"pattern": [
|
|
127
|
+
".*"
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
"results": {},
|
|
132
|
+
"generated_at": "2026-01-29T05:10:47Z"
|
|
133
|
+
}
|