ado-git-repo-insights 3.2.0__tar.gz → 3.3.0__tar.gz
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.
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/CHANGELOG.md +14 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/PKG-INFO +1 -1
- ado_git_repo_insights-3.3.0/VERSION +1 -0
- ado_git_repo_insights-3.3.0/docs/ENABLE-ML-FEATURES.md +241 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/index.js +71 -9
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/task.json +27 -1
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/production-issues.test.js +11 -10
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/dashboard.js +1 -1
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/vss-extension.json +1 -1
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/package-lock.json +2 -2
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/package.json +1 -1
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights.egg-info/PKG-INFO +1 -1
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights.egg-info/SOURCES.txt +2 -1
- ado_git_repo_insights-3.3.0/tests/integration/test_phase5_ml_integration.py +695 -0
- ado_git_repo_insights-3.2.0/DEFERRED-PHASE5.md +0 -207
- ado_git_repo_insights-3.2.0/VERSION +0 -1
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.editorconfig +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.gitattributes +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/scripts/check-baseline-integrity.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/scripts/validate-test-results.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/workflows/ci.yml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/workflows/release.yml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.gitignore +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.gitleaks.toml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.husky/pre-commit +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.husky/pre-push +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.pre-commit-config.yaml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.releaserc.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/LICENSE +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/MERMAID.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/README.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/agents/INVARIANTS.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/agents/definition-of-done.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/agents/victory-gates.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/config.example.yaml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/DEFAULT-DASHBOARD-ENHANCEMENT-PLAN.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/EXTENSION.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/INSTALLATION.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/MANUAL_WALKTHROUGH.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/PHASE5.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/PHASE6.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/SESSION.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/SUMMARY.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/ado-pipeline-smoke-check.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/dataset-contract.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/phase5-contract-notes.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/rollout-plan.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/runbook.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/images/README.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/images/icon.png +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/images/icon.png.placeholder +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/jest.config.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/overview.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/package-lock.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/package.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/scripts/copy-vss-sdk.sh +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/scripts/update-perf-baseline.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/index.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/package-lock.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/package.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/test-output.txt +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/test-results.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/ado-sdk.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/api-patterns.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/auth-pattern.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/chunked-loading.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/cross-project-settings.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/dashboard.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/dataset-loader.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/date-range-warning.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/error-codes.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/aggregates/dimensions.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/aggregates/weekly_rollups/2026-W02.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/dataset-manifest.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/insights/summary.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/perf-baselines.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/predictions/trends.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/metrics.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/mocks/ado-sdk.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/performance.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/pipeline-artifact-url.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/sdk-bundling.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/setup.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/synthetic-fixtures.test.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/VSS.SDK.min.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/artifact-client.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/dataset-loader.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/error-codes.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/error-types.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/index.html +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/settings.html +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/settings.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/styles.css +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension-verification-test.yml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/insights-verification-test.yml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/pr-insights-pipeline.yml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/pyproject.toml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/sample-pipeline.yml +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/schemas/dataset-manifest.schema.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/schemas/insights.schema.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/schemas/predictions.schema.json +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/check-version-unchanged.sh +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/csv_diff.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/generate-synthetic-dataset.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/stamp-extension-version.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/validate-task-inputs.js +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/setup.cfg +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/cli.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/config.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/extractor/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/extractor/ado_client.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/extractor/pr_extractor.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/date_utils.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/forecaster.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/insights.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/database.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/models.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/repository.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/transform/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/transform/aggregators.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/transform/csv_generator.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/utils/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/utils/datetime_utils.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/utils/logging_config.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/utils/run_summary.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights.egg-info/dependency_links.txt +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights.egg-info/entry_points.txt +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights.egg-info/requires.txt +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights.egg-info/top_level.txt +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/fixtures/README.md +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_backfill_convergence.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_db_open_failure.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_golden_outputs.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_incremental_run.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_multi_project_scoping.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/test_redaction.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/__init__.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_ado_client_pagination.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_aggregators.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_artifacts_dir.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_chunk_selection.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_cli_args.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_cli_exit_code.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_comments_cli.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_comments_extraction.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_completed_only.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_config_validation.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_csv_contract.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_csv_determinism.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_date_range_defaults.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_datetime_utils.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_forecaster_contract.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_insights_contract.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_insights_id_stability.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_insights_schema.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_logging_config.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_ml_cli_flags.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_monday_alignment.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_operational_summary.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_predictions_schema.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_retry_policy.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_run_summary.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_secret_redaction.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_summary_drift_guard.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_synthetic_dataset.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_team_extraction.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_upsert_keys.py +0 -0
- {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_version_validation.py +0 -0
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [3.3.0](https://github.com/oddessentials/ado-git-repo-insights/compare/v3.2.0...v3.3.0) (2026-01-18)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* revert manual version bump, remove obsolete planning doc ([df019c0](https://github.com/oddessentials/ado-git-repo-insights/commit/df019c0738ddc0b3b684e940ed8fcd272e879dec))
|
|
7
|
+
* **tests:** resolve ruff linting errors in Phase 5 ML tests ([d816e36](https://github.com/oddessentials/ado-git-repo-insights/commit/d816e3697d1993369f4be82df563faad7d8b435e))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* **dashboard:** enable Phase 5 features (Predictions & AI Insights tabs) ([649f39e](https://github.com/oddessentials/ado-git-repo-insights/commit/649f39e17ca7c778133aed2dba8df0bf360d4b03))
|
|
13
|
+
* **task:** add Phase 5 ML inputs to pipeline task (v2.3.0) ([314c560](https://github.com/oddessentials/ado-git-repo-insights/commit/314c56045ecc531cec7cf60d94b180dc9655b2ea))
|
|
14
|
+
|
|
1
15
|
# [3.2.0](https://github.com/oddessentials/ado-git-repo-insights/compare/v3.1.0...v3.2.0) (2026-01-18)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.3.0
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Enabling ML Features (Phase 5)
|
|
2
|
+
|
|
3
|
+
This guide explains how to enable and configure the Phase 5 ML features: **Predictions** (Prophet time-series forecasting) and **AI Insights** (OpenAI-powered analysis).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Phase 5 adds two new dashboard tabs:
|
|
8
|
+
|
|
9
|
+
- **Predictions**: Forecasts for PR throughput, cycle time, and review time over the next 4 weeks
|
|
10
|
+
- **AI Insights**: AI-generated observations about bottlenecks, trends, and anomalies
|
|
11
|
+
|
|
12
|
+
Both features are opt-in via pipeline task inputs and require additional dependencies.
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
### For Predictions (Prophet)
|
|
17
|
+
|
|
18
|
+
Prophet requires a working C++ compiler and CMake. On hosted agents, this is typically available. For self-hosted agents:
|
|
19
|
+
|
|
20
|
+
**Ubuntu/Debian:**
|
|
21
|
+
```bash
|
|
22
|
+
sudo apt-get install -y build-essential cmake python3-dev
|
|
23
|
+
pip install prophet>=1.1.0
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Windows:**
|
|
27
|
+
- Install Visual Studio Build Tools with C++ workload
|
|
28
|
+
- Or use a hosted agent where Prophet is pre-installed
|
|
29
|
+
|
|
30
|
+
**macOS:**
|
|
31
|
+
```bash
|
|
32
|
+
xcode-select --install
|
|
33
|
+
pip install prophet>=1.1.0
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### For AI Insights (OpenAI)
|
|
37
|
+
|
|
38
|
+
1. Create an OpenAI account at https://platform.openai.com
|
|
39
|
+
2. Generate an API key
|
|
40
|
+
3. Store the key as a secret in Azure DevOps:
|
|
41
|
+
- Go to Pipelines > Library > Variable Groups
|
|
42
|
+
- Create a new variable group (e.g., "OpenAI Secrets")
|
|
43
|
+
- Add variable: `OPENAI_API_KEY` = `sk-...` (mark as secret)
|
|
44
|
+
- Link the variable group to your pipeline
|
|
45
|
+
|
|
46
|
+
## Pipeline Configuration
|
|
47
|
+
|
|
48
|
+
### Basic Configuration
|
|
49
|
+
|
|
50
|
+
Add the new inputs to your pipeline YAML:
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
- task: ExtractPullRequests@2
|
|
54
|
+
inputs:
|
|
55
|
+
organization: $(System.CollectionUri)
|
|
56
|
+
projects: |
|
|
57
|
+
ProjectA
|
|
58
|
+
ProjectB
|
|
59
|
+
pat: $(PAT)
|
|
60
|
+
generateAggregates: true
|
|
61
|
+
# Enable ML features
|
|
62
|
+
enablePredictions: true
|
|
63
|
+
enableInsights: true
|
|
64
|
+
openaiApiKey: $(OPENAI_API_KEY)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Full Example
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
trigger:
|
|
71
|
+
- main
|
|
72
|
+
|
|
73
|
+
schedules:
|
|
74
|
+
- cron: "0 6 * * *" # Run daily at 6 AM
|
|
75
|
+
displayName: Daily PR Insights
|
|
76
|
+
branches:
|
|
77
|
+
include: [main]
|
|
78
|
+
always: true
|
|
79
|
+
|
|
80
|
+
variables:
|
|
81
|
+
- group: OpenAI Secrets # Contains OPENAI_API_KEY
|
|
82
|
+
|
|
83
|
+
stages:
|
|
84
|
+
- stage: Extract
|
|
85
|
+
jobs:
|
|
86
|
+
- job: ExtractPRs
|
|
87
|
+
pool:
|
|
88
|
+
vmImage: 'ubuntu-latest'
|
|
89
|
+
steps:
|
|
90
|
+
- task: UsePythonVersion@0
|
|
91
|
+
inputs:
|
|
92
|
+
versionSpec: '3.10'
|
|
93
|
+
addToPath: true
|
|
94
|
+
|
|
95
|
+
- task: ExtractPullRequests@2
|
|
96
|
+
inputs:
|
|
97
|
+
organization: $(System.CollectionUri)
|
|
98
|
+
projects: |
|
|
99
|
+
MyProject
|
|
100
|
+
pat: $(PAT)
|
|
101
|
+
generateAggregates: true
|
|
102
|
+
enablePredictions: true
|
|
103
|
+
enableInsights: true
|
|
104
|
+
openaiApiKey: $(OPENAI_API_KEY)
|
|
105
|
+
|
|
106
|
+
- task: PublishPipelineArtifact@1
|
|
107
|
+
inputs:
|
|
108
|
+
targetPath: '$(Pipeline.Workspace)/aggregates'
|
|
109
|
+
artifact: 'aggregates'
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Task Input Reference
|
|
113
|
+
|
|
114
|
+
| Input | Type | Default | Description |
|
|
115
|
+
|-------|------|---------|-------------|
|
|
116
|
+
| `enablePredictions` | boolean | `false` | Generate ML predictions using Prophet |
|
|
117
|
+
| `enableInsights` | boolean | `false` | Generate AI insights using OpenAI |
|
|
118
|
+
| `openaiApiKey` | string | - | OpenAI API key (required if `enableInsights` is true) |
|
|
119
|
+
|
|
120
|
+
## Output Files
|
|
121
|
+
|
|
122
|
+
When ML features are enabled, additional files are generated:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
aggregates/
|
|
126
|
+
├── dataset-manifest.json # features.predictions / features.ai_insights = true
|
|
127
|
+
├── aggregates/
|
|
128
|
+
│ └── ...
|
|
129
|
+
├── predictions/
|
|
130
|
+
│ └── trends.json # When enablePredictions=true
|
|
131
|
+
└── insights/
|
|
132
|
+
└── summary.json # When enableInsights=true
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### predictions/trends.json
|
|
136
|
+
|
|
137
|
+
Contains 4-week forecasts for key metrics:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"schema_version": 1,
|
|
142
|
+
"generated_at": "2026-01-18T12:00:00Z",
|
|
143
|
+
"is_stub": false,
|
|
144
|
+
"generated_by": "prophet-v1.0",
|
|
145
|
+
"forecasts": [
|
|
146
|
+
{
|
|
147
|
+
"metric": "pr_throughput",
|
|
148
|
+
"unit": "count",
|
|
149
|
+
"horizon_weeks": 4,
|
|
150
|
+
"values": [
|
|
151
|
+
{
|
|
152
|
+
"period_start": "2026-01-20",
|
|
153
|
+
"predicted": 28,
|
|
154
|
+
"lower_bound": 22,
|
|
155
|
+
"upper_bound": 34
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### insights/summary.json
|
|
164
|
+
|
|
165
|
+
Contains AI-generated insights:
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"schema_version": 1,
|
|
170
|
+
"generated_at": "2026-01-18T12:00:00Z",
|
|
171
|
+
"is_stub": false,
|
|
172
|
+
"generated_by": "openai-v1.0",
|
|
173
|
+
"insights": [
|
|
174
|
+
{
|
|
175
|
+
"id": "bottleneck-abc123",
|
|
176
|
+
"category": "bottleneck",
|
|
177
|
+
"severity": "warning",
|
|
178
|
+
"title": "Review latency increasing",
|
|
179
|
+
"description": "Average time to first review has increased by 15%.",
|
|
180
|
+
"affected_entities": ["team:Backend Team"]
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Dashboard Display
|
|
187
|
+
|
|
188
|
+
Once ML features are enabled and data is generated:
|
|
189
|
+
|
|
190
|
+
1. **Predictions tab**: Shows forecast charts with confidence intervals
|
|
191
|
+
2. **AI Insights tab**: Shows categorized insight cards grouped by severity
|
|
192
|
+
|
|
193
|
+
If no data is available, the tabs show "Coming Soon" state with instructions to enable the features in the pipeline.
|
|
194
|
+
|
|
195
|
+
## Troubleshooting
|
|
196
|
+
|
|
197
|
+
### "Predictions skipped: Prophet not installed"
|
|
198
|
+
|
|
199
|
+
Install Prophet with ML extras:
|
|
200
|
+
```bash
|
|
201
|
+
pip install "ado-git-repo-insights[ml]"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Or install Prophet directly:
|
|
205
|
+
```bash
|
|
206
|
+
pip install prophet>=1.1.0
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### "AI Insights enabled but OpenAI API Key not provided"
|
|
210
|
+
|
|
211
|
+
Ensure `openaiApiKey` input is set and the variable group is linked to your pipeline.
|
|
212
|
+
|
|
213
|
+
### Prophet installation fails
|
|
214
|
+
|
|
215
|
+
Prophet requires additional build tools. See [Prophet Installation](https://facebook.github.io/prophet/docs/installation.html) for platform-specific instructions.
|
|
216
|
+
|
|
217
|
+
### OpenAI rate limits
|
|
218
|
+
|
|
219
|
+
The insights generator caches results for 24 hours to minimize API calls. If you hit rate limits:
|
|
220
|
+
1. Wait for the rate limit window to reset
|
|
221
|
+
2. Consider using a higher-tier OpenAI plan
|
|
222
|
+
|
|
223
|
+
## Cost Considerations
|
|
224
|
+
|
|
225
|
+
### Prophet (Predictions)
|
|
226
|
+
- **Cost**: Free (runs locally)
|
|
227
|
+
- **Runtime**: +10-30 seconds per pipeline run
|
|
228
|
+
- **Resource**: CPU-intensive during model fitting
|
|
229
|
+
|
|
230
|
+
### OpenAI (AI Insights)
|
|
231
|
+
- **Cost**: ~$0.001-0.01 per run (depends on PR count)
|
|
232
|
+
- **Runtime**: +5-15 seconds per pipeline run
|
|
233
|
+
- **Caching**: Results cached for 24 hours (same data = no API call)
|
|
234
|
+
|
|
235
|
+
## Security
|
|
236
|
+
|
|
237
|
+
- **PAT**: Never logged, passed securely to Python process
|
|
238
|
+
- **OpenAI API Key**: Passed via environment variable, never logged
|
|
239
|
+
- **Data**: PR metadata is sent to OpenAI for analysis (titles, cycle times, counts)
|
|
240
|
+
|
|
241
|
+
If your organization has data residency requirements, consider using Azure OpenAI Service instead.
|
{ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/index.js
RENAMED
|
@@ -77,10 +77,13 @@ async function validatePythonEnvironment() {
|
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
79
|
* Install the Python package if not already installed.
|
|
80
|
+
* @param {string} pythonCmd - Python executable command
|
|
81
|
+
* @param {boolean} withML - Install ML extras (prophet, openai)
|
|
80
82
|
*/
|
|
81
|
-
function installPackage(pythonCmd) {
|
|
83
|
+
function installPackage(pythonCmd, withML = false) {
|
|
82
84
|
try {
|
|
83
|
-
|
|
85
|
+
const packageSpec = withML ? `${PACKAGE_NAME}[ml]` : PACKAGE_NAME;
|
|
86
|
+
tl.debug(`Checking if ${packageSpec} is installed...`);
|
|
84
87
|
|
|
85
88
|
// Check if package is already installed
|
|
86
89
|
try {
|
|
@@ -88,12 +91,32 @@ function installPackage(pythonCmd) {
|
|
|
88
91
|
encoding: 'utf-8',
|
|
89
92
|
stdio: 'pipe'
|
|
90
93
|
});
|
|
94
|
+
|
|
95
|
+
// If ML is needed, verify ML dependencies are available
|
|
96
|
+
if (withML) {
|
|
97
|
+
try {
|
|
98
|
+
execSync(`${pythonCmd} -c "import prophet; import openai"`, {
|
|
99
|
+
encoding: 'utf-8',
|
|
100
|
+
stdio: 'pipe'
|
|
101
|
+
});
|
|
102
|
+
tl.debug(`${packageSpec} already installed with ML extras`);
|
|
103
|
+
return true;
|
|
104
|
+
} catch (e) {
|
|
105
|
+
// ML dependencies missing, need to install them
|
|
106
|
+
tl.debug(`ML dependencies missing, installing ${packageSpec}...`);
|
|
107
|
+
execSync(`${pythonCmd} -m pip install "${packageSpec}" --quiet`, {
|
|
108
|
+
stdio: 'inherit'
|
|
109
|
+
});
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
91
114
|
tl.debug(`${PACKAGE_NAME} already installed`);
|
|
92
115
|
return true;
|
|
93
116
|
} catch (e) {
|
|
94
117
|
// Package not installed, install it
|
|
95
|
-
tl.debug(`Installing ${
|
|
96
|
-
execSync(`${pythonCmd} -m pip install ${
|
|
118
|
+
tl.debug(`Installing ${packageSpec}...`);
|
|
119
|
+
execSync(`${pythonCmd} -m pip install "${packageSpec}" --quiet`, {
|
|
97
120
|
stdio: 'inherit'
|
|
98
121
|
});
|
|
99
122
|
return true;
|
|
@@ -117,8 +140,13 @@ async function run() {
|
|
|
117
140
|
const pythonCmd = await validatePythonEnvironment();
|
|
118
141
|
if (!pythonCmd) return;
|
|
119
142
|
|
|
120
|
-
//
|
|
121
|
-
|
|
143
|
+
// Phase 5: Check if ML features are requested (need ML extras)
|
|
144
|
+
const enablePredictions = tl.getBoolInput('enablePredictions', false);
|
|
145
|
+
const enableInsights = tl.getBoolInput('enableInsights', false);
|
|
146
|
+
const needsML = enablePredictions || enableInsights;
|
|
147
|
+
|
|
148
|
+
// Install package (with ML extras if needed)
|
|
149
|
+
if (!installPackage(pythonCmd, needsML)) return;
|
|
122
150
|
|
|
123
151
|
try {
|
|
124
152
|
// Get task inputs
|
|
@@ -131,6 +159,8 @@ async function run() {
|
|
|
131
159
|
// Phase 3: Aggregates generation
|
|
132
160
|
const generateAggregates = tl.getBoolInput('generateAggregates', false);
|
|
133
161
|
const aggregatesDirInput = tl.getInput('aggregatesDir', false) || 'aggregates';
|
|
162
|
+
// Phase 5: ML features (enablePredictions/enableInsights already read above for install)
|
|
163
|
+
const openaiApiKey = tl.getInput('openaiApiKey', false);
|
|
134
164
|
// CRITICAL: Input name must match task.json contract ('database', not 'databasePath')
|
|
135
165
|
const databaseInput = tl.getInput('database', false) || 'ado-insights.sqlite';
|
|
136
166
|
const outputDirInput = tl.getInput('outputDir', false) || 'csv_output';
|
|
@@ -196,9 +226,23 @@ async function run() {
|
|
|
196
226
|
if (generateAggregates) {
|
|
197
227
|
console.log(`Generate Aggregates: true`);
|
|
198
228
|
console.log(`Aggregates Dir: ${aggregatesDir}`);
|
|
229
|
+
if (enablePredictions) console.log(`ML Predictions: enabled`);
|
|
230
|
+
if (enableInsights) console.log(`AI Insights: enabled`);
|
|
231
|
+
if (enableInsights && openaiApiKey) console.log(`OpenAI API Key: ********`);
|
|
199
232
|
}
|
|
200
233
|
console.log('='.repeat(50));
|
|
201
234
|
|
|
235
|
+
// Phase 5: Validate insights configuration
|
|
236
|
+
if (enableInsights && !openaiApiKey) {
|
|
237
|
+
tl.setResult(tl.TaskResult.Failed,
|
|
238
|
+
`AI Insights enabled but OpenAI API Key not provided.\n\n` +
|
|
239
|
+
`Resolution:\n` +
|
|
240
|
+
`1. Create a variable group with OPENAI_API_KEY secret\n` +
|
|
241
|
+
`2. Set openaiApiKey input to $(OPENAI_API_KEY)`
|
|
242
|
+
);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
202
246
|
// Validate date formats if provided (fail fast on invalid input)
|
|
203
247
|
const datePattern = /^\d{4}-\d{2}-\d{2}$/;
|
|
204
248
|
if (startDate && !datePattern.test(startDate)) {
|
|
@@ -278,8 +322,22 @@ async function run() {
|
|
|
278
322
|
'--output', aggregatesDir,
|
|
279
323
|
];
|
|
280
324
|
|
|
325
|
+
// Phase 5: Add ML flags
|
|
326
|
+
if (enablePredictions) {
|
|
327
|
+
aggArgs.push('--enable-predictions');
|
|
328
|
+
}
|
|
329
|
+
if (enableInsights) {
|
|
330
|
+
aggArgs.push('--enable-insights');
|
|
331
|
+
}
|
|
332
|
+
|
|
281
333
|
console.log(`\n[3/${totalSteps}] Generating aggregates...`);
|
|
282
|
-
|
|
334
|
+
|
|
335
|
+
// Phase 5: Set OPENAI_API_KEY environment variable for insights
|
|
336
|
+
const aggEnv = enableInsights && openaiApiKey
|
|
337
|
+
? { OPENAI_API_KEY: openaiApiKey }
|
|
338
|
+
: {};
|
|
339
|
+
|
|
340
|
+
const aggResult = await runPython(pythonCmd, aggArgs, aggEnv);
|
|
283
341
|
if (!aggResult) return;
|
|
284
342
|
}
|
|
285
343
|
|
|
@@ -302,12 +360,16 @@ async function run() {
|
|
|
302
360
|
|
|
303
361
|
/**
|
|
304
362
|
* Run Python command and return success status.
|
|
363
|
+
* @param {string} pythonCmd - Python executable command
|
|
364
|
+
* @param {string[]} args - Command arguments
|
|
365
|
+
* @param {Object} extraEnv - Additional environment variables to pass
|
|
305
366
|
*/
|
|
306
|
-
function runPython(pythonCmd, args) {
|
|
367
|
+
function runPython(pythonCmd, args, extraEnv = {}) {
|
|
307
368
|
return new Promise((resolve) => {
|
|
308
369
|
const proc = spawn(pythonCmd, args, {
|
|
309
370
|
stdio: 'inherit',
|
|
310
|
-
shell: process.platform === 'win32'
|
|
371
|
+
shell: process.platform === 'win32',
|
|
372
|
+
env: { ...process.env, ...extraEnv }
|
|
311
373
|
});
|
|
312
374
|
|
|
313
375
|
proc.on('close', (code) => {
|
{ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/task.json
RENAMED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"author": "Odd Essentials, LLC",
|
|
9
9
|
"version": {
|
|
10
10
|
"Major": 2,
|
|
11
|
-
"Minor":
|
|
11
|
+
"Minor": 3,
|
|
12
12
|
"Patch": 0
|
|
13
13
|
},
|
|
14
14
|
"instanceNameFormat": "Extract PR Metrics",
|
|
@@ -86,6 +86,32 @@
|
|
|
86
86
|
"required": false,
|
|
87
87
|
"defaultValue": "$(Pipeline.Workspace)/aggregates",
|
|
88
88
|
"helpMarkDown": "Directory for aggregate JSON files (used with generateAggregates)"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"name": "enablePredictions",
|
|
92
|
+
"type": "boolean",
|
|
93
|
+
"label": "Generate ML Predictions",
|
|
94
|
+
"required": false,
|
|
95
|
+
"defaultValue": "false",
|
|
96
|
+
"helpMarkDown": "Generate trend predictions using Prophet time-series forecasting. Requires generateAggregates to be enabled. Adds ~10-30s to pipeline runtime.",
|
|
97
|
+
"visibleRule": "generateAggregates = true"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "enableInsights",
|
|
101
|
+
"type": "boolean",
|
|
102
|
+
"label": "Generate AI Insights",
|
|
103
|
+
"required": false,
|
|
104
|
+
"defaultValue": "false",
|
|
105
|
+
"helpMarkDown": "Generate AI-powered insights using OpenAI. Requires generateAggregates and openaiApiKey. Adds ~5-15s to pipeline runtime.",
|
|
106
|
+
"visibleRule": "generateAggregates = true"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "openaiApiKey",
|
|
110
|
+
"type": "string",
|
|
111
|
+
"label": "OpenAI API Key",
|
|
112
|
+
"required": false,
|
|
113
|
+
"helpMarkDown": "OpenAI API key for AI Insights generation. Use $(OPENAI_API_KEY) from a variable group. Required when enableInsights is true.",
|
|
114
|
+
"visibleRule": "enableInsights = true"
|
|
89
115
|
}
|
|
90
116
|
],
|
|
91
117
|
"execution": {
|
|
@@ -804,21 +804,22 @@ describe('Regression Prevention', () => {
|
|
|
804
804
|
|
|
805
805
|
describe('Phase 5 Feature Flag (Predictions & AI Insights)', () => {
|
|
806
806
|
/**
|
|
807
|
-
* Phase 5 features (Predictions, AI Insights) are
|
|
808
|
-
*
|
|
807
|
+
* Phase 5 features (Predictions, AI Insights) are now enabled.
|
|
808
|
+
* The tabs are visible by default and show "Coming Soon" state
|
|
809
|
+
* until the backend generates predictions/insights data.
|
|
810
|
+
*
|
|
811
|
+
* Full functionality requires additional setup:
|
|
809
812
|
* - Prophet library for forecasting
|
|
810
813
|
* - OpenAI API key for AI insights
|
|
811
|
-
* - Pipeline task inputs
|
|
812
|
-
*
|
|
813
|
-
* Until ready, the tabs should show "Coming Soon" state.
|
|
814
|
+
* - Pipeline task inputs (enablePredictions, enableInsights)
|
|
814
815
|
*/
|
|
815
816
|
|
|
816
817
|
describe('Feature flag behavior', () => {
|
|
817
|
-
it('ENABLE_PHASE5_FEATURES should be
|
|
818
|
-
//
|
|
819
|
-
//
|
|
820
|
-
const ENABLE_PHASE5_FEATURES =
|
|
821
|
-
expect(ENABLE_PHASE5_FEATURES).toBe(
|
|
818
|
+
it('ENABLE_PHASE5_FEATURES should be true (Phase 5 enabled)', () => {
|
|
819
|
+
// Phase 5 features are now enabled by default
|
|
820
|
+
// Tabs are visible and show "Coming Soon" until data is available
|
|
821
|
+
const ENABLE_PHASE5_FEATURES = true;
|
|
822
|
+
expect(ENABLE_PHASE5_FEATURES).toBe(true);
|
|
822
823
|
});
|
|
823
824
|
|
|
824
825
|
it('Phase 5 tabs should be hidden when feature flag is false', () => {
|
|
@@ -31,7 +31,7 @@ const SETTINGS_KEY_PIPELINE = 'pr-insights-pipeline-id';
|
|
|
31
31
|
// - OpenAI API key for AI insights
|
|
32
32
|
// - Pipeline task inputs (enablePredictions, enableInsights) not yet exposed
|
|
33
33
|
// Set to true when Phase 5 is production-ready
|
|
34
|
-
const ENABLE_PHASE5_FEATURES =
|
|
34
|
+
const ENABLE_PHASE5_FEATURES = true;
|
|
35
35
|
|
|
36
36
|
// DOM element cache
|
|
37
37
|
const elements = {};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ado-git-repo-insights-release",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "ado-git-repo-insights-release",
|
|
9
|
-
"version": "3.
|
|
9
|
+
"version": "3.3.0",
|
|
10
10
|
"devDependencies": {
|
|
11
11
|
"@semantic-release/changelog": "^6.0.3",
|
|
12
12
|
"@semantic-release/commit-analyzer": "^13.0.0",
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
.pre-commit-config.yaml
|
|
6
6
|
.releaserc.json
|
|
7
7
|
CHANGELOG.md
|
|
8
|
-
DEFERRED-PHASE5.md
|
|
9
8
|
LICENSE
|
|
10
9
|
MERMAID.md
|
|
11
10
|
README.md
|
|
@@ -28,6 +27,7 @@ agents/INVARIANTS.md
|
|
|
28
27
|
agents/definition-of-done.md
|
|
29
28
|
agents/victory-gates.md
|
|
30
29
|
docs/DEFAULT-DASHBOARD-ENHANCEMENT-PLAN.md
|
|
30
|
+
docs/ENABLE-ML-FEATURES.md
|
|
31
31
|
docs/EXTENSION.md
|
|
32
32
|
docs/INSTALLATION.md
|
|
33
33
|
docs/MANUAL_WALKTHROUGH.md
|
|
@@ -135,6 +135,7 @@ tests/integration/test_db_open_failure.py
|
|
|
135
135
|
tests/integration/test_golden_outputs.py
|
|
136
136
|
tests/integration/test_incremental_run.py
|
|
137
137
|
tests/integration/test_multi_project_scoping.py
|
|
138
|
+
tests/integration/test_phase5_ml_integration.py
|
|
138
139
|
tests/unit/__init__.py
|
|
139
140
|
tests/unit/test_ado_client_pagination.py
|
|
140
141
|
tests/unit/test_aggregators.py
|