@ngocsangairvds/vsaf 4.0.6 → 4.0.8
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/README.md +7 -5
- package/package.json +2 -2
- package/packages/cli/dist/commands/init.d.ts.map +1 -1
- package/packages/cli/dist/commands/init.js +25 -14
- package/packages/cli/dist/commands/init.js.map +1 -1
- package/packages/cli/dist/commands/install.js +1 -1
- package/packages/cli/dist/commands/install.js.map +1 -1
- package/packages/cli/dist/commands/skill.js +8 -8
- package/packages/cli/dist/commands/skill.js.map +1 -1
- package/packages/core/dist/skills/skill-loader.d.ts.map +1 -1
- package/packages/core/dist/skills/skill-loader.js +9 -4
- package/packages/core/dist/skills/skill-loader.js.map +1 -1
- package/skills/sdlc/architecture/SKILL.md +22 -8
- package/skills/sdlc/bmad-checkpoint-preview/SKILL.md +29 -0
- package/skills/sdlc/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-05-wrapup.md +24 -0
- package/skills/sdlc/bmad-correct-course/SKILL.md +6 -0
- package/skills/sdlc/bmad-correct-course/checklist.md +288 -0
- package/skills/sdlc/bmad-correct-course/workflow.md +267 -0
- package/skills/sdlc/discovery/SKILL.md +2 -2
- package/skills/sdlc/pack.yaml +3 -1
- package/skills/sdlc/prd/SKILL.md +20 -5
- package/skills/sdlc/review/SKILL.md +9 -5
- package/skills/sdlc/sdlc-health/SKILL.md +5 -3
- package/skills/sdlc/setup/SKILL.md +1 -1
- package/skills/sdlc/srs/SKILL.md +7 -6
- package/skills/sdlc/test-design/SKILL.md +10 -6
- package/skills/sdlc/workflows/hotfix-tdd.yaml +2 -2
- package/skills/sdlc/workflows/hotfix.yaml +5 -5
- package/skills/sdlc/workflows/master-sdlc.yaml +9 -9
- package/skills/sdlc/workflows/onboarding.yaml +2 -2
- package/skills/sdlc/workflows/sdlc-build.yaml +1 -1
- package/skills/sdlc/workflows/sdlc-design.yaml +2 -2
- package/skills/sdlc/workflows/sdlc-qa.yaml +3 -3
- package/skills/sdlc/workflows/sdlc-testcase.yaml +1 -1
- package/skills/sdlc/workflows/sdlc-thinking.yaml +2 -2
- package/skills/vds-skill/install-deps.mjs +20 -4
- package/skills/vds-skill/vds-scripts/.claude/phase7-CLOSURE.md +100 -0
- package/skills/vds-skill/vds-scripts/.dockerignore +62 -0
- package/skills/vds-skill/vds-scripts/.github/ISSUE_TEMPLATE/cli-change.md +92 -0
- package/skills/vds-skill/vds-scripts/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +48 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/chaos-smoke.yml +266 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/confluence-sync.yml +44 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/docs-confluence-evidence.yml +170 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/docs-quality.yml +59 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/lint-and-test.yml +90 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/scheduler-load-smoke.yml +104 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/telegram-bridge-ci.yml +131 -0
- package/skills/vds-skill/vds-scripts/.graphifyignore +29 -0
- package/skills/vds-skill/vds-scripts/.importlinter +86 -0
- package/skills/vds-skill/vds-scripts/.mcp.json +11 -0
- package/skills/vds-skill/vds-scripts/.pre-commit-config.yaml +62 -0
- package/skills/vds-skill/vds-scripts/.ruffignore +3 -0
- package/skills/vds-skill/vds-scripts/.secrets.baseline +133 -0
- package/skills/vds-skill/vds-scripts/AGENTS.md +250 -0
- package/skills/vds-skill/vds-scripts/AGENTS.vi.md +92 -0
- package/skills/vds-skill/vds-scripts/ECOSYSTEM-CHANGELOG.md +52 -0
- package/skills/vds-skill/vds-scripts/ECOSYSTEM-DOCS.md +602 -0
- package/skills/vds-skill/vds-scripts/ECOSYSTEM_ALIGNMENT.md +133 -0
- package/skills/vds-skill/vds-scripts/Makefile +119 -0
- package/skills/vds-skill/vds-scripts/README.md +103 -0
- package/skills/vds-skill/vds-scripts/bitbucket_manifest_mapping.toml +34 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/ARCHITECTURE_ANALYSIS.md +258 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +393 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/EVALUATION_REPORT.md +61 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/FEATURES.md +908 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/README.md +817 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/pyproject.toml +49 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/__init__.py +50 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/async_client.py +641 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/cli.py +2271 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/client.py +2693 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/config.py +186 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/factory.py +185 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/parsers.py +113 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/protocols.py +244 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/repo_ops.py +325 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/__init__.py +8 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/conftest.py +65 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_advanced_search.py +155 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_async_client.py +505 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_branch_permissions.py +172 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli.py +113 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli_archive.py +122 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli_clone.py +131 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client.py +207 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_archive.py +73 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_branch_conditions.py +101 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_code_advanced.py +180 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_code_file.py +33 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_deployment_environments.py +193 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_issues.py +163 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_pipelines_advanced.py +171 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_pr_blockers.py +118 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_repository_variables.py +155 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code.py +98 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code_advanced.py +279 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code_insights.py +334 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_conditions.py +149 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_config.py +297 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_deployment_env.py +352 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_errors.py +67 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_factory.py +352 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_fork_operations.py +203 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_issue_cli.py +262 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_pipeline_advanced.py +265 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_pr_blocker.py +206 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_protocols.py +336 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_archive.py +169 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_clone.py +115 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_parsing.py +149 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_settings.py +336 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_variables.py +266 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_webhooks.py +188 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_workspace.py +234 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/unit/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/unit/test_parsers.py +254 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/README.md +29 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/pyproject.toml +63 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/__init__.py +17 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/cli.py +187 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/validator.py +121 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/test_cli.py +62 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/test_validator.py +33 -0
- package/skills/vds-skill/vds-scripts/code/code_evidence_pack.json +435 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/Dockerfile +19 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/README.md +479 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/SYNC_SCRIPTS.md +127 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/SYNC_STANDARDIZATION.md +108 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/pyproject.toml +50 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/__init__.py +56 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/async_client.py +100 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/cli.py +3160 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/config.py +215 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content.py +368 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content_v2.py +144 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/crawl_tree.py +1833 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/errors.py +44 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/eventing.py +111 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/http.py +1850 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/orchestration.py +166 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/protocols.py +61 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/reporting.py +78 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree.py +122 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree_copier.py +431 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_pdfs_from_markdown.py +203 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_pdfs_to_confluence.py +299 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_png_attachments.py +299 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/conftest.py +46 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_advanced_content.py +252 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_advanced_search.py +193 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_async_client.py +104 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_cache_management.py +246 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_cli.py +716 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_config.py +130 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content.py +192 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content_flags.py +27 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content_labels.py +94 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_crawl_tree.py +2252 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_degraded_write_safety.py +176 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_draft_management.py +225 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_errors.py +75 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing.py +73 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_chaos.py +37 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_rate_limit.py +44 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_timeout.py +49 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_export.py +231 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_history.py +217 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_http.py +375 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_orchestration.py +93 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_reporting.py +24 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_search_cql.py +36 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_space_management.py +236 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_space_permissions.py +384 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_tree_copier.py +644 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_tree_copier_remap.py +289 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_user_group_management.py +387 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/README.md +663 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/ci_validate.sh +16 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-component.png +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-component.puml +23 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-sequence.png +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-sequence.puml +21 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-usecase.png +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-usecase.puml +14 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/examples/github-actions-validate.yml +39 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/generate_all_diagrams.py +827 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/generate_insurance_c4_diagrams.py +261 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/generate_insurance_c4_quick.py +486 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/pyproject.toml +28 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/render_png.py +59 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/src/vds_diagram_generator/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/src/vds_diagram_generator/cli.py +50 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/test_c4_hierarchical.py +142 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/test_c4_quick.py +131 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_analyzer_completeness.py +260 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_c4_syntax_correctness.py +138 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_component_coverage.py +182 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_mermaid_output.py +80 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_png_generation.py +112 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_scenario_templates.py +15 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_sequence_accuracy.py +93 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_structurizr_export.py +177 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_style_consistency.py +174 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_usecase_generator.py +201 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_usecase_integration.py +124 -0
- package/skills/vds-skill/vds-scripts/docker/.dockerignore +38 -0
- package/skills/vds-skill/vds-scripts/docker/ADR.md +392 -0
- package/skills/vds-skill/vds-scripts/docker/Dockerfile +68 -0
- package/skills/vds-skill/vds-scripts/docker/MIGRATION.md +453 -0
- package/skills/vds-skill/vds-scripts/docker/README.md +347 -0
- package/skills/vds-skill/vds-scripts/docker/ROLLBACK.md +596 -0
- package/skills/vds-skill/vds-scripts/docker/compose.phase2-verification.yml +31 -0
- package/skills/vds-skill/vds-scripts/docker/docker-compose.cli.yml +206 -0
- package/skills/vds-skill/vds-scripts/docker/docker-compose.infra.yml +276 -0
- package/skills/vds-skill/vds-scripts/docker/docker-compose.services.yml +425 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/init-schemas.sql +177 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/pgbouncer.ini +75 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/userlist.txt +50 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/userlist.txt.template +36 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/.gitkeep +0 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/PREFLIGHT.md +132 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/README.md +84 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence.yaml +157 -0
- package/skills/vds-skill/vds-scripts/docs/.freshness.yaml +54 -0
- package/skills/vds-skill/vds-scripts/docs/README.md +235 -0
- package/skills/vds-skill/vds-scripts/docs/agents/README.md +33 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/data-flow.md +132 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/development-roadmap.md +49 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/features-overview.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/index.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/runtime-verification-and-gap-reporting.md +127 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/system-architecture.md +139 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/whats-new.md +75 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/who-ecosystem-introduction.md +65 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/who-ecosystem-model.md +41 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/02-using-vds-ai-memory.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/03-memory-cross-agent.md +241 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/04-using-progress-reports.md +240 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/08-semantic-search.md +46 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/apply-phase3-migration.md +148 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/choose-the-right-command-or-skill.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/contribute-new-orchestrator.md +149 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/decision-tree.md +63 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/first-audit-run.md +83 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/index.md +49 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +314 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +165 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +138 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +130 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +142 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +140 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +135 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-all-project-preparation.md +211 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-bounded-parallel-analysis.md +123 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-confluence-upload-recovery.md +204 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase132-department-preparation.md +144 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/run-ecosystem-daily-report.md +213 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/tips-and-tricks.md +138 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/troubleshooting-guide.md +221 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/agent-operational-contract.md +162 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/alignment-phase179-report.md +144 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/audit-triage-playbook.md +256 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/backup-restore.md +132 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/bitbucket-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/brd-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/capability-coverage-review.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/ci-workflows.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/circular-dependency-orchestrator.md +55 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-commands.md +583 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-development-standards.md +41 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-help-matrix.md +84 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/common-errors.md +126 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/configuration-reference.md +128 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-sync-target.md +111 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-sync.md +46 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/db-query-orchestrator.md +93 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/diagrams-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/ecosystem-daily-report.md +229 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/elastic-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/env-git-helper.md +216 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/evolution-orchestrator.md +113 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/excel-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/git-orchestrator.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/google-sheets-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/grafana-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/hexagonal-orchestrator.md +64 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/index.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/infrastructure-v2.15.md +67 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/intellij-orchestrator.md +50 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/jira-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/links-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/lint-cli.md +99 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/lsp-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/markdown-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/mcp-orchestrator.md +88 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/memory-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/metabase-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/migration-playbook.md +71 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/multi-agent-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/openapi-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-architecture.md +194 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-comparison-matrix.md +79 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-index.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/pdf-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/portable-paths-and-config.md +0 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/portable-paths-validation-matrix.md +129 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/progress-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/progress-report-cli.md +215 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/public-interface-orchestrator.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/research-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/schema-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/search-tools.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/skills-commands.md +256 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/skills-reference.md +32 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/sonarqube-orchestrator.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/spec-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/structure-orchestrator.md +69 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/system-requirements.md +76 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/tasks-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/validation-and-sync-notes.md +54 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/vds-ai-memory-api.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/vds-cli-reference.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/who-capability-inventory.md +96 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/who-capability-routing-matrix.md +14 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/feature-progression-guide.md +112 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/index.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/quick-start.md +50 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/who-skills-and-scripts-onboarding.md +47 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/zero-to-productive-developer.md +339 -0
- package/skills/vds-skill/vds-scripts/docs/confluence/IMPLEMENTATION-SUMMARY.md +78 -0
- package/skills/vds-skill/vds-scripts/docs/confluence/SYNC-GUIDE.md +47 -0
- package/skills/vds-skill/vds-scripts/docs/deployment/offline-docker-image-load.md +59 -0
- package/skills/vds-skill/vds-scripts/docs/evolution-auto-run-rollout.md +325 -0
- package/skills/vds-skill/vds-scripts/docs/evolution-loop-deep-integration.md +496 -0
- package/skills/vds-skill/vds-scripts/docs/evolution-loop-integration-guide.md +359 -0
- package/skills/vds-skill/vds-scripts/docs/openspace-schema-snapshot.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/operations/sla-mttr-policy.md +44 -0
- package/skills/vds-skill/vds-scripts/docs/p0-closure-evidence/SUMMARY.md +58 -0
- package/skills/vds-skill/vds-scripts/docs/p4-closure-evidence/.gitkeep +0 -0
- package/skills/vds-skill/vds-scripts/docs/p4-closure-evidence/smoke-20260427T024137Z-b95b586b.json +15 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/alembic-and-runtime-advisory-locks.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/dbos-listen-notify.md +54 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/pgbouncer-search-path-empirical.md +110 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/pgvector-set-local-audit.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/topology-decision-session-mode.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/phases/CHANGELOG.md +103 -0
- package/skills/vds-skill/vds-scripts/docs/phases/PHASE_125_COMPLETION_AND_MERGE.md +212 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125/IMPLEMENTATION_REPORT.md +227 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125/TSK-125.10-11-implementation-summary.md +196 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125/profile-patch-ollama-local-anthropic.md +122 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_completion_summary.md +369 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_llm_analysis_skill.md +164 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_merge_complete.md +147 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_skill_runtime_closure_20260321.md +91 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/closure-handoff-summary-2026-03-23.md +290 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/remaining-risk-register-2026-03-25.md +143 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/verification-evidence-2026-03-23.md +135 -0
- package/skills/vds-skill/vds-scripts/docs/v0-sunset-known-issues.md +88 -0
- package/skills/vds-skill/vds-scripts/docs/vi/TRANSLATION-BACKLOG.md +72 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/README.md +41 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/features-overview.md +29 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/index.md +14 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/runtime-verification-and-gap-reporting.md +129 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/whats-new.md +37 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/who-ecosystem-introduction.md +21 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/who-ecosystem-model.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/02-using-vds-ai-memory.md +100 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/03-memory-cross-agent.md +243 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/04-using-progress-reports.md +242 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/08-semantic-search.md +16 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/choose-the-right-command-or-skill.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/decision-tree.md +77 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/first-audit-run.md +85 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/index.md +21 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +156 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +174 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +147 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +139 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +151 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +149 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +144 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-all-project-preparation.md +213 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-bounded-parallel-analysis.md +125 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-confluence-upload-recovery.md +206 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase132-department-preparation.md +146 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/tips-and-tricks.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/troubleshooting-guide.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/agent-operational-contract.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/audit-triage-playbook.md +258 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/bitbucket-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/brd-orchestrator.md +29 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/capability-coverage-review.md +46 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/circular-dependency-orchestrator.md +29 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-commands.md +409 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-development-standards.md +19 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-help-matrix.md +71 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/common-errors.md +133 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/configuration-reference.md +25 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/confluence-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/db-query-orchestrator.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/diagrams-orchestrator.md +31 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/elastic-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/evolution-orchestrator.md +31 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/excel-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/git-orchestrator.md +31 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/google-sheets-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/grafana-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/hexagonal-orchestrator.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/index.md +25 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/intellij-orchestrator.md +59 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/jira-orchestrator.md +32 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/links-orchestrator.md +66 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/lsp-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/markdown-orchestrator.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/mcp-orchestrator.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/memory-orchestrator.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/metabase-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/multi-agent-orchestrator.md +61 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/openapi-orchestrator.md +66 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/orchestrator-architecture.md +24 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/orchestrator-index.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/pdf-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/portable-paths-and-config.md +123 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/portable-paths-validation-matrix.md +131 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/progress-orchestrator.md +43 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/progress-report-cli.md +217 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/public-interface-orchestrator.md +82 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/research-orchestrator.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/schema-orchestrator.md +66 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/search-tools.md +19 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/skills-reference.md +27 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/sonarqube-orchestrator.md +71 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/spec-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/structure-orchestrator.md +78 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/system-requirements.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/tasks-orchestrator.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/validation-and-sync-notes.md +26 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/vds-ai-memory-api.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/vds-cli-reference.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/who-capability-inventory.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/who-capability-routing-matrix.md +16 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/feature-progression-guide.md +124 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/index.md +13 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/quick-start.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/who-skills-and-scripts-onboarding.md +42 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/zero-to-productive-developer.md +137 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/README.md +450 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/pyproject.toml +97 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/__init__.py +81 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/cli.py +652 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/client.py +743 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/config.py +208 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/py.typed +0 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/conftest.py +227 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_client.py +990 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_config.py +268 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_e2e_verification.py +272 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_errors.py +78 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/README.md +288 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/RESEARCH_BASED_UPDATES_REPORT.md +261 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/add_essential_missing_effort.py +255 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/adjust_effort_complexity.py +184 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/brd_analysis_and_task_breakdown.py +632 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/brd_analysis_comprehensive.py +1029 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/check_overlaps_and_brd_coverage.py +570 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/clean_remarks_column.py +127 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/comprehensive_brd_check.py +322 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/create_buffered_summary.py +119 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/create_service_totals_sheet.py +118 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/examples/basic_operations.py +85 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/expand_all_tasks.py +341 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/expand_tasks.py +304 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fill_brd_references.py +347 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fill_remarks_and_colors.py +132 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/finalize_brd_and_cleanup.py +295 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/finalize_brd_coverage.py +327 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_all_formulas.py +99 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_detail_presentation.py +113 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_presentation_and_effort.py +116 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_presentation_consistency.py +231 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_remarks_matching.py +179 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/group_tasks_by_service_id.py +210 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/increase_brd_coverage.py +497 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/increase_effort_complexity.py +155 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/organize_and_deduplicate.py +273 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/pyproject.toml +64 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/rebuild_all_formulas.py +146 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/remove_base_multiplier_and_check_duplicates.py +310 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/remove_duplicate_brd_tasks.py +137 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/research_based_updates.py +457 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/restore_e_values.py +172 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/__init__.py +5 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/cli.py +746 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/config.py +74 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/converters.py +226 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/errors.py +88 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/excel_client.py +443 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/formatters.py +211 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/logging.py +57 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/source_contract.py +29 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/target_state_status.py +837 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/ulnc_alignment.py +1291 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/validators.py +164 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/sync_detail_and_total_sheets.py +211 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/conftest.py +36 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_cli.py +383 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_excel_client.py +129 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_ulnc_alignment.py +373 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_validators.py +64 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_api_database_effort.py +261 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_buffers_inline.py +115 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_complex_services_and_add_new.py +336 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_responsibility_and_fix_rows.py +208 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_task_breakdown_vietnamese.py +309 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_vietnamese_and_responsibility.py +415 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/verify_brd_coverage_comprehensive.py +401 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/ENHANCEMENT_SUMMARY.md +119 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/README.md +286 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/VERIFICATION_REPORT.md +152 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/pyproject.toml +37 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__init__.py +30 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__main__.py +4 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/branch_probe.py +271 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/cli.py +892 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/logging_config.py +63 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/manifest.py +249 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/orchestrator.py +1647 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/protocols.py +35 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/reporting.py +55 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_cli_settings.py +19 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_integration.py +79 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_manifest.py +79 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_orchestrator.py +207 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_public_api.py +235 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_resilience.py +343 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/test_branch_probe.py +327 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/test_protocols.py +132 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/README.md +241 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/pyproject.toml +45 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/__init__.py +69 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/cli.py +568 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/client.py +186 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/config.py +46 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/errors.py +41 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/conftest.py +1 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_cli.py +212 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_client.py +24 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_config.py +16 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/README.md +572 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/pyproject.toml +102 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/__init__.py +78 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/cli.py +455 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/client.py +700 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/config.py +243 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/py.typed +1 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/conftest.py +308 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_client.py +458 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_config.py +203 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_errors.py +78 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/README.md +864 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/pyproject.toml +43 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/__init__.py +65 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/adapter.py +1685 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/cli.py +2806 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/config.py +168 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/reporting.py +66 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/conftest.py +86 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_bulk_operations.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_components.py +56 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_createmeta.py +45 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_dashboard.py +119 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_issue_properties.py +53 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_permissions_compat.py +41 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_reindex.py +42 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_remote_links.py +75 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_transitions.py +90 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_user_management.py +116 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_version_management.py +181 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_watchers.py +43 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_advanced_search.py +179 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_agile.py +304 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_application_properties.py +243 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_backlog.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_bulk_operations.py +403 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_cli.py +108 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_components.py +119 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_config.py +166 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_dashboard.py +122 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_discover_fields.py +207 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_errors.py +72 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_filter_management.py +411 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_archiving.py +179 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_links.py +257 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_properties.py +189 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_link_types.py +407 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_parse_set.py +37 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_permissions.py +343 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_reindex.py +81 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_remote_links.py +269 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_security_schemes.py +202 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_transitions_changelog.py +109 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_user_management.py +246 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_version_management.py +503 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_watchers.py +116 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_worklog.py +243 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/README.md +864 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/pyproject.toml +43 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/__init__.py +65 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/adapter.py +1689 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/cli.py +2799 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/config.py +137 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/reporting.py +65 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/conftest.py +86 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_bulk_operations.py +101 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_components.py +64 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_createmeta.py +45 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_dashboard.py +135 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_issue_properties.py +63 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_permissions_compat.py +42 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_reindex.py +42 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_remote_links.py +89 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_transitions.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_user_management.py +130 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_version_management.py +189 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_watchers.py +49 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_advanced_search.py +213 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_agile.py +334 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_application_properties.py +261 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_backlog.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_bulk_operations.py +443 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_cli.py +106 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_components.py +133 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_config.py +166 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_dashboard.py +130 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_discover_fields.py +207 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_errors.py +61 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_filter_management.py +478 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_archiving.py +181 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_links.py +257 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_properties.py +203 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_link_types.py +426 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_parse_set.py +37 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_permissions.py +358 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_reindex.py +81 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_remote_links.py +292 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_security_schemes.py +218 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_transitions_changelog.py +121 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_user_management.py +283 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_version_management.py +561 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_watchers.py +128 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_worklog.py +265 -0
- package/skills/vds-skill/vds-scripts/llms.txt +159 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/README.md +72 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/pyproject.toml +39 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/src/vds_markdown_orchestrator/__init__.py +5 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/src/vds_markdown_orchestrator/cli.py +102 -0
- package/skills/vds-skill/vds-scripts/mcp_server/Dockerfile +63 -0
- package/skills/vds-skill/vds-scripts/mcp_server/README.md +140 -0
- package/skills/vds-skill/vds-scripts/mcp_server/pyproject.toml +41 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/config.py +36 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/server.py +111 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/__init__.py +15 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/bitbucket_tools.py +47 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/confluence_tools.py +53 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/git_tools.py +71 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/jira_tools.py +63 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/vidp_tools.py +64 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/conftest.py +31 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_bitbucket_tools.py +28 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_confluence_tools.py +28 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_git_tools.py +35 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_jira_tools.py +35 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/__init__.py +6 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/conftest.py +51 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_confluence_tools.py +40 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_jira_tools.py +39 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_tool_registration.py +50 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.dockerignore +93 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.env.example +40 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.ruff_rules.py +350 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.yamllint.yml +43 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/DEVELOPMENT_PLAN.md +80 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/Dockerfile +87 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/README.md +608 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/cli_verification_test/test.md +6 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/cli_verification_test/test.pdf +0 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/alertmanager.yml +83 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/prometheus.prod.yml +98 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/prometheus.yml +40 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/redis.conf +78 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/COMPETITIVE_ANALYSIS_REPORT.md +309 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/FEATURES_GUIDE.md +518 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/MULTI_USER_DEPLOYMENT_GUIDE.md +615 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/USER_GUIDE.md +829 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/pyproject.toml +87 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/pytest.ini +71 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/ruff.toml +6 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/debug_security_report.py +59 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/demo_library_selector.py +109 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/generate_project_stats.py +52 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/generate_styled_pdf.py +95 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/migrate_render_pdfs.py +285 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/setup_team.bat +283 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/setup_team.sh +324 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/__init__.py +5 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/cli.py +542 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/config.py +33 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/README.md +650 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/conftest.py +520 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/requirements.txt +51 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/run_tests.py +659 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/test_config.py +36 -0
- package/skills/vds-skill/vds-scripts/platform_core/pyproject.toml +49 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/__init__.py +16 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/alembic/__init__.py +18 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/alembic/runtime.py +139 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/config.py +88 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/credentials.py +40 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/env.py +24 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/errors.py +127 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/__init__.py +18 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/auth.py +32 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/errors.py +47 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/pagination.py +65 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/retry.py +62 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/stack.py +61 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/logging.py +132 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/protocols.py +77 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/serialization.py +80 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/severity.py +175 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/conftest.py +1 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_alembic_runtime.py +300 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_auth.py +84 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_config.py +83 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_credentials.py +73 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_env.py +56 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_errors.py +201 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_errors_http.py +74 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_http_settings.py +116 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_logging.py +148 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_pagination.py +153 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_protocols.py +132 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_retry.py +151 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_serialization.py +92 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_severity.py +178 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_stack.py +130 -0
- package/skills/vds-skill/vds-scripts/platform_core/uv.lock +341 -0
- package/skills/vds-skill/vds-scripts/pyproject.toml +145 -0
- package/skills/vds-skill/vds-scripts/pyrightconfig.json +82 -0
- package/skills/vds-skill/vds-scripts/repo-manifest.yaml +380 -0
- package/skills/vds-skill/vds-scripts/repo-manifest.yaml.example +25 -0
- package/skills/vds-skill/vds-scripts/ruff.toml +100 -0
- package/skills/vds-skill/vds-scripts/scripts/BRD-Validation-API.postman_collection.json +706 -0
- package/skills/vds-skill/vds-scripts/scripts/BRD-Validation-README.md +308 -0
- package/skills/vds-skill/vds-scripts/scripts/README.md +271 -0
- package/skills/vds-skill/vds-scripts/scripts/_validate_alias_phase2.py +137 -0
- package/skills/vds-skill/vds-scripts/scripts/audit-cli-patterns.sh +135 -0
- package/skills/vds-skill/vds-scripts/scripts/audit-dashboard.sh +525 -0
- package/skills/vds-skill/vds-scripts/scripts/backup.sh +123 -0
- package/skills/vds-skill/vds-scripts/scripts/bootstrap_uv.sh +69 -0
- package/skills/vds-skill/vds-scripts/scripts/brd-validation-environment.json +51 -0
- package/skills/vds-skill/vds-scripts/scripts/brd-validation-test-results.json +13023 -0
- package/skills/vds-skill/vds-scripts/scripts/brd_coverage_report.json +276 -0
- package/skills/vds-skill/vds-scripts/scripts/check-future-annotations.py +22 -0
- package/skills/vds-skill/vds-scripts/scripts/check-invalid-symlinks.py +183 -0
- package/skills/vds-skill/vds-scripts/scripts/check-no-debug-markers.py +21 -0
- package/skills/vds-skill/vds-scripts/scripts/check-no-unittest.py +21 -0
- package/skills/vds-skill/vds-scripts/scripts/ci/assert_no_openspace_commits.sh +37 -0
- package/skills/vds-skill/vds-scripts/scripts/ci/verify_branch_protection.sh +64 -0
- package/skills/vds-skill/vds-scripts/scripts/closure/phase1_check.sh +483 -0
- package/skills/vds-skill/vds-scripts/scripts/closure/phase2_check.sh +500 -0
- package/skills/vds-skill/vds-scripts/scripts/create_memory_session.py +36 -0
- package/skills/vds-skill/vds-scripts/scripts/deploy-bootstrap.sh +201 -0
- package/skills/vds-skill/vds-scripts/scripts/deployment/load_docker_images_offline.sh +90 -0
- package/skills/vds-skill/vds-scripts/scripts/dev/cli_smoke.sh +259 -0
- package/skills/vds-skill/vds-scripts/scripts/final_completion_report.md +139 -0
- package/skills/vds-skill/vds-scripts/scripts/folder_structure_report.json +321 -0
- package/skills/vds-skill/vds-scripts/scripts/generate_completion_report.py +132 -0
- package/skills/vds-skill/vds-scripts/scripts/generate_intellij_modules.py +154 -0
- package/skills/vds-skill/vds-scripts/scripts/init-pgbouncer-userlist.sh +154 -0
- package/skills/vds-skill/vds-scripts/scripts/link_integrity_report.json +807 -0
- package/skills/vds-skill/vds-scripts/scripts/move_audit_artifact_pages.py +252 -0
- package/skills/vds-skill/vds-scripts/scripts/move_audit_artifact_pages_rest.py +165 -0
- package/skills/vds-skill/vds-scripts/scripts/move_wrong_dept_pages.py +235 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_bootstrap.sh +56 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_common.sh +75 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_doctor.sh +61 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_sync_shadow.sh +65 -0
- package/skills/vds-skill/vds-scripts/scripts/phase7-baseline.sh +77 -0
- package/skills/vds-skill/vds-scripts/scripts/preflight/env_check.sh +102 -0
- package/skills/vds-skill/vds-scripts/scripts/repair_autopay_reports.sh +173 -0
- package/skills/vds-skill/vds-scripts/scripts/rollback_drill.sh +659 -0
- package/skills/vds-skill/vds-scripts/scripts/run-audit-in-tmux.sh +286 -0
- package/skills/vds-skill/vds-scripts/scripts/run-department-audit.sh +495 -0
- package/skills/vds-skill/vds-scripts/scripts/run-project-audit.sh +267 -0
- package/skills/vds-skill/vds-scripts/scripts/save_intellij_memories.py +112 -0
- package/skills/vds-skill/vds-scripts/scripts/save_memories_to_vds_ai.py +81 -0
- package/skills/vds-skill/vds-scripts/scripts/save_memories_vds_style.py +133 -0
- package/skills/vds-skill/vds-scripts/scripts/search_intellij_memories.py +48 -0
- package/skills/vds-skill/vds-scripts/scripts/setup_intellij_workspace.py +71 -0
- package/skills/vds-skill/vds-scripts/scripts/smoke-test-deploy.sh +137 -0
- package/skills/vds-skill/vds-scripts/scripts/smoke_deploy_lib.py +205 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/README.md +89 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/confluence_sync_coordinator.sh +27 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/coordination.sh +114 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/diagram_coordinator.sh +25 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/docs_root.sh +22 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/generate_diagrams.sh +22 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/markdown_coordinator.sh +25 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/progress_dashboard.sh +17 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/schema_coordinator.sh +25 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/sync_confluence.sh +30 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/update_dependencies.sh +19 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_links.sh +86 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_markdown.sh +52 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_schemas.sh +26 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_structure.sh +98 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_dockerfile_correctness.py +815 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_makefile_loadouts.py +560 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_smoke_deploy.py +313 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_verify_alembic.py +581 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_verify_infra_topology.py +254 -0
- package/skills/vds-skill/vds-scripts/scripts/update_modules_xml.py +194 -0
- package/skills/vds-skill/vds-scripts/scripts/uv-workspace-alignment-verification-2026-03-25.md +128 -0
- package/skills/vds-skill/vds-scripts/scripts/uv-workspace-alignment-verification-2026-04-18.md +100 -0
- package/skills/vds-skill/vds-scripts/scripts/validate-cli-standardization.sh +188 -0
- package/skills/vds-skill/vds-scripts/scripts/validate_brd_coverage.py +197 -0
- package/skills/vds-skill/vds-scripts/scripts/validate_folder_structure.py +234 -0
- package/skills/vds-skill/vds-scripts/scripts/validate_link_integrity.py +274 -0
- package/skills/vds-skill/vds-scripts/scripts/vami017-caller-compat-report.md +62 -0
- package/skills/vds-skill/vds-scripts/scripts/vami017-phase-b-scaffold-notes.md +79 -0
- package/skills/vds-skill/vds-scripts/scripts/vds_sh_helpers.sh +180 -0
- package/skills/vds-skill/vds-scripts/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +26 -0
- package/skills/vds-skill/vds-scripts/scripts/verify-infra-topology.py +868 -0
- package/skills/vds-skill/vds-scripts/scripts/verify-memory-cli-e2e.sh +598 -0
- package/skills/vds-skill/vds-scripts/scripts/verify-worktree-features.sh +306 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree-add.sh +128 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree-remove.sh +112 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree_compose.sh +269 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree_uv.sh +77 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/IMPLEMENTATION_AUDIT.md +376 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/README.md +507 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/pyproject.toml +106 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/scripts/ensure_symlink.sh +38 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/__init__.py +164 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/batch.py +212 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/cli.py +1407 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/client.py +608 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/config.py +260 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/diff.py +220 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/external_sca.py +932 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/portfolio.py +225 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/pr.py +505 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/reports.py +342 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/scanner.py +351 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/webhooks.py +269 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/conftest.py +134 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_batch.py +419 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_config.py +145 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_errors.py +78 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_external_sca.py +466 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_pr.py +471 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_reports.py +511 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_webhooks.py +660 -0
- package/skills/vds-skill/vds-scripts/uv.lock +5046 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/CHANGELOG.md +36 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/README.md +453 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/docs/PHASE9A_ASSESSMENT.md +50 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/docs/embedding.md +468 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/pyproject.toml +51 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/__init__.py +29 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/__init__.py +26 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/hooks.py +119 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/loop.py +864 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/tools.py +41 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/config.py +252 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/__init__.py +55 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/_cascade.py +143 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/budget.py +353 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/cache.py +373 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/embedding.py +815 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/provider.py +173 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/schemas.py +45 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/__init__.py +77 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/decorators.py +258 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/jsonl_exporter.py +236 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/tracer.py +497 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/profiles.py +2015 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/runtime/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/runtime/agent_id.py +60 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/security/__init__.py +13 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/security/credentials.py +106 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/executor.py +238 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/manager.py +381 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/policy.py +568 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/__init__.py +19 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/langgraph_runner.py +102 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/protocols.py +81 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/conftest.py +62 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_audit_loop_hooks_integration.py +135 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_audit_observability_integration.py +246 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_public_api_stability.py +91 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_call_site_parallelism.py +30 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_dimension_guardrail.py +25 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_drop_in_provider_extensibility.py +76 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding.py +393 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_cache.py +302 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_extra.py +696 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_subclass.py +49 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_no_provider_leakage_in_env.py +34 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_provider_auto_route.py +48 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_runtime_log_clean.py +111 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_w7_logic_fixes.py +219 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_embedding_block_parser.py +194 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_env_resolver_allowlist.py +141 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_profile_authorization.py +158 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_profiles_w3_extra.py +547 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_real_audit_profile_compat.py +129 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/test_for_agent.py +322 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/test_w9_cascade_edges.py +369 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/security/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/security/test_credentials.py +132 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agent_loop.py +663 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agent_loop_coverage.py +429 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agents_hooks_defaults.py +22 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget.py +155 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget_coverage.py +264 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget_tracking_only.py +71 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_cache.py +251 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_cache_context.py +62 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_config.py +155 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_langgraph_runner.py +45 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_langgraph_runner_coverage.py +98 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_llm_cache_deep.py +113 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_decorators.py +697 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_hooks.py +217 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_jsonl_exporter.py +542 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_jsonl_wiring.py +313 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_tracer.py +896 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_profiles.py +1571 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_profiles_coverage.py +444 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_provider.py +316 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_schemas.py +63 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_executor.py +297 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_manager.py +370 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_manager_coverage.py +364 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_policy.py +402 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_rubric.py +47 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_tools.py +51 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_workflow_protocols.py +136 -0
- package/skills/vds-skill/vds-scripts/vds_cli/README.md +201 -0
- package/skills/vds-skill/vds-scripts/vds_cli/VERIFICATION_REPORT.md +41 -0
- package/skills/vds-skill/vds-scripts/vds_cli/pyproject.toml +50 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/assets/git-credential-helper.py +235 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/cli.py +1126 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/commands/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/commands/lint_cli.py +389 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/confluence_sync.py +846 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/__init__.py +7 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/funnel.py +105 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/scanner.py +211 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/freshness/report.py +90 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/types.py +27 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_cmd.py +672 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_metrics.py +75 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_sync.py +1171 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem/__init__.py +39 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem/report.py +439 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem_docs.py +164 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/env.py +111 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/env_git_helper.py +281 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/google_sheets_orchestrator.py +173 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/router.py +232 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/skills_cmd.py +274 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/sync_api.py +613 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/sync_service.py +283 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/conftest.py +62 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/test_env_git_helper_lifecycle.py +261 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/test_git_credential_helper.py +240 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/test_router_help_proxy.py +43 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_cli.py +241 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_cli_DOC004.py +110 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_confluence_sync.py +315 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_confluence_sync_wave7.py +375 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_consumption_funnel.py +106 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_consumption_scanner.py +144 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_cmd.py +89 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_cmd_wave8.py +161 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_metrics.py +16 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_quality_score.py +61 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_sync.py +417 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_cli_dashboard.py +667 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_cli_dashboard_rendering.py +143 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_docs.py +63 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_env.py +85 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_freshness_report.py +125 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_lint_cli.py +224 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_router.py +101 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_skills_cmd.py +419 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_sync_api.py +357 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_sync_service.py +170 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/conftest.py +51 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_bitbucket_real.py +32 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_confluence_real.py +32 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_jira_real.py +40 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/README.md +190 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/pyproject.toml +96 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/__init__.py +36 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/app.py +55 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/completers.py +139 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/context.py +201 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/env.py +163 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/errors.py +440 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/output.py +284 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/paths.py +78 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/testing.py +211 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/version.py +85 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_app.py +126 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_completers.py +148 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_context.py +192 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_env.py +235 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_errors.py +275 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_output.py +229 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_paths.py +61 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_testing.py +138 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_version.py +64 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/README.md +31 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/pyproject.toml +50 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/__init__.py +26 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/cli.py +246 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/client.py +104 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/config.py +82 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/workflows.json +3 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/workflows.py +130 -0
|
@@ -0,0 +1,1571 @@
|
|
|
1
|
+
"""Tests for vds_agent_core.profiles — Wave 2 full extraction."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import textwrap
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
from unittest.mock import patch
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestCodexCredentialResolverProtocol:
|
|
15
|
+
"""ConfigHooks Protocol structural conformance."""
|
|
16
|
+
|
|
17
|
+
def test_protocol_importable(self) -> None:
|
|
18
|
+
from vds_agent_core.profiles import CodexCredentialResolver
|
|
19
|
+
|
|
20
|
+
assert hasattr(CodexCredentialResolver, "resolve")
|
|
21
|
+
|
|
22
|
+
def test_protocol_is_runtime_checkable(self) -> None:
|
|
23
|
+
from vds_agent_core.profiles import CodexCredentialResolver
|
|
24
|
+
|
|
25
|
+
class _Good:
|
|
26
|
+
def resolve(self, field: str) -> str:
|
|
27
|
+
return field
|
|
28
|
+
|
|
29
|
+
class _Bad:
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
assert isinstance(_Good(), CodexCredentialResolver)
|
|
33
|
+
assert not isinstance(_Bad(), CodexCredentialResolver)
|
|
34
|
+
|
|
35
|
+
def test_protocol_structural_match(self) -> None:
|
|
36
|
+
"""A class with the right method satisfies the protocol without inheriting."""
|
|
37
|
+
from vds_agent_core.profiles import CodexCredentialResolver
|
|
38
|
+
|
|
39
|
+
class MyResolver:
|
|
40
|
+
def resolve(self, field: str) -> str:
|
|
41
|
+
return f"resolved:{field}"
|
|
42
|
+
|
|
43
|
+
resolver = MyResolver()
|
|
44
|
+
assert isinstance(resolver, CodexCredentialResolver)
|
|
45
|
+
assert resolver.resolve("access_token") == "resolved:access_token"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TestDefaultRuntimeProfilesFileExport:
|
|
49
|
+
def test_exported_from_package_root(self) -> None:
|
|
50
|
+
from vds_agent_core import DEFAULT_RUNTIME_PROFILES_FILE
|
|
51
|
+
|
|
52
|
+
assert isinstance(DEFAULT_RUNTIME_PROFILES_FILE, Path)
|
|
53
|
+
assert DEFAULT_RUNTIME_PROFILES_FILE.name == "audit.profiles.yaml"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class TestRuntimeProfileActivation:
|
|
57
|
+
"""RuntimeProfileActivation dataclass."""
|
|
58
|
+
|
|
59
|
+
def test_importable(self) -> None:
|
|
60
|
+
from vds_agent_core.profiles import RuntimeProfileActivation
|
|
61
|
+
|
|
62
|
+
activation = RuntimeProfileActivation(
|
|
63
|
+
profile_name="test",
|
|
64
|
+
source="cli",
|
|
65
|
+
profile_path=Path("/tmp/test.yaml"),
|
|
66
|
+
applied_env_keys=("KEY_A", "KEY_B"),
|
|
67
|
+
)
|
|
68
|
+
assert activation.profile_name == "test"
|
|
69
|
+
assert activation.source == "cli"
|
|
70
|
+
assert activation.applied_env_keys == ("KEY_A", "KEY_B")
|
|
71
|
+
|
|
72
|
+
def test_none_profile(self) -> None:
|
|
73
|
+
from vds_agent_core.profiles import RuntimeProfileActivation
|
|
74
|
+
|
|
75
|
+
activation = RuntimeProfileActivation(
|
|
76
|
+
profile_name=None,
|
|
77
|
+
source="none",
|
|
78
|
+
profile_path=Path("/tmp/test.yaml"),
|
|
79
|
+
applied_env_keys=(),
|
|
80
|
+
)
|
|
81
|
+
assert activation.profile_name is None
|
|
82
|
+
assert activation.source == "none"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class TestApplyRuntimeProfile:
|
|
86
|
+
"""apply_runtime_profile with full extraction mechanics."""
|
|
87
|
+
|
|
88
|
+
def test_importable(self) -> None:
|
|
89
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
90
|
+
|
|
91
|
+
assert callable(apply_runtime_profile)
|
|
92
|
+
|
|
93
|
+
def test_none_profile_no_yaml(self, tmp_path: Path) -> None:
|
|
94
|
+
"""None profile with no YAML file returns source=none."""
|
|
95
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
96
|
+
|
|
97
|
+
fake_yaml = tmp_path / "profiles.yaml"
|
|
98
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(fake_yaml)}, clear=False):
|
|
99
|
+
result = apply_runtime_profile(None)
|
|
100
|
+
assert result.profile_name is None
|
|
101
|
+
assert result.source == "none"
|
|
102
|
+
assert result.applied_env_keys == ()
|
|
103
|
+
|
|
104
|
+
def test_default_profile_from_yaml(self, tmp_path: Path) -> None:
|
|
105
|
+
"""Default profile is loaded when no explicit profile is requested."""
|
|
106
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
107
|
+
|
|
108
|
+
yaml_content = textwrap.dedent(""" default_profile: my-default
|
|
109
|
+
profiles:
|
|
110
|
+
my-default:
|
|
111
|
+
env:
|
|
112
|
+
MY_CUSTOM_KEY: hello
|
|
113
|
+
""")
|
|
114
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
115
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
116
|
+
|
|
117
|
+
env_patch = {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}
|
|
118
|
+
with patch.dict(os.environ, env_patch, clear=False):
|
|
119
|
+
os.environ.pop("MY_CUSTOM_KEY", None)
|
|
120
|
+
result = apply_runtime_profile(None)
|
|
121
|
+
assert result.profile_name == "my-default"
|
|
122
|
+
assert result.source == "default"
|
|
123
|
+
assert "MY_CUSTOM_KEY" in result.applied_env_keys
|
|
124
|
+
assert os.environ.get("MY_CUSTOM_KEY") == "hello"
|
|
125
|
+
|
|
126
|
+
def test_explicit_profile_from_yaml(self, tmp_path: Path) -> None:
|
|
127
|
+
"""Explicit profile name overrides default."""
|
|
128
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
129
|
+
|
|
130
|
+
yaml_content = textwrap.dedent(""" default_profile: default-one
|
|
131
|
+
profiles:
|
|
132
|
+
default-one:
|
|
133
|
+
env:
|
|
134
|
+
TEST_KEY_A: from-default
|
|
135
|
+
explicit-one:
|
|
136
|
+
env:
|
|
137
|
+
TEST_KEY_B: from-explicit
|
|
138
|
+
""")
|
|
139
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
140
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
141
|
+
|
|
142
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
143
|
+
os.environ.pop("TEST_KEY_A", None)
|
|
144
|
+
os.environ.pop("TEST_KEY_B", None)
|
|
145
|
+
result = apply_runtime_profile("explicit-one")
|
|
146
|
+
assert result.profile_name == "explicit-one"
|
|
147
|
+
assert result.source == "cli"
|
|
148
|
+
assert "TEST_KEY_B" in result.applied_env_keys
|
|
149
|
+
assert os.environ.get("TEST_KEY_B") == "from-explicit"
|
|
150
|
+
|
|
151
|
+
def test_missing_profile_raises(self, tmp_path: Path) -> None:
|
|
152
|
+
"""Requesting a non-existent profile raises ValueError."""
|
|
153
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
154
|
+
|
|
155
|
+
yaml_content = textwrap.dedent(""" profiles:
|
|
156
|
+
existing:
|
|
157
|
+
env:
|
|
158
|
+
X: Y
|
|
159
|
+
""")
|
|
160
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
161
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
162
|
+
|
|
163
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
164
|
+
with pytest.raises(ValueError, match="was not found"):
|
|
165
|
+
apply_runtime_profile("nonexistent")
|
|
166
|
+
|
|
167
|
+
def test_custom_env_prefix(self, tmp_path: Path) -> None:
|
|
168
|
+
"""Custom env_prefix replaces VDS_AUDIT_ in env key mapping."""
|
|
169
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
170
|
+
|
|
171
|
+
yaml_content = textwrap.dedent(""" profiles:
|
|
172
|
+
test-profile:
|
|
173
|
+
retry_policy:
|
|
174
|
+
agent_retries: 3
|
|
175
|
+
""")
|
|
176
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
177
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
178
|
+
|
|
179
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
180
|
+
# Clear any pre-existing keys
|
|
181
|
+
for k in list(os.environ):
|
|
182
|
+
if k.startswith("VDS_PROGRESS_"):
|
|
183
|
+
os.environ.pop(k, None)
|
|
184
|
+
result = apply_runtime_profile(
|
|
185
|
+
"test-profile",
|
|
186
|
+
env_prefix="VDS_PROGRESS_",
|
|
187
|
+
)
|
|
188
|
+
assert result.profile_name == "test-profile"
|
|
189
|
+
assert "VDS_PROGRESS_LLM__AGENT_RETRIES" in result.applied_env_keys
|
|
190
|
+
assert os.environ.get("VDS_PROGRESS_LLM__AGENT_RETRIES") == "3"
|
|
191
|
+
|
|
192
|
+
def test_config_hooks_accepted(self, tmp_path: Path) -> None:
|
|
193
|
+
"""config_hooks parameter is accepted and functional."""
|
|
194
|
+
from vds_agent_core.profiles import ConfigHooks, apply_runtime_profile
|
|
195
|
+
|
|
196
|
+
class _TrackingHooks:
|
|
197
|
+
def __init__(self) -> None:
|
|
198
|
+
self.calls: list[str] = []
|
|
199
|
+
|
|
200
|
+
def get_config(self) -> Any:
|
|
201
|
+
self.calls.append("get")
|
|
202
|
+
return {}
|
|
203
|
+
|
|
204
|
+
def set_config(self, cfg: Any) -> None:
|
|
205
|
+
self.calls.append("set")
|
|
206
|
+
|
|
207
|
+
def reset_config(self) -> None:
|
|
208
|
+
self.calls.append("reset")
|
|
209
|
+
|
|
210
|
+
hooks = _TrackingHooks()
|
|
211
|
+
assert isinstance(hooks, ConfigHooks)
|
|
212
|
+
|
|
213
|
+
yaml_content = textwrap.dedent(""" profiles:
|
|
214
|
+
hook-test:
|
|
215
|
+
env:
|
|
216
|
+
HOOK_TEST_KEY: value
|
|
217
|
+
""")
|
|
218
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
219
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
220
|
+
|
|
221
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
222
|
+
os.environ.pop("HOOK_TEST_KEY", None)
|
|
223
|
+
result = apply_runtime_profile("hook-test", _config_hooks=hooks)
|
|
224
|
+
assert result.profile_name == "hook-test"
|
|
225
|
+
|
|
226
|
+
def test_force_override(self, tmp_path: Path) -> None:
|
|
227
|
+
"""force_override=True overwrites existing env vars."""
|
|
228
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
229
|
+
|
|
230
|
+
yaml_content = textwrap.dedent(""" profiles:
|
|
231
|
+
override-test:
|
|
232
|
+
env:
|
|
233
|
+
OVERRIDE_KEY: new-value
|
|
234
|
+
""")
|
|
235
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
236
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
237
|
+
|
|
238
|
+
with patch.dict(
|
|
239
|
+
os.environ,
|
|
240
|
+
{
|
|
241
|
+
"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file),
|
|
242
|
+
"OVERRIDE_KEY": "old-value",
|
|
243
|
+
},
|
|
244
|
+
clear=False,
|
|
245
|
+
):
|
|
246
|
+
result = apply_runtime_profile("override-test", force_override=True)
|
|
247
|
+
assert os.environ.get("OVERRIDE_KEY") == "new-value"
|
|
248
|
+
assert "OVERRIDE_KEY" in result.applied_env_keys
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class TestBuildLlmSettingsForProfile:
|
|
252
|
+
"""build_llm_settings_for_profile with config_hooks."""
|
|
253
|
+
|
|
254
|
+
def test_with_config_hooks_and_factory(self, tmp_path: Path) -> None:
|
|
255
|
+
"""Config hooks are called during build, factory produces settings."""
|
|
256
|
+
from vds_agent_core.profiles import build_llm_settings_for_profile
|
|
257
|
+
|
|
258
|
+
yaml_content = textwrap.dedent(""" profiles:
|
|
259
|
+
build-test:
|
|
260
|
+
env:
|
|
261
|
+
BUILD_TEST_MARKER: active
|
|
262
|
+
""")
|
|
263
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
264
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
265
|
+
|
|
266
|
+
class _MockHooks:
|
|
267
|
+
def __init__(self) -> None:
|
|
268
|
+
self.calls: list[str] = []
|
|
269
|
+
|
|
270
|
+
def get_config(self) -> Any:
|
|
271
|
+
self.calls.append("get")
|
|
272
|
+
return {"original": True}
|
|
273
|
+
|
|
274
|
+
def set_config(self, cfg: Any) -> None:
|
|
275
|
+
self.calls.append(f"set:{cfg}")
|
|
276
|
+
|
|
277
|
+
def reset_config(self) -> None:
|
|
278
|
+
self.calls.append("reset")
|
|
279
|
+
|
|
280
|
+
hooks = _MockHooks()
|
|
281
|
+
|
|
282
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
283
|
+
result = build_llm_settings_for_profile(
|
|
284
|
+
"build-test",
|
|
285
|
+
config_hooks=hooks,
|
|
286
|
+
settings_factory=lambda: {"built": True},
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
assert result == {"built": True}
|
|
290
|
+
assert "get" in hooks.calls
|
|
291
|
+
assert "reset" in hooks.calls
|
|
292
|
+
assert any(c.startswith("set:") for c in hooks.calls)
|
|
293
|
+
|
|
294
|
+
def test_without_factory_returns_none(self, tmp_path: Path) -> None:
|
|
295
|
+
"""Without settings_factory, returns None."""
|
|
296
|
+
from vds_agent_core.profiles import build_llm_settings_for_profile
|
|
297
|
+
|
|
298
|
+
yaml_content = textwrap.dedent(""" profiles:
|
|
299
|
+
no-factory:
|
|
300
|
+
env:
|
|
301
|
+
NF_KEY: val
|
|
302
|
+
""")
|
|
303
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
304
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
305
|
+
|
|
306
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
307
|
+
result = build_llm_settings_for_profile("no-factory")
|
|
308
|
+
|
|
309
|
+
assert result is None
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class TestEnvMaps:
|
|
313
|
+
"""_EnvMaps prefix substitution."""
|
|
314
|
+
|
|
315
|
+
def test_default_prefix(self) -> None:
|
|
316
|
+
from vds_agent_core.profiles import _EnvMaps
|
|
317
|
+
|
|
318
|
+
maps = _EnvMaps("VDS_AUDIT_")
|
|
319
|
+
assert maps.retry["agent_retries"] == "VDS_AUDIT_LLM__AGENT_RETRIES"
|
|
320
|
+
assert maps.active_profile_env == "VDS_AUDIT_ACTIVE_PROFILE"
|
|
321
|
+
|
|
322
|
+
def test_custom_prefix(self) -> None:
|
|
323
|
+
from vds_agent_core.profiles import _EnvMaps
|
|
324
|
+
|
|
325
|
+
maps = _EnvMaps("VDS_PROGRESS_")
|
|
326
|
+
assert maps.retry["agent_retries"] == "VDS_PROGRESS_LLM__AGENT_RETRIES"
|
|
327
|
+
assert maps.active_profile_env == "VDS_PROGRESS_ACTIVE_PROFILE"
|
|
328
|
+
assert maps.model_llm["type"] == "VDS_PROGRESS_LLM_PROTOCOL"
|
|
329
|
+
assert maps.model_dspy["model"] == "VDS_PROGRESS_DSPY_MODEL"
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class TestProfileProtectedEnvKeys:
|
|
333
|
+
"""profile_protected_env_keys with prefix."""
|
|
334
|
+
|
|
335
|
+
def test_default_prefix(self) -> None:
|
|
336
|
+
from vds_agent_core.profiles import profile_protected_env_keys
|
|
337
|
+
|
|
338
|
+
keys = profile_protected_env_keys()
|
|
339
|
+
assert "VDS_AUDIT_LLM_PROTOCOL" in keys
|
|
340
|
+
assert "VDS_AUDIT_LLM__API_KEY" in keys
|
|
341
|
+
|
|
342
|
+
def test_custom_prefix(self) -> None:
|
|
343
|
+
from vds_agent_core.profiles import profile_protected_env_keys
|
|
344
|
+
|
|
345
|
+
keys = profile_protected_env_keys(env_prefix="VDS_PROGRESS_")
|
|
346
|
+
assert "VDS_PROGRESS_LLM_PROTOCOL" in keys
|
|
347
|
+
assert "VDS_PROGRESS_LLM__API_KEY" in keys
|
|
348
|
+
assert "VDS_AUDIT_LLM_PROTOCOL" not in keys
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class TestResolveAgenticToolFirstScalar:
|
|
352
|
+
"""resolve_agentic_tool_first_scalar with custom prefix."""
|
|
353
|
+
|
|
354
|
+
def test_default_returns_default(self) -> None:
|
|
355
|
+
from vds_agent_core.profiles import resolve_agentic_tool_first_scalar
|
|
356
|
+
|
|
357
|
+
os.environ.pop("VDS_AUDIT_AGENTIC_TOOL_FIRST_MAX_STEPS", None)
|
|
358
|
+
result = resolve_agentic_tool_first_scalar("tool_first_max_steps", default=10)
|
|
359
|
+
assert result == 10
|
|
360
|
+
|
|
361
|
+
def test_custom_prefix(self) -> None:
|
|
362
|
+
from vds_agent_core.profiles import resolve_agentic_tool_first_scalar
|
|
363
|
+
|
|
364
|
+
os.environ["VDS_PROGRESS_AGENTIC_TOOL_FIRST_MAX_STEPS"] = "25"
|
|
365
|
+
try:
|
|
366
|
+
result = resolve_agentic_tool_first_scalar(
|
|
367
|
+
"tool_first_max_steps",
|
|
368
|
+
default=10,
|
|
369
|
+
env_prefix="VDS_PROGRESS_",
|
|
370
|
+
)
|
|
371
|
+
assert result == 25
|
|
372
|
+
finally:
|
|
373
|
+
os.environ.pop("VDS_PROGRESS_AGENTIC_TOOL_FIRST_MAX_STEPS", None)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
class TestRealProfileIntegration:
|
|
377
|
+
"""Integration tests using the real ~/.vds/audit.profiles.yaml file.
|
|
378
|
+
|
|
379
|
+
These tests exercise the actual YAML loading and env mutation paths
|
|
380
|
+
that unit tests with mocks cannot cover.
|
|
381
|
+
"""
|
|
382
|
+
|
|
383
|
+
def test_resolve_runtime_profiles_path_finds_real_file(self) -> None:
|
|
384
|
+
from vds_agent_core.profiles import resolve_runtime_profiles_path
|
|
385
|
+
|
|
386
|
+
path = resolve_runtime_profiles_path()
|
|
387
|
+
assert path is not None
|
|
388
|
+
assert path.exists(), f"Profile file not found at {path}"
|
|
389
|
+
assert path.suffix == ".yaml"
|
|
390
|
+
|
|
391
|
+
def test_list_runtime_profile_names_returns_profiles(self) -> None:
|
|
392
|
+
from vds_agent_core.profiles import list_runtime_profile_names
|
|
393
|
+
|
|
394
|
+
names = list_runtime_profile_names()
|
|
395
|
+
assert isinstance(names, list)
|
|
396
|
+
assert len(names) > 0, "Expected at least one profile"
|
|
397
|
+
|
|
398
|
+
def test_apply_runtime_profile_none_is_noop(self) -> None:
|
|
399
|
+
"""Applying None profile should not raise and return activation."""
|
|
400
|
+
from vds_agent_core.profiles import RuntimeProfileActivation, apply_runtime_profile
|
|
401
|
+
|
|
402
|
+
result = apply_runtime_profile(None)
|
|
403
|
+
assert result is not None
|
|
404
|
+
assert isinstance(result, RuntimeProfileActivation)
|
|
405
|
+
|
|
406
|
+
def test_apply_runtime_profile_default_profile(self) -> None:
|
|
407
|
+
"""Apply the default profile from the real YAML file."""
|
|
408
|
+
import os
|
|
409
|
+
|
|
410
|
+
from vds_agent_core.profiles import RuntimeProfileActivation, apply_runtime_profile
|
|
411
|
+
|
|
412
|
+
# Save and restore env state
|
|
413
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
414
|
+
try:
|
|
415
|
+
result = apply_runtime_profile("omniroute-dlg1-gpt-openai")
|
|
416
|
+
assert result is not None
|
|
417
|
+
assert isinstance(result, RuntimeProfileActivation)
|
|
418
|
+
finally:
|
|
419
|
+
# Restore env
|
|
420
|
+
for k in list(os.environ.keys()):
|
|
421
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
422
|
+
del os.environ[k]
|
|
423
|
+
for k, v in saved.items():
|
|
424
|
+
os.environ[k] = v
|
|
425
|
+
|
|
426
|
+
def test_apply_runtime_profile_unknown_profile_raises(self) -> None:
|
|
427
|
+
"""Applying an unknown profile name should raise ValueError."""
|
|
428
|
+
import pytest
|
|
429
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
430
|
+
|
|
431
|
+
with pytest.raises((ValueError, KeyError, Exception)):
|
|
432
|
+
apply_runtime_profile("nonexistent-profile-xyz-12345")
|
|
433
|
+
|
|
434
|
+
def test_profile_sets_env_vars(self) -> None:
|
|
435
|
+
"""Applying a real profile should set VDS_AUDIT_* env vars."""
|
|
436
|
+
import os
|
|
437
|
+
|
|
438
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
439
|
+
|
|
440
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
441
|
+
try:
|
|
442
|
+
apply_runtime_profile("omniroute-dlg1-gpt-openai")
|
|
443
|
+
# After applying, at least the active profile env var should be set
|
|
444
|
+
active = os.environ.get("VDS_AUDIT_ACTIVE_PROFILE")
|
|
445
|
+
assert active == "omniroute-dlg1-gpt-openai", f"Expected active profile, got {active}"
|
|
446
|
+
finally:
|
|
447
|
+
for k in list(os.environ.keys()):
|
|
448
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
449
|
+
del os.environ[k]
|
|
450
|
+
for k, v in saved.items():
|
|
451
|
+
os.environ[k] = v
|
|
452
|
+
|
|
453
|
+
def test_apply_runtime_profile_custom_env_prefix(self) -> None:
|
|
454
|
+
"""env_prefix parameter should be accepted without error."""
|
|
455
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
456
|
+
|
|
457
|
+
# Just verify it accepts the parameter — don't check env mutation
|
|
458
|
+
# since VDS_PROGRESS_ prefix won't match the YAML profile keys
|
|
459
|
+
result = apply_runtime_profile(None, env_prefix="VDS_PROGRESS_")
|
|
460
|
+
assert result is not None
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
class TestRealProfilePolicyApplication:
|
|
464
|
+
"""Tests that verify policy application helpers are exercised via real profiles."""
|
|
465
|
+
|
|
466
|
+
def _apply_and_restore(self, profile_name: str) -> dict:
|
|
467
|
+
"""Apply profile, capture env changes, restore env."""
|
|
468
|
+
import os
|
|
469
|
+
|
|
470
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
471
|
+
|
|
472
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
473
|
+
try:
|
|
474
|
+
apply_runtime_profile(profile_name)
|
|
475
|
+
applied = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
476
|
+
return applied
|
|
477
|
+
finally:
|
|
478
|
+
for k in list(os.environ.keys()):
|
|
479
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
480
|
+
del os.environ[k]
|
|
481
|
+
for k, v in saved.items():
|
|
482
|
+
os.environ[k] = v
|
|
483
|
+
|
|
484
|
+
def test_model_policy_sets_llm_enabled(self) -> None:
|
|
485
|
+
"""Profile with env.VDS_AUDIT_LLM_ENABLED should set it."""
|
|
486
|
+
applied = self._apply_and_restore("omniroute-dlg1-gpt-openai")
|
|
487
|
+
assert applied.get("VDS_AUDIT_LLM_ENABLED") == "true"
|
|
488
|
+
|
|
489
|
+
def test_model_policy_sets_api_key_env(self) -> None:
|
|
490
|
+
"""Profile with env.VDS_AUDIT_LLM__API_KEY should set it."""
|
|
491
|
+
applied = self._apply_and_restore("omniroute-dlg1-gpt-openai")
|
|
492
|
+
# Key may be set to the literal ${OMNIROUTE_API_KEY} or resolved value
|
|
493
|
+
assert "VDS_AUDIT_LLM__API_KEY" in applied or "VDS_AUDIT_LLM_ENABLED" in applied
|
|
494
|
+
|
|
495
|
+
def test_model_policy_sets_max_tokens(self) -> None:
|
|
496
|
+
"""Profile env.VDS_AUDIT_LLM__MAX_TOKENS_PER_REQUEST should be applied."""
|
|
497
|
+
applied = self._apply_and_restore("omniroute-dlg1-gpt-openai")
|
|
498
|
+
assert applied.get("VDS_AUDIT_LLM__MAX_TOKENS_PER_REQUEST") == "24000"
|
|
499
|
+
|
|
500
|
+
def test_model_policy_sets_agent_retries(self) -> None:
|
|
501
|
+
"""Profile env.VDS_AUDIT_LLM__AGENT_RETRIES should be applied."""
|
|
502
|
+
applied = self._apply_and_restore("omniroute-dlg1-gpt-openai")
|
|
503
|
+
assert applied.get("VDS_AUDIT_LLM__AGENT_RETRIES") == "2"
|
|
504
|
+
|
|
505
|
+
def test_model_policy_sets_skills_toolset(self) -> None:
|
|
506
|
+
"""Profile env.VDS_AUDIT_LLM__SKILLS_TOOLSET_ENABLED should be applied."""
|
|
507
|
+
applied = self._apply_and_restore("omniroute-dlg1-gpt-openai")
|
|
508
|
+
assert applied.get("VDS_AUDIT_LLM__SKILLS_TOOLSET_ENABLED") == "true"
|
|
509
|
+
|
|
510
|
+
def test_active_profile_env_var_set(self) -> None:
|
|
511
|
+
"""VDS_AUDIT_ACTIVE_PROFILE should be set to the applied profile name."""
|
|
512
|
+
applied = self._apply_and_restore("omniroute-dlg1-gpt-openai")
|
|
513
|
+
assert applied.get("VDS_AUDIT_ACTIVE_PROFILE") == "omniroute-dlg1-gpt-openai"
|
|
514
|
+
|
|
515
|
+
def test_build_llm_settings_for_profile(self) -> None:
|
|
516
|
+
"""build_llm_settings_for_profile should not raise for a valid profile."""
|
|
517
|
+
from vds_agent_core.profiles import build_llm_settings_for_profile
|
|
518
|
+
|
|
519
|
+
# May return None if no settings_factory is provided — just verify no exception
|
|
520
|
+
try:
|
|
521
|
+
build_llm_settings_for_profile("omniroute-dlg1-gpt-openai")
|
|
522
|
+
except Exception as e:
|
|
523
|
+
# Only fail if it's not a missing-factory type error
|
|
524
|
+
if "settings_factory" not in str(e) and "factory" not in str(e).lower():
|
|
525
|
+
raise
|
|
526
|
+
|
|
527
|
+
def test_inherit_runtime_llm_policy(self) -> None:
|
|
528
|
+
"""inherit_runtime_llm_policy should not raise for a valid profile."""
|
|
529
|
+
import os
|
|
530
|
+
|
|
531
|
+
from vds_agent_core.profiles import inherit_runtime_llm_policy
|
|
532
|
+
|
|
533
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
534
|
+
try:
|
|
535
|
+
# inherit_runtime_llm_policy requires profile_name as first arg
|
|
536
|
+
try:
|
|
537
|
+
inherit_runtime_llm_policy("omniroute-dlg1-gpt-openai")
|
|
538
|
+
except Exception as e:
|
|
539
|
+
# Only fail if it is not a missing-factory type error
|
|
540
|
+
if "settings_factory" not in str(e) and "factory" not in str(e).lower():
|
|
541
|
+
raise
|
|
542
|
+
finally:
|
|
543
|
+
for k in list(os.environ.keys()):
|
|
544
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
545
|
+
del os.environ[k]
|
|
546
|
+
for k, v in saved.items():
|
|
547
|
+
os.environ[k] = v
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
class TestResolveDefaultFailoverProfiles:
|
|
551
|
+
"""resolve_default_failover_profiles returns other profiles excluding active."""
|
|
552
|
+
|
|
553
|
+
def test_excludes_active_profile(self) -> None:
|
|
554
|
+
from vds_agent_core.profiles import resolve_default_failover_profiles
|
|
555
|
+
|
|
556
|
+
all_profiles = ["profile-a", "profile-b", "profile-c"]
|
|
557
|
+
result = resolve_default_failover_profiles("profile-a", all_profiles=all_profiles)
|
|
558
|
+
assert "profile-a" not in result
|
|
559
|
+
assert "profile-b" in result
|
|
560
|
+
assert "profile-c" in result
|
|
561
|
+
|
|
562
|
+
def test_none_active_returns_all(self) -> None:
|
|
563
|
+
from vds_agent_core.profiles import resolve_default_failover_profiles
|
|
564
|
+
|
|
565
|
+
all_profiles = ["profile-a", "profile-b"]
|
|
566
|
+
result = resolve_default_failover_profiles(None, all_profiles=all_profiles)
|
|
567
|
+
assert result == ["profile-a", "profile-b"]
|
|
568
|
+
|
|
569
|
+
def test_empty_all_profiles_returns_empty(self) -> None:
|
|
570
|
+
from vds_agent_core.profiles import resolve_default_failover_profiles
|
|
571
|
+
|
|
572
|
+
result = resolve_default_failover_profiles("profile-a", all_profiles=[])
|
|
573
|
+
assert result == []
|
|
574
|
+
|
|
575
|
+
def test_deduplicates_profiles(self) -> None:
|
|
576
|
+
from vds_agent_core.profiles import resolve_default_failover_profiles
|
|
577
|
+
|
|
578
|
+
all_profiles = ["profile-a", "profile-b", "profile-b", "profile-c"]
|
|
579
|
+
result = resolve_default_failover_profiles("profile-a", all_profiles=all_profiles)
|
|
580
|
+
assert result.count("profile-b") == 1
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
class TestListRuntimeProfileNames:
|
|
584
|
+
"""list_runtime_profile_names returns names from YAML."""
|
|
585
|
+
|
|
586
|
+
def test_returns_list_from_yaml(self, tmp_path: Path) -> None:
|
|
587
|
+
import textwrap
|
|
588
|
+
from unittest.mock import patch
|
|
589
|
+
|
|
590
|
+
from vds_agent_core.profiles import list_runtime_profile_names
|
|
591
|
+
|
|
592
|
+
yaml_content = textwrap.dedent("""
|
|
593
|
+
profiles:
|
|
594
|
+
alpha:
|
|
595
|
+
env:
|
|
596
|
+
KEY_A: val
|
|
597
|
+
beta:
|
|
598
|
+
env:
|
|
599
|
+
KEY_B: val
|
|
600
|
+
""")
|
|
601
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
602
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
603
|
+
|
|
604
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
605
|
+
names = list_runtime_profile_names()
|
|
606
|
+
|
|
607
|
+
assert "alpha" in names
|
|
608
|
+
assert "beta" in names
|
|
609
|
+
|
|
610
|
+
def test_missing_file_returns_empty(self, tmp_path: Path) -> None:
|
|
611
|
+
from unittest.mock import patch
|
|
612
|
+
|
|
613
|
+
from vds_agent_core.profiles import list_runtime_profile_names
|
|
614
|
+
|
|
615
|
+
missing = tmp_path / "nonexistent.yaml"
|
|
616
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(missing)}, clear=False):
|
|
617
|
+
names = list_runtime_profile_names()
|
|
618
|
+
|
|
619
|
+
assert names == []
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
class TestEnvMapsCustomPrefix:
|
|
623
|
+
"""_EnvMaps with non-default prefix replaces VDS_AUDIT_ correctly."""
|
|
624
|
+
|
|
625
|
+
def test_model_dspy_prefix_replaced(self) -> None:
|
|
626
|
+
from vds_agent_core.profiles import _EnvMaps
|
|
627
|
+
|
|
628
|
+
maps = _EnvMaps("VDS_PROGRESS_")
|
|
629
|
+
assert maps.model_dspy["model"] == "VDS_PROGRESS_DSPY_MODEL"
|
|
630
|
+
assert maps.model_dspy["api_key"] == "VDS_PROGRESS_DSPY_API_KEY"
|
|
631
|
+
|
|
632
|
+
def test_timeout_prefix_replaced(self) -> None:
|
|
633
|
+
from vds_agent_core.profiles import _EnvMaps
|
|
634
|
+
|
|
635
|
+
maps = _EnvMaps("VDS_PROGRESS_")
|
|
636
|
+
assert maps.timeout["agent_timeout_seconds"] == "VDS_PROGRESS_LLM__AGENT_TIMEOUT_SECONDS"
|
|
637
|
+
|
|
638
|
+
def test_agentic_tool_first_prefix_replaced(self) -> None:
|
|
639
|
+
from vds_agent_core.profiles import _EnvMaps
|
|
640
|
+
|
|
641
|
+
maps = _EnvMaps("VDS_PROGRESS_")
|
|
642
|
+
assert maps.agentic_tool_first["tool_first_max_steps"] == "VDS_PROGRESS_AGENTIC_TOOL_FIRST_MAX_STEPS"
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
class TestModelPolicyViaYaml:
|
|
646
|
+
"""Tests for model policy helpers exercised via apply_runtime_profile with crafted YAML."""
|
|
647
|
+
|
|
648
|
+
def _apply(self, tmp_path: Path, yaml_content: str, profile: str = "test-profile", **kwargs: Any) -> Any:
|
|
649
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
650
|
+
|
|
651
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
652
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
653
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
654
|
+
# Clear any pre-existing VDS_AUDIT_ keys that might interfere
|
|
655
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
656
|
+
for k in list(saved):
|
|
657
|
+
if k != "VDS_AUDIT_RUNTIME_PROFILES_FILE":
|
|
658
|
+
os.environ.pop(k, None)
|
|
659
|
+
try:
|
|
660
|
+
return apply_runtime_profile(profile, force_override=True, **kwargs)
|
|
661
|
+
finally:
|
|
662
|
+
for k in list(os.environ.keys()):
|
|
663
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
664
|
+
os.environ.pop(k, None)
|
|
665
|
+
for k, v in saved.items():
|
|
666
|
+
os.environ[k] = v
|
|
667
|
+
|
|
668
|
+
def test_model_llm_type_applied(self, tmp_path: Path) -> None:
|
|
669
|
+
"""model.llm.type sets VDS_AUDIT_LLM_PROTOCOL."""
|
|
670
|
+
result = self._apply(
|
|
671
|
+
tmp_path,
|
|
672
|
+
"""
|
|
673
|
+
profiles:
|
|
674
|
+
test-profile:
|
|
675
|
+
model:
|
|
676
|
+
llm:
|
|
677
|
+
type: openai
|
|
678
|
+
base_url: http://localhost:4000
|
|
679
|
+
api_key: sk-test
|
|
680
|
+
""",
|
|
681
|
+
)
|
|
682
|
+
assert result.profile_name == "test-profile"
|
|
683
|
+
assert "VDS_AUDIT_LLM_PROTOCOL" in result.applied_env_keys
|
|
684
|
+
|
|
685
|
+
def test_model_llm_stream_applied(self, tmp_path: Path) -> None:
|
|
686
|
+
"""model.llm.stream sets VDS_AUDIT_LLM__STREAM."""
|
|
687
|
+
result = self._apply(
|
|
688
|
+
tmp_path,
|
|
689
|
+
"""
|
|
690
|
+
profiles:
|
|
691
|
+
test-profile:
|
|
692
|
+
model:
|
|
693
|
+
llm:
|
|
694
|
+
type: openai
|
|
695
|
+
base_url: http://localhost:4000
|
|
696
|
+
api_key: sk-test
|
|
697
|
+
stream: true
|
|
698
|
+
""",
|
|
699
|
+
)
|
|
700
|
+
assert "VDS_AUDIT_LLM__STREAM" in result.applied_env_keys
|
|
701
|
+
|
|
702
|
+
def test_model_llm_invalid_type_raises(self, tmp_path: Path) -> None:
|
|
703
|
+
"""model.llm.type with unsupported protocol raises ValueError."""
|
|
704
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
705
|
+
|
|
706
|
+
yaml_content = textwrap.dedent("""
|
|
707
|
+
profiles:
|
|
708
|
+
test-profile:
|
|
709
|
+
model:
|
|
710
|
+
llm:
|
|
711
|
+
type: unsupported-protocol
|
|
712
|
+
base_url: http://localhost:4000
|
|
713
|
+
api_key: sk-test
|
|
714
|
+
""")
|
|
715
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
716
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
717
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
718
|
+
with pytest.raises(ValueError, match=r"invalid model\.llm\.type"):
|
|
719
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
720
|
+
|
|
721
|
+
def test_model_llm_reasoning_effort_applied(self, tmp_path: Path) -> None:
|
|
722
|
+
"""model.llm.reasoning_effort sets VDS_AUDIT_LLM__REASONING_EFFORT."""
|
|
723
|
+
result = self._apply(
|
|
724
|
+
tmp_path,
|
|
725
|
+
"""
|
|
726
|
+
profiles:
|
|
727
|
+
test-profile:
|
|
728
|
+
model:
|
|
729
|
+
llm:
|
|
730
|
+
type: openai
|
|
731
|
+
base_url: http://localhost:4000
|
|
732
|
+
api_key: sk-test
|
|
733
|
+
reasoning_effort: high
|
|
734
|
+
""",
|
|
735
|
+
)
|
|
736
|
+
assert "VDS_AUDIT_LLM__REASONING_EFFORT" in result.applied_env_keys
|
|
737
|
+
|
|
738
|
+
def test_model_llm_invalid_reasoning_effort_raises(self, tmp_path: Path) -> None:
|
|
739
|
+
"""model.llm.reasoning_effort with invalid value raises ValueError."""
|
|
740
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
741
|
+
|
|
742
|
+
yaml_content = textwrap.dedent("""
|
|
743
|
+
profiles:
|
|
744
|
+
test-profile:
|
|
745
|
+
model:
|
|
746
|
+
llm:
|
|
747
|
+
type: openai
|
|
748
|
+
base_url: http://localhost:4000
|
|
749
|
+
api_key: sk-test
|
|
750
|
+
reasoning_effort: ultra
|
|
751
|
+
""")
|
|
752
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
753
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
754
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
755
|
+
with pytest.raises(ValueError, match="reasoning_effort"):
|
|
756
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
757
|
+
|
|
758
|
+
def test_model_llm_row_failover_profiles_string(self, tmp_path: Path) -> None:
|
|
759
|
+
"""model.llm.row_failover_profiles as comma-string sets env var."""
|
|
760
|
+
# Note: list form is not used here because the generic tier loop in
|
|
761
|
+
# _apply_profile_model_policy also processes row_failover_profiles as a
|
|
762
|
+
# string field — using a string value avoids the conflict.
|
|
763
|
+
result = self._apply(
|
|
764
|
+
tmp_path,
|
|
765
|
+
"""
|
|
766
|
+
profiles:
|
|
767
|
+
test-profile:
|
|
768
|
+
model:
|
|
769
|
+
llm:
|
|
770
|
+
type: openai
|
|
771
|
+
base_url: http://localhost:4000
|
|
772
|
+
api_key: sk-test
|
|
773
|
+
row_failover_profiles: "profile-b,profile-c"
|
|
774
|
+
""",
|
|
775
|
+
)
|
|
776
|
+
assert "VDS_AUDIT_LLM__ROW_FAILOVER_PROFILES" in result.applied_env_keys
|
|
777
|
+
|
|
778
|
+
def test_model_llm_model_shorthand_sets_all_tiers(self, tmp_path: Path) -> None:
|
|
779
|
+
"""model.llm.model shorthand sets simple/standard/complex tiers."""
|
|
780
|
+
result = self._apply(
|
|
781
|
+
tmp_path,
|
|
782
|
+
"""
|
|
783
|
+
profiles:
|
|
784
|
+
test-profile:
|
|
785
|
+
model:
|
|
786
|
+
llm:
|
|
787
|
+
type: openai
|
|
788
|
+
base_url: http://localhost:4000
|
|
789
|
+
api_key: sk-test
|
|
790
|
+
model: gpt-4o
|
|
791
|
+
""",
|
|
792
|
+
)
|
|
793
|
+
assert "VDS_AUDIT_LLM__MODEL_STANDARD" in result.applied_env_keys
|
|
794
|
+
assert "VDS_AUDIT_LLM__MODEL_SIMPLE" in result.applied_env_keys
|
|
795
|
+
assert "VDS_AUDIT_LLM__MODEL_COMPLEX" in result.applied_env_keys
|
|
796
|
+
|
|
797
|
+
def test_model_dspy_type_and_model_applied(self, tmp_path: Path) -> None:
|
|
798
|
+
"""model.dspy.type and model set DSPy env vars."""
|
|
799
|
+
result = self._apply(
|
|
800
|
+
tmp_path,
|
|
801
|
+
"""
|
|
802
|
+
profiles:
|
|
803
|
+
test-profile:
|
|
804
|
+
model:
|
|
805
|
+
llm:
|
|
806
|
+
type: openai
|
|
807
|
+
base_url: http://localhost:4000
|
|
808
|
+
api_key: sk-test
|
|
809
|
+
dspy:
|
|
810
|
+
type: openai
|
|
811
|
+
model: openai/gpt-4o
|
|
812
|
+
api_key: sk-dspy
|
|
813
|
+
""",
|
|
814
|
+
)
|
|
815
|
+
assert "VDS_AUDIT_DSPY_PROTOCOL" in result.applied_env_keys
|
|
816
|
+
assert "VDS_AUDIT_DSPY_MODEL" in result.applied_env_keys
|
|
817
|
+
|
|
818
|
+
def test_model_dspy_invalid_type_raises(self, tmp_path: Path) -> None:
|
|
819
|
+
"""model.dspy.type with unsupported protocol raises ValueError."""
|
|
820
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
821
|
+
|
|
822
|
+
yaml_content = textwrap.dedent("""
|
|
823
|
+
profiles:
|
|
824
|
+
test-profile:
|
|
825
|
+
model:
|
|
826
|
+
dspy:
|
|
827
|
+
type: bad-protocol
|
|
828
|
+
model: gpt-4o
|
|
829
|
+
""")
|
|
830
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
831
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
832
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
833
|
+
with pytest.raises(ValueError, match=r"invalid model\.dspy\.type"):
|
|
834
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
835
|
+
|
|
836
|
+
def test_model_embedding_applied(self, tmp_path: Path) -> None:
|
|
837
|
+
"""model.embedding fields set embedding env vars."""
|
|
838
|
+
result = self._apply(
|
|
839
|
+
tmp_path,
|
|
840
|
+
"""
|
|
841
|
+
profiles:
|
|
842
|
+
test-profile:
|
|
843
|
+
model:
|
|
844
|
+
embedding:
|
|
845
|
+
base_url: http://localhost:11434
|
|
846
|
+
model: bge-m3
|
|
847
|
+
api_key: sk-embed
|
|
848
|
+
""",
|
|
849
|
+
)
|
|
850
|
+
assert "VDS_AUDIT_EMBEDDING__BASE_URL" in result.applied_env_keys
|
|
851
|
+
assert "VDS_AUDIT_EMBEDDING__MODEL" in result.applied_env_keys
|
|
852
|
+
|
|
853
|
+
def test_model_llm_unknown_key_raises(self, tmp_path: Path) -> None:
|
|
854
|
+
"""model.llm with unknown key raises ValueError."""
|
|
855
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
856
|
+
|
|
857
|
+
yaml_content = textwrap.dedent("""
|
|
858
|
+
profiles:
|
|
859
|
+
test-profile:
|
|
860
|
+
model:
|
|
861
|
+
llm:
|
|
862
|
+
type: openai
|
|
863
|
+
unknown_field: bad
|
|
864
|
+
""")
|
|
865
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
866
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
867
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
868
|
+
with pytest.raises(ValueError, match=r"invalid model\.llm keys"):
|
|
869
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
class TestSkillPolicyViaYaml:
|
|
873
|
+
"""Tests for skill_policy helpers exercised via apply_runtime_profile."""
|
|
874
|
+
|
|
875
|
+
def _apply(self, tmp_path: Path, yaml_content: str) -> Any:
|
|
876
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
877
|
+
|
|
878
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
879
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
880
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
881
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
882
|
+
for k in list(saved):
|
|
883
|
+
if k != "VDS_AUDIT_RUNTIME_PROFILES_FILE":
|
|
884
|
+
os.environ.pop(k, None)
|
|
885
|
+
try:
|
|
886
|
+
return apply_runtime_profile("test-profile", force_override=True)
|
|
887
|
+
finally:
|
|
888
|
+
for k in list(os.environ.keys()):
|
|
889
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
890
|
+
os.environ.pop(k, None)
|
|
891
|
+
for k, v in saved.items():
|
|
892
|
+
os.environ[k] = v
|
|
893
|
+
|
|
894
|
+
def test_skill_policy_enabled_applied(self, tmp_path: Path) -> None:
|
|
895
|
+
"""skill_policy.enabled sets VDS_AUDIT_LLM__SKILLS_TOOLSET_ENABLED."""
|
|
896
|
+
result = self._apply(
|
|
897
|
+
tmp_path,
|
|
898
|
+
"""
|
|
899
|
+
profiles:
|
|
900
|
+
test-profile:
|
|
901
|
+
skill_policy:
|
|
902
|
+
enabled: true
|
|
903
|
+
""",
|
|
904
|
+
)
|
|
905
|
+
assert "VDS_AUDIT_LLM__SKILLS_TOOLSET_ENABLED" in result.applied_env_keys
|
|
906
|
+
|
|
907
|
+
def test_skill_policy_allow_script_execution(self, tmp_path: Path) -> None:
|
|
908
|
+
"""skill_policy.allow_script_execution sets env var."""
|
|
909
|
+
result = self._apply(
|
|
910
|
+
tmp_path,
|
|
911
|
+
"""
|
|
912
|
+
profiles:
|
|
913
|
+
test-profile:
|
|
914
|
+
skill_policy:
|
|
915
|
+
allow_script_execution: false
|
|
916
|
+
""",
|
|
917
|
+
)
|
|
918
|
+
assert "VDS_AUDIT_LLM__SKILLS_ALLOW_SCRIPT_EXECUTION" in result.applied_env_keys
|
|
919
|
+
|
|
920
|
+
def test_skill_policy_default_trust_tier(self, tmp_path: Path) -> None:
|
|
921
|
+
"""skill_policy.default_trust_tier sets env var."""
|
|
922
|
+
result = self._apply(
|
|
923
|
+
tmp_path,
|
|
924
|
+
"""
|
|
925
|
+
profiles:
|
|
926
|
+
test-profile:
|
|
927
|
+
skill_policy:
|
|
928
|
+
default_trust_tier: internal
|
|
929
|
+
""",
|
|
930
|
+
)
|
|
931
|
+
assert "VDS_AUDIT_LLM__SKILLS_DEFAULT_TRUST_TIER" in result.applied_env_keys
|
|
932
|
+
|
|
933
|
+
def test_skill_policy_invalid_trust_tier_raises(self, tmp_path: Path) -> None:
|
|
934
|
+
"""skill_policy.default_trust_tier with invalid value raises ValueError."""
|
|
935
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
936
|
+
|
|
937
|
+
yaml_content = textwrap.dedent("""
|
|
938
|
+
profiles:
|
|
939
|
+
test-profile:
|
|
940
|
+
skill_policy:
|
|
941
|
+
default_trust_tier: super-trusted
|
|
942
|
+
""")
|
|
943
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
944
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
945
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
946
|
+
with pytest.raises(ValueError):
|
|
947
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
948
|
+
|
|
949
|
+
def test_skill_policy_allowlist_applied(self, tmp_path: Path) -> None:
|
|
950
|
+
"""skill_policy.allowlist sets VDS_AUDIT_LLM__SKILLS_ALLOWLIST."""
|
|
951
|
+
result = self._apply(
|
|
952
|
+
tmp_path,
|
|
953
|
+
"""
|
|
954
|
+
profiles:
|
|
955
|
+
test-profile:
|
|
956
|
+
skill_policy:
|
|
957
|
+
allowlist:
|
|
958
|
+
- research-skill
|
|
959
|
+
- grepai-skill
|
|
960
|
+
""",
|
|
961
|
+
)
|
|
962
|
+
assert "VDS_AUDIT_LLM__SKILLS_ALLOWLIST" in result.applied_env_keys
|
|
963
|
+
|
|
964
|
+
def test_skill_policy_allowed_trust_tiers_applied(self, tmp_path: Path) -> None:
|
|
965
|
+
"""skill_policy.allowed_trust_tiers sets env var."""
|
|
966
|
+
result = self._apply(
|
|
967
|
+
tmp_path,
|
|
968
|
+
"""
|
|
969
|
+
profiles:
|
|
970
|
+
test-profile:
|
|
971
|
+
skill_policy:
|
|
972
|
+
allowed_trust_tiers:
|
|
973
|
+
- internal
|
|
974
|
+
- external-verified
|
|
975
|
+
""",
|
|
976
|
+
)
|
|
977
|
+
assert "VDS_AUDIT_LLM__SKILLS_ALLOWED_TRUST_TIERS" in result.applied_env_keys
|
|
978
|
+
|
|
979
|
+
def test_skill_policy_trust_tiers_map_applied(self, tmp_path: Path) -> None:
|
|
980
|
+
"""skill_policy.trust_tiers map sets env var."""
|
|
981
|
+
result = self._apply(
|
|
982
|
+
tmp_path,
|
|
983
|
+
"""
|
|
984
|
+
profiles:
|
|
985
|
+
test-profile:
|
|
986
|
+
skill_policy:
|
|
987
|
+
trust_tiers:
|
|
988
|
+
research-skill: internal
|
|
989
|
+
grepai-skill: external-verified
|
|
990
|
+
""",
|
|
991
|
+
)
|
|
992
|
+
assert "VDS_AUDIT_LLM__SKILLS_TRUST_TIERS" in result.applied_env_keys
|
|
993
|
+
|
|
994
|
+
def test_skill_policy_strict_require_effective_skill(self, tmp_path: Path) -> None:
|
|
995
|
+
"""skill_policy.strict_require_effective_skill sets env var."""
|
|
996
|
+
result = self._apply(
|
|
997
|
+
tmp_path,
|
|
998
|
+
"""
|
|
999
|
+
profiles:
|
|
1000
|
+
test-profile:
|
|
1001
|
+
skill_policy:
|
|
1002
|
+
strict_require_effective_skill: true
|
|
1003
|
+
""",
|
|
1004
|
+
)
|
|
1005
|
+
assert "VDS_AUDIT_AGENTIC_STRICT_REQUIRE_EFFECTIVE_SKILL" in result.applied_env_keys
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
class TestBackendPolicyViaYaml:
|
|
1009
|
+
"""Tests for backend_policy helpers exercised via apply_runtime_profile."""
|
|
1010
|
+
|
|
1011
|
+
def _apply(self, tmp_path: Path, yaml_content: str, extra_env: dict | None = None) -> Any:
|
|
1012
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1013
|
+
|
|
1014
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1015
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
1016
|
+
env_patch = {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}
|
|
1017
|
+
if extra_env:
|
|
1018
|
+
env_patch.update(extra_env)
|
|
1019
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
1020
|
+
with patch.dict(os.environ, env_patch, clear=False):
|
|
1021
|
+
for k in list(saved):
|
|
1022
|
+
if k not in ("VDS_AUDIT_RUNTIME_PROFILES_FILE",) and k not in (extra_env or {}):
|
|
1023
|
+
os.environ.pop(k, None)
|
|
1024
|
+
try:
|
|
1025
|
+
return apply_runtime_profile("test-profile", force_override=True)
|
|
1026
|
+
finally:
|
|
1027
|
+
for k in list(os.environ.keys()):
|
|
1028
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
1029
|
+
os.environ.pop(k, None)
|
|
1030
|
+
for k, v in saved.items():
|
|
1031
|
+
os.environ[k] = v
|
|
1032
|
+
|
|
1033
|
+
def test_backend_policy_prompt_evaluator(self, tmp_path: Path) -> None:
|
|
1034
|
+
"""backend_policy.backend=prompt_evaluator sets env var."""
|
|
1035
|
+
result = self._apply(
|
|
1036
|
+
tmp_path,
|
|
1037
|
+
"""
|
|
1038
|
+
profiles:
|
|
1039
|
+
test-profile:
|
|
1040
|
+
backend_policy:
|
|
1041
|
+
backend: prompt_evaluator
|
|
1042
|
+
""",
|
|
1043
|
+
)
|
|
1044
|
+
assert "VDS_AUDIT_LLM__ROW_EVALUATION_BACKEND" in result.applied_env_keys
|
|
1045
|
+
|
|
1046
|
+
def test_backend_policy_dspy(self, tmp_path: Path) -> None:
|
|
1047
|
+
"""backend_policy.backend=dspy sets env var."""
|
|
1048
|
+
result = self._apply(
|
|
1049
|
+
tmp_path,
|
|
1050
|
+
"""
|
|
1051
|
+
profiles:
|
|
1052
|
+
test-profile:
|
|
1053
|
+
backend_policy:
|
|
1054
|
+
backend: dspy
|
|
1055
|
+
""",
|
|
1056
|
+
)
|
|
1057
|
+
assert "VDS_AUDIT_LLM__ROW_EVALUATION_BACKEND" in result.applied_env_keys
|
|
1058
|
+
|
|
1059
|
+
def test_backend_policy_invalid_backend_raises(self, tmp_path: Path) -> None:
|
|
1060
|
+
"""backend_policy.backend with invalid value raises ValueError."""
|
|
1061
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1062
|
+
|
|
1063
|
+
yaml_content = textwrap.dedent("""
|
|
1064
|
+
profiles:
|
|
1065
|
+
test-profile:
|
|
1066
|
+
backend_policy:
|
|
1067
|
+
backend: unknown-backend
|
|
1068
|
+
""")
|
|
1069
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1070
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1071
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1072
|
+
with pytest.raises(ValueError):
|
|
1073
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1074
|
+
|
|
1075
|
+
def test_backend_policy_locked_and_allow_override_raises(self, tmp_path: Path) -> None:
|
|
1076
|
+
"""backend_policy locked=true + allow_override=true raises ValueError."""
|
|
1077
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1078
|
+
|
|
1079
|
+
yaml_content = textwrap.dedent("""
|
|
1080
|
+
profiles:
|
|
1081
|
+
test-profile:
|
|
1082
|
+
backend_policy:
|
|
1083
|
+
backend: prompt_evaluator
|
|
1084
|
+
locked: true
|
|
1085
|
+
allow_override: true
|
|
1086
|
+
""")
|
|
1087
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1088
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1089
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1090
|
+
with pytest.raises(ValueError, match="locked=true cannot be combined"):
|
|
1091
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1092
|
+
|
|
1093
|
+
|
|
1094
|
+
class TestAgenticPolicyViaYaml:
|
|
1095
|
+
"""Tests for agentic policy helpers exercised via apply_runtime_profile."""
|
|
1096
|
+
|
|
1097
|
+
def _apply(self, tmp_path: Path, yaml_content: str) -> Any:
|
|
1098
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1099
|
+
|
|
1100
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1101
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
1102
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
1103
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1104
|
+
for k in list(saved):
|
|
1105
|
+
if k != "VDS_AUDIT_RUNTIME_PROFILES_FILE":
|
|
1106
|
+
os.environ.pop(k, None)
|
|
1107
|
+
try:
|
|
1108
|
+
return apply_runtime_profile("test-profile", force_override=True)
|
|
1109
|
+
finally:
|
|
1110
|
+
for k in list(os.environ.keys()):
|
|
1111
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
1112
|
+
os.environ.pop(k, None)
|
|
1113
|
+
for k, v in saved.items():
|
|
1114
|
+
os.environ[k] = v
|
|
1115
|
+
|
|
1116
|
+
def test_agentic_non_progress_preset_applied(self, tmp_path: Path) -> None:
|
|
1117
|
+
"""agentic.non_progress_preset sets env var."""
|
|
1118
|
+
result = self._apply(
|
|
1119
|
+
tmp_path,
|
|
1120
|
+
"""
|
|
1121
|
+
profiles:
|
|
1122
|
+
test-profile:
|
|
1123
|
+
agentic:
|
|
1124
|
+
non_progress_preset: strict
|
|
1125
|
+
""",
|
|
1126
|
+
)
|
|
1127
|
+
assert "VDS_AUDIT_AGENTIC_NON_PROGRESS_PRESET" in result.applied_env_keys
|
|
1128
|
+
|
|
1129
|
+
def test_agentic_invalid_preset_raises(self, tmp_path: Path) -> None:
|
|
1130
|
+
"""agentic.non_progress_preset with invalid value raises ValueError."""
|
|
1131
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1132
|
+
|
|
1133
|
+
yaml_content = textwrap.dedent("""
|
|
1134
|
+
profiles:
|
|
1135
|
+
test-profile:
|
|
1136
|
+
agentic:
|
|
1137
|
+
non_progress_preset: invalid-preset
|
|
1138
|
+
""")
|
|
1139
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1140
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1141
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1142
|
+
with pytest.raises(ValueError):
|
|
1143
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1144
|
+
|
|
1145
|
+
def test_agentic_strict_no_fallback_applied(self, tmp_path: Path) -> None:
|
|
1146
|
+
"""agentic.strict_no_fallback sets env var."""
|
|
1147
|
+
result = self._apply(
|
|
1148
|
+
tmp_path,
|
|
1149
|
+
"""
|
|
1150
|
+
profiles:
|
|
1151
|
+
test-profile:
|
|
1152
|
+
agentic:
|
|
1153
|
+
strict_no_fallback: true
|
|
1154
|
+
""",
|
|
1155
|
+
)
|
|
1156
|
+
assert "VDS_AUDIT_AGENTIC_STRICT_NO_FALLBACK" in result.applied_env_keys
|
|
1157
|
+
|
|
1158
|
+
def test_agentic_tool_first_max_steps_applied(self, tmp_path: Path) -> None:
|
|
1159
|
+
"""agentic.tool_first_max_steps sets env var."""
|
|
1160
|
+
result = self._apply(
|
|
1161
|
+
tmp_path,
|
|
1162
|
+
"""
|
|
1163
|
+
profiles:
|
|
1164
|
+
test-profile:
|
|
1165
|
+
agentic:
|
|
1166
|
+
tool_first_max_steps: 10
|
|
1167
|
+
""",
|
|
1168
|
+
)
|
|
1169
|
+
assert "VDS_AUDIT_AGENTIC_TOOL_FIRST_MAX_STEPS" in result.applied_env_keys
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
class TestEnvReferenceResolution:
|
|
1173
|
+
"""Tests for ${ENV_VAR} and ${codex:...} reference resolution."""
|
|
1174
|
+
|
|
1175
|
+
def test_env_ref_resolved_when_set(self, tmp_path: Path) -> None:
|
|
1176
|
+
"""${ENV_VAR} in profile value is resolved from environment."""
|
|
1177
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1178
|
+
|
|
1179
|
+
yaml_content = textwrap.dedent("""
|
|
1180
|
+
profiles:
|
|
1181
|
+
test-profile:
|
|
1182
|
+
env:
|
|
1183
|
+
MY_RESOLVED_KEY: "${MY_SOURCE_VAR}"
|
|
1184
|
+
""")
|
|
1185
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1186
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1187
|
+
with patch.dict(
|
|
1188
|
+
os.environ,
|
|
1189
|
+
{
|
|
1190
|
+
"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file),
|
|
1191
|
+
"MY_SOURCE_VAR": "resolved-value",
|
|
1192
|
+
},
|
|
1193
|
+
clear=False,
|
|
1194
|
+
):
|
|
1195
|
+
os.environ.pop("MY_RESOLVED_KEY", None)
|
|
1196
|
+
_result = apply_runtime_profile("test-profile", force_override=True)
|
|
1197
|
+
assert os.environ.get("MY_RESOLVED_KEY") == "resolved-value"
|
|
1198
|
+
|
|
1199
|
+
def test_env_ref_raises_when_not_set(self, tmp_path: Path) -> None:
|
|
1200
|
+
"""${ENV_VAR} raises ValueError when the referenced var is not set."""
|
|
1201
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1202
|
+
|
|
1203
|
+
yaml_content = textwrap.dedent("""
|
|
1204
|
+
profiles:
|
|
1205
|
+
test-profile:
|
|
1206
|
+
env:
|
|
1207
|
+
MY_KEY: "${NONEXISTENT_VAR_XYZ_12345}"
|
|
1208
|
+
""")
|
|
1209
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1210
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1211
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1212
|
+
os.environ.pop("NONEXISTENT_VAR_XYZ_12345", None)
|
|
1213
|
+
with pytest.raises(ValueError, match="NONEXISTENT_VAR_XYZ_12345"):
|
|
1214
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1215
|
+
|
|
1216
|
+
def test_codex_ref_raises_when_module_unavailable(self, tmp_path: Path) -> None:
|
|
1217
|
+
"""${codex:access_token} raises ValueError when codex_oauth not available."""
|
|
1218
|
+
import sys
|
|
1219
|
+
|
|
1220
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1221
|
+
|
|
1222
|
+
yaml_content = textwrap.dedent("""
|
|
1223
|
+
profiles:
|
|
1224
|
+
test-profile:
|
|
1225
|
+
env:
|
|
1226
|
+
MY_KEY: "${codex:access_token}"
|
|
1227
|
+
""")
|
|
1228
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1229
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1230
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1231
|
+
with patch.dict(sys.modules, {"vds_audit_orchestrator.llm.codex_oauth": None}):
|
|
1232
|
+
with pytest.raises(ValueError, match="codex"):
|
|
1233
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1234
|
+
|
|
1235
|
+
def test_malformed_codex_ref_raises(self, tmp_path: Path) -> None:
|
|
1236
|
+
"""Malformed ${codex:...} reference raises ValueError."""
|
|
1237
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1238
|
+
|
|
1239
|
+
yaml_content = textwrap.dedent("""
|
|
1240
|
+
profiles:
|
|
1241
|
+
test-profile:
|
|
1242
|
+
env:
|
|
1243
|
+
MY_KEY: "${codex:bad field name!}"
|
|
1244
|
+
""")
|
|
1245
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1246
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1247
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1248
|
+
with pytest.raises(ValueError):
|
|
1249
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
class TestResolveSkillDirectoryPath:
|
|
1253
|
+
"""resolve_skill_directory_path with absolute and relative paths."""
|
|
1254
|
+
|
|
1255
|
+
def test_absolute_path_returned_as_is(self, tmp_path: Path) -> None:
|
|
1256
|
+
from vds_agent_core.profiles import resolve_skill_directory_path
|
|
1257
|
+
|
|
1258
|
+
result = resolve_skill_directory_path(str(tmp_path))
|
|
1259
|
+
assert result == tmp_path.resolve()
|
|
1260
|
+
|
|
1261
|
+
def test_tilde_expanded(self) -> None:
|
|
1262
|
+
from vds_agent_core.profiles import resolve_skill_directory_path
|
|
1263
|
+
|
|
1264
|
+
result = resolve_skill_directory_path("~")
|
|
1265
|
+
assert result == Path.home().resolve()
|
|
1266
|
+
|
|
1267
|
+
def test_relative_path_resolved_against_cwd(self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
1268
|
+
from vds_agent_core.profiles import resolve_skill_directory_path
|
|
1269
|
+
|
|
1270
|
+
monkeypatch.chdir(tmp_path)
|
|
1271
|
+
monkeypatch.delenv("VDS_PROJECT_DIR", raising=False)
|
|
1272
|
+
monkeypatch.delenv("CLAUDE_PROJECT_DIR", raising=False)
|
|
1273
|
+
subdir = tmp_path / "skills"
|
|
1274
|
+
subdir.mkdir()
|
|
1275
|
+
result = resolve_skill_directory_path("skills")
|
|
1276
|
+
assert result == subdir.resolve()
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
class TestInheritRuntimeLlmPolicy:
|
|
1280
|
+
"""inherit_runtime_llm_policy copies policy fields from source_llm."""
|
|
1281
|
+
|
|
1282
|
+
def test_source_llm_none_returns_settings(self, tmp_path: Path) -> None:
|
|
1283
|
+
"""When source_llm is None, returns the built settings directly."""
|
|
1284
|
+
from vds_agent_core.profiles import inherit_runtime_llm_policy
|
|
1285
|
+
|
|
1286
|
+
yaml_content = textwrap.dedent("""
|
|
1287
|
+
profiles:
|
|
1288
|
+
test-profile:
|
|
1289
|
+
env:
|
|
1290
|
+
INHERIT_TEST_KEY: value
|
|
1291
|
+
""")
|
|
1292
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1293
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1294
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1295
|
+
result = inherit_runtime_llm_policy("test-profile", source_llm=None)
|
|
1296
|
+
# Returns None because no settings_factory provided
|
|
1297
|
+
assert result is None
|
|
1298
|
+
|
|
1299
|
+
def test_source_llm_fields_copied(self, tmp_path: Path) -> None:
|
|
1300
|
+
"""When source_llm provided, policy fields are copied to settings."""
|
|
1301
|
+
from vds_agent_core.profiles import inherit_runtime_llm_policy
|
|
1302
|
+
|
|
1303
|
+
yaml_content = textwrap.dedent("""
|
|
1304
|
+
profiles:
|
|
1305
|
+
test-profile:
|
|
1306
|
+
env:
|
|
1307
|
+
INHERIT_TEST_KEY: value
|
|
1308
|
+
""")
|
|
1309
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1310
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1311
|
+
|
|
1312
|
+
class _FakeSettings:
|
|
1313
|
+
stream = False
|
|
1314
|
+
agent_stream = False
|
|
1315
|
+
|
|
1316
|
+
class _SourceLlm:
|
|
1317
|
+
stream = True
|
|
1318
|
+
agent_stream = True
|
|
1319
|
+
|
|
1320
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1321
|
+
result = inherit_runtime_llm_policy(
|
|
1322
|
+
"test-profile",
|
|
1323
|
+
source_llm=_SourceLlm(),
|
|
1324
|
+
settings_factory=_FakeSettings,
|
|
1325
|
+
)
|
|
1326
|
+
# stream should be copied from source_llm
|
|
1327
|
+
assert result.stream is True
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
class TestAgentRuntimePolicyViaYaml:
|
|
1331
|
+
"""Tests for agent_runtime_policy helpers exercised via apply_runtime_profile."""
|
|
1332
|
+
|
|
1333
|
+
def _apply(self, tmp_path: Path, yaml_content: str) -> Any:
|
|
1334
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1335
|
+
|
|
1336
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1337
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
1338
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
1339
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1340
|
+
for k in list(saved):
|
|
1341
|
+
if k != "VDS_AUDIT_RUNTIME_PROFILES_FILE":
|
|
1342
|
+
os.environ.pop(k, None)
|
|
1343
|
+
try:
|
|
1344
|
+
return apply_runtime_profile("test-profile", force_override=True)
|
|
1345
|
+
finally:
|
|
1346
|
+
for k in list(os.environ.keys()):
|
|
1347
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
1348
|
+
os.environ.pop(k, None)
|
|
1349
|
+
for k, v in saved.items():
|
|
1350
|
+
os.environ[k] = v
|
|
1351
|
+
|
|
1352
|
+
def test_agent_runtime_policy_mode_applied(self, tmp_path: Path) -> None:
|
|
1353
|
+
"""agent_runtime_policy.mode=pydanticai sets env var."""
|
|
1354
|
+
result = self._apply(
|
|
1355
|
+
tmp_path,
|
|
1356
|
+
"""
|
|
1357
|
+
profiles:
|
|
1358
|
+
test-profile:
|
|
1359
|
+
agent_runtime_policy:
|
|
1360
|
+
mode: pydanticai
|
|
1361
|
+
""",
|
|
1362
|
+
)
|
|
1363
|
+
assert "VDS_AUDIT_LLM__AGENT_RUNTIME_MODE" in result.applied_env_keys
|
|
1364
|
+
|
|
1365
|
+
def test_agent_runtime_policy_invalid_mode_raises(self, tmp_path: Path) -> None:
|
|
1366
|
+
"""agent_runtime_policy.mode with invalid value raises ValueError."""
|
|
1367
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1368
|
+
|
|
1369
|
+
yaml_content = textwrap.dedent("""
|
|
1370
|
+
profiles:
|
|
1371
|
+
test-profile:
|
|
1372
|
+
agent_runtime_policy:
|
|
1373
|
+
mode: invalid-mode
|
|
1374
|
+
""")
|
|
1375
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1376
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1377
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1378
|
+
with pytest.raises(ValueError):
|
|
1379
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1380
|
+
|
|
1381
|
+
def test_agent_runtime_policy_tool_allowlists_applied(self, tmp_path: Path) -> None:
|
|
1382
|
+
"""agent_runtime_policy.tool_allowlists sets env var."""
|
|
1383
|
+
result = self._apply(
|
|
1384
|
+
tmp_path,
|
|
1385
|
+
"""
|
|
1386
|
+
profiles:
|
|
1387
|
+
test-profile:
|
|
1388
|
+
agent_runtime_policy:
|
|
1389
|
+
mode: pydanticai
|
|
1390
|
+
tool_allowlists:
|
|
1391
|
+
evaluator:
|
|
1392
|
+
- read_file
|
|
1393
|
+
- search_code
|
|
1394
|
+
""",
|
|
1395
|
+
)
|
|
1396
|
+
assert "VDS_AUDIT_AGENTIC_TOOL_ALLOWLISTS" in result.applied_env_keys
|
|
1397
|
+
|
|
1398
|
+
def test_agent_runtime_policy_non_progress_policy_applied(self, tmp_path: Path) -> None:
|
|
1399
|
+
"""agent_runtime_policy.non_progress_policy sets env var."""
|
|
1400
|
+
result = self._apply(
|
|
1401
|
+
tmp_path,
|
|
1402
|
+
"""
|
|
1403
|
+
profiles:
|
|
1404
|
+
test-profile:
|
|
1405
|
+
agent_runtime_policy:
|
|
1406
|
+
mode: pydanticai
|
|
1407
|
+
non_progress_policy:
|
|
1408
|
+
max_retries: 3
|
|
1409
|
+
""",
|
|
1410
|
+
)
|
|
1411
|
+
assert "VDS_AUDIT_AGENTIC_NON_PROGRESS_POLICY" in result.applied_env_keys
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
class TestTimeoutPolicyViaYaml:
|
|
1415
|
+
"""Tests for timeout_policy helpers exercised via apply_runtime_profile."""
|
|
1416
|
+
|
|
1417
|
+
def _apply(self, tmp_path: Path, yaml_content: str) -> Any:
|
|
1418
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1419
|
+
|
|
1420
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1421
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
1422
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
1423
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1424
|
+
for k in list(saved):
|
|
1425
|
+
if k != "VDS_AUDIT_RUNTIME_PROFILES_FILE":
|
|
1426
|
+
os.environ.pop(k, None)
|
|
1427
|
+
try:
|
|
1428
|
+
return apply_runtime_profile("test-profile", force_override=True)
|
|
1429
|
+
finally:
|
|
1430
|
+
for k in list(os.environ.keys()):
|
|
1431
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
1432
|
+
os.environ.pop(k, None)
|
|
1433
|
+
for k, v in saved.items():
|
|
1434
|
+
os.environ[k] = v
|
|
1435
|
+
|
|
1436
|
+
def test_timeout_policy_agent_timeout_applied(self, tmp_path: Path) -> None:
|
|
1437
|
+
"""timeout_policy.agent_timeout_seconds sets env var."""
|
|
1438
|
+
result = self._apply(
|
|
1439
|
+
tmp_path,
|
|
1440
|
+
"""
|
|
1441
|
+
profiles:
|
|
1442
|
+
test-profile:
|
|
1443
|
+
timeout_policy:
|
|
1444
|
+
agent_timeout_seconds: 120
|
|
1445
|
+
""",
|
|
1446
|
+
)
|
|
1447
|
+
assert "VDS_AUDIT_LLM__AGENT_TIMEOUT_SECONDS" in result.applied_env_keys
|
|
1448
|
+
|
|
1449
|
+
def test_timeout_policy_row_timeout_applied(self, tmp_path: Path) -> None:
|
|
1450
|
+
"""timeout_policy.row_timeout_ms sets env var."""
|
|
1451
|
+
result = self._apply(
|
|
1452
|
+
tmp_path,
|
|
1453
|
+
"""
|
|
1454
|
+
profiles:
|
|
1455
|
+
test-profile:
|
|
1456
|
+
timeout_policy:
|
|
1457
|
+
row_timeout_ms: 60000
|
|
1458
|
+
""",
|
|
1459
|
+
)
|
|
1460
|
+
assert "VDS_AUDIT_ROW_TIMEOUT_MS" in result.applied_env_keys
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
class TestDspyAutoDerivation:
|
|
1464
|
+
"""Tests for DSPy auto-derivation and coherence validation."""
|
|
1465
|
+
|
|
1466
|
+
def _apply(self, tmp_path: Path, yaml_content: str) -> Any:
|
|
1467
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1468
|
+
|
|
1469
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1470
|
+
yaml_file.write_text(textwrap.dedent(yaml_content), encoding="utf-8")
|
|
1471
|
+
saved = {k: v for k, v in os.environ.items() if k.startswith("VDS_AUDIT_")}
|
|
1472
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1473
|
+
for k in list(saved):
|
|
1474
|
+
if k != "VDS_AUDIT_RUNTIME_PROFILES_FILE":
|
|
1475
|
+
os.environ.pop(k, None)
|
|
1476
|
+
try:
|
|
1477
|
+
return apply_runtime_profile("test-profile", force_override=True)
|
|
1478
|
+
finally:
|
|
1479
|
+
for k in list(os.environ.keys()):
|
|
1480
|
+
if k.startswith("VDS_AUDIT_") and k not in saved:
|
|
1481
|
+
os.environ.pop(k, None)
|
|
1482
|
+
for k, v in saved.items():
|
|
1483
|
+
os.environ[k] = v
|
|
1484
|
+
|
|
1485
|
+
def test_dspy_model_auto_derived_from_llm(self, tmp_path: Path) -> None:
|
|
1486
|
+
"""DSPy model is auto-derived from LLM standard model when not explicit."""
|
|
1487
|
+
result = self._apply(
|
|
1488
|
+
tmp_path,
|
|
1489
|
+
"""
|
|
1490
|
+
profiles:
|
|
1491
|
+
test-profile:
|
|
1492
|
+
model:
|
|
1493
|
+
llm:
|
|
1494
|
+
type: openai
|
|
1495
|
+
base_url: http://localhost:4000
|
|
1496
|
+
api_key: sk-test
|
|
1497
|
+
standard: openai/gpt-4o
|
|
1498
|
+
""",
|
|
1499
|
+
)
|
|
1500
|
+
# VDS_AUDIT_DSPY_MODEL should be auto-derived
|
|
1501
|
+
assert "VDS_AUDIT_DSPY_MODEL" in result.applied_env_keys
|
|
1502
|
+
|
|
1503
|
+
def test_dspy_coherence_incoherent_raises(self, tmp_path: Path) -> None:
|
|
1504
|
+
"""Incoherent DSPy model/protocol pairing raises ValueError."""
|
|
1505
|
+
from vds_agent_core.profiles import apply_runtime_profile
|
|
1506
|
+
|
|
1507
|
+
yaml_content = textwrap.dedent("""
|
|
1508
|
+
profiles:
|
|
1509
|
+
test-profile:
|
|
1510
|
+
model:
|
|
1511
|
+
llm:
|
|
1512
|
+
type: openai
|
|
1513
|
+
base_url: http://localhost:4000
|
|
1514
|
+
api_key: sk-test
|
|
1515
|
+
dspy:
|
|
1516
|
+
type: anthropic
|
|
1517
|
+
model: openai/gpt-4o
|
|
1518
|
+
""")
|
|
1519
|
+
yaml_file = tmp_path / "profiles.yaml"
|
|
1520
|
+
yaml_file.write_text(yaml_content, encoding="utf-8")
|
|
1521
|
+
with patch.dict(os.environ, {"VDS_AUDIT_RUNTIME_PROFILES_FILE": str(yaml_file)}, clear=False):
|
|
1522
|
+
with pytest.raises(ValueError, match="incoherent"):
|
|
1523
|
+
apply_runtime_profile("test-profile", force_override=True)
|
|
1524
|
+
|
|
1525
|
+
def test_dspy_temperature_applied(self, tmp_path: Path) -> None:
|
|
1526
|
+
"""model.dspy.temperature sets DSPy temperature env var."""
|
|
1527
|
+
result = self._apply(
|
|
1528
|
+
tmp_path,
|
|
1529
|
+
"""
|
|
1530
|
+
profiles:
|
|
1531
|
+
test-profile:
|
|
1532
|
+
model:
|
|
1533
|
+
dspy:
|
|
1534
|
+
type: openai
|
|
1535
|
+
model: openai/gpt-4o
|
|
1536
|
+
temperature: 0.5
|
|
1537
|
+
""",
|
|
1538
|
+
)
|
|
1539
|
+
assert "VDS_AUDIT_DSPY_TEMPERATURE" in result.applied_env_keys
|
|
1540
|
+
|
|
1541
|
+
def test_dspy_max_tokens_applied(self, tmp_path: Path) -> None:
|
|
1542
|
+
"""model.dspy.max_tokens sets DSPy max_tokens env var."""
|
|
1543
|
+
result = self._apply(
|
|
1544
|
+
tmp_path,
|
|
1545
|
+
"""
|
|
1546
|
+
profiles:
|
|
1547
|
+
test-profile:
|
|
1548
|
+
model:
|
|
1549
|
+
dspy:
|
|
1550
|
+
type: openai
|
|
1551
|
+
model: openai/gpt-4o
|
|
1552
|
+
max_tokens: 4096
|
|
1553
|
+
""",
|
|
1554
|
+
)
|
|
1555
|
+
assert "VDS_AUDIT_DSPY_MAX_TOKENS" in result.applied_env_keys
|
|
1556
|
+
|
|
1557
|
+
def test_dspy_system_role_compat_applied(self, tmp_path: Path) -> None:
|
|
1558
|
+
"""model.dspy.system_role_compat sets DSPy system_role_compat env var."""
|
|
1559
|
+
result = self._apply(
|
|
1560
|
+
tmp_path,
|
|
1561
|
+
"""
|
|
1562
|
+
profiles:
|
|
1563
|
+
test-profile:
|
|
1564
|
+
model:
|
|
1565
|
+
dspy:
|
|
1566
|
+
type: openai
|
|
1567
|
+
model: openai/gpt-4o
|
|
1568
|
+
system_role_compat: true
|
|
1569
|
+
""",
|
|
1570
|
+
)
|
|
1571
|
+
assert "VDS_AUDIT_DSPY_SYSTEM_ROLE_COMPAT" in result.applied_env_keys
|