Skip to content

feat(workflows): add Python testing CI workflow with pytest and Codecov#934

Merged
WilliamBerryiii merged 12 commits intomicrosoft:mainfrom
JasonOA888:feat/issue-890-python-testing-ci
Mar 12, 2026
Merged

feat(workflows): add Python testing CI workflow with pytest and Codecov#934
WilliamBerryiii merged 12 commits intomicrosoft:mainfrom
JasonOA888:feat/issue-890-python-testing-ci

Conversation

@JasonOA888
Copy link
Copy Markdown
Contributor

@JasonOA888 JasonOA888 commented Mar 8, 2026

Description

Add a reusable pytest-tests.yml CI workflow for Python testing with dynamic skill discovery, pytest coverage, and Codecov integration.

Workflow (pytest-tests.yml)

  • Reusable workflow accepting working-directory, soft-fail, and changed-files-only inputs
  • pytest with pytest-cov for XML coverage reporting
  • Codecov OIDC integration for coverage tracking (no token required)
  • Changed-files-only mode for efficient CI runs on PRs
  • upload-artifact step for preserving raw coverage XML

PR Validation Integration (pr-validation.yml)

  • Dynamic Python skill discovery via matrix strategy — finds all directories under .github/skills/ containing a pyproject.toml
  • Matrix-based parallel test execution across discovered skills
  • changed-files-only mode enabled for PR validation runs

Codecov Configuration (codecov.yml)

  • pytest flag scoped to .github/skills/**/scripts/**
  • Project-level target: auto with 1% threshold
  • Patch-level target: 80% (informational)
  • Carryforward enabled for the pytest flag

Test Coverage

  • 531 tests passing across 14 test files with 90% overall coverage
  • All 14 script files above the 80% patch coverage threshold
  • Key coverage: pptx_shapes 100%, pptx_utils 100%, render_pdf_images 99%, validate_slides 99%, build_deck 91%

Related Issue(s)

Fixes #890

Type of Change

Select all that apply:

Code & Documentation:

  • Bug fix (non-breaking change fixing an issue)
  • New feature (non-breaking change adding functionality)
  • Breaking change (fix or feature causing existing functionality to change)
  • Documentation update

Infrastructure & Configuration:

  • GitHub Actions workflow
  • Linting configuration (markdown, PowerShell, etc.)
  • Security configuration
  • DevContainer configuration
  • Dependency update

AI Artifacts:

  • Reviewed contribution with prompt-builder agent and addressed all feedback
  • Copilot instructions (.github/instructions/*.instructions.md)
  • Copilot prompt (.github/prompts/*.prompt.md)
  • Copilot agent (.github/agents/*.agent.md)
  • Copilot skill (.github/skills/*/SKILL.md)

Other:

  • Script/automation (.ps1, .sh, .py)
  • Other (please describe):

Testing

  • 531 pytest tests passing with 90% coverage across the powerpoint skill's 14 script files
  • All action SHAs verified current (actions/checkout v4.2.2, actions/setup-python v6.2.0, astral-sh/setup-uv v7.4.0, actions/upload-artifact v4.4.3, codecov/codecov-action v5.5.2)

Checklist

Required Checks

  • Documentation is updated (if applicable)
  • Files follow existing naming conventions
  • Changes are backwards compatible (if applicable)
  • Tests added for new functionality (if applicable)

Required Automated Checks

The following validation commands must pass before merging:

  • Markdown linting: npm run lint:md
  • Spell checking: npm run spell-check
  • Frontmatter validation: npm run lint:frontmatter
  • Skill structure validation: npm run validate:skills
  • Link validation: npm run lint:md-links
  • PowerShell analysis: npm run lint:ps

@JasonOA888 JasonOA888 requested a review from a team as a code owner March 8, 2026 06:12
@WilliamBerryiii
Copy link
Copy Markdown
Member

Hi @JasonOA888 — thank you for taking the time to contribute to this project! We really appreciate the effort you've put into this PR.

Before we can review and merge your changes, we need you to sign the Microsoft Contributor License Agreement (CLA). The CLA bot should have posted instructions on this PR when it was opened. You can sign by posting the following comment:

@microsoft-github-policy-service agree

If you're contributing on behalf of a company, use:

@microsoft-github-policy-service agree company="{your company}"

