Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
c3b65a5
move azure plugin files
JasonYeMSFT Jul 14, 2026
af20fbe
move azure eval files
JasonYeMSFT Jul 14, 2026
7a19fc4
2nd plugin for testing
JasonYeMSFT Jul 14, 2026
34e9e22
extend skill object in test code to carry plugin info
JasonYeMSFT Jul 14, 2026
480fd78
commit plan
JasonYeMSFT Jul 14, 2026
7b2789c
preserve changelog after moving plugin file during build
JasonYeMSFT Jul 14, 2026
83463bf
feature: cat emoji
JasonYeMSFT Jul 14, 2026
8f7fe1d
Keep azure-skills directory name
JasonYeMSFT Jul 14, 2026
aa88a7a
update plan
JasonYeMSFT Jul 15, 2026
5849f9b
plugin output dirname override
JasonYeMSFT Jul 15, 2026
6848325
fix plugin selection in agent-runner
JasonYeMSFT Jul 15, 2026
5d66b34
fix eval.yml
JasonYeMSFT Jul 15, 2026
2913ab2
fix pr-plugin-version-check.yml
JasonYeMSFT Jul 15, 2026
80abf31
fix test-all-skills.yml
JasonYeMSFT Jul 15, 2026
fdf0032
test scripts and notes
JasonYeMSFT Jul 15, 2026
f1cc4d0
llm generated script todo
JasonYeMSFT Jul 15, 2026
2ed4751
fix check-plugin-version-pr script
JasonYeMSFT Jul 15, 2026
37bf8a6
remove dead update-plugin-version script
JasonYeMSFT Jul 15, 2026
3c5ec5b
fix copilot cli char budget check script
JasonYeMSFT Jul 16, 2026
27bbc7a
use plugin dirname in code
JasonYeMSFT Jul 16, 2026
abb749f
fix references check script
JasonYeMSFT Jul 16, 2026
a4adb8c
fix tokens script
JasonYeMSFT Jul 16, 2026
4bc70f4
fix frontmatter script
JasonYeMSFT Jul 16, 2026
ecbdf91
move new foundry files
JasonYeMSFT Jul 16, 2026
b6da523
give frontmatter cli a default check all option
JasonYeMSFT Jul 16, 2026
1da9489
fix lint
JasonYeMSFT Jul 16, 2026
b4b1d71
Remove invalid param in .vally.yaml
JasonYeMSFT Jul 16, 2026
34cf0e5
clean up unused script
JasonYeMSFT Jul 16, 2026
c8ae35e
rename eval dirname
JasonYeMSFT Jul 17, 2026
feae772
rewrite integration test workflow using github-script
JasonYeMSFT Jul 17, 2026
508712f
fix scripts in integration test workflow
JasonYeMSFT Jul 17, 2026
346fdb4
update codeowners
JasonYeMSFT Jul 17, 2026
f8a2a22
temp test pr.yml
JasonYeMSFT Jul 17, 2026
f49c0b6
build output for token analysis
JasonYeMSFT Jul 17, 2026
79afef7
remove stale azure-rbac file
JasonYeMSFT Jul 17, 2026
7ac66a2
add missing semicolon
JasonYeMSFT Jul 17, 2026
030c039
Remove temporary changes
JasonYeMSFT Jul 17, 2026
f467332
update legacy changelog
JasonYeMSFT Jul 17, 2026
cb19677
delete plan.md
JasonYeMSFT Jul 17, 2026
999b3f7
clarify responsibility of maintaining legacy changelog
JasonYeMSFT Jul 17, 2026
9c37872
add back dropped version.json
JasonYeMSFT Jul 17, 2026
d71fbdd
Merge branch 'main' into chuye/multi-plugin-folder-structure
JasonYeMSFT Jul 20, 2026
82c969e
Merge branch 'main' into chuye/multi-plugin-folder-structure
JasonYeMSFT Jul 22, 2026
cfff68c
move azure-compute files
JasonYeMSFT Jul 22, 2026
4e21e14
fix unresolved string
JasonYeMSFT Jul 22, 2026
8a019c5
update legacy changelog
JasonYeMSFT Jul 22, 2026
bd38c97
fix build script
JasonYeMSFT Jul 22, 2026
047aaa9
fix build script
JasonYeMSFT Jul 22, 2026
c17e1eb
move misplaced files
JasonYeMSFT Jul 22, 2026
2b88c72
Merge branch 'main' into chuye/multi-plugin-folder-structure
JasonYeMSFT Jul 23, 2026
2810c45
remove cat plugin
JasonYeMSFT Jul 23, 2026
0f5d1ab
move azure-validate test fixture
JasonYeMSFT Jul 23, 2026
725c450
remove unneeded npm scripts
JasonYeMSFT Jul 23, 2026
8d3c535
Merge branch 'main' into chuye/multi-plugin-folder-structure
JasonYeMSFT Jul 24, 2026
6212471
Merge branch 'main' into chuye/multi-plugin-folder-structure
JasonYeMSFT Jul 24, 2026
7d90580
remove stale file
JasonYeMSFT Jul 24, 2026
74d58ee
sync legacy changelog
JasonYeMSFT Jul 24, 2026
360286c
add trailing new line
JasonYeMSFT Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
39 changes: 38 additions & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# Workflow files — explicit protection (changes require team review)
/.github/workflows/ @microsoft/github-copilot-for-azure-writers

