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.
Files changed (174) hide show
  1. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/CHANGELOG.md +14 -0
  2. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/PKG-INFO +1 -1
  3. ado_git_repo_insights-3.3.0/VERSION +1 -0
  4. ado_git_repo_insights-3.3.0/docs/ENABLE-ML-FEATURES.md +241 -0
  5. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/index.js +71 -9
  6. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/task.json +27 -1
  7. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/production-issues.test.js +11 -10
  8. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/dashboard.js +1 -1
  9. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/vss-extension.json +1 -1
  10. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/package-lock.json +2 -2
  11. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/package.json +1 -1
  12. {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
  13. {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
  14. ado_git_repo_insights-3.3.0/tests/integration/test_phase5_ml_integration.py +695 -0
  15. ado_git_repo_insights-3.2.0/DEFERRED-PHASE5.md +0 -207
  16. ado_git_repo_insights-3.2.0/VERSION +0 -1
  17. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.editorconfig +0 -0
  18. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.gitattributes +0 -0
  19. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/scripts/check-baseline-integrity.js +0 -0
  20. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/scripts/validate-test-results.py +0 -0
  21. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/workflows/ci.yml +0 -0
  22. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.github/workflows/release.yml +0 -0
  23. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.gitignore +0 -0
  24. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.gitleaks.toml +0 -0
  25. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.husky/pre-commit +0 -0
  26. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.husky/pre-push +0 -0
  27. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.pre-commit-config.yaml +0 -0
  28. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/.releaserc.json +0 -0
  29. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/LICENSE +0 -0
  30. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/MERMAID.md +0 -0
  31. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/README.md +0 -0
  32. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/agents/INVARIANTS.md +0 -0
  33. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/agents/definition-of-done.md +0 -0
  34. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/agents/victory-gates.md +0 -0
  35. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/config.example.yaml +0 -0
  36. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/DEFAULT-DASHBOARD-ENHANCEMENT-PLAN.md +0 -0
  37. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/EXTENSION.md +0 -0
  38. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/INSTALLATION.md +0 -0
  39. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/MANUAL_WALKTHROUGH.md +0 -0
  40. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/PHASE5.md +0 -0
  41. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/PHASE6.md +0 -0
  42. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/SESSION.md +0 -0
  43. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/SUMMARY.md +0 -0
  44. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/ado-pipeline-smoke-check.md +0 -0
  45. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/dataset-contract.md +0 -0
  46. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/phase5-contract-notes.md +0 -0
  47. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/rollout-plan.md +0 -0
  48. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/docs/runbook.md +0 -0
  49. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/images/README.md +0 -0
  50. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/images/icon.png +0 -0
  51. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/images/icon.png.placeholder +0 -0
  52. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/jest.config.js +0 -0
  53. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/overview.md +0 -0
  54. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/package-lock.json +0 -0
  55. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/package.json +0 -0
  56. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/scripts/copy-vss-sdk.sh +0 -0
  57. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/scripts/update-perf-baseline.js +0 -0
  58. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/index.test.js +0 -0
  59. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/package-lock.json +0 -0
  60. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tasks/extract-prs/package.json +0 -0
  61. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/test-output.txt +0 -0
  62. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/test-results.json +0 -0
  63. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/ado-sdk.test.js +0 -0
  64. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/api-patterns.test.js +0 -0
  65. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/auth-pattern.test.js +0 -0
  66. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/chunked-loading.test.js +0 -0
  67. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/cross-project-settings.test.js +0 -0
  68. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/dashboard.test.js +0 -0
  69. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/dataset-loader.test.js +0 -0
  70. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/date-range-warning.test.js +0 -0
  71. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/error-codes.test.js +0 -0
  72. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/aggregates/dimensions.json +0 -0
  73. {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
  74. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/dataset-manifest.json +0 -0
  75. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/insights/summary.json +0 -0
  76. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/perf-baselines.json +0 -0
  77. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures/predictions/trends.json +0 -0
  78. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/fixtures.test.js +0 -0
  79. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/metrics.test.js +0 -0
  80. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/mocks/ado-sdk.js +0 -0
  81. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/performance.test.js +0 -0
  82. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/pipeline-artifact-url.test.js +0 -0
  83. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/sdk-bundling.test.js +0 -0
  84. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/setup.js +0 -0
  85. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/tests/synthetic-fixtures.test.js +0 -0
  86. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/VSS.SDK.min.js +0 -0
  87. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/artifact-client.js +0 -0
  88. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/dataset-loader.js +0 -0
  89. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/error-codes.js +0 -0
  90. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/error-types.js +0 -0
  91. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/index.html +0 -0
  92. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/settings.html +0 -0
  93. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/settings.js +0 -0
  94. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension/ui/styles.css +0 -0
  95. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/extension-verification-test.yml +0 -0
  96. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/insights-verification-test.yml +0 -0
  97. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/pr-insights-pipeline.yml +0 -0
  98. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/pyproject.toml +0 -0
  99. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/sample-pipeline.yml +0 -0
  100. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/schemas/dataset-manifest.schema.json +0 -0
  101. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/schemas/insights.schema.json +0 -0
  102. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/schemas/predictions.schema.json +0 -0
  103. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/check-version-unchanged.sh +0 -0
  104. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/csv_diff.py +0 -0
  105. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/generate-synthetic-dataset.py +0 -0
  106. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/stamp-extension-version.js +0 -0
  107. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/scripts/validate-task-inputs.js +0 -0
  108. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/setup.cfg +0 -0
  109. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/__init__.py +0 -0
  110. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/cli.py +0 -0
  111. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/config.py +0 -0
  112. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/extractor/__init__.py +0 -0
  113. {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
  114. {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
  115. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/__init__.py +0 -0
  116. {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
  117. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/forecaster.py +0 -0
  118. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/ml/insights.py +0 -0
  119. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/__init__.py +0 -0
  120. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/database.py +0 -0
  121. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/models.py +0 -0
  122. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/persistence/repository.py +0 -0
  123. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/transform/__init__.py +0 -0
  124. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/transform/aggregators.py +0 -0
  125. {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
  126. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/src/ado_git_repo_insights/utils/__init__.py +0 -0
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/__init__.py +0 -0
  135. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/fixtures/README.md +0 -0
  136. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/__init__.py +0 -0
  137. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_backfill_convergence.py +0 -0
  138. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_db_open_failure.py +0 -0
  139. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_golden_outputs.py +0 -0
  140. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_incremental_run.py +0 -0
  141. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/integration/test_multi_project_scoping.py +0 -0
  142. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/test_redaction.py +0 -0
  143. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/__init__.py +0 -0
  144. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_ado_client_pagination.py +0 -0
  145. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_aggregators.py +0 -0
  146. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_artifacts_dir.py +0 -0
  147. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_chunk_selection.py +0 -0
  148. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_cli_args.py +0 -0
  149. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_cli_exit_code.py +0 -0
  150. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_comments_cli.py +0 -0
  151. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_comments_extraction.py +0 -0
  152. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_completed_only.py +0 -0
  153. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_config_validation.py +0 -0
  154. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_csv_contract.py +0 -0
  155. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_csv_determinism.py +0 -0
  156. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_date_range_defaults.py +0 -0
  157. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_datetime_utils.py +0 -0
  158. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_forecaster_contract.py +0 -0
  159. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_insights_contract.py +0 -0
  160. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_insights_id_stability.py +0 -0
  161. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_insights_schema.py +0 -0
  162. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_logging_config.py +0 -0
  163. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_ml_cli_flags.py +0 -0
  164. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_monday_alignment.py +0 -0
  165. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_operational_summary.py +0 -0
  166. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_predictions_schema.py +0 -0
  167. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_retry_policy.py +0 -0
  168. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_run_summary.py +0 -0
  169. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_secret_redaction.py +0 -0
  170. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_summary_drift_guard.py +0 -0
  171. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_synthetic_dataset.py +0 -0
  172. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_team_extraction.py +0 -0
  173. {ado_git_repo_insights-3.2.0 → ado_git_repo_insights-3.3.0}/tests/unit/test_upsert_keys.py +0 -0
  174. {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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ado-git-repo-insights
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: Extract Azure DevOps Pull Request metrics to SQLite and generate PowerBI-compatible CSVs.
5
5
  Author-email: "Odd Essentials, LLC" <admin@oddessentials.com>
6
6
  License: MIT
@@ -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.
@@ -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
- tl.debug(`Checking if ${PACKAGE_NAME} is installed...`);
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 ${PACKAGE_NAME}...`);
96
- execSync(`${pythonCmd} -m pip install ${PACKAGE_NAME} --quiet`, {
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
- // Install package
121
- if (!installPackage(pythonCmd)) return;
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
- const aggResult = await runPython(pythonCmd, aggArgs);
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) => {
@@ -8,7 +8,7 @@
8
8
  "author": "Odd Essentials, LLC",
9
9
  "version": {
10
10
  "Major": 2,
11
- "Minor": 2,
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 not yet production-ready.
808
- * They require additional setup:
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 not yet exposed
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 false by default', () => {
818
- // This documents the expected default state
819
- // When Phase 5 is ready, this test should be updated
820
- const ENABLE_PHASE5_FEATURES = false;
821
- expect(ENABLE_PHASE5_FEATURES).toBe(false);
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 = false;
34
+ const ENABLE_PHASE5_FEATURES = true;
35
35
 
36
36
  // DOM element cache
37
37
  const elements = {};
@@ -2,7 +2,7 @@
2
2
  "manifestVersion": 1,
3
3
  "id": "ado-git-repo-insights",
4
4
  "name": "Git Repo Insights",
5
- "version": "3.2.0",
5
+ "version": "3.3.0",
6
6
  "publisher": "OddEssentials",
7
7
  "targets": [
8
8
  {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ado-git-repo-insights-release",
3
- "version": "3.2.0",
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.2.0",
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",
@@ -11,7 +11,7 @@
11
11
  "husky": "^9.1.7",
12
12
  "semantic-release": "^24.0.0"
13
13
  },
14
- "version": "3.2.0",
14
+ "version": "3.3.0",
15
15
  "scripts": {
16
16
  "prepare": "husky"
17
17
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ado-git-repo-insights
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: Extract Azure DevOps Pull Request metrics to SQLite and generate PowerBI-compatible CSVs.
5
5
  Author-email: "Odd Essentials, LLC" <admin@oddessentials.com>
6
6
  License: MIT
@@ -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