We'd love to include your work, but unfortunately we won't be able to accept the contribution without a signed CLA. If we don't hear back, we'll eventually need to close this PR and potentially redo the work under a signed agreement.

Thanks again, and please let us know if you have any questions!

@WilliamBerryiii WilliamBerryiii changed the title feat(ci): add Python testing CI workflow with pytest and Codecov feat(workflows): add Python testing CI workflow with pytest and Codecov Mar 8, 2026
@WilliamBerryiii
Copy link
Copy Markdown
Member

PR Compliance Update — The following adjustments were made to align this PR with project conventions:

  1. Title scope: Changed feat(ci):feat(workflows): — the project uses workflows as the conventional scope for CI/workflow file changes (see .github/instructions/hve-core/commit-message.instructions.md).
  2. PR body: Reformatted to use the project's PR template with all required sections (Related Issue(s), Type of Change, Checklist, Security Considerations, etc.). The original description and Fixes #890 reference were preserved.

No content was changed — only formatting and metadata alignment. Thank you for the contribution! 🙏

Copy link
Copy Markdown
Contributor

@katriendg katriendg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @JasonOA888, thank you so much for taking the time to contribute to this project! It's highly appreciated, and you've made a solid start on the pytest CI workflow. The workflow structure, pinned actions, OIDC-based Codecov integration, and the soft-fail / changed-files-only inputs are all heading in the right direction.

That said, after comparing the PR against the requirements in #890, there are a number of items that still need to be addressed before this can be merged. Sharing the full list here so the path forward is straightforward:

Missing from the issue requirements

  1. working-directory input — The issue requires the workflow to accept a working-directory input so the orchestrator can call it once per Python skill directory. This is a core architectural requirement for multi-skill support and is currently absent.

  2. Dependency management approach — The issue specifies using uv sync --locked within the skill's working directory (to use the committed lockfile and prevent supply-chain risks), not uv pip install --system. The current approach installs packages globally and bypasses lockfile guarantees.

  3. pr-validation.yml integration — The issue requires modifying pr-validation.yml to call pytest-tests.yml as a job in the validation matrix. This file was not changed.

  4. codecov.yml flag configuration — The issue requires adding a pytest coverage flag in codecov.yml with path filters (.github/skills/**/scripts/**) and carryforward: true. This file was not changed.

  5. pytest-mock in skill dev dependencies — The issue requires pytest-mock to be included in the [dependency-groups] dev dependencies of Python skills' pyproject.toml files, not just installed in CI.

Implementation differences

  • code-coverage input — The workflow adds a code-coverage boolean toggle, but the issue expects coverage to always be collected during test runs. This extra input diverges from the spec.
  • Test execution — The issue expects uv run pytest (running within the skill's virtual environment) rather than a bare pytest call at the repo root.
  • Acceptance criteria gap — "Adding a new Python skill requires only a new orchestrator job entry, no workflow changes" depends on the working-directory input and orchestrator integration, both currently missing.

Would you be able to update the PR to cover the remaining items? Happy to answer any questions about the expected architecture or help clarify anything in the issue. Thanks again for contributing!

@JasonOA888
Copy link
Copy Markdown
Contributor Author

@JasonOA888 please read the following Contributor License Agreement(CLA). If you agree with the CLA, please reply with the following information.

@microsoft-github-policy-service agree [company="{your company}"]

Options:

  • (default - no company specified) I have sole ownership of intellectual property rights to my Submissions and I am not making Submissions in the course of work for my employer.
@microsoft-github-policy-service agree
  • (when company given) I am making Submissions in the course of work for my employer (or my employer has intellectual property rights in my Submissions by contract or applicable law). I have permission from my employer to make Submissions and enter into this Agreement on behalf of my employer. By signing below, the defined term “You” includes me and my employer.
@microsoft-github-policy-service agree company="Microsoft"

Contributor License Agreement

Contribution License Agreement

This Contribution License Agreement (“Agreement”) is agreed to by the party signing below (“You”), and conveys certain license rights to Microsoft Corporation and its affiliates (“Microsoft”) for Your contributions to Microsoft open source projects. This Agreement is effective as of the latest signature date below.

  1. Definitions.
    “Code” means the computer software code, whether in human-readable or machine-executable form,
    that is delivered by You to Microsoft under this Agreement.
    “Project” means any of the projects owned or managed by Microsoft and offered under a license
    approved by the Open Source Initiative (www.opensource.org).
    “Submit” is the act of uploading, submitting, transmitting, or distributing code or other content to any
    Project, including but not limited to communication on electronic mailing lists, source code control
    systems, and issue tracking systems that are managed by, or on behalf of, the Project for the purpose of
    discussing and improving that Project, but excluding communication that is conspicuously marked or
    otherwise designated in writing by You as “Not a Submission.”
    “Submission” means the Code and any other copyrightable material Submitted by You, including any
    associated comments and documentation.
  2. Your Submission. You must agree to the terms of this Agreement before making a Submission to any
    Project. This Agreement covers any and all Submissions that You, now or in the future (except as
    described in Section 4 below), Submit to any Project.
  3. Originality of Work. You represent that each of Your Submissions is entirely Your original work.
    Should You wish to Submit materials that are not Your original work, You may Submit them separately
    to the Project if You (a) retain all copyright and license information that was in the materials as You
    received them, (b) in the description accompanying Your Submission, include the phrase “Submission
    containing materials of a third party:” followed by the names of the third party and any licenses or other
    restrictions of which You are aware, and (c) follow any other instructions in the Project’s written
    guidelines concerning Submissions.
  4. Your Employer. References to “employer” in this Agreement include Your employer or anyone else
    for whom You are acting in making Your Submission, e.g. as a contractor, vendor, or agent. If Your
    Submission is made in the course of Your work for an employer or Your employer has intellectual
    property rights in Your Submission by contract or applicable law, You must secure permission from Your
    employer to make the Submission before signing this Agreement. In that case, the term “You” in this
    Agreement will refer to You and the employer collectively. If You change employers in the future and
    desire to Submit additional Submissions for the new employer, then You agree to sign a new Agreement
    and secure permission from the new employer before Submitting those Submissions.
  5. Licenses.
  • Copyright License. You grant Microsoft, and those who receive the Submission directly or
    indirectly from Microsoft, a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license in the
    Submission to reproduce, prepare derivative works of, publicly display, publicly perform, and distribute
    the Submission and such derivative works, and to sublicense any or all of the foregoing rights to third
    parties.
  • Patent License. You grant Microsoft, and those who receive the Submission directly or
    indirectly from Microsoft, a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license under
    Your patent claims that are necessarily infringed by the Submission or the combination of the
    Submission with the Project to which it was Submitted to make, have made, use, offer to sell, sell and
    import or otherwise dispose of the Submission alone or with the Project.
  • Other Rights Reserved. Each party reserves all rights not expressly granted in this Agreement.
    No additional licenses or rights whatsoever (including, without limitation, any implied licenses) are
    granted by implication, exhaustion, estoppel or otherwise.
  1. Representations and Warranties. You represent that You are legally entitled to grant the above
    licenses. You represent that each of Your Submissions is entirely Your original work (except as You may
    have disclosed under Section 3). You represent that You have secured permission from Your employer to
    make the Submission in cases where Your Submission is made in the course of Your work for Your
    employer or Your employer has intellectual property rights in Your Submission by contract or applicable
    law. If You are signing this Agreement on behalf of Your employer, You represent and warrant that You
    have the necessary authority to bind the listed employer to the obligations contained in this Agreement.
    You are not expected to provide support for Your Submission, unless You choose to do so. UNLESS
    REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, AND EXCEPT FOR THE WARRANTIES
    EXPRESSLY STATED IN SECTIONS 3, 4, AND 6, THE SUBMISSION PROVIDED UNDER THIS AGREEMENT IS
    PROVIDED WITHOUT WARRANTY OF ANY KIND, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY OF
    NONINFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
  2. Notice to Microsoft. You agree to notify Microsoft in writing of any facts or circumstances of which
    You later become aware that would make Your representations in this Agreement inaccurate in any
    respect.
  3. Information about Submissions. You agree that contributions to Projects and information about
    contributions may be maintained indefinitely and disclosed publicly, including Your name and other
    information that You submit with Your Submission.
  4. Governing Law/Jurisdiction. This Agreement is governed by the laws of the State of Washington, and
    the parties consent to exclusive jurisdiction and venue in the federal courts sitting in King County,
    Washington, unless no federal subject matter jurisdiction exists, in which case the parties consent to
    exclusive jurisdiction and venue in the Superior Court of King County, Washington. The parties waive all
    defenses of lack of personal jurisdiction and forum non-conveniens.
  5. Entire Agreement/Assignment. This Agreement is the entire agreement between the parties, and
    supersedes any and all prior agreements, understandings or communications, written or oral, between
    the parties relating to the subject matter hereof. This Agreement may be assigned by Microsoft.

@microsoft-github-policy-service agree

@JasonOA888
Copy link
Copy Markdown
Contributor Author

@microsoft-github-policy-service agree

@JasonOA888
Copy link
Copy Markdown
Contributor Author

Thanks for the detailed review @katriendg! The feedback is very helpful.

I can see the PR is missing several key requirements from #890:

  1. working-directory input for multi-skill support
  2. uv sync --locked instead of uv pip install --system
  3. pr-validation.yml integration
  4. codecov.yml flag configuration
  5. pytest-mock in skill dev dependencies
  6. uv run pytest instead of bare pytest
  7. ❌ Remove code-coverage toggle

I'd like to update this PR to address all the requirements. A few clarifying questions:

  1. Should I also update the PowerPoint skill's pyproject.toml to add pytest-mock, or is that a separate PR?
  2. For the orchestrator integration, should each Python skill get its own job entry in pr-validation.yml, or should there be a matrix strategy?

I'll start working on the updates.

- Add reusable pytest-tests.yml workflow
  - Accepts working-directory input for multi-skill support
  - Uses uv sync --locked for dependency management
  - Runs pytest with coverage collection
  - Uploads coverage to Codecov with pytest flag

- Update pr-validation.yml
  - Add pytest-powerpoint job calling the new workflow

- Update codecov.yml
  - Add pytest coverage flag with skill path filters
  - Enable carryforward for skills not tested in a given commit

Fixes microsoft#890
@JasonOA888 JasonOA888 force-pushed the feat/issue-890-python-testing-ci branch from e992624 to 4046c7c Compare March 9, 2026 07:55
@JasonOA888
Copy link
Copy Markdown
Contributor Author

PR updated to address all review feedback:

Changes Made

1. pytest-tests.yml (new reusable workflow)

  • ✅ Added working-directory input for multi-skill support
  • ✅ Uses uv sync --locked for dependency management (not uv pip install --system)
  • ✅ Runs uv run pytest within skill's virtual environment
  • ✅ Always collects coverage (removed code-coverage toggle)
  • ✅ Uploads to Codecov with pytest flag

2. pr-validation.yml

  • ✅ Added pytest-powerpoint job that calls the new workflow
  • ✅ Uses working-directory: .github/skills/experimental/powerpoint
  • ✅ Set changed-files-only: true to skip if no Python changes

3. codecov.yml

  • ✅ Added pytest coverage flag with path filter .github/skills/**/scripts/**
  • ✅ Enabled carryforward: true

Notes

  • pytest-mock in skill dev dependencies: This requires modifying each skill's pyproject.toml. Since the PowerPoint skill PR (feat(skills): add PowerPoint automation skill with YAML-driven deck generation #868) is still pending, I haven't modified any skill files. Once a Python skill is merged, its pyproject.toml should include pytest-mock>=3.14 in [dependency-groups] dev.

  • Multiple skills: Adding new Python skills requires only a new job entry in pr-validation.yml calling the reusable workflow with the appropriate working-directory.

@katriendg
Copy link
Copy Markdown
Contributor

@JasonOA888, thank you for the quick turnaround addressing the earlier feedback. The reusable workflow (pytest-tests.yml) itself is well-structured: working-directory input, uv sync --locked, uv run pytest, Codecov OIDC upload with the pytest flag, and the changed-files-only skip logic are all solid. Appreciate the effort here.

Two items remain before this can move forward:

  1. Discovery instead of hardcoding. The pytest-powerpoint job in pr-validation.yml hardcodes a single skill directory. The project convention (see extension-package.yml discover-collections) is to dynamically discover targets. For pytest, this means a discovery job that finds all pyproject.toml files under .github/skills/ and emits their parent directories as a JSON matrix, with a downstream matrix job calling pytest-tests.yml per skill. This way, adding a new Python skill only requires dropping a pyproject.toml in the skill folder with no workflow edits.

  2. Dependency on PR feat(skills): add PowerPoint automation skill with YAML-driven deck generation #868. This PR targets a skill directory that doesn't exist on main yet (the PowerPoint skill lands with feat(skills): add PowerPoint automation skill with YAML-driven deck generation #868). Without that, there's nothing for this workflow to discover or test against.

I'd recommend converting this PR to draft until #868 merges, then rebasing and reworking the pr-validation.yml integration with the discovery pattern. That gives us a real end-to-end validation path.
@WilliamBerryiii agree?

The contribution is valuable and aligns well with the #890 requirements. Once #868 is in, we can get this across the finish line quickly. Thanks again!

@katriendg katriendg requested review from a team and katriendg March 9, 2026 08:21
Changes:
- Add discover-python-skills job that finds all pyproject.toml under .github/skills/
- Replace hardcoded pytest-powerpoint job with matrix-based pytest job
- Adding new Python skill now only requires dropping pyproject.toml in skill folder

This follows the project convention of dynamic discovery (see extension-package.yml).

Note: Tests will pass with empty matrix until PowerPoint skill (microsoft#868) lands.
@JasonOA888
Copy link
Copy Markdown
Contributor Author

Updated to use dynamic discovery following project conventions.

Changes

1. Discovery Job (discover-python-skills)

  • Finds all pyproject.toml files under .github/skills/
  • Builds JSON matrix with skill name and working directory
  • Outputs has-skills flag to skip if no Python skills found

2. Matrix-based pytest Job

  • Replaces hardcoded pytest-powerpoint job
  • Uses fromJson(needs.discover-python-skills.outputs.matrix)
  • Each skill runs independently with fail-fast: false

3. Result

Adding a new Python skill now only requires:

  1. Create skill folder under .github/skills/
  2. Add pyproject.toml with [dependency-groups] dev = ["pytest>=8.0", "ruff>=0.4", "pytest-mock>=3.14"]
  3. No workflow edits needed

Note on PowerPoint Skill (#868)

The workflow will pass with an empty matrix until the PowerPoint skill lands. Once #868 merges, the discovery job will automatically find it.

This follows the same pattern as extension-package.yml discover-collections.

@JasonOA888
Copy link
Copy Markdown
Contributor Author

@katriendg Sounds good! I'll keep this PR ready and rebased.

Once #868 merges, I'll:

  1. Rebase onto main
  2. Verify discovery finds the PowerPoint skill
  3. Confirm end-to-end test execution

The workflow is already structured for dynamic discovery, so it should work automatically once a Python skill exists in the repo.

(Unable to convert to draft via API, but consider this ready-and-waiting)

WilliamBerryiii and others added 3 commits March 9, 2026 16:42
- Add coverage.status.project.pytest with pytest flag to codecov.yml
- Quote $GITHUB_OUTPUT in check-python step for shell safety
- Replace hashFiles(inputs.working-directory) with inputs.working-directory for artifact and codecov naming
- Make working-directory input required, remove hardcoded default
@WilliamBerryiii WilliamBerryiii dismissed katriendg’s stale review March 12, 2026 19:11

Requesting review from another maintainer so we can merge

Bill Berry added 2 commits March 12, 2026 12:28
- rewrite all tests to match actual validate_slides.py public API
- add async test coverage for validate_slide, run, and main
- cover argument parsing, image discovery, prompt loading, and error paths
- achieve 99% code coverage on validate_slides module

🧪 - Generated by Copilot
- Update astral-sh/setup-uv from v6.4.3 (deleted SHA) to v7.4.0
- Add TestMain class to test_build_deck.py covering full build,
  template build, and partial rebuild paths (76% → 91%)
- Add TestParseSlideNumbers, slide_numbers filtering, fitz import
  error, and BrokenPipeError tests to test_render_pdf_images.py
  (78% → 99%)
- Fix missing slide_numbers attribute in Namespace test fixtures
- 531 tests passing, 90% overall coverage
Bill Berry added 2 commits March 12, 2026 13:18
The v6.0.0 SHA (e797f83) is no longer available on GitHub, causing
the PR validation pytest job to fail. Update to v6.2.0 SHA
(a309ff8) matching copilot-setup-steps.yml.
@WilliamBerryiii
Copy link
Copy Markdown
Member

Hey @JasonOA888 — just wanted to take a moment to say thank you for picking up these backlog items and driving them forward. Adding Python testing CI with pytest and Codecov integration is a meaningful contribution to the project, and the dynamic skill discovery via matrix strategy is a great pattern that will scale well as more Python skills are added.

We really appreciate your patience working through the review feedback and revisions with us — the PR has shaped up well through the collaboration. The workflow is solid, the coverage configuration is clean, and the overall design fits nicely into the existing CI architecture.

I've pushed a few additional commits to the branch to address the remaining review items and CI issues we identified together:

  • Test coverage: Rewrote test_validate_slides.py to match the current module interface (post-PR feat(skills): add PowerPoint automation skill with YAML-driven deck generation #868 merge), and added comprehensive tests for build_deck.main() and render_pdf_images — bringing overall coverage to 90% with all scripts above the 80% threshold
  • CI fixes: Updated pinned SHAs for astral-sh/setup-uv (v7.4.0) and actions/setup-python (v6.2.0), and sanitized the upload-artifact name to handle forward slashes in the working directory path
  • Code quality: Cleaned up unused imports flagged by CodeQL

Thanks again for the contribution — looking forward to getting this merged! 🚀

…ame sanitization

- add Set artifact name step using tr to convert path separators
- reference step output for upload-artifact name

🔧 - Generated by Copilot
WilliamBerryiii added a commit that referenced this pull request Mar 20, 2026
🤖 I have created a release *beep* *boop*
---


##
[3.2.0](hve-core-v3.1.46...hve-core-v3.2.0)
(2026-03-20)


### ✨ Features

* add -OutputPath parameter to Validate-MarkdownFrontmatter.ps1
([#1134](#1134))
([fdf1bcf](fdf1bcf)),
closes [#1006](#1006)
* add action version consistency scan workflow
([#1127](#1127))
([4229df1](4229df1))
* **agent:** MVE Experiment Designer
([#976](#976))
([70f86ca](70f86ca))
* **agents:** add ADO Backlog Manager orchestrator agent
([#800](#800))
([fae3987](fae3987))
* **agents:** add meeting analyst agent for transcript analysis using
work-iq ([#502](#502))
([5345b5b](5345b5b))
* **agents:** add quick-reference line to RPI Phase 5 suggestions
([#897](#897))
([9a90f39](9a90f39))
* **agents:** add RAI Planner, enhance SSSC Planner, and redesign
Security Planner
([#979](#979))
([06f826c](06f826c))
* **agents:** add symmetric cross-system handoff to GitHub Backlog
Manager ([#952](#952))
([ba34a35](ba34a35))
* **agents:** Functional Code Review Agent — pre-PR functional
correctness reviewer
([#733](#733))
([9cf63b7](9cf63b7))
* **build:** add Python extensions and uv 0.10.8 to devcontainer
([#920](#920))
([9ca0579](9ca0579))
* **build:** add uv ecosystem to Dependabot configuration
([#913](#913))
([2a4bd39](2a4bd39))
* **build:** enable npm pinning enforcement in dependency scan
([#838](#838))
([4e9e31f](4e9e31f))
* **build:** migrate attestation actions to v4.1.0 and add SBOM
verification docs
([#841](#841))
([ca1e65b](ca1e65b))
* **collections:** add four new validator checks (orphan, duplicate,
companion, coverage)
([#869](#869))
([1a96b73](1a96b73))
* **devcontainer,security:** add enterprise artifact hub configuration
([#1032](#1032))
([1d56d25](1d56d25))
* **docs:** add Rust coding standards and guidelines
([#809](#809))
([d4c4899](d4c4899))
* **extension:** add Microsoft logo icon to VS Code Marketplace listings
([#906](#906))
([82aca41](82aca41))
* **github:** add declarative label management
([#953](#953))
([a1a6845](a1a6845))
* **instructions:** add ADO backlog shared infrastructure
([#786](#786))
([1914078](1914078))
* **instructions:** add ADO backlog sprint planning and capacity
tracking ([#788](#788))
([d6fb77d](d6fb77d))
* **instructions:** add ADO triage workflow and prompt
([#787](#787))
([cde0190](cde0190))
* **instructions:** add shared story quality conventions and sprint
planning ([#803](#803))
([a2f18e3](a2f18e3))
* **prompts:** add ADO discovery and work item prompts with agent
routing ([#790](#790))
([7e74523](7e74523))
* **prompts:** add security review prompts
([#1118](#1118))
([ad30967](ad30967))
* **scripts:** add dynamic Python skill discovery for lint/test
([#957](#957))
([0a90f57](0a90f57))
* **scripts:** add Get-StandardTimestamp utility to CIHelpers module
([#1126](#1126))
([b273a4b](b273a4b))
* **scripts:** add Python copyright header validation
([#905](#905))
([67df902](67df902))
* **scripts:** add Python skill support to Validate-SkillStructure
([#903](#903))
([68479d9](68479d9))
* **scripts:** add workflow npm command scanning to dependency pinning
([#837](#837))
([6b5ae06](6b5ae06))
* **security:** add basic security reviewer agent with owasp skills
([#1008](#1008))
([cb1fd05](cb1fd05))
* **security:** add sigstore attestation bundles and fix
component-detection action
([#1148](#1148))
([f79c272](f79c272))
* **skills:** add Atheris fuzz harness with CI workflow integration
([#1102](#1102))
([d337e1d](d337e1d))
* **skills:** add PowerPoint automation skill with YAML-driven deck
generation ([#868](#868))
([00465cd](00465cd))
* **skills:** convert hve-core-installer agent to self-contained skill
([#846](#846))
([1d821fb](1d821fb))
* **skills:** enhance pr-reference skill with flexible filtering and
base branch detection
([#1095](#1095))
([26a32ea](26a32ea))
* **workflows:** add devcontainer infrastructure change log workflow
([#899](#899))
([8aca446](8aca446))
* **workflows:** add milestone auto-close on stable and pre-release
publishes ([#834](#834))
([79362b1](79362b1))
* **workflows:** add ms.date documentation freshness checking
([#969](#969))
([3ed441c](3ed441c))
* **workflows:** add Python linting CI workflow with Ruff
([#951](#951))
([f89f0eb](f89f0eb))
* **workflows:** add Python testing CI workflow with pytest and Codecov
([#934](#934))
([5e8306f](5e8306f))
* **workflows:** add uv and Python package sync to copilot-setup-steps
([#921](#921))
([45d517d](45d517d))


### 🐛 Bug Fixes

* **build:** override Linguist vendored flag for Python skill files
([#1155](#1155))
([0eee5b6](0eee5b6))
* **build:** override serialize-javascript to >=7.0.3 for RCE fix
([#876](#876))
([e49039a](e49039a))
* **build:** resolve Pinned-Dependencies alerts for vsce npm commands in
extension workflows
([#782](#782))
([89dad9d](89dad9d))
* **build:** update undici and yauzl overrides for security audit
([#1030](#1030))
([2c2f92f](2c2f92f))
* **docs:** add CLI Plugins to install.md navigation surfaces
([#902](#902))
([79d6595](79d6595))
* **docs:** add sidebar ordering for Design Thinking documentation
([#832](#832))
([551fddc](551fddc)),
closes [#830](#830)
* **docs:** graduate design-thinking to preview and correct stale
collection references
([#831](#831))
([5110e35](5110e35))
* **docs:** include project-planning in UX Designer install guidance
([#908](#908))
([e7aa9bc](e7aa9bc))
* **docs:** remediate writing-style convention violations
([#865](#865))
([68b04bc](68b04bc))
* **docs:** remove draft content announcement banner
([#825](#825))
([b45de80](b45de80))
* **docs:** remove unbounded path-to-regexp override breaking SSG
([#1153](#1153))
([d810018](d810018))
* **docs:** use actual clone paths instead of folder display names in
multi-root workspace settings
([#984](#984))
([5dbab82](5dbab82))
* **instructions:** replace black with ruff in uv-projects
([#898](#898))
([b0c06d9](b0c06d9))
* **scripts:** cover .github/ skill files in copyright header validation
([#1055](#1055))
([#1098](#1098))
([27fbd33](27fbd33))
* **scripts:** eliminate phantom git changes from plugin generation
([#1035](#1035))
([e49a1b5](e49a1b5))
* **scripts:** enable JSON log output for lint:version-consistency
([#1033](#1033))
([52b0885](52b0885))
* **security:** calculate compliance score from total scanned
dependencies ([#930](#930))
([c112c3d](c112c3d))
* **skills:** add AST validation and namespace restriction for
content-extra.py
([#1027](#1027))
([c50c7a3](c50c7a3))
* **skills:** add depth limits to recursive PowerPoint processing
functions ([#1028](#1028))
([bf08994](bf08994))
* **skills:** harden XML parsing and blob writes in powerpoint extract
([#1053](#1053))
([89d24b1](89d24b1))
* **skills:** resolve ruff lint and format violations in powerpoint
skill ([#1048](#1048))
([17bbe7a](17bbe7a))
* **workflows:** add uv.lock dependencies submission have fork-skip
condition ([#1109](#1109))
([dec56ac](dec56ac))
* **workflows:** automate weekly SHA staleness check with issue creation
([#975](#975))
([1ea4caa](1ea4caa))
* **workflows:** close Codecov integration gaps for Pester and pytest
flags ([#1106](#1106))
([cca29b7](cca29b7))
* **workflows:** propagate uv sync errors in copilot-setup-steps
([#961](#961))
([df88d7c](df88d7c))
* **workflows:** resolve release-please skip cascade and Python project
discovery ([#1043](#1043))
([79993e2](79993e2))
* **workflows:** scan only commit subjects for breaking change detection
([#1157](#1157))
([a38a657](a38a657))


### 📚 Documentation

* clarify HVE Core Extension vs Installer messaging across documentation
([#965](#965))
([0fceb8f](0fceb8f))
* **docs:** add ADO integration user documentation
([#935](#935))
([ec89302](ec89302))
* **docs:** add Project Planning agent documentation
([#936](#936))
([3a3a0fd](3a3a0fd))
* **onboarding:** overhaul marketplace onboarding and documentation site
([#982](#982))
([4309e10](4309e10))


### ♻️ Refactoring

* **build:** merge code-review collection into coding-standards
([#863](#863))
([8027e7b](8027e7b))
* **workflows:** rename release pipeline workflows and add marketplace
automation triggers
([#829](#829))
([b6397f4](b6397f4))


### 🔧 Maintenance

* **build:** add clean:logs npm script
([#1122](#1122))
([f85fe02](f85fe02)),
closes [#988](#988)
* **build:** add JSON reporter for cspell
([#1123](#1123))
([6d59f67](6d59f67))
* **ci:** add multi-arch support to copilot-setup-steps binary downloads
([#955](#955))
([8d0c706](8d0c706))
* **deps-dev:** bump cspell from 9.6.4 to 9.7.0 in the npm-dependencies
group ([#839](#839))
([3fa16ff](3fa16ff))
* **deps:** bump actions/dependency-review-action from 4.8.3 to 4.9.0 in
the github-actions group across 1 directory
([#942](#942))
([1a9b858](1a9b858))
* **deps:** bump cairosvg from 2.8.2 to 2.9.0 in
/.github/skills/experimental/powerpoint
([#1025](#1025))
([f4deda7](f4deda7))
* **deps:** bump dompurify from 3.3.1 to 3.3.2 in /docs/docusaurus
([#924](#924))
([d2060d6](d2060d6))
* **deps:** bump svgo from 3.3.2 to 3.3.3 in /docs/docusaurus
([#880](#880))
([6dc2406](6dc2406))
* **deps:** bump the github-actions group across 1 directory with 4
updates ([#1100](#1100))
([2290dc0](2290dc0))
* **deps:** bump the github-actions group with 6 updates
([#840](#840))
([f57bc01](f57bc01))
* **docs:** correct New-MsDateReport table rendering and refresh stale
docs ([#1114](#1114))
([c2b806f](c2b806f))
* **settings:** remove orphaned Checkov config and stale gitignore
entries ([#870](#870))
([98fcd74](98fcd74))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: hve-core-release-please[bot] <254602402+hve-core-release-please[bot]@users.noreply.github.com>
Co-authored-by: Bill Berry <wberry@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(workflows): Add Python testing CI workflow with pytest and Codecov integration

5 participants