# Plugin skills owners
# Plugin skills owners (kept for reference)
/plugin/skills/ @tmeschter @RickWinter
/plugin/skills/airunway-aks-setup/ @tmeschter @RickWinter
/plugin/skills/appinsights-instrumentation/ @JasonYeMSFT @RickWinter
Expand Down Expand Up @@ -43,3 +43,40 @@
/plugin/skills/microsoft-foundry/foundry-agent/routine/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugin/skills/microsoft-foundry/foundry-agent/invocations-ws/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugin/skills/python-appservice-deploy/ @glaming1 @tmeschter @RickWinter

# Plugin skills owners (multi-plugin)
/plugins/azure-skills/skills/ @tmeschter @RickWinter
/plugins/azure-skills/skills/airunway-aks-setup/ @tmeschter @RickWinter
/plugins/azure-skills/skills/appinsights-instrumentation/ @JasonYeMSFT @RickWinter
/plugins/azure-skills/skills/azure-ai/ @JasonYeMSFT @RickWinter
/plugins/azure-skills/skills/azure-aigateway/ @azaslonov @RickWinter
/plugins/azure-skills/skills/azure-cloud-migrate/ @saikoumudi @MadhuraBharadwaj-MSFT @RickWinter
/plugins/azure-skills/skills/azure-compliance/ @saikoumudi @RickWinter
/plugins/azure-skills/skills/azure-compute/ @alex-thompson @rakal-dyh @joybb @rmmue21 @RickWinter
/plugins/azure-skills/skills/azure-cost/ @saikoumudi @RickWinter
/plugins/azure-skills/skills/azure-deploy/ @microsoft/github-copilot-for-azure-writers @paulyuk
/plugins/azure-skills/skills/azure-diagnostics/ @tmeschter @saikoumudi @RickWinter
/plugins/azure-skills/skills/azure-enterprise-infra-planner/ @Jbrocket @micha31r @arunrab @RickWinter
/plugins/azure-skills/skills/azure-kubernetes/ @saikoumudi @chandraneel @gambtho @RickWinter
/plugins/azure-skills/skills/azure-kusto/ @saikoumudi @RickWinter
/plugins/azure-skills/skills/azure-messaging/ @kashifkhan @RickWinter
/plugins/azure-skills/skills/azure-prepare/ @microsoft/github-copilot-for-azure-writers
/plugins/azure-skills/skills/azure-quotas/ @rakal-dyh @RickWinter
/plugins/azure-skills/skills/azure-reliability/ @MadhuraBharadwaj-MSFT @saikoumudi @RickWinter
/plugins/azure-skills/skills/azure-resource-lookup/ @JasonYeMSFT @RickWinter
/plugins/azure-skills/skills/azure-resource-visualizer/ @tmeschter @RickWinter
/plugins/azure-skills/skills/azure-storage/ @JasonYeMSFT @RickWinter
/plugins/azure-skills/skills/azure-upgrade/ @MadhuraBharadwaj-MSFT @saikoumudi @RickWinter
/plugins/azure-skills/skills/azure-validate/ @microsoft/github-copilot-for-azure-writers
/plugins/azure-skills/skills/entra-agent-id/ @ArLucaID @RickWinter
/plugins/azure-skills/skills/entra-app-registration/ @JasonYeMSFT @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/ @ankitbko @tendau @XOEEst @anchenyi @XiaofuHuang @jugonzales @vebudumu @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/cicd/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/deploy/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/troubleshoot/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invocations-ws/ @anchenyi @XiaofuHuang @swatDong @RickWinter
/plugins/azure-skills/skills/python-appservice-deploy/ @glaming1 @tmeschter @RickWinter
28 changes: 18 additions & 10 deletions .github/skills/vally-eval/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,31 @@ Vally eval suites are written as yaml documents. All eval suites share eval spec

Refer to the official documentation on the schema of the spec and the schema of the eval suites [writing-eval-specs](https://microsoft.github.io/vally/guides/writing-eval-specs/).

Vally eval suites for azure-skills plugin have the following file layout. The shared eval spec is located at `<repo-root>/.vally.yaml`. The eval suites are categorized by skills. The eval suites for each skill are located at `<repo-root>/evals/<skill-name>/*.yaml`, e.g. `<repo-root>/evals/azure-ai/eval.yaml`.
Vally eval suites for azure-skills plugin have the following file layout. The shared eval spec is located at `<repo-root>/.vally.yaml`. The eval suites are categorized by plugin and skills. The eval suites for each skill are located at `<repo-root>/evals/<plugin-dirname>/<skill-name>/*.yaml`, e.g. `<repo-root>/evals/azure-skills/azure-ai/eval.yaml`.

Use meaningful file names to categorize tests. If a skill needs fixture files for its eval suites, it should organize such fixture files in a `fixture` directory under its directory, e.g. `<repo-root>/evals/azure-ai/fixture/`. The [vally test runner](/tests/run-vally-test.ts) and [stimulus validation script](/scripts/src/vally/validate-stimulus.ts) will load all `*.yaml` files except for those under a `fixture/` directory. Make sure to put all fixture files under the `fixture/` directory.
Use meaningful file names to categorize tests. If a skill needs fixture files for its eval suites, it should organize such fixture files in a `fixture` directory under its directory, e.g. `<repo-root>/evals/azure-skills/azure-ai/fixture/`. The [vally test runner](/tests/run-vally-test.ts) and [stimulus validation script](/scripts/src/vally/validate-stimulus.ts) will load all `*.yaml` files except for those under a `fixture/` directory. Make sure to put all fixture files under the `fixture/` directory.

## Migrate integration tests

azure-skills plugin have implemented JavaScript integration test using Jest as the underlying test runner. All such integration tests are under `tests/**/integration.test.ts` files.

To migrate integration test for a skill to vally suites, create its eval suite spec at `<repo-root>/evals/<skill-name>/eval.yaml`, add a suite that runs the same prompt and uses vally's built-in graders to grade the trajectory of the agent run. If the integration test grades the agent run in a way that vally's built-in graders don't support, refer to the official documentation on how to create a custom grader [writing-custom-grader](https://microsoft.github.io/vally/guides/writing-custom-graders/).
To migrate integration test for a skill to vally suites, create its eval suite spec at `<repo-root>/evals/<plugin-dirname>/<skill-name>/eval.yaml`, add a suite that runs the same prompt and uses vally's built-in graders to grade the trajectory of the agent run. If the integration test grades the agent run in a way that vally's built-in graders don't support, refer to the official documentation on how to create a custom grader [writing-custom-grader](https://microsoft.github.io/vally/guides/writing-custom-graders/).

## Why is there a custom executor

The legacy Jest based integration test framework implemented features that vally doesn't support yet, such as early termination, follow up, system prompt modification, screenshot taking, etc. Besides, the azure-skills plugin runs automated integration tests, collects its exported data and feeds the data to a dashboard web app under `<repo-root>/dashboard/` to monitor skill integration test results.
The legacy Jest based integration test framework implemented features that vally doesn't support yet, such as early termination, follow up, system prompt modification, screenshot taking, etc. Besides, [test-all-integration](/.github/workflows/test-all-integration.yml) runs automated integration tests, collects its exported data and feeds the data to a dashboard web app under `<repo-root>/dashboard/` to monitor skill integration test results.

If you intend to have your vally suites use any of the extended features or have their results be consumed by the dashboard, you **MUST** use the custom executor in your vally suites.

### Use tags to control the custom executor

The custom executor in azure-skills plugin uses special tag values to control the behavior of the custom executor. See [tag-helpers.ts](../../../tests/vally/tag-helpers.ts) to learn what special tags are supported.
The custom executor uses special tag values to control the behavior of the custom executor. See [tag-helpers.ts](../../../tests/vally/tag-helpers.ts) to learn what special tags are supported.

> Note: If an eval suite specifies an earlyTerminate condition, the suite MUST NOT use the `completed` grader because early terminated runs will always fail the `completed` grader by design.

## Validate vally eval suites

Vally eval suites for azure-skills plugin follow certain conventions. For example, all eval suites must have a `type`, `tier`, `cost` and `area` tag so they can be run for a corresponding target group. To ensure all eval suites follow the conventions, a script is added to validate the eval suites and report errors when it sees any violation. To run the script, execute this command from the `scripts/` directory.
Vally eval suites in this repo follow certain conventions. For example, all eval suites must have a `type`, `tier`, `cost` and `area` tag so they can be run for a corresponding target group. To ensure all eval suites follow the conventions, a script is added to validate the eval suites and report errors when it sees any violation. To run the script, execute this command from the `scripts/` directory.

```bash
# cwd as <repo-root>/scripts/
Expand All @@ -56,10 +56,10 @@ Use vally-cli to run vally eval suites. In most cases, you would like to use a c

```bash
# In tests/
npm run test:vally -- --skill $SKILL
npm run test:vally -- --plugin $PLUGIN_DIR --skill $SKILL
```

`--eval-spec ../evals/<skill-name>/eval.yaml` tells vally which eval spec to run. The path is relative to the current working directory of the process running the command. `--output-dir ./results` tells vally to write its output to a `results/` directory relative to the current working directory of the process running the command. `--executor-plugin ../../tests/vally/vally-executor.ts` tells vally to load and execute the code in this module, which registers the custom executor used by azure-skill vally eval suites. Note that this path is relative to the parent directory of the eval spec to run. For example, if the eval spec to run is `<repo-root>/evals/azure-ai/eval.yaml`, resolving this relative path ends at `<repo-root>/tests/vally/vally-executor.ts`.
See [vally test runner](/tests/run-vally-test.ts) on how it composes the vally commands under the hood.

## Run vally eval suites in CI

Expand All @@ -75,12 +75,20 @@ Test authors commonly need to fine-tune grader configurations to reduce result f

```bash
# in tests/
npx @microsoft/vally-cli grade --eval-spec ../evals/<skill-name>/eval.yaml --verbose < results/<test-run-name>/results.jsonl
npx @microsoft/vally-cli grade --eval-spec ../evals/<plugin-dirname>/<skill-name>/eval.yaml --verbose < results/<test-run-name>/results.jsonl
```

You can keep tuning the grader config in `eval.yaml` and re-grade the trajectory until the results meet your expectations.

If your skill uses a custom grader, add `--grader-plugin ./tests/vally/vally-graders.ts` to load the custom graders.
If your skill uses a custom grader, add `--grader-plugin` to load the custom graders.

```bash
# in tests/
npx @microsoft/vally-cli grade --eval-spec ../evals/<plugin-dirname>/<skill-name>/eval.yaml --grader-plugin
../../../tests/vally/vally-graders.ts --verbose < results/<test-run-name>/results.jsonl
```

Note that the grader plugin's path is relative to the parent directory of the eval spec to run. For example, if the eval spec to run is `<repo-root>/evals/azure-skills/azure-ai/eval.yaml`, resolving this relative path ends at `<repo-root>/tests/vally/vally-executor.ts`.

### Collect test results

Expand Down
6 changes: 2 additions & 4 deletions .github/skills/vally-eval/references/ci-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Follow these steps to add a skill's Vally suites to the CI test workflow so they

## Prerequisites

- The skill's Vally suites are implemented under `evals/<skill-name>/eval.yaml` (or split across multiple YAML files).
- The skill's Vally suites are implemented under `evals/<plugin-dirname>/<skill-name>/eval.yaml` (or split across multiple YAML files).
Comment thread
JasonYeMSFT marked this conversation as resolved.
- The Vally suites use the `integration-test-agent-runner` custom executor.
- The test results can be made public.

Expand All @@ -14,9 +14,7 @@ The scheduled CI test workflow determines which skills to test by reading `tests

### Use shared job template

Most skills use a shared job template to run eval suites. This template is defined as the `test` job in `.github/workflows/test-all-integration.yml`.

If you use the shared job template, add the skill in the workflow’s `VALLY_SKILLS` list. Otherwise the job will run Jest-based integration tests instead of `npm run test:vally`. The CI workflow creates one job per skill from this template and runs all eval suites with `npm run test:vally`.
Most skills use a shared job template to run eval suites. This template is defined as the `test` job in `.github/workflows/test-all-integration.yml`. The CI workflow creates one job per skill from this template and runs all eval suites with `npm run test:vally`.

Reuse this template whenever possible. It provisions a test environment, installs common tools (for example, Azure CLI and Azure Developer CLI), connects to a test Azure subscription, and includes utility steps that collect and publish test results to a well-known storage location for downstream processing.

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/eval.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
pull_request:
paths:
- "evals/**"
- "plugin/skills/**"
- "plugins/*/skills/**"
- ".vally.yaml"
workflow_dispatch:
inputs:
Expand Down Expand Up @@ -55,7 +55,7 @@ jobs:
npm run vally validate-stimulus

- name: Lint skill and eval specs
run: npx --yes @microsoft/vally-cli@^0.7.0 lint plugin/skills/ --eval-spec evals/ --strict --grader-plugin ./tests/vally/vally-graders.ts
run: npx --yes @microsoft/vally-cli@^0.7.0 lint plugins/ --eval-spec evals/ --strict --grader-plugin ./tests/vally/vally-graders.ts

- name: Determine suite
if: github.event_name != 'pull_request'
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/pr-plugin-version-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ on:
pull_request:
branches: [main]
paths:
- "plugin/.plugin/plugin.json"
- "plugin/.claude-plugin/plugin.json"
- "plugin/.cursor-plugin/plugin.json"
- "plugins/*/.plugin/plugin.json"
- "plugins/*/.claude-plugin/plugin.json"
- "plugins/*/.cursor-plugin/plugin.json"

permissions:
contents: read
Expand Down
Loading
Loading