diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c20feeb60..319b83bb5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -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 @@ -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 diff --git a/.github/skills/vally-eval/SKILL.md b/.github/skills/vally-eval/SKILL.md index ac4bf2254..5b56ba3f7 100644 --- a/.github/skills/vally-eval/SKILL.md +++ b/.github/skills/vally-eval/SKILL.md @@ -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 `/.vally.yaml`. The eval suites are categorized by skills. The eval suites for each skill are located at `/evals//*.yaml`, e.g. `/evals/azure-ai/eval.yaml`. +Vally eval suites for azure-skills plugin have the following file layout. The shared eval spec is located at `/.vally.yaml`. The eval suites are categorized by plugin and skills. The eval suites for each skill are located at `/evals///*.yaml`, e.g. `/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. `/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. `/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 `/evals//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 `/evals///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 `/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 `/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 /scripts/ @@ -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//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 `/evals/azure-ai/eval.yaml`, resolving this relative path ends at `/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 @@ -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//eval.yaml --verbose < results//results.jsonl +npx @microsoft/vally-cli grade --eval-spec ../evals///eval.yaml --verbose < results//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///eval.yaml --grader-plugin +../../../tests/vally/vally-graders.ts --verbose < results//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 `/evals/azure-skills/azure-ai/eval.yaml`, resolving this relative path ends at `/tests/vally/vally-executor.ts`. ### Collect test results diff --git a/.github/skills/vally-eval/references/ci-test.md b/.github/skills/vally-eval/references/ci-test.md index 2dd45b2b7..854bef405 100644 --- a/.github/skills/vally-eval/references/ci-test.md +++ b/.github/skills/vally-eval/references/ci-test.md @@ -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//eval.yaml` (or split across multiple YAML files). +- The skill's Vally suites are implemented under `evals///eval.yaml` (or split across multiple YAML files). - The Vally suites use the `integration-test-agent-runner` custom executor. - The test results can be made public. @@ -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. diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml index 1bd3ba0cf..5f4765fd0 100644 --- a/.github/workflows/eval.yml +++ b/.github/workflows/eval.yml @@ -4,7 +4,7 @@ on: pull_request: paths: - "evals/**" - - "plugin/skills/**" + - "plugins/*/skills/**" - ".vally.yaml" workflow_dispatch: inputs: @@ -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' diff --git a/.github/workflows/pr-plugin-version-check.yml b/.github/workflows/pr-plugin-version-check.yml index a6e325272..d99407ab0 100644 --- a/.github/workflows/pr-plugin-version-check.yml +++ b/.github/workflows/pr-plugin-version-check.yml @@ -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 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index faafa5629..685e7a5d4 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -116,6 +116,9 @@ jobs: working-directory: ./scripts run: npm ci --ignore-scripts + - name: Build output + run: npm ci --ignore-scripts && npm run build + - name: Check Copilot CLI skill char budget working-directory: ./scripts run: npm run checkCopilotCliCharBudget @@ -212,7 +215,7 @@ jobs: uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v47.0.5 with: files: | - plugin/skills/*/SKILL.md + plugins/*/skills/*/SKILL.md .github/skills/*/SKILL.md - name: Check all changed plugin skill files @@ -220,7 +223,7 @@ jobs: uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v47.0.5 with: files: | - plugin/skills/** + plugins/*/skills/** .github/skills/** - name: Setup Node.js @@ -256,12 +259,12 @@ jobs: echo "## Skill Validation" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - # Map changed plugin/skills paths to built output/skills paths so we + # Map changed plugins//skills paths to built output//skills paths so we # validate the version-stamped copies. .github/skills are unchanged. SKILL_FILES="" for file in $CHANGED_FILES; do - if echo "$file" | grep -q '^plugin/skills/'; then - mapped=$(echo "$file" | sed 's|^plugin/skills/|output/skills/|') + if echo "$file" | grep -Eq '^plugins/[^/]+/skills/'; then + mapped=$(echo "$file" | sed -E 's|^plugins/([^/]+)/skills/|output/\1/skills/|') SKILL_FILES="$SKILL_FILES ../$mapped" else SKILL_FILES="$SKILL_FILES ../$file" @@ -290,15 +293,33 @@ jobs: const fs = require('fs'); const path = require('path'); - // Get all skill directories from the built output - const skillsDir = 'output/skills'; - const skillDirs = fs.readdirSync(skillsDir) - .filter(f => fs.statSync(path.join(skillsDir, f)).isDirectory()) - .sort(); + // Get all skill directories from output//skills/ + const outputDir = "output"; + const pluginDirs = fs.readdirSync(outputDir) + .filter(f => fs.statSync(path.join(outputDir, f)).isDirectory()); + + const pluginSkillDirPathsMap = pluginDirs.reduce((acc, pluginDir) => { + const pluginSkillsDir = path.join(outputDir, pluginDir, "skills"); + if (!fs.existsSync(pluginSkillsDir) || !fs.statSync(pluginSkillsDir).isDirectory()) { + acc[pluginDir] = []; + return acc; + } + + acc[pluginDir] = fs.readdirSync(pluginSkillsDir) + .filter(f => fs.statSync(path.join(pluginSkillsDir, f)).isDirectory()) + .map(skillDir => path.join(pluginSkillsDir, skillDir)); + return acc; + }, {}); + + const skillDirs = Object.values(pluginSkillDirPathsMap) + .flat() + .map(skillPath => path.basename(skillPath)) + .sort(); // Read skills.json const skillsJson = JSON.parse(fs.readFileSync('tests/skills.json', 'utf8')); - const jsonSkills = [...skillsJson.skills].sort(); + const jsonPlugins = [...skillsJson.plugins].sort(); + const jsonSkills = jsonPlugins.map(p => p.skills).flat().sort(); let hasError = false; @@ -306,38 +327,40 @@ jobs: const skillDirsStr = JSON.stringify(skillDirs); const jsonSkillsStr = JSON.stringify(jsonSkills); if (skillDirsStr !== jsonSkillsStr) { - console.log(); - console.log("skills in skills.json doesn't match available skills in output/skills/"); - hasError = true; + console.log(); + console.log("skills in skills.json doesn't match available skills in output//skills/"); + hasError = true; } // 2. Integration test schedule coverages all skills // Only consider the active cron schedules from .github/workflows/integration-tests.yml const activeCronSchedules = [ - '0 5 * * 2-6', - '0 8 * * 2-6', - '0 12 * * 2-6', + '0 5 * * 2-6', + '0 8 * * 2-6', + '0 12 * * 2-6', ]; let scheduledSkills = []; - activeCronSchedules.forEach(cron => { - const value = skillsJson.integrationTestSchedule[cron]; + jsonPlugins.forEach(p => { + activeCronSchedules.forEach(cron => { + const value = p.integrationTestSchedule[cron]; if (value) { - value.split(',').forEach(s => scheduledSkills.push(s)); + value.split(',').forEach(s => scheduledSkills.push(s)); } + }); }); scheduledSkills = scheduledSkills.sort(); const scheduledSkillsStr = JSON.stringify(scheduledSkills); if (skillDirsStr !== scheduledSkillsStr) { - console.log("skillDirs", JSON.stringify(skillDirs)); - console.log("scheduledSkills", JSON.stringify(scheduledSkills)); - console.log("integrationTestSchedule in skills.json doesn't match available skills in output/skills/"); - hasError = true; + console.log("skillDirs", JSON.stringify(skillDirs)); + console.log("scheduledSkills", JSON.stringify(scheduledSkills)); + console.log("integrationTestSchedule in skills.json doesn't match available skills in output//skills/"); + hasError = true; } if (hasError) { - core.setFailed('tests/skills.json validation failed'); + core.setFailed('tests/skills.json validation failed'); } - name: Skip message @@ -362,7 +385,7 @@ jobs: uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v47.0.5 with: files: | - plugin/skills/**/*.md + plugins/*/skills/**/*.md - name: Setup Node.js if: steps.changed-markdown.outputs.any_changed == 'true' @@ -393,13 +416,13 @@ jobs: VALIDATION_FAILED=0 # Validate built plugin skill output so version-stamped files are checked - echo "Validating references in ../output/skills" - if OUTPUT=$(npm run references -- --skills-dir ../output/skills 2>&1); then + echo "Validating references in ../output//skills" + if OUTPUT=$(npm run references 2>&1); then echo "$OUTPUT" - echo "✅ output/skills references are valid" >> $GITHUB_STEP_SUMMARY + echo "✅ output//skills references are valid" >> $GITHUB_STEP_SUMMARY else echo "$OUTPUT" - echo "❌ output/skills contains broken or escaped markdown references" >> $GITHUB_STEP_SUMMARY + echo "❌ output//skills contains broken or escaped markdown references" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY echo "$OUTPUT" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/publish-to-marketplace.yml b/.github/workflows/publish-to-marketplace.yml index bc2491197..469cc4234 100644 --- a/.github/workflows/publish-to-marketplace.yml +++ b/.github/workflows/publish-to-marketplace.yml @@ -59,17 +59,23 @@ jobs: # 4. Sync files from source to target (mirror: add new, update existing, remove stale) - name: Sync files run: | - SOURCE_DIR="source-repo/output/" - TARGET_DIR="target-repo/.github/plugins/azure-skills/" + SOURCE_ROOT="source-repo/output" + TARGET_ROOT="target-repo/.github/plugins" - # Ensure target directory exists - mkdir -p "$TARGET_DIR" + # Scan immediate child directories under source-repo/output and sync each child + # to target-repo/.github/plugins//. + find "$SOURCE_ROOT" -mindepth 1 -maxdepth 1 -type d | while IFS= read -r child_dir; do + child_name=$(basename "$child_dir") + target_dir="$TARGET_ROOT/$child_name/" - # Use rsync to mirror source into target: - # --archive preserve permissions, timestamps, etc. - # --delete remove files in target that are no longer in source - # --verbose list changes - rsync --archive --delete --verbose "$SOURCE_DIR" "$TARGET_DIR" + mkdir -p "$target_dir" + + # Use rsync to mirror each child directory into its corresponding target directory: + # --archive preserve permissions, timestamps, etc. + # --delete remove files in target that are no longer in source child dir + # --verbose list changes + rsync --archive --delete --verbose "$child_dir/" "$target_dir" + done # 5. Commit changes and create a PR - name: Commit and push changes @@ -155,30 +161,45 @@ jobs: # 4. Sync files from source to target (mirror: add new, update existing, remove stale) - name: Sync files run: | - SOURCE_DIR="source-repo/output/" - TARGET_DIR="target-repo/.github/plugins/azure-skills/" + SOURCE_ROOT="source-repo/output" + TARGET_ROOT="target-repo/.github/plugins" - # Ensure target directory exists - mkdir -p "$TARGET_DIR" + # Scan immediate child directories under source-repo/output and sync each child + # to target-repo/.github/plugins//. + find "$SOURCE_ROOT" -mindepth 1 -maxdepth 1 -type d | while IFS= read -r child_dir; do + child_name=$(basename "$child_dir") + target_dir="$TARGET_ROOT/$child_name/" - # Use rsync to mirror source into target: - # --archive preserve permissions, timestamps, etc. - # --delete remove files in target that are no longer in source - # --verbose list changes - rsync --archive --delete --verbose "$SOURCE_DIR" "$TARGET_DIR" + mkdir -p "$target_dir" - # 5. Copy plugin.json, .mcp.json, .claude-plugin/plugin.json, skills/, hooks/, and gemini-extension.json to the repo root - - name: Copy plugin files to repo root + # Use rsync to mirror each child directory into its corresponding target directory: + # --archive preserve permissions, timestamps, etc. + # --delete remove files in target that are no longer in source child dir + # --verbose list changes + rsync --archive --delete --verbose "$child_dir/" "$target_dir" + done + + # 5. Copy azure plugin to the repo root + # The way some agent client installs the azure plugin from 3rd party marketplace requires us to replicate it at the repo root. + # The azure plugin is added to the following 3rd party marketplaces. + # - claude-plugins-official: https://github.com/anthropics/claude-plugins-official/blob/main/.claude-plugin/marketplace.json#L429 + # - awesome-copilot: https://github.com/github/awesome-copilot/blob/30472ecf0fe34cc561df958c08501ecc5ca80ea4/.github/plugin/marketplace.json#L121 + # When Claude Code installs from claude-plugins-official, since the entry only configured the azure-skills repo in it, + # Claude Code will look for the .claude-plugin/plugin.json in the azure-skills repo to discover the plugin files. + # The relative paths for skills, mcpServers, and hooks are relative to the plugin root and in this case the plugin root is the repo root, + # which is different from the .github/plugins/azure-skills plugin root when installing it directly from the azure-skills marketplace. + # We workaround this difference by replicating the plugin files so the agent clients can still find them. + - name: Copy azure plugin files to repo root run: | - cp "source-repo/output/.plugin/plugin.json" "target-repo/plugin.json" - cp "source-repo/output/.mcp.json" "target-repo/.mcp.json" + cp "source-repo/output/azure-skills/.plugin/plugin.json" "target-repo/plugin.json" + cp "source-repo/output/azure-skills/.mcp.json" "target-repo/.mcp.json" mkdir -p "target-repo/.claude-plugin/" - cp "source-repo/output/.claude-plugin/plugin.json" "target-repo/.claude-plugin/plugin.json" + cp "source-repo/output/azure-skills/.claude-plugin/plugin.json" "target-repo/.claude-plugin/plugin.json" mkdir -p "target-repo/skills/" - rsync --archive --delete --verbose "source-repo/output/skills/" "target-repo/skills/" + rsync --archive --delete --verbose "source-repo/output/azure-skills/skills/" "target-repo/skills/" mkdir -p "target-repo/hooks/" - rsync --archive --delete --verbose "source-repo/output/hooks/" "target-repo/hooks/" - cp "source-repo/output/gemini-extension.json" "target-repo/gemini-extension.json" + rsync --archive --delete --verbose "source-repo/output/azure-skills/hooks/" "target-repo/hooks/" + cp "source-repo/output/azure-skills/gemini-extension.json" "target-repo/gemini-extension.json" # Clean up stale copilot-hooks.json from repo root (previously copied there, now lives under hooks/) rm -f "target-repo/copilot-hooks.json" @@ -191,7 +212,7 @@ jobs: TARGET_DIRS=("target-repo/.github/plugins/azure-skills/" "target-repo/skills/" "target-repo/hooks/" "target-repo/plugin.json" "target-repo/.mcp.json" "target-repo/.claude-plugin/plugin.json" "target-repo/gemini-extension.json") for target in "${TARGET_DIRS[@]}"; do if [ -e "$target" ]; then - if matches=$(grep -rli --include='*.md' --include='*.json' --exclude='CHANGELOG.md' 'https://github.com/microsoft/github-copilot-for-azure' "$target"); then + if matches=$(grep -rli --include='*.md' --include='*.json' --exclude='CHANGELOG.md' --exclude='changelog-*.md' 'https://github.com/microsoft/github-copilot-for-azure' "$target"); then echo "$matches" | while IFS= read -r file; do sed -i 's|https://github.com/microsoft/GitHub-Copilot-for-Azure|https://github.com/microsoft/azure-skills|g' "$file" sed -i 's|https://github.com/microsoft/github-copilot-for-azure|https://github.com/microsoft/azure-skills|g' "$file" @@ -232,4 +253,4 @@ jobs: --base "main" \ --head "$BRANCH_NAME" \ --title "Sync plugin files from GitHub-Copilot-for-Azure (run ${{ github.run_id }})" \ - --body "Automated sync of \`plugin/\` from [GitHub-Copilot-for-Azure](${{ github.server_url }}/${{ github.repository }}) at commit \`${{ github.sha }}\`." + --body "Automated sync of \`plugins/\` from [GitHub-Copilot-for-Azure](${{ github.server_url }}/${{ github.repository }}) at commit \`${{ github.sha }}\`." diff --git a/.github/workflows/sync-to-azure-mcp.yml b/.github/workflows/sync-to-azure-mcp.yml index 11d0b38ba..bb8b7d380 100644 --- a/.github/workflows/sync-to-azure-mcp.yml +++ b/.github/workflows/sync-to-azure-mcp.yml @@ -36,9 +36,22 @@ jobs: working-directory: source-repo/scripts run: npm ci --ignore-scripts - - name: Generate JSON files + - name: Generate allowlist JSON files working-directory: source-repo/scripts - run: npm run generateMcpAllowlists -- ../plugin/skills ${{ github.workspace }} + run: | + PLUGIN_PATHS=() + for plugin_dir in ../plugins/*; do + if [ -d "$plugin_dir" ]; then + PLUGIN_PATHS+=("$plugin_dir") + fi + done + + if [ "${#PLUGIN_PATHS[@]}" -eq 0 ]; then + echo "No plugin directories found under ../plugins" + exit 1 + fi + + npm run generateMcpAllowlists -- "${PLUGIN_PATHS[@]}" "${{ github.workspace }}" # 3. Generate a short-lived token from the GitHub App for microsoft/mcp - name: Generate token for microsoft/mcp diff --git a/.github/workflows/test-all-integration.yml b/.github/workflows/test-all-integration.yml index e05cd68e3..fffd125d4 100644 --- a/.github/workflows/test-all-integration.yml +++ b/.github/workflows/test-all-integration.yml @@ -22,7 +22,7 @@ on: workflow_dispatch: inputs: skills: - description: 'Comma separated list of skills to test (e.g. "appinsights-instrumentation,azure-ai")' + description: 'Comma separated list of skills to test (e.g. "azure-skills/appinsights-instrumentation,azure-skills/azure-ai"). Each string must be in the form of "/".' required: true type: string model-override: @@ -72,58 +72,63 @@ jobs: - name: Resolve inputs based on trigger type id: resolve + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7 env: - EVENT_NAME: ${{ github.event_name }} INPUT_SKILLS: ${{ inputs.skills }} INPUT_DEPLOY_TEST_PATTERN: ${{ inputs.deploy-test-pattern }} INPUT_DEBUG: ${{ inputs.debug }} EVENT_SCHEDULE: ${{ github.event.schedule }} - run: | - if [ "$EVENT_NAME" = "workflow_dispatch" ]; then - # Manual trigger - use provided inputs - echo "skills=$INPUT_SKILLS" >> "$GITHUB_OUTPUT" - echo "deploy-test-pattern=$INPUT_DEPLOY_TEST_PATTERN" >> "$GITHUB_OUTPUT" - echo "debug=$INPUT_DEBUG" >> "$GITHUB_OUTPUT" - else - cd tests - # Scheduled trigger - read from tests/skills.json - CRON="$EVENT_SCHEDULE" - echo "Schedule: $CRON" - - # Read skills from integrationTestSchedule in tests/skills.json - SKILLS=$(jq -r --arg cron "$CRON" '.integrationTestSchedule[$cron]' skills.json) - echo "Skills from schedule config: $SKILLS" - - # If skills is empty or null, exit - if [ -z "$SKILLS" ] || [ "$SKILLS" = "null" ]; then - echo "No skills specified for this schedule, using all skills from tests/skills.json" - exit 1 - fi - - echo "skills=$SKILLS" >> "$GITHUB_OUTPUT" - echo "Final skills list: $SKILLS" - - # Set deploy-test-pattern and debug based on the schedule slot - case "$CRON" in - "0 5 * * 2-6") - echo "debug=$SCHEDULED_DEBUG_21" >> "$GITHUB_OUTPUT" - ;; - "0 8 * * 2-6") - echo "debug=$SCHEDULED_DEBUG_00" >> "$GITHUB_OUTPUT" - ;; - "0 12 * * 2-6") - echo "debug=$SCHEDULED_DEBUG_04" >> "$GITHUB_OUTPUT" - ;; - *) - echo "Unknown schedule: $CRON" - exit 1 - ;; - esac - fi - - echo "Resolved inputs:" - echo "skills=$(grep '^skills=' "$GITHUB_OUTPUT" | tail -1)" - echo "debug=$(grep '^debug=' "$GITHUB_OUTPUT" | tail -1)" + SCHEDULED_DEBUG_21: ${{ env.SCHEDULED_DEBUG_21 }} + SCHEDULED_DEBUG_00: ${{ env.SCHEDULED_DEBUG_00 }} + SCHEDULED_DEBUG_04: ${{ env.SCHEDULED_DEBUG_04 }} + with: + script: | + const eventName = context.eventName; + + if (eventName === "workflow_dispatch") { + // Manual trigger - use provided inputs + core.setOutput("skills", process.env.INPUT_SKILLS); + core.setOutput("deploy-test-pattern", process.env.INPUT_DEPLOY_TEST_PATTERN); + core.setOutput("debug", process.env.INPUT_DEBUG); + } else { + // Scheduled trigger - read from tests/skills.json + const cron = process.env.EVENT_SCHEDULE; + core.info(`Schedule: ${cron}`); + + const fs = require("fs"); + const skillsJson = JSON.parse(fs.readFileSync("tests/skills.json", "utf8")); + + // Collect skills from all plugins for this cron schedule + const skillsList = skillsJson.plugins + .map(plugin => { + const entry = plugin.integrationTestSchedule?.[cron]; + return entry ? entry.split(",").map(s => `${plugin.dirname}/${s.trim()}`) : []; + }) + .flat(); + + if (skillsList.length === 0) { + core.setFailed(`No skills specified for schedule: ${cron}`); + return; + } + + const skills = skillsList.join(","); + core.info(`Skills from schedule config: ${skills}`); + core.setOutput("skills", skills); + + // Set debug flag based on the schedule slot + const debugMap = { + "0 5 * * 2-6": process.env.SCHEDULED_DEBUG_21, + "0 8 * * 2-6": process.env.SCHEDULED_DEBUG_00, + "0 12 * * 2-6": process.env.SCHEDULED_DEBUG_04, + }; + + if (!(cron in debugMap)) { + core.setFailed(`Unknown schedule: ${cron}`); + return; + } + + core.setOutput("debug", debugMap[cron]); + } setup: name: Build skill matrix @@ -135,28 +140,24 @@ jobs: steps: - name: Parse skills input into matrix id: set-matrix + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7 env: SKILLS_INPUT: ${{ needs.resolve-inputs.outputs.skills }} - run: | - # Convert comma separated list of skills to a JSON array - # Filter out azure-deploy (it runs via a separate reusable workflow) - SKILLS="$SKILLS_INPUT" + with: + script: | + // Convert comma separated list of skills to a JSON array + // Each item is in the form of "/" + // Filter out azure-deploy (it runs via a separate reusable workflow) + const skillsInput = process.env.SKILLS_INPUT || ""; + const skills = skillsInput.split(",").map(s => s.trim()); - # Check if azure-deploy is in the list - if echo "$SKILLS" | grep -q 'azure-deploy'; then - echo "has_azure_deploy=true" >> "$GITHUB_OUTPUT" - else - echo "has_azure_deploy=false" >> "$GITHUB_OUTPUT" - fi + // Check if azure-deploy is in the list + const hasAzureDeploy = skills.includes("azure-skills/azure-deploy"); + core.setOutput("has_azure_deploy", hasAzureDeploy.toString()); - # Build matrix excluding azure-deploy - JSON=$(echo "$SKILLS" | tr ',' '\n' | sed 's/^ *//;s/ *$//' | grep -v '^azure-deploy$' | jq -R . | jq -sc .) - # Handle empty array case - if [ "$JSON" = "[]" ]; then - echo "matrix=[]" >> "$GITHUB_OUTPUT" - else - echo "matrix=$JSON" >> "$GITHUB_OUTPUT" - fi + // Build matrix excluding azure-deploy + const matrix = skills.filter(s => s !== "azure-deploy"); + core.setOutput("matrix", JSON.stringify(matrix)); # Call the azure-deploy workflow when azure-deploy is in the skills list azure-deploy: @@ -177,7 +178,7 @@ jobs: runs-on: ubuntu-latest env: # Skills that should be tested using vally in a JSON array - VALLY_SKILLS: '["azure-ai","azure-aigateway","azure-compliance","azure-diagnostics","azure-kusto","azure-storage","entra-app-registration","azure-messaging","airunway-aks-setup","appinsights-instrumentation","azure-cost","azure-quotas","azure-kubernetes","azure-enterprise-infra-planner","azure-resource-lookup","azure-resource-visualizer","azure-reliability","entra-agent-id","python-appservice-deploy","azure-upgrade","azure-prepare","azure-compute","azure-validate"]' + JEST_SKILLS: '["azure-skills/azure-cloud-migrate","azure-skills/microsoft-foundry"]' AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }} AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }} @@ -273,7 +274,7 @@ jobs: # Skill authors should use the reports to identify issues and polish their skills/tests. - name: Run integration tests – ${{ matrix.skill }} - if: ${{ !contains(fromJson(env.VALLY_SKILLS), matrix.skill) }} + if: ${{ contains(fromJson(env.JEST_SKILLS), matrix.skill) }} env: DEBUG: ${{ needs.resolve-inputs.outputs.debug == 'true' && '1' || '' }} TEST_RUN_ID: all-integration @@ -281,27 +282,23 @@ jobs: SKILL_TEST_PATTERN: ${{ inputs.skill-test-pattern }} SKILL: ${{ matrix.skill }} run: | - echo test with $MODEL_OVERRIDE - - # Handle azure-ai vs azure-aigateway prefix collision - if [ "$SKILL" = "azure-ai" ]; then - npm run test:integration azure-ai/ "$SKILL_TEST_PATTERN" - else - npm run test:integration "$SKILL" "$SKILL_TEST_PATTERN" - fi + PLUGIN_DIR="${SKILL%%/*}" + SKILL_NAME="${SKILL##*/}" + npm run test:integration "$SKILL_NAME" "$SKILL_TEST_PATTERN" continue-on-error: false # Override the number of concurrent workers to 2 to prevent a GitHub hosted Actions runner running out of memory. - name: Run integration tests (vally) - ${{ matrix.skill }} - if: ${{ contains(fromJson(env.VALLY_SKILLS), matrix.skill) }} + if: ${{ !contains(fromJson(env.JEST_SKILLS), matrix.skill) }} env: DEBUG: ${{ needs.resolve-inputs.outputs.debug == 'true' && '1' || '' }} TEST_RUN_ID: all-integration MODEL_OVERRIDE: ${{ inputs.model-override }} SKILL: ${{ matrix.skill }} run: | - echo test with $MODEL_OVERRIDE - npm run test:vally -- --skill $SKILL --workers 2 + PLUGIN_DIR="${SKILL%%/*}" + SKILL_NAME="${SKILL##*/}" + npm run test:vally -- --plugin $PLUGIN_DIR --skill $SKILL_NAME --workers 2 - name: Generate skill report if: always() diff --git a/.github/workflows/test-all-skills.yml b/.github/workflows/test-all-skills.yml index b7897a7cc..521a5b84c 100644 --- a/.github/workflows/test-all-skills.yml +++ b/.github/workflows/test-all-skills.yml @@ -22,12 +22,12 @@ on: - main paths: - "tests/**" - - "plugin/skills/**" + - "plugins/*/skills/**" - ".github/workflows/test-*.yml" pull_request: paths: - "tests/**" - - "plugin/skills/**" + - "plugins/*/skills/**" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/test-azure-deploy.yml b/.github/workflows/test-azure-deploy.yml index d662b5aac..5b60dc454 100644 --- a/.github/workflows/test-azure-deploy.yml +++ b/.github/workflows/test-azure-deploy.yml @@ -56,19 +56,19 @@ jobs: steps: - name: Parse test-pattern input into matrix id: set-matrix + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7 env: INPUT: ${{ inputs.test-pattern }} - run: | - # Default test groups if input is empty - DEFAULT='["skill-invocation","vanilla-static-web-apps-deploy","vanilla-app-service-deploy","vanilla-azure-functions-deploy","vanilla-azure-container-apps-deploy","terraform-static-web-apps-deploy","terraform-app-service-deploy","terraform-azure-functions-deploy","terraform-azure-container-apps-deploy","brownfield-dotnet","brownfield-javascript","brownfield-python"]' - - if [ -z "$INPUT" ]; then - echo "matrix=$DEFAULT" >> "$GITHUB_OUTPUT" - else - # Convert comma-delimited input to JSON array - JSON=$(echo "$INPUT" | tr ',' '\n' | sed 's/^ *//;s/ *$//' | jq -R . | jq -sc .) - echo "matrix=$JSON" >> "$GITHUB_OUTPUT" - fi + with: + script: | + const DEFAULT = ["skill-invocation","vanilla-static-web-apps-deploy","vanilla-app-service-deploy","vanilla-azure-functions-deploy","vanilla-azure-container-apps-deploy","terraform-static-web-apps-deploy","terraform-app-service-deploy","terraform-azure-functions-deploy","terraform-azure-container-apps-deploy","brownfield-dotnet","brownfield-javascript","brownfield-python"]; + const input = process.env.INPUT || ""; + + const matrix = input + ? input.split(",").map(s => s.trim()).filter(Boolean) + : DEFAULT; + + core.setOutput("matrix", JSON.stringify(matrix)); test: name: azure-deploy – ${{ matrix.test-group }} @@ -180,7 +180,6 @@ jobs: MODEL_OVERRIDE: ${{ inputs.model-override }} TEST_GROUP: ${{ matrix.test-group }} run: | - echo test with $MODEL_OVERRIDE npm run test:integration -- azure-deploy "$TEST_GROUP" continue-on-error: true diff --git a/.vally.yaml b/.vally.yaml index b17280c2f..7f976353e 100644 --- a/.vally.yaml +++ b/.vally.yaml @@ -1,6 +1,4 @@ paths: - skills: - - plugin/skills evals: - evals evalFilenames: ["eval.yaml", "eval.yml", "*.eval.yaml"] diff --git a/evals/airunway-aks-setup/eval.yaml b/evals/azure-skills/airunway-aks-setup/eval.yaml similarity index 100% rename from evals/airunway-aks-setup/eval.yaml rename to evals/azure-skills/airunway-aks-setup/eval.yaml diff --git a/evals/airunway-aks-setup/fixture/kubeconfig.yaml b/evals/azure-skills/airunway-aks-setup/fixture/kubeconfig.yaml similarity index 100% rename from evals/airunway-aks-setup/fixture/kubeconfig.yaml rename to evals/azure-skills/airunway-aks-setup/fixture/kubeconfig.yaml diff --git a/evals/appinsights-instrumentation/eval.yaml b/evals/azure-skills/appinsights-instrumentation/eval.yaml similarity index 100% rename from evals/appinsights-instrumentation/eval.yaml rename to evals/azure-skills/appinsights-instrumentation/eval.yaml diff --git a/evals/appinsights-instrumentation/fixture/aspnetcore-app/Program.cs b/evals/azure-skills/appinsights-instrumentation/fixture/aspnetcore-app/Program.cs similarity index 100% rename from evals/appinsights-instrumentation/fixture/aspnetcore-app/Program.cs rename to evals/azure-skills/appinsights-instrumentation/fixture/aspnetcore-app/Program.cs diff --git a/evals/appinsights-instrumentation/fixture/aspnetcore-app/aspnetcore-app.csproj b/evals/azure-skills/appinsights-instrumentation/fixture/aspnetcore-app/aspnetcore-app.csproj similarity index 100% rename from evals/appinsights-instrumentation/fixture/aspnetcore-app/aspnetcore-app.csproj rename to evals/azure-skills/appinsights-instrumentation/fixture/aspnetcore-app/aspnetcore-app.csproj diff --git a/evals/appinsights-instrumentation/fixture/package.json b/evals/azure-skills/appinsights-instrumentation/fixture/package.json similarity index 100% rename from evals/appinsights-instrumentation/fixture/package.json rename to evals/azure-skills/appinsights-instrumentation/fixture/package.json diff --git a/evals/appinsights-instrumentation/fixture/python-app/main.py b/evals/azure-skills/appinsights-instrumentation/fixture/python-app/main.py similarity index 100% rename from evals/appinsights-instrumentation/fixture/python-app/main.py rename to evals/azure-skills/appinsights-instrumentation/fixture/python-app/main.py diff --git a/evals/appinsights-instrumentation/fixture/python-app/requirements.txt b/evals/azure-skills/appinsights-instrumentation/fixture/python-app/requirements.txt similarity index 100% rename from evals/appinsights-instrumentation/fixture/python-app/requirements.txt rename to evals/azure-skills/appinsights-instrumentation/fixture/python-app/requirements.txt diff --git a/evals/azure-ai/eval.yaml b/evals/azure-skills/azure-ai/eval.yaml similarity index 100% rename from evals/azure-ai/eval.yaml rename to evals/azure-skills/azure-ai/eval.yaml diff --git a/evals/azure-aigateway/eval.yaml b/evals/azure-skills/azure-aigateway/eval.yaml similarity index 100% rename from evals/azure-aigateway/eval.yaml rename to evals/azure-skills/azure-aigateway/eval.yaml diff --git a/evals/azure-compliance/eval.yaml b/evals/azure-skills/azure-compliance/eval.yaml similarity index 100% rename from evals/azure-compliance/eval.yaml rename to evals/azure-skills/azure-compliance/eval.yaml diff --git a/evals/azure-compute/capacity-reservation.eval.yaml b/evals/azure-skills/azure-compute/capacity-reservation.eval.yaml similarity index 100% rename from evals/azure-compute/capacity-reservation.eval.yaml rename to evals/azure-skills/azure-compute/capacity-reservation.eval.yaml diff --git a/evals/azure-compute/essential-machine-management.eval.yaml b/evals/azure-skills/azure-compute/essential-machine-management.eval.yaml similarity index 100% rename from evals/azure-compute/essential-machine-management.eval.yaml rename to evals/azure-skills/azure-compute/essential-machine-management.eval.yaml diff --git a/evals/azure-compute/vm-creator.eval.yaml b/evals/azure-skills/azure-compute/vm-creator.eval.yaml similarity index 100% rename from evals/azure-compute/vm-creator.eval.yaml rename to evals/azure-skills/azure-compute/vm-creator.eval.yaml diff --git a/evals/azure-compute/vm-recommender.eval.yaml b/evals/azure-skills/azure-compute/vm-recommender.eval.yaml similarity index 100% rename from evals/azure-compute/vm-recommender.eval.yaml rename to evals/azure-skills/azure-compute/vm-recommender.eval.yaml diff --git a/evals/azure-cost/eval.yaml b/evals/azure-skills/azure-cost/eval.yaml similarity index 100% rename from evals/azure-cost/eval.yaml rename to evals/azure-skills/azure-cost/eval.yaml diff --git a/evals/azure-deploy/eval.yaml b/evals/azure-skills/azure-deploy/eval.yaml similarity index 100% rename from evals/azure-deploy/eval.yaml rename to evals/azure-skills/azure-deploy/eval.yaml diff --git a/evals/azure-diagnostics/eval.yaml b/evals/azure-skills/azure-diagnostics/eval.yaml similarity index 100% rename from evals/azure-diagnostics/eval.yaml rename to evals/azure-skills/azure-diagnostics/eval.yaml diff --git a/evals/azure-enterprise-infra-planner/eval.yaml b/evals/azure-skills/azure-enterprise-infra-planner/eval.yaml similarity index 100% rename from evals/azure-enterprise-infra-planner/eval.yaml rename to evals/azure-skills/azure-enterprise-infra-planner/eval.yaml diff --git a/evals/azure-kubernetes/eval.yaml b/evals/azure-skills/azure-kubernetes/eval.yaml similarity index 100% rename from evals/azure-kubernetes/eval.yaml rename to evals/azure-skills/azure-kubernetes/eval.yaml diff --git a/evals/azure-kubernetes/fixture/deployment.yaml b/evals/azure-skills/azure-kubernetes/fixture/deployment.yaml similarity index 100% rename from evals/azure-kubernetes/fixture/deployment.yaml rename to evals/azure-skills/azure-kubernetes/fixture/deployment.yaml diff --git a/evals/azure-kubernetes/fixture/workloads.yaml b/evals/azure-skills/azure-kubernetes/fixture/workloads.yaml similarity index 100% rename from evals/azure-kubernetes/fixture/workloads.yaml rename to evals/azure-skills/azure-kubernetes/fixture/workloads.yaml diff --git a/evals/azure-kusto/eval.yaml b/evals/azure-skills/azure-kusto/eval.yaml similarity index 100% rename from evals/azure-kusto/eval.yaml rename to evals/azure-skills/azure-kusto/eval.yaml diff --git a/evals/azure-messaging/eval.yaml b/evals/azure-skills/azure-messaging/eval.yaml similarity index 100% rename from evals/azure-messaging/eval.yaml rename to evals/azure-skills/azure-messaging/eval.yaml diff --git a/evals/azure-prepare/e2e-eval.yaml b/evals/azure-skills/azure-prepare/e2e-eval.yaml similarity index 100% rename from evals/azure-prepare/e2e-eval.yaml rename to evals/azure-skills/azure-prepare/e2e-eval.yaml diff --git a/evals/azure-prepare/fixture/containerized-web/Dockerfile b/evals/azure-skills/azure-prepare/fixture/containerized-web/Dockerfile similarity index 100% rename from evals/azure-prepare/fixture/containerized-web/Dockerfile rename to evals/azure-skills/azure-prepare/fixture/containerized-web/Dockerfile diff --git a/evals/azure-prepare/fixture/containerized-web/app.js b/evals/azure-skills/azure-prepare/fixture/containerized-web/app.js similarity index 100% rename from evals/azure-prepare/fixture/containerized-web/app.js rename to evals/azure-skills/azure-prepare/fixture/containerized-web/app.js diff --git a/evals/azure-prepare/fixture/containerized-web/package.json b/evals/azure-skills/azure-prepare/fixture/containerized-web/package.json similarity index 100% rename from evals/azure-prepare/fixture/containerized-web/package.json rename to evals/azure-skills/azure-prepare/fixture/containerized-web/package.json diff --git a/evals/azure-prepare/fixture/discussion-board/app.js b/evals/azure-skills/azure-prepare/fixture/discussion-board/app.js similarity index 100% rename from evals/azure-prepare/fixture/discussion-board/app.js rename to evals/azure-skills/azure-prepare/fixture/discussion-board/app.js diff --git a/evals/azure-prepare/fixture/discussion-board/package.json b/evals/azure-skills/azure-prepare/fixture/discussion-board/package.json similarity index 100% rename from evals/azure-prepare/fixture/discussion-board/package.json rename to evals/azure-skills/azure-prepare/fixture/discussion-board/package.json diff --git a/evals/azure-prepare/fixture/functions-event/function_app.py b/evals/azure-skills/azure-prepare/fixture/functions-event/function_app.py similarity index 100% rename from evals/azure-prepare/fixture/functions-event/function_app.py rename to evals/azure-skills/azure-prepare/fixture/functions-event/function_app.py diff --git a/evals/azure-prepare/fixture/functions-event/host.json b/evals/azure-skills/azure-prepare/fixture/functions-event/host.json similarity index 100% rename from evals/azure-prepare/fixture/functions-event/host.json rename to evals/azure-skills/azure-prepare/fixture/functions-event/host.json diff --git a/evals/azure-prepare/fixture/functions-event/requirements.txt b/evals/azure-skills/azure-prepare/fixture/functions-event/requirements.txt similarity index 100% rename from evals/azure-prepare/fixture/functions-event/requirements.txt rename to evals/azure-skills/azure-prepare/fixture/functions-event/requirements.txt diff --git a/evals/azure-prepare/fixture/functions-http/function_app.py b/evals/azure-skills/azure-prepare/fixture/functions-http/function_app.py similarity index 100% rename from evals/azure-prepare/fixture/functions-http/function_app.py rename to evals/azure-skills/azure-prepare/fixture/functions-http/function_app.py diff --git a/evals/azure-prepare/fixture/functions-http/host.json b/evals/azure-skills/azure-prepare/fixture/functions-http/host.json similarity index 100% rename from evals/azure-prepare/fixture/functions-http/host.json rename to evals/azure-skills/azure-prepare/fixture/functions-http/host.json diff --git a/evals/azure-prepare/fixture/functions-http/requirements.txt b/evals/azure-skills/azure-prepare/fixture/functions-http/requirements.txt similarity index 100% rename from evals/azure-prepare/fixture/functions-http/requirements.txt rename to evals/azure-skills/azure-prepare/fixture/functions-http/requirements.txt diff --git a/evals/azure-prepare/fixture/functions-servicebus/function_app.py b/evals/azure-skills/azure-prepare/fixture/functions-servicebus/function_app.py similarity index 100% rename from evals/azure-prepare/fixture/functions-servicebus/function_app.py rename to evals/azure-skills/azure-prepare/fixture/functions-servicebus/function_app.py diff --git a/evals/azure-prepare/fixture/functions-servicebus/host.json b/evals/azure-skills/azure-prepare/fixture/functions-servicebus/host.json similarity index 100% rename from evals/azure-prepare/fixture/functions-servicebus/host.json rename to evals/azure-skills/azure-prepare/fixture/functions-servicebus/host.json diff --git a/evals/azure-prepare/fixture/functions-servicebus/requirements.txt b/evals/azure-skills/azure-prepare/fixture/functions-servicebus/requirements.txt similarity index 100% rename from evals/azure-prepare/fixture/functions-servicebus/requirements.txt rename to evals/azure-skills/azure-prepare/fixture/functions-servicebus/requirements.txt diff --git a/evals/azure-prepare/fixture/functions-timer/function_app.py b/evals/azure-skills/azure-prepare/fixture/functions-timer/function_app.py similarity index 100% rename from evals/azure-prepare/fixture/functions-timer/function_app.py rename to evals/azure-skills/azure-prepare/fixture/functions-timer/function_app.py diff --git a/evals/azure-prepare/fixture/functions-timer/host.json b/evals/azure-skills/azure-prepare/fixture/functions-timer/host.json similarity index 100% rename from evals/azure-prepare/fixture/functions-timer/host.json rename to evals/azure-skills/azure-prepare/fixture/functions-timer/host.json diff --git a/evals/azure-prepare/fixture/functions-timer/requirements.txt b/evals/azure-skills/azure-prepare/fixture/functions-timer/requirements.txt similarity index 100% rename from evals/azure-prepare/fixture/functions-timer/requirements.txt rename to evals/azure-skills/azure-prepare/fixture/functions-timer/requirements.txt diff --git a/evals/azure-prepare/fixture/nodejs-hello/Dockerfile b/evals/azure-skills/azure-prepare/fixture/nodejs-hello/Dockerfile similarity index 100% rename from evals/azure-prepare/fixture/nodejs-hello/Dockerfile rename to evals/azure-skills/azure-prepare/fixture/nodejs-hello/Dockerfile diff --git a/evals/azure-prepare/fixture/nodejs-hello/app.js b/evals/azure-skills/azure-prepare/fixture/nodejs-hello/app.js similarity index 100% rename from evals/azure-prepare/fixture/nodejs-hello/app.js rename to evals/azure-skills/azure-prepare/fixture/nodejs-hello/app.js diff --git a/evals/azure-prepare/fixture/nodejs-hello/package.json b/evals/azure-skills/azure-prepare/fixture/nodejs-hello/package.json similarity index 100% rename from evals/azure-prepare/fixture/nodejs-hello/package.json rename to evals/azure-skills/azure-prepare/fixture/nodejs-hello/package.json diff --git a/evals/azure-prepare/fixture/portfolio/index.html b/evals/azure-skills/azure-prepare/fixture/portfolio/index.html similarity index 100% rename from evals/azure-prepare/fixture/portfolio/index.html rename to evals/azure-skills/azure-prepare/fixture/portfolio/index.html diff --git a/evals/azure-prepare/fixture/social-media/app.js b/evals/azure-skills/azure-prepare/fixture/social-media/app.js similarity index 100% rename from evals/azure-prepare/fixture/social-media/app.js rename to evals/azure-skills/azure-prepare/fixture/social-media/app.js diff --git a/evals/azure-prepare/fixture/social-media/package.json b/evals/azure-skills/azure-prepare/fixture/social-media/package.json similarity index 100% rename from evals/azure-prepare/fixture/social-media/package.json rename to evals/azure-skills/azure-prepare/fixture/social-media/package.json diff --git a/evals/azure-prepare/fixture/todo/api/package.json b/evals/azure-skills/azure-prepare/fixture/todo/api/package.json similarity index 100% rename from evals/azure-prepare/fixture/todo/api/package.json rename to evals/azure-skills/azure-prepare/fixture/todo/api/package.json diff --git a/evals/azure-prepare/fixture/todo/api/server.js b/evals/azure-skills/azure-prepare/fixture/todo/api/server.js similarity index 100% rename from evals/azure-prepare/fixture/todo/api/server.js rename to evals/azure-skills/azure-prepare/fixture/todo/api/server.js diff --git a/evals/azure-prepare/fixture/todo/frontend/index.html b/evals/azure-skills/azure-prepare/fixture/todo/frontend/index.html similarity index 100% rename from evals/azure-prepare/fixture/todo/frontend/index.html rename to evals/azure-skills/azure-prepare/fixture/todo/frontend/index.html diff --git a/evals/azure-prepare/fixture/url-shortener/function_app.py b/evals/azure-skills/azure-prepare/fixture/url-shortener/function_app.py similarity index 100% rename from evals/azure-prepare/fixture/url-shortener/function_app.py rename to evals/azure-skills/azure-prepare/fixture/url-shortener/function_app.py diff --git a/evals/azure-prepare/fixture/url-shortener/host.json b/evals/azure-skills/azure-prepare/fixture/url-shortener/host.json similarity index 100% rename from evals/azure-prepare/fixture/url-shortener/host.json rename to evals/azure-skills/azure-prepare/fixture/url-shortener/host.json diff --git a/evals/azure-prepare/fixture/url-shortener/requirements.txt b/evals/azure-skills/azure-prepare/fixture/url-shortener/requirements.txt similarity index 100% rename from evals/azure-prepare/fixture/url-shortener/requirements.txt rename to evals/azure-skills/azure-prepare/fixture/url-shortener/requirements.txt diff --git a/evals/azure-prepare/fixture/whiteboard/index.html b/evals/azure-skills/azure-prepare/fixture/whiteboard/index.html similarity index 100% rename from evals/azure-prepare/fixture/whiteboard/index.html rename to evals/azure-skills/azure-prepare/fixture/whiteboard/index.html diff --git a/evals/azure-prepare/routing-eval.yaml b/evals/azure-skills/azure-prepare/routing-eval.yaml similarity index 100% rename from evals/azure-prepare/routing-eval.yaml rename to evals/azure-skills/azure-prepare/routing-eval.yaml diff --git a/evals/azure-quotas/eval.yaml b/evals/azure-skills/azure-quotas/eval.yaml similarity index 100% rename from evals/azure-quotas/eval.yaml rename to evals/azure-skills/azure-quotas/eval.yaml diff --git a/evals/azure-reliability/eval.yaml b/evals/azure-skills/azure-reliability/eval.yaml similarity index 100% rename from evals/azure-reliability/eval.yaml rename to evals/azure-skills/azure-reliability/eval.yaml diff --git a/evals/azure-resource-lookup/eval.yaml b/evals/azure-skills/azure-resource-lookup/eval.yaml similarity index 100% rename from evals/azure-resource-lookup/eval.yaml rename to evals/azure-skills/azure-resource-lookup/eval.yaml diff --git a/evals/azure-resource-visualizer/eval.yaml b/evals/azure-skills/azure-resource-visualizer/eval.yaml similarity index 100% rename from evals/azure-resource-visualizer/eval.yaml rename to evals/azure-skills/azure-resource-visualizer/eval.yaml diff --git a/evals/azure-storage/eval.yaml b/evals/azure-skills/azure-storage/eval.yaml similarity index 100% rename from evals/azure-storage/eval.yaml rename to evals/azure-skills/azure-storage/eval.yaml diff --git a/evals/azure-upgrade/eval.yaml b/evals/azure-skills/azure-upgrade/eval.yaml similarity index 100% rename from evals/azure-upgrade/eval.yaml rename to evals/azure-skills/azure-upgrade/eval.yaml diff --git a/evals/azure-validate/e2e-eval.yaml b/evals/azure-skills/azure-validate/e2e-eval.yaml similarity index 100% rename from evals/azure-validate/e2e-eval.yaml rename to evals/azure-skills/azure-validate/e2e-eval.yaml diff --git a/evals/azure-validate/fixture/bicep-cli/index.html b/evals/azure-skills/azure-validate/fixture/bicep-cli/index.html similarity index 100% rename from evals/azure-validate/fixture/bicep-cli/index.html rename to evals/azure-skills/azure-validate/fixture/bicep-cli/index.html diff --git a/evals/azure-validate/fixture/bicep-cli/infra/main.bicep b/evals/azure-skills/azure-validate/fixture/bicep-cli/infra/main.bicep similarity index 100% rename from evals/azure-validate/fixture/bicep-cli/infra/main.bicep rename to evals/azure-skills/azure-validate/fixture/bicep-cli/infra/main.bicep diff --git a/evals/azure-validate/fixture/bicep-cli/infra/main.parameters.json b/evals/azure-skills/azure-validate/fixture/bicep-cli/infra/main.parameters.json similarity index 100% rename from evals/azure-validate/fixture/bicep-cli/infra/main.parameters.json rename to evals/azure-skills/azure-validate/fixture/bicep-cli/infra/main.parameters.json diff --git a/evals/azure-validate/fixture/bicep-cli/infra/resources.bicep b/evals/azure-skills/azure-validate/fixture/bicep-cli/infra/resources.bicep similarity index 100% rename from evals/azure-validate/fixture/bicep-cli/infra/resources.bicep rename to evals/azure-skills/azure-validate/fixture/bicep-cli/infra/resources.bicep diff --git a/evals/azure-validate/fixture/containerized-app/Dockerfile b/evals/azure-skills/azure-validate/fixture/containerized-app/Dockerfile similarity index 100% rename from evals/azure-validate/fixture/containerized-app/Dockerfile rename to evals/azure-skills/azure-validate/fixture/containerized-app/Dockerfile diff --git a/evals/azure-validate/fixture/containerized-app/app.js b/evals/azure-skills/azure-validate/fixture/containerized-app/app.js similarity index 100% rename from evals/azure-validate/fixture/containerized-app/app.js rename to evals/azure-skills/azure-validate/fixture/containerized-app/app.js diff --git a/evals/azure-validate/fixture/containerized-app/azure.yaml b/evals/azure-skills/azure-validate/fixture/containerized-app/azure.yaml similarity index 100% rename from evals/azure-validate/fixture/containerized-app/azure.yaml rename to evals/azure-skills/azure-validate/fixture/containerized-app/azure.yaml diff --git a/evals/azure-validate/fixture/containerized-app/infra/abbreviations.json b/evals/azure-skills/azure-validate/fixture/containerized-app/infra/abbreviations.json similarity index 100% rename from evals/azure-validate/fixture/containerized-app/infra/abbreviations.json rename to evals/azure-skills/azure-validate/fixture/containerized-app/infra/abbreviations.json diff --git a/evals/azure-validate/fixture/containerized-app/infra/main.bicep b/evals/azure-skills/azure-validate/fixture/containerized-app/infra/main.bicep similarity index 100% rename from evals/azure-validate/fixture/containerized-app/infra/main.bicep rename to evals/azure-skills/azure-validate/fixture/containerized-app/infra/main.bicep diff --git a/evals/azure-validate/fixture/containerized-app/infra/main.parameters.json b/evals/azure-skills/azure-validate/fixture/containerized-app/infra/main.parameters.json similarity index 100% rename from evals/azure-validate/fixture/containerized-app/infra/main.parameters.json rename to evals/azure-skills/azure-validate/fixture/containerized-app/infra/main.parameters.json diff --git a/evals/azure-validate/fixture/containerized-app/infra/resources.bicep b/evals/azure-skills/azure-validate/fixture/containerized-app/infra/resources.bicep similarity index 100% rename from evals/azure-validate/fixture/containerized-app/infra/resources.bicep rename to evals/azure-skills/azure-validate/fixture/containerized-app/infra/resources.bicep diff --git a/evals/azure-validate/fixture/containerized-app/package.json b/evals/azure-skills/azure-validate/fixture/containerized-app/package.json similarity index 100% rename from evals/azure-validate/fixture/containerized-app/package.json rename to evals/azure-skills/azure-validate/fixture/containerized-app/package.json diff --git a/evals/azure-validate/fixture/portfolio/azure.yaml b/evals/azure-skills/azure-validate/fixture/portfolio/azure.yaml similarity index 100% rename from evals/azure-validate/fixture/portfolio/azure.yaml rename to evals/azure-skills/azure-validate/fixture/portfolio/azure.yaml diff --git a/evals/azure-validate/fixture/portfolio/index.html b/evals/azure-skills/azure-validate/fixture/portfolio/index.html similarity index 100% rename from evals/azure-validate/fixture/portfolio/index.html rename to evals/azure-skills/azure-validate/fixture/portfolio/index.html diff --git a/evals/azure-validate/fixture/portfolio/infra/main.bicep b/evals/azure-skills/azure-validate/fixture/portfolio/infra/main.bicep similarity index 100% rename from evals/azure-validate/fixture/portfolio/infra/main.bicep rename to evals/azure-skills/azure-validate/fixture/portfolio/infra/main.bicep diff --git a/evals/azure-validate/fixture/portfolio/infra/main.parameters.json b/evals/azure-skills/azure-validate/fixture/portfolio/infra/main.parameters.json similarity index 100% rename from evals/azure-validate/fixture/portfolio/infra/main.parameters.json rename to evals/azure-skills/azure-validate/fixture/portfolio/infra/main.parameters.json diff --git a/evals/azure-validate/fixture/portfolio/infra/resources.bicep b/evals/azure-skills/azure-validate/fixture/portfolio/infra/resources.bicep similarity index 100% rename from evals/azure-validate/fixture/portfolio/infra/resources.bicep rename to evals/azure-skills/azure-validate/fixture/portfolio/infra/resources.bicep diff --git a/evals/azure-validate/fixture/whiteboard/azure.yaml b/evals/azure-skills/azure-validate/fixture/whiteboard/azure.yaml similarity index 100% rename from evals/azure-validate/fixture/whiteboard/azure.yaml rename to evals/azure-skills/azure-validate/fixture/whiteboard/azure.yaml diff --git a/evals/azure-validate/fixture/whiteboard/index.html b/evals/azure-skills/azure-validate/fixture/whiteboard/index.html similarity index 100% rename from evals/azure-validate/fixture/whiteboard/index.html rename to evals/azure-skills/azure-validate/fixture/whiteboard/index.html diff --git a/evals/azure-validate/fixture/whiteboard/infra/main.bicep b/evals/azure-skills/azure-validate/fixture/whiteboard/infra/main.bicep similarity index 100% rename from evals/azure-validate/fixture/whiteboard/infra/main.bicep rename to evals/azure-skills/azure-validate/fixture/whiteboard/infra/main.bicep diff --git a/evals/azure-validate/fixture/whiteboard/infra/main.parameters.json b/evals/azure-skills/azure-validate/fixture/whiteboard/infra/main.parameters.json similarity index 100% rename from evals/azure-validate/fixture/whiteboard/infra/main.parameters.json rename to evals/azure-skills/azure-validate/fixture/whiteboard/infra/main.parameters.json diff --git a/evals/azure-validate/fixture/whiteboard/infra/resources.bicep b/evals/azure-skills/azure-validate/fixture/whiteboard/infra/resources.bicep similarity index 100% rename from evals/azure-validate/fixture/whiteboard/infra/resources.bicep rename to evals/azure-skills/azure-validate/fixture/whiteboard/infra/resources.bicep diff --git a/evals/azure-validate/routing-eval.yaml b/evals/azure-skills/azure-validate/routing-eval.yaml similarity index 100% rename from evals/azure-validate/routing-eval.yaml rename to evals/azure-skills/azure-validate/routing-eval.yaml diff --git a/evals/entra-agent-id/eval.yaml b/evals/azure-skills/entra-agent-id/eval.yaml similarity index 100% rename from evals/entra-agent-id/eval.yaml rename to evals/azure-skills/entra-agent-id/eval.yaml diff --git a/evals/entra-app-registration/eval.yaml b/evals/azure-skills/entra-app-registration/eval.yaml similarity index 100% rename from evals/entra-app-registration/eval.yaml rename to evals/azure-skills/entra-app-registration/eval.yaml diff --git a/evals/microsoft-foundry/eval.yaml b/evals/azure-skills/microsoft-foundry/eval.yaml similarity index 100% rename from evals/microsoft-foundry/eval.yaml rename to evals/azure-skills/microsoft-foundry/eval.yaml diff --git a/evals/python-appservice-deploy/eval.yaml b/evals/azure-skills/python-appservice-deploy/eval.yaml similarity index 100% rename from evals/python-appservice-deploy/eval.yaml rename to evals/azure-skills/python-appservice-deploy/eval.yaml diff --git a/evals/python-appservice-deploy/fixture/flask-app/app.py b/evals/azure-skills/python-appservice-deploy/fixture/flask-app/app.py similarity index 100% rename from evals/python-appservice-deploy/fixture/flask-app/app.py rename to evals/azure-skills/python-appservice-deploy/fixture/flask-app/app.py diff --git a/evals/python-appservice-deploy/fixture/flask-app/requirements.txt b/evals/azure-skills/python-appservice-deploy/fixture/flask-app/requirements.txt similarity index 100% rename from evals/python-appservice-deploy/fixture/flask-app/requirements.txt rename to evals/azure-skills/python-appservice-deploy/fixture/flask-app/requirements.txt diff --git a/gulpfile.ts b/gulpfile.ts index f3c423f0c..9dc8e5438 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -4,7 +4,7 @@ import * as nbgv from "nerdbank-gitversioning"; import * as path from "path"; import log from "fancy-log"; import { execSync } from "child_process"; -import { mkdirSync, readFileSync, rmSync, writeFileSync } from "fs"; +import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "fs"; import Vinyl = require("vinyl"); // Matches top-level skill files like skills/azure-deploy/SKILL.md but not nested ones. @@ -18,7 +18,7 @@ const PLUGIN_JSON_RE = /^\.(?:plugin|cursor-plugin|claude-plugin)[\\/]plugin\.js * calls `nbgv.getVersion()` against that skill's source directory, which * contains its own `version.json` with `pathFilters: ["."]`. */ -function stampSkillVersions() { +function stampSkillVersions(plugin: string) { return new Transform({ objectMode: true, async transform(file: Vinyl, _encoding, callback) { @@ -29,7 +29,7 @@ function stampSkillVersions() { try { const skillName = file.relative.split(/[/\\]/)[1]; - const sourceSkillDir = path.resolve("plugin/skills", skillName); + const sourceSkillDir = path.resolve(`plugins/${plugin}/skills`, skillName); const versionInfo = await nbgv.getVersion(sourceSkillDir); const version = versionInfo.simpleVersion; @@ -46,7 +46,7 @@ function stampSkillVersions() { file.contents = Buffer.from( content.replace(versionPlaceholderPattern, `$1${version}$2`) ); - log(`setting skill version: skills/${skillName} ${version}`); + log(`setting skill version: plugins/${plugin}/skills/${skillName} ${version}`); } catch (err) { callback(err as Error); return; @@ -59,21 +59,23 @@ function stampSkillVersions() { /** * Stamps the plugin.json files in `.plugin/`, `.cursor-plugin/`, and - * `.claude-plugin/` with a shared NBGV version derived from `plugin/version.json`. - * The version is fetched once on the first matching file and cached for the rest. + * `.claude-plugin/` with using git commit height. */ -function stampPluginVersions() { +function stampPluginVersions(plugin: string, legacyChangelog?: LegacyChangelog) { const versionJson = JSON.parse( - readFileSync("plugin/version.json", "utf-8") + readFileSync(`plugins/${plugin}/version.json`, "utf-8") ); const majorMinor = versionJson.version as string; - const commits = getVersionedCommits(); + const commits = getVersionedCommits(plugin); // The last commit is the most recent commit - const patchNumber = commits.length > 0 + let patchNumber = commits.length > 0 ? commits[commits.length - 1].relativeHeight : 0; + if (legacyChangelog) { + patchNumber += legacyChangelog.patchOffset; + } const version = `${majorMinor}.${patchNumber}`; @@ -110,25 +112,59 @@ function stampPluginVersions() { }); } -function build() { - rmSync("output", { recursive: true, force: true }); - const pipeline = src(["plugin/**/*", "!plugin/**/version.json", "!plugin/CHANGELOG.md"], { dot: true, encoding: false }) - .pipe(stampSkillVersions()) - .pipe(stampPluginVersions()) - .pipe(dest("output")); - - pipeline.on("end", () => { - try { - generateChangelog(); - } catch (err) { - const error = - err instanceof Error ? err : new Error(String(err)); - log.error("Failed to generate CHANGELOG.md after writing output/.", error); - throw error; - } +function getPluginDirnames(): string[] { + return readdirSync("plugins", { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .sort(); +} + +function buildPlugin(pluginDirname: string): Promise { + const legacyChangelog = getLegacyChangelog(pluginDirname); + + return new Promise((resolve, reject) => { + const pluginSourceDir = path.join("plugins", pluginDirname); + const pluginOutputDir = path.join("output", pluginDirname); + + const pipeline = src( + [ + `${pluginSourceDir}/**/*`, + `!${pluginSourceDir}/**/version.json`, + `!${pluginSourceDir}/CHANGELOG.md`, + `!${pluginSourceDir}/changelog-*.md`, // legacy changelog + ], + { dot: true, encoding: false, base: pluginSourceDir } + ) + .pipe(stampSkillVersions(pluginDirname)) + .pipe(stampPluginVersions(pluginDirname, legacyChangelog)) + .pipe(dest(pluginOutputDir)); + + pipeline.on("error", (err) => reject(err)); + pipeline.on("end", () => { + try { + generateChangelog(pluginDirname, legacyChangelog); + resolve(); + } catch (err) { + const error = err instanceof Error ? err : new Error(String(err)); + log.error(`Failed to generate CHANGELOG.md for plugins/${pluginDirname}.`, error); + reject(error); + } + }); }); +} + +async function build() { + rmSync("output", { recursive: true, force: true }); - return pipeline; + const plugins = getPluginDirnames(); + if (plugins.length === 0) { + log.warn("No plugin directories found under plugins/; skipping build."); + return; + } + + for (const plugin of plugins) { + await buildPlugin(plugin); + } } type Commit = { @@ -151,8 +187,8 @@ type Commit = { /** * @returns Commits with their associated version numbers from oldest to newest. */ -function getVersionedCommits(): Commit[] { - const pluginDir = "plugin"; +function getVersionedCommits(plugin: string): Commit[] { + const pluginDir = `plugins/${plugin}`; // Find the commit that introduced plugin/version.json (the NBGV baseline). const baselineCommit = execSync( @@ -245,14 +281,8 @@ function getVersionedCommits(): Commit[] { }); } -/** - * Generates a CHANGELOG.md in the output directory based on merged PRs - * that touch plugin/ and have titles starting with fix:, feat:, feature:, chore:, misc:, test:, or eval:. - * Each version corresponds to a single first-parent commit touching plugin/ - * since the NBGV baseline commit (when plugin/version.json was introduced). - */ -function generateChangelog(): void { - const versionedCommits = getVersionedCommits(); +function generateChangelog(plugin: string, legacyChangelog?: LegacyChangelog): void { + const versionedCommits = getVersionedCommits(plugin); if (versionedCommits.length === 0) { log.warn("No commit data available for changelog generation."); @@ -272,9 +302,15 @@ function generateChangelog(): void { // Build changelog content (newest first). let content = "# Changelog\n"; + let patchOffset = 0; + if (legacyChangelog) { + patchOffset = legacyChangelog.patchOffset; + } + for (let i = versionedCommits.length - 1; i >= 0; i--) { const entry = versionedCommits[i]; - const version = `${entry.majorMinor}.${entry.relativeHeight}`; + + const version = `${entry.majorMinor}.${entry.relativeHeight + patchOffset}`; // Turn (#NNN) into a markdown link. const subject = entry.subject.replace( @@ -284,9 +320,85 @@ function generateChangelog(): void { content += `\n## ${version}\n\n- ${subject}\n`; } - mkdirSync("output", { recursive: true }); - writeFileSync("output/CHANGELOG.md", content, "utf-8"); - log(`generated CHANGELOG.md with ${versionedCommits.length} entries`); + // Add all the legacy changelog entries + if (legacyChangelog) { + if (!content.endsWith("\n")) { + content += "\n"; + } + content += "\n"; + content += legacyChangelog.legacyChangelogContent; + if (!legacyChangelog.legacyChangelogContent.endsWith("\n")) { + content += "\n"; + } + } + + const outputDir = path.join("output", plugin); + mkdirSync(outputDir, { recursive: true }); + writeFileSync(path.join(outputDir, "CHANGELOG.md"), content, "utf-8"); + log(`generated CHANGELOG.md for plugins/${plugin} with ${versionedCommits.length} entries`); +} + +type LegacyChangelog = { + patchOffset: number; + legacyChangelogContent: string; +}; + +function getLegacyChangelog(plugin: string): LegacyChangelog | undefined { + const pluginDir = `plugins/${plugin}`; + // Moving files causes the git commit history to be lost and thus erases old changelog entries. + // To preserve old changelog entries after moving plugin files, + // we commit legacy changelog entries and compute a version offset so the + // new generated version numbers keep increasing. + // The file is named `changelog-.md` in `plugins//`. + // Update the file if we ever need to move files again. + const legacyChangelogFile = readdirSync(pluginDir, { withFileTypes: true }) + .filter((entry) => entry.isFile() && /^changelog-.*\.md$/i.test(entry.name)) + .map((entry) => entry.name) + .sort((a, b) => b.localeCompare(a)) + .at(0); + + if (!legacyChangelogFile) { + return undefined; + } + + let firstLegacyVersionParts: + | { major: number; minor: number; patch: number } + | undefined; + + const firstLegacyContent = readFileSync( + path.join(pluginDir, legacyChangelogFile), + "utf-8" + ); + const firstVersionMatch = firstLegacyContent.match(/\b(\d+)\.(\d+)\.(\d+)\b/); + if (firstVersionMatch) { + firstLegacyVersionParts = { + major: Number(firstVersionMatch[1]), + minor: Number(firstVersionMatch[2]), + patch: Number(firstVersionMatch[3]), + }; + } + + const versionJson = JSON.parse( + readFileSync(path.join(pluginDir, "version.json"), "utf-8") + ); + const majorMinor = versionJson.version as string; + const [major, minor] = majorMinor.split(".").map((s) => Number(s)); + + let patchOffset = 0; + if (firstLegacyVersionParts) { + // When major/minor version is higher than the most recent major/minor in the legacy changelog, + // the patch number must have been reset to 0 so we don't need an offset. + if (major === firstLegacyVersionParts.major && minor === firstLegacyVersionParts.minor) { + patchOffset = firstLegacyVersionParts.patch + 1; + } + } + + const content = readFileSync(path.join(pluginDir, legacyChangelogFile), "utf-8"); + + return { + patchOffset, + legacyChangelogContent: content + }; } export default build; diff --git a/plugin/.claude-plugin/plugin.json b/plugins/azure-skills/.claude-plugin/plugin.json similarity index 100% rename from plugin/.claude-plugin/plugin.json rename to plugins/azure-skills/.claude-plugin/plugin.json diff --git a/plugin/.cursor-plugin/plugin.json b/plugins/azure-skills/.cursor-plugin/plugin.json similarity index 100% rename from plugin/.cursor-plugin/plugin.json rename to plugins/azure-skills/.cursor-plugin/plugin.json diff --git a/plugin/.mcp.json b/plugins/azure-skills/.mcp.json similarity index 100% rename from plugin/.mcp.json rename to plugins/azure-skills/.mcp.json diff --git a/plugin/.plugin/plugin.json b/plugins/azure-skills/.plugin/plugin.json similarity index 100% rename from plugin/.plugin/plugin.json rename to plugins/azure-skills/.plugin/plugin.json diff --git a/plugin/LICENSE b/plugins/azure-skills/LICENSE similarity index 100% rename from plugin/LICENSE rename to plugins/azure-skills/LICENSE diff --git a/plugin/README.md b/plugins/azure-skills/README.md similarity index 100% rename from plugin/README.md rename to plugins/azure-skills/README.md diff --git a/plugin/assets/azure-logo.svg b/plugins/azure-skills/assets/azure-logo.svg similarity index 100% rename from plugin/assets/azure-logo.svg rename to plugins/azure-skills/assets/azure-logo.svg diff --git a/plugins/azure-skills/changelog-2026-07-24.md b/plugins/azure-skills/changelog-2026-07-24.md new file mode 100644 index 000000000..130e27d87 --- /dev/null +++ b/plugins/azure-skills/changelog-2026-07-24.md @@ -0,0 +1,447 @@ +## 1.2.5 + +- fix: auto-install microsoft-foundry plugin in Copilot app ([#2954](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2954)) + +## 1.2.4 + +- feat: support re-host scenario ([#2955](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2955)) + +## 1.2.3 + +- feat: create toolbox skill for foundry agent ([#2921](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2921)) + +## 1.2.2 + +- feature: Introduce azure-app-onboard skill along with azure-app-onboard-prereq + vally tests ([#2938](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2938)) + +## 1.2.1 + +- fix: azure-validate eval failures (deploy-intent gating + tool-call-match grading) ([#2928](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2928)) + +## 1.2.0 + +- fix: unify plugin and changelog versioning ([#2927](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2927)) + +## 1.1.105 + +- Fix ambiguous file path example ([#2893](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2893)) + +## 1.1.104 + +- feat: Migrate VM Troubleshooter workflow to azure-diagnostics ([#2859](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2859)) + +## 1.1.103 + +- feat: set azd user agent env ([#2882](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2882)) + +## 1.1.102 + +- fix: split prompt-agent tool references into tools/prompt-agent/ ([#2857](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2857)) + +## 1.1.101 + +- feat: replace azure-validate AZCLI/Bicep validation steps with a shared script ([#2856](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2856)) + +## 1.1.100 + +- feat: replace azure-validate Aspire Functions secret-storage scan with a script ([#2854](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2854)) + +## 1.1.99 + +- feat: replace azure-validate Aspire ACA env-var setup with a script ([#2855](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2855)) + +## 1.1.98 + +- feat: script-ify Terraform validation preflight sequence (azure-validate) ([#2862](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2862)) + +## 1.1.97 + +- fix: improve canvas-entry gate logic and add plugin-contributed extension detection ([#2866](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2866)) + +## 1.1.96 + +- fix(microsoft-foundry): support user-entra-token auth for incoming a2a ([#2858](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2858)) + +## 1.1.95 + +- feature: retire azure-rbac skill ([#2779](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2779)) + +## 1.1.94 + +- fix(microsoft-foundry): hosted agents call incoming A2A agent ([#2846](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2846)) + +## 1.1.93 + +- feat: align the Microsoft Foundry skill with the latest azd behavior ([#2844](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2844)) + +## 1.1.92 + +- feat: add cicd sub skill ([#2838](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2838)) + +## 1.1.91 + +- fix: clarify canvas-first reminder ([#2837](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2837)) + +## 1.1.90 + +- chore: improve agent instruction and quick start ([#2768](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2768)) + +## 1.1.89 + +- fix: remove azd init from Foundry agent creation ([#2812](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2812)) + +## 1.1.88 + +- feat: update invocations_ws skill for GA and path-based routing ([#2807](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2807)) + +## 1.1.87 + +- eval: migrate azure-compute integration tests to vally eval suite ([#2596](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2596)) + +## 1.1.86 + +- fix: use proper tool to execute query in Azure SQL Server ([#2772](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2772)) + +## 1.1.85 + +- feat: add canvas-first entry gate for Foundry agent creation ([#2775](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2775)) + +## 1.1.84 + +- feature: retire azure-hosted-copilot-sdk skill ([#2556](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2556)) + +## 1.1.83 + +- feat: capture and report skill version in telemetry hooks ([#2763](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2763)) + +## 1.1.82 + +- eval: migrate azure-prepare integration tests to vally eval suites ([#2721](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2721)) + +## 1.1.81 + +- feat: support foundry routine and add it as a sub-skill ([#2743](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2743)) + +## 1.1.80 + +- fix: correct toolbox reference docs from live testing ([#2755](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2755)) + +## 1.1.79 + +- fix(microsoft-foundry): vnet ([#2754](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2754)) + +## 1.1.78 + +- fix: restructure and update skill reference docs for hosted agent creation ([#2737](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2737)) + +## 1.1.77 + +- fix(microsoft-foundry): sync latest azd contract and schema ([#2722](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2722)) + +## 1.1.76 + +- feat: add guardrails reference docs for hosted agent creation ([#2731](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2731)) + +## 1.1.75 + +- fix: Get hooks working in Copilot again ([#2719](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2719)) + +## 1.1.74 + +- feat: improve foundry skill in more real user scenarios. ([#2705](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2705)) + +## 1.1.73 + +- feat: add skill related knowledge into foundry skill ([#2664](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2664)) + +## 1.1.72 + +- fix(microsoft-foundry): improve quick start provision and local run polling ([#2694](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2694)) + +## 1.1.71 + +- fix: add Network Isolation Errors hint to microsoft-foundry SKILL.md ([#2685](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2685)) + +## 1.1.70 + +- Enhance FAOS documentation and fix evaluator contract issues ([#2637](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2637)) + +## 1.1.69 + +- feat: improve the hosted agent getting started with coding ([#2610](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2610)) + +## 1.1.68 + +- feat: add python-appservice-deploy skill for Python/Flask/Django/FastAPI on App Service ([#2487](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2487)) + +## 1.1.67 + +- feat(azure-compute): add VM creation workflow with approval gate before deploy ([#2297](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2297)) + +## 1.1.66 + +- feat: (azure-cost) add storage optimization guide and fix token limit ([#2554](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2554)) + +## 1.1.65 + +- eval: migrate infra-planner tests to Vally ([#2483](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2483)) + +## 1.1.64 + +- Optimize FAOS preparation and clarify evaluator documentation ([#2482](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2482)) + +## 1.1.63 + +- Fix: hard gate deployment phase for infra-planner skill ([#2427](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2427)) + +## 1.1.62 + +- fix azure-upgrade: improve Java Azure SDK BOM migration reliability ([#2270](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2270)) + +## 1.1.61 + +- docs: rename AI Toolkit to Foundry Toolkit for VSCode in microsoft-foundry skill ([#2429](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2429)) + +## 1.1.60 + +- Refresh toolbox skills and add Foundry tool catalog (connector) reference ([#2384](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2384)) + +## 1.1.59 + +- azure-kubernetes: add VPA and pod rightsizing routing triggers ([#2391](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2391)) + +## 1.1.58 + +- feat(azure-kubernetes): Update constraint spec references to match what Deployment Safeguards enforces ([#1976](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1976)) + +## 1.1.57 + +- rename Foundry RBAC roles ([#2281](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2281)) + +## 1.1.56 + +- Add insights into the infra planner skill ([#2345](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2345)) + +## 1.1.55 + +- Add invocations_ws sub-skill to microsoft-foundry ([#2388](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2388)) + +## 1.1.54 + +- Clarify FAOS optimization guidance and improve evaluator contracts leveraging azd ([#2383](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2383)) + +## 1.1.53 + +- Add azure-reliability — Azure App Service reliability reference ([#2242](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2242)) + +## 1.1.52 + +- feature: Move quota workflow to a script ([#2360](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2360)) + +## 1.1.51 + +- fix: toolbox skill invocation and foundry samples path ([#2389](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2389)) + +## 1.1.50 + +- feat: support direct code deployment ([#2362](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2362)) + +## 1.1.49 + +- Clarify FAOS optimization guidance and improve evaluator contracts ([#2286](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2286)) + +## 1.1.48 + +- Add: Fine-tuning sub-skill for microsoft-foundry plugin ([#1995](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1995)) + +## 1.1.47 + +- updated plugin.json to skip default hooks.json discovery from vscode ([#2308](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2308)) + +## 1.1.46 + +- feat(azure-diagnostics/inspektor-gadget): Use correct filter for tcpdump gadget ([#2292](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2292)) + +## 1.1.45 + +- feat(microsoft-foundry): add Tracing Insights API skill for automated anomaly detection ([#2276](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2276)) + +## 1.1.44 + +- fix(microsoft-foundry): update integrate toolbox into hosted-agent flow ([#2264](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2264)) + +## 1.1.43 + +- Clarify FAOS optimization guidance and custom evaluator contracts ([#2251](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2251)) + +## 1.1.42 + +- Add azure-reliability skill (Functions) ([#2241](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2241)) + +## 1.1.41 + +- azure-diagnostics: Add Inspektor Gadget Reference ([#1961](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1961)) + +## 1.1.40 + +- fix: update foundry-agent invoke skill for invocations protocol ([#2154](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2154)) + +## 1.1.39 + +- ci(eval): migrate to Vally eval framework with v0.4.0 features ([#1912](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1912)) + +## 1.1.38 + +- Fix broken VPA installation link in azure-aks-vpa.md ([#2178](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2178)) + +## 1.1.37 + +- fix: improve azure-hosted-copilot-sdk routing for codebase-detection scenarios ([#1857](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1857)) + +## 1.1.36 + +- FAOS optimize preparation skill ([#2174](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2174)) + +## 1.1.35 + +- Add Spring Boot to Azure Container Apps migration skill ([#1569](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1569)) + +## 1.1.34 + +- Gap-5: App Service Operate (B+ → A) — SKU selection, custom domains, networking ([#1639](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1639)) + +## 1.1.33 + +- azure-upgrade: add Redis (ACR/OSS and ACRE) -> AMR migration scenarios ([#2159](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2159)) + +## 1.1.32 + +- feature: Feature/azure compute/enablemachinemanagement ([#2069](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2069)) + +## 1.1.31 + +- Gap-8: App Service Migrate (F → A) — Beanstalk + Heroku + App Engine migration guides ([#1633](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1633)) + +## 1.1.30 + +- Gap-10: Container Apps Observe (B → A) — Observability playbook + Dapr tracing ([#1642](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1642)) + +## 1.1.29 + +- fix(app-service-templates): address review feedback — discoverability, auth IaC, token refresh, source splits ([#1635](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1635)) + +## 1.1.28 + +- Add missing instructions for terraform two-phase pre deploy check ([#2138](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2138)) + +## 1.1.27 + +- update the path in script to support claude marketplace file refs ([#2122](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2122)) + +## 1.1.26 + +- Add private-network sub-skill for Foundry VNet deployment ([#2073](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2073)) + +## 1.1.25 + +- Eval suite renaming and multiple env & agent folder support. ([#2092](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2092)) + +## 1.1.24 + +- fix: update toolbox sample link ([#2078](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2078)) + +## 1.1.23 + +- Add continuous-eval observe ref for Foundry agent Monitoring ([#1733](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1733)) + +## 1.1.22 + +- Gap-6: App Service Diagnose (B → A) — Dedicated troubleshooting guide ([#1640](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1640)) + +## 1.1.21 + +- fix: Remove context7 MCP server from plugin config ([#2100](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2100)) + +## 1.1.20 + +- feat: Extend `azure-upgrade` skill by adding workflow for migrating legacy Azure SDKs for Java to latest modern ones ([#1901](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1901)) + +## 1.1.19 + +- Add entra-agent-id skill ([#2033](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2033)) + +## 1.1.18 + +- fix: strengthen azure-resource-lookup routing for web app/website prompts ([#2006](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2006)) + +## 1.1.17 + +- Move Azure Messaging Troubleshooting Info To New Directory ([#1986](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1986)) + +## 1.1.16 + +- Ask agent to remove stale IaC after potential conversion ([#2032](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2032)) + +## 1.1.15 + +- Gap-3: Container Apps Operate (C → A) — Revisions, day-2 ops, networking ([#1637](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1637)) + +## 1.1.14 + +- feat: generate CHANGELOG.md at build time from git history ([#2068](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2068)) + +## 1.1.13 + +- Extend azure-cloud-migrate skill with AWS Fargate to Container Apps scenario ([#1534](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1534)) + +## 1.1.12 + +- chore: update post-deployment rbac assignment logic ([#2057](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2057)) + +## 1.1.11 + +- fix: Add Foundry Toolbox integration to hosted agent create skill ([#2035](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2035)) + +## 1.1.10 + +- Remove hardcoded Azure Functions templates, use MCP tool ([#1949](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1949)) + +## 1.1.9 + +- fix: strengthen azure-storage routing for storage tiers informational prompts ([#2008](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2008)) + +## 1.1.8 + +- docs(cloud-migrate): add Kubernetes to Container Apps migration guidance ([#1568](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1568)) + +## 1.1.7 + +- fix(azure-prepare): mandate Active Directory Default in SQL connection strings ([#1937](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1937)) + +## 1.1.6 + +- fix(azure-prepare): fix Aspire AddParameter+WithBuildArg guidance for all azd versions ([#1939](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1939)) + +## 1.1.5 + +- refactor: support multi-protocol (responses + invocation) in create skill, fix invoke skill and other issues ([#2013](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2013)) + +## 1.1.4 + +- chore: support hosted agent v2 in code gen and deploy skill ([#2000](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/2000)) + +## 1.1.3 + +- Refactor aks troubleshoot paths ([#1987](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1987)) + +## 1.1.2 + +- fix: clarify output directory naming to use workspace root basename ([#1990](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1990)) + +## 1.1.1 + +- Tweak instructions to resolve synk high risks ([#1988](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1988)) + +## 1.1.0 + +- Add Gulp build system with NBGV versioning ([#1968](https://github.com/microsoft/GitHub-Copilot-for-Azure/pull/1968)) \ No newline at end of file diff --git a/plugin/gemini-extension.json b/plugins/azure-skills/gemini-extension.json similarity index 100% rename from plugin/gemini-extension.json rename to plugins/azure-skills/gemini-extension.json diff --git a/plugin/hooks/claude-hooks.json b/plugins/azure-skills/hooks/claude-hooks.json similarity index 100% rename from plugin/hooks/claude-hooks.json rename to plugins/azure-skills/hooks/claude-hooks.json diff --git a/plugin/hooks/cursor-hooks.json b/plugins/azure-skills/hooks/cursor-hooks.json similarity index 100% rename from plugin/hooks/cursor-hooks.json rename to plugins/azure-skills/hooks/cursor-hooks.json diff --git a/plugin/hooks/hooks.json b/plugins/azure-skills/hooks/hooks.json similarity index 100% rename from plugin/hooks/hooks.json rename to plugins/azure-skills/hooks/hooks.json diff --git a/plugin/hooks/scripts/track-telemetry.ps1 b/plugins/azure-skills/hooks/scripts/track-telemetry.ps1 similarity index 100% rename from plugin/hooks/scripts/track-telemetry.ps1 rename to plugins/azure-skills/hooks/scripts/track-telemetry.ps1 diff --git a/plugin/hooks/scripts/track-telemetry.sh b/plugins/azure-skills/hooks/scripts/track-telemetry.sh similarity index 100% rename from plugin/hooks/scripts/track-telemetry.sh rename to plugins/azure-skills/hooks/scripts/track-telemetry.sh diff --git a/plugin/skills/airunway-aks-setup/SKILL.md b/plugins/azure-skills/skills/airunway-aks-setup/SKILL.md similarity index 100% rename from plugin/skills/airunway-aks-setup/SKILL.md rename to plugins/azure-skills/skills/airunway-aks-setup/SKILL.md diff --git a/plugin/skills/airunway-aks-setup/references/gpu-profiles.md b/plugins/azure-skills/skills/airunway-aks-setup/references/gpu-profiles.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/gpu-profiles.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/gpu-profiles.md diff --git a/plugin/skills/airunway-aks-setup/references/model-sizing.md b/plugins/azure-skills/skills/airunway-aks-setup/references/model-sizing.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/model-sizing.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/model-sizing.md diff --git a/plugin/skills/airunway-aks-setup/references/powershell-notes.md b/plugins/azure-skills/skills/airunway-aks-setup/references/powershell-notes.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/powershell-notes.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/powershell-notes.md diff --git a/plugin/skills/airunway-aks-setup/references/steps/step-1-verify.md b/plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-1-verify.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/steps/step-1-verify.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-1-verify.md diff --git a/plugin/skills/airunway-aks-setup/references/steps/step-2-controller.md b/plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-2-controller.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/steps/step-2-controller.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-2-controller.md diff --git a/plugin/skills/airunway-aks-setup/references/steps/step-3-gpu.md b/plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-3-gpu.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/steps/step-3-gpu.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-3-gpu.md diff --git a/plugin/skills/airunway-aks-setup/references/steps/step-4-provider.md b/plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-4-provider.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/steps/step-4-provider.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-4-provider.md diff --git a/plugin/skills/airunway-aks-setup/references/steps/step-5-deploy.md b/plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-5-deploy.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/steps/step-5-deploy.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-5-deploy.md diff --git a/plugin/skills/airunway-aks-setup/references/steps/step-6-summary.md b/plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-6-summary.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/steps/step-6-summary.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/steps/step-6-summary.md diff --git a/plugin/skills/airunway-aks-setup/references/troubleshooting.md b/plugins/azure-skills/skills/airunway-aks-setup/references/troubleshooting.md similarity index 100% rename from plugin/skills/airunway-aks-setup/references/troubleshooting.md rename to plugins/azure-skills/skills/airunway-aks-setup/references/troubleshooting.md diff --git a/plugin/skills/airunway-aks-setup/version.json b/plugins/azure-skills/skills/airunway-aks-setup/version.json similarity index 100% rename from plugin/skills/airunway-aks-setup/version.json rename to plugins/azure-skills/skills/airunway-aks-setup/version.json diff --git a/plugin/skills/appinsights-instrumentation/LICENSE.txt b/plugins/azure-skills/skills/appinsights-instrumentation/LICENSE.txt similarity index 100% rename from plugin/skills/appinsights-instrumentation/LICENSE.txt rename to plugins/azure-skills/skills/appinsights-instrumentation/LICENSE.txt diff --git a/plugin/skills/appinsights-instrumentation/SKILL.md b/plugins/azure-skills/skills/appinsights-instrumentation/SKILL.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/SKILL.md rename to plugins/azure-skills/skills/appinsights-instrumentation/SKILL.md diff --git a/plugin/skills/appinsights-instrumentation/examples/appinsights.bicep b/plugins/azure-skills/skills/appinsights-instrumentation/examples/appinsights.bicep similarity index 100% rename from plugin/skills/appinsights-instrumentation/examples/appinsights.bicep rename to plugins/azure-skills/skills/appinsights-instrumentation/examples/appinsights.bicep diff --git a/plugin/skills/appinsights-instrumentation/references/aspnetcore.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/aspnetcore.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/aspnetcore.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/aspnetcore.md diff --git a/plugin/skills/appinsights-instrumentation/references/auto.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/auto.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/auto.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/auto.md diff --git a/plugin/skills/appinsights-instrumentation/references/container-apps.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/container-apps.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/container-apps.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/container-apps.md diff --git a/plugin/skills/appinsights-instrumentation/references/nodejs.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/nodejs.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/nodejs.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/nodejs.md diff --git a/plugin/skills/appinsights-instrumentation/references/python.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/python.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/python.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/python.md diff --git a/plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-java.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-java.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-java.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-java.md diff --git a/plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-py.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-py.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-py.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-exporter-py.md diff --git a/plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-py.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-py.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-py.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-py.md diff --git a/plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-ts.md b/plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-ts.md similarity index 100% rename from plugin/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-ts.md rename to plugins/azure-skills/skills/appinsights-instrumentation/references/sdk/azure-monitor-opentelemetry-ts.md diff --git a/plugin/skills/appinsights-instrumentation/scripts/appinsights.ps1 b/plugins/azure-skills/skills/appinsights-instrumentation/scripts/appinsights.ps1 similarity index 100% rename from plugin/skills/appinsights-instrumentation/scripts/appinsights.ps1 rename to plugins/azure-skills/skills/appinsights-instrumentation/scripts/appinsights.ps1 diff --git a/plugin/skills/microsoft-foundry/version.json b/plugins/azure-skills/skills/appinsights-instrumentation/version.json similarity index 96% rename from plugin/skills/microsoft-foundry/version.json rename to plugins/azure-skills/skills/appinsights-instrumentation/version.json index af73f6419..f6a681a2d 100644 --- a/plugin/skills/microsoft-foundry/version.json +++ b/plugins/azure-skills/skills/appinsights-instrumentation/version.json @@ -3,4 +3,4 @@ "pathFilters": [ "." ] -} +} \ No newline at end of file diff --git a/plugin/skills/azure-ai/SKILL.md b/plugins/azure-skills/skills/azure-ai/SKILL.md similarity index 100% rename from plugin/skills/azure-ai/SKILL.md rename to plugins/azure-skills/skills/azure-ai/SKILL.md diff --git a/plugin/skills/azure-ai/references/auth-best-practices.md b/plugins/azure-skills/skills/azure-ai/references/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-ai/references/auth-best-practices.md rename to plugins/azure-skills/skills/azure-ai/references/auth-best-practices.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-contentsafety-java.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-contentsafety-java.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-contentsafety-java.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-contentsafety-java.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-contentsafety-py.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-contentsafety-py.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-contentsafety-py.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-contentsafety-py.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-contentsafety-ts.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-contentsafety-ts.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-contentsafety-ts.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-contentsafety-ts.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-document-intelligence-dotnet.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-document-intelligence-dotnet.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-document-intelligence-dotnet.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-document-intelligence-dotnet.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-document-intelligence-ts.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-document-intelligence-ts.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-document-intelligence-ts.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-document-intelligence-ts.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-openai-dotnet.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-openai-dotnet.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-openai-dotnet.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-openai-dotnet.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-transcription-py.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-transcription-py.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-transcription-py.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-transcription-py.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-translation-text-py.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-translation-text-py.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-translation-text-py.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-translation-text-py.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-translation-ts.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-translation-ts.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-translation-ts.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-translation-ts.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-java.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-java.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-java.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-java.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-py.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-py.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-py.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-ai-vision-imageanalysis-py.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-search-documents-dotnet.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-search-documents-dotnet.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-search-documents-dotnet.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-search-documents-dotnet.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-search-documents-py.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-search-documents-py.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-search-documents-py.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-search-documents-py.md diff --git a/plugin/skills/azure-ai/references/sdk/azure-search-documents-ts.md b/plugins/azure-skills/skills/azure-ai/references/sdk/azure-search-documents-ts.md similarity index 100% rename from plugin/skills/azure-ai/references/sdk/azure-search-documents-ts.md rename to plugins/azure-skills/skills/azure-ai/references/sdk/azure-search-documents-ts.md diff --git a/plugin/skills/appinsights-instrumentation/version.json b/plugins/azure-skills/skills/azure-ai/version.json similarity index 100% rename from plugin/skills/appinsights-instrumentation/version.json rename to plugins/azure-skills/skills/azure-ai/version.json diff --git a/plugin/skills/azure-aigateway/SKILL.md b/plugins/azure-skills/skills/azure-aigateway/SKILL.md similarity index 100% rename from plugin/skills/azure-aigateway/SKILL.md rename to plugins/azure-skills/skills/azure-aigateway/SKILL.md diff --git a/plugin/skills/azure-aigateway/references/auth-best-practices.md b/plugins/azure-skills/skills/azure-aigateway/references/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-aigateway/references/auth-best-practices.md rename to plugins/azure-skills/skills/azure-aigateway/references/auth-best-practices.md diff --git a/plugin/skills/azure-aigateway/references/patterns.md b/plugins/azure-skills/skills/azure-aigateway/references/patterns.md similarity index 100% rename from plugin/skills/azure-aigateway/references/patterns.md rename to plugins/azure-skills/skills/azure-aigateway/references/patterns.md diff --git a/plugin/skills/azure-aigateway/references/policies.md b/plugins/azure-skills/skills/azure-aigateway/references/policies.md similarity index 100% rename from plugin/skills/azure-aigateway/references/policies.md rename to plugins/azure-skills/skills/azure-aigateway/references/policies.md diff --git a/plugin/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-py.md b/plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-py.md similarity index 100% rename from plugin/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-py.md rename to plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-py.md diff --git a/plugin/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-ts.md b/plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-ts.md similarity index 100% rename from plugin/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-ts.md rename to plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-ai-contentsafety-ts.md diff --git a/plugin/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-dotnet.md b/plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-dotnet.md similarity index 100% rename from plugin/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-dotnet.md rename to plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-dotnet.md diff --git a/plugin/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-py.md b/plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-py.md similarity index 100% rename from plugin/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-py.md rename to plugins/azure-skills/skills/azure-aigateway/references/sdk/azure-mgmt-apimanagement-py.md diff --git a/plugin/skills/azure-aigateway/references/troubleshooting.md b/plugins/azure-skills/skills/azure-aigateway/references/troubleshooting.md similarity index 100% rename from plugin/skills/azure-aigateway/references/troubleshooting.md rename to plugins/azure-skills/skills/azure-aigateway/references/troubleshooting.md diff --git a/plugin/skills/azure-aigateway/version.json b/plugins/azure-skills/skills/azure-aigateway/version.json similarity index 100% rename from plugin/skills/azure-aigateway/version.json rename to plugins/azure-skills/skills/azure-aigateway/version.json diff --git a/plugin/skills/azure-app-onboard-prereq/SKILL.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/SKILL.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/SKILL.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/SKILL.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/build-check.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/build-check.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/build-check.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/build-check.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/cloud-sdk-migration.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/cloud-sdk-migration.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/cloud-sdk-migration.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/cloud-sdk-migration.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/completeness-check.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/completeness-check.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/completeness-check.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/completeness-check.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/component-mapping.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/component-mapping.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/component-mapping.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/component-mapping.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/dependency-compatibility.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/dependency-compatibility.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/dependency-compatibility.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/dependency-compatibility.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/deployability-check.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/deployability-check.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/deployability-check.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/deployability-check.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/prereq-artifacts.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/prereq-artifacts.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/prereq-artifacts.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/prereq-artifacts.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/prereq-schemas.ts b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/prereq-schemas.ts similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/prereq-schemas.ts rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/prereq-schemas.ts diff --git a/plugin/skills/azure-app-onboard-prereq/references/readiness-gate.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/readiness-gate.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/readiness-gate.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/readiness-gate.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/remediation-protocol.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/remediation-protocol.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/remediation-protocol.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/remediation-protocol.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/session-protocol.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/session-protocol.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/session-protocol.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/session-protocol.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/session-schemas.ts b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/session-schemas.ts similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/session-schemas.ts rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/session-schemas.ts diff --git a/plugin/skills/azure-app-onboard-prereq/references/subagent-starter-scaffold.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/subagent-starter-scaffold.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/subagent-starter-scaffold.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/subagent-starter-scaffold.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/subscription-resolution.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/subscription-resolution.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/subscription-resolution.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/subscription-resolution.md diff --git a/plugin/skills/azure-app-onboard-prereq/references/zero-code-path.md b/plugins/azure-skills/skills/azure-app-onboard-prereq/references/zero-code-path.md similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/references/zero-code-path.md rename to plugins/azure-skills/skills/azure-app-onboard-prereq/references/zero-code-path.md diff --git a/plugin/skills/azure-ai/version.json b/plugins/azure-skills/skills/azure-app-onboard-prereq/version.json similarity index 100% rename from plugin/skills/azure-ai/version.json rename to plugins/azure-skills/skills/azure-app-onboard-prereq/version.json diff --git a/plugin/skills/azure-app-onboard/SKILL.md b/plugins/azure-skills/skills/azure-app-onboard/SKILL.md similarity index 100% rename from plugin/skills/azure-app-onboard/SKILL.md rename to plugins/azure-skills/skills/azure-app-onboard/SKILL.md diff --git a/plugin/skills/azure-app-onboard/deploy/SKILL.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/SKILL.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/SKILL.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/SKILL.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/approval-gate-template.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/approval-gate-template.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/approval-gate-template.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/approval-gate-template.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/blocked-patterns.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/blocked-patterns.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/blocked-patterns.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/blocked-patterns.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/code-deployment-appservice.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/code-deployment-appservice.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/code-deployment-appservice.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/code-deployment-appservice.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/code-deployment-container-apps.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/code-deployment-container-apps.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/code-deployment-container-apps.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/code-deployment-container-apps.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/code-deployment-swa.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/code-deployment-swa.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/code-deployment-swa.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/code-deployment-swa.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/database-post-deploy.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/database-post-deploy.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/database-post-deploy.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/database-post-deploy.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/deploy-checklist-template.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/deploy-checklist-template.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/deploy-checklist-template.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/deploy-checklist-template.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/deploy-safety.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/deploy-safety.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/deploy-safety.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/deploy-safety.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/deploy-schemas.ts b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/deploy-schemas.ts similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/deploy-schemas.ts rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/deploy-schemas.ts diff --git a/plugin/skills/azure-app-onboard/deploy/references/error-classification.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/error-classification.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/error-classification.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/error-classification.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/health-check-patterns.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/health-check-patterns.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/health-check-patterns.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/health-check-patterns.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/mcp-tools.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/mcp-tools.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/mcp-tools.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/mcp-tools.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/portal-links.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/portal-links.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/portal-links.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/portal-links.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/preflight-checks.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/preflight-checks.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/preflight-checks.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/preflight-checks.md diff --git a/plugin/skills/azure-app-onboard/deploy/references/subagent-preflight.md b/plugins/azure-skills/skills/azure-app-onboard/deploy/references/subagent-preflight.md similarity index 100% rename from plugin/skills/azure-app-onboard/deploy/references/subagent-preflight.md rename to plugins/azure-skills/skills/azure-app-onboard/deploy/references/subagent-preflight.md diff --git a/plugin/skills/azure-app-onboard/prepare/SKILL.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/SKILL.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/SKILL.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/SKILL.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/deploy-strategy.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/deploy-strategy.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/deploy-strategy.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/deploy-strategy.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/mcp-tools.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/mcp-tools.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/mcp-tools.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/mcp-tools.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/naming-patterns.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/naming-patterns.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/naming-patterns.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/naming-patterns.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/prepare-schemas.ts b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/prepare-schemas.ts similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/prepare-schemas.ts rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/prepare-schemas.ts diff --git a/plugin/skills/azure-app-onboard/prepare/references/pricing-guide-services.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/pricing-guide-services.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/pricing-guide-services.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/pricing-guide-services.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/pricing-guide.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/pricing-guide.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/pricing-guide.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/pricing-guide.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/service-mapping.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/service-mapping.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/service-mapping.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/service-mapping.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/sku-matrix.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/sku-matrix.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/sku-matrix.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/sku-matrix.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/sku-quota-validation.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/sku-quota-validation.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/sku-quota-validation.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/sku-quota-validation.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/subagent-pricing.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/subagent-pricing.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/subagent-pricing.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/subagent-pricing.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/subagent-quota.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/subagent-quota.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/subagent-quota.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/subagent-quota.md diff --git a/plugin/skills/azure-app-onboard/prepare/references/validation-rubric.md b/plugins/azure-skills/skills/azure-app-onboard/prepare/references/validation-rubric.md similarity index 100% rename from plugin/skills/azure-app-onboard/prepare/references/validation-rubric.md rename to plugins/azure-skills/skills/azure-app-onboard/prepare/references/validation-rubric.md diff --git a/plugin/skills/azure-app-onboard/references/approval-gates.md b/plugins/azure-skills/skills/azure-app-onboard/references/approval-gates.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/approval-gates.md rename to plugins/azure-skills/skills/azure-app-onboard/references/approval-gates.md diff --git a/plugin/skills/azure-app-onboard/references/azd-template-routing.md b/plugins/azure-skills/skills/azure-app-onboard/references/azd-template-routing.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/azd-template-routing.md rename to plugins/azure-skills/skills/azure-app-onboard/references/azd-template-routing.md diff --git a/plugin/skills/azure-app-onboard/references/handoff-protocol.md b/plugins/azure-skills/skills/azure-app-onboard/references/handoff-protocol.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/handoff-protocol.md rename to plugins/azure-skills/skills/azure-app-onboard/references/handoff-protocol.md diff --git a/plugin/skills/azure-app-onboard/references/iac-resources.md b/plugins/azure-skills/skills/azure-app-onboard/references/iac-resources.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/iac-resources.md rename to plugins/azure-skills/skills/azure-app-onboard/references/iac-resources.md diff --git a/plugin/skills/azure-app-onboard/references/intent-gathering.md b/plugins/azure-skills/skills/azure-app-onboard/references/intent-gathering.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/intent-gathering.md rename to plugins/azure-skills/skills/azure-app-onboard/references/intent-gathering.md diff --git a/plugin/skills/azure-app-onboard/references/mcp-tool-reference.md b/plugins/azure-skills/skills/azure-app-onboard/references/mcp-tool-reference.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/mcp-tool-reference.md rename to plugins/azure-skills/skills/azure-app-onboard/references/mcp-tool-reference.md diff --git a/plugin/skills/azure-app-onboard/references/pipeline-rules-runtime.md b/plugins/azure-skills/skills/azure-app-onboard/references/pipeline-rules-runtime.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/pipeline-rules-runtime.md rename to plugins/azure-skills/skills/azure-app-onboard/references/pipeline-rules-runtime.md diff --git a/plugin/skills/azure-app-onboard/references/pipeline-rules.md b/plugins/azure-skills/skills/azure-app-onboard/references/pipeline-rules.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/pipeline-rules.md rename to plugins/azure-skills/skills/azure-app-onboard/references/pipeline-rules.md diff --git a/plugin/skills/azure-app-onboard/references/session-protocol.md b/plugins/azure-skills/skills/azure-app-onboard/references/session-protocol.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/session-protocol.md rename to plugins/azure-skills/skills/azure-app-onboard/references/session-protocol.md diff --git a/plugin/skills/azure-app-onboard/references/session-schemas.ts b/plugins/azure-skills/skills/azure-app-onboard/references/session-schemas.ts similarity index 100% rename from plugin/skills/azure-app-onboard/references/session-schemas.ts rename to plugins/azure-skills/skills/azure-app-onboard/references/session-schemas.ts diff --git a/plugin/skills/azure-app-onboard/references/subscription-resolution.md b/plugins/azure-skills/skills/azure-app-onboard/references/subscription-resolution.md similarity index 100% rename from plugin/skills/azure-app-onboard/references/subscription-resolution.md rename to plugins/azure-skills/skills/azure-app-onboard/references/subscription-resolution.md diff --git a/plugin/skills/azure-app-onboard/scaffold/SKILL.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/SKILL.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/SKILL.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/SKILL.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/bicep-app-service.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-app-service.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/bicep-app-service.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-app-service.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/bicep-container-apps.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-container-apps.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/bicep-container-apps.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-container-apps.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/bicep-patterns-data.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-patterns-data.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/bicep-patterns-data.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-patterns-data.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/bicep-patterns-security.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-patterns-security.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/bicep-patterns-security.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-patterns-security.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/bicep-patterns.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-patterns.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/bicep-patterns.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-patterns.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/bicep-swa.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-swa.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/bicep-swa.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/bicep-swa.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/cicd-pipelines.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/cicd-pipelines.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/cicd-pipelines.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/cicd-pipelines.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/dockerfile-generation.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/dockerfile-generation.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/dockerfile-generation.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/dockerfile-generation.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/env-var-secrets.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/env-var-secrets.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/env-var-secrets.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/env-var-secrets.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/error-handling.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/error-handling.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/error-handling.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/error-handling.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/iac-generation-rules.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/iac-generation-rules.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/iac-generation-rules.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/iac-generation-rules.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/mcp-tools.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/mcp-tools.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/mcp-tools.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/mcp-tools.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/rbac-roles.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/rbac-roles.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/rbac-roles.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/rbac-roles.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/scaffold-healing-rules.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/scaffold-healing-rules.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/scaffold-healing-rules.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/scaffold-healing-rules.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/scaffold-schemas.ts b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/scaffold-schemas.ts similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/scaffold-schemas.ts rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/scaffold-schemas.ts diff --git a/plugin/skills/azure-app-onboard/scaffold/references/self-healing.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/self-healing.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/self-healing.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/self-healing.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/self-review-checklist.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/self-review-checklist.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/self-review-checklist.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/self-review-checklist.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/self-review-procedure.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/self-review-procedure.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/self-review-procedure.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/self-review-procedure.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/subagent-iac-gen.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/subagent-iac-gen.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/subagent-iac-gen.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/subagent-iac-gen.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/subagent-review.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/subagent-review.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/subagent-review.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/subagent-review.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/subagent-validate.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/subagent-validate.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/subagent-validate.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/subagent-validate.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/terraform-patterns.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/terraform-patterns.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/terraform-patterns.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/terraform-patterns.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/validation-and-manifest.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/validation-and-manifest.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/validation-and-manifest.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/validation-and-manifest.md diff --git a/plugin/skills/azure-app-onboard/scaffold/references/waf-checklist.md b/plugins/azure-skills/skills/azure-app-onboard/scaffold/references/waf-checklist.md similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/references/waf-checklist.md rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/references/waf-checklist.md diff --git a/plugin/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.ps1 b/plugins/azure-skills/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.ps1 similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.ps1 rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.ps1 diff --git a/plugin/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.sh b/plugins/azure-skills/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.sh similarity index 100% rename from plugin/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.sh rename to plugins/azure-skills/skills/azure-app-onboard/scaffold/scripts/scaffold-conformance.sh diff --git a/plugin/skills/azure-app-onboard-prereq/version.json b/plugins/azure-skills/skills/azure-app-onboard/version.json similarity index 100% rename from plugin/skills/azure-app-onboard-prereq/version.json rename to plugins/azure-skills/skills/azure-app-onboard/version.json diff --git a/plugin/skills/azure-cloud-migrate/SKILL.md b/plugins/azure-skills/skills/azure-cloud-migrate/SKILL.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/SKILL.md rename to plugins/azure-skills/skills/azure-cloud-migrate/SKILL.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/app-service/app-engine-to-app-service.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/app-engine-to-app-service.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/app-service/app-engine-to-app-service.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/app-engine-to-app-service.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/app-service/assessment.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/assessment.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/app-service/assessment.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/assessment.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/app-service/beanstalk-to-app-service.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/beanstalk-to-app-service.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/app-service/beanstalk-to-app-service.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/beanstalk-to-app-service.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/app-service/code-migration.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/code-migration.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/app-service/code-migration.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/code-migration.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/app-service/global-rules.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/global-rules.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/app-service/global-rules.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/global-rules.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/app-service/heroku-to-app-service.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/heroku-to-app-service.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/app-service/heroku-to-app-service.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/app-service/heroku-to-app-service.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/assessment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/assessment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/assessment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/assessment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-assessment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-assessment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-assessment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-assessment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-deployment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-deployment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-deployment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-deployment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-to-container-apps.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-to-container-apps.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-to-container-apps.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/cloudrun-to-container-apps.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/deployment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/deployment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/deployment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/deployment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/fargate-assessment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/fargate-assessment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/fargate-assessment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/fargate-assessment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/fargate-deployment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/fargate-deployment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/fargate-deployment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/fargate-deployment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/fargate-to-container-apps.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/fargate-to-container-apps.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/fargate-to-container-apps.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/fargate-to-container-apps.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/k8s-to-container-apps.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/k8s-to-container-apps.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/k8s-to-container-apps.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/k8s-to-container-apps.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-apps-to-aca.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-apps-to-aca.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-apps-to-aca.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-apps-to-aca.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-assessment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-assessment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-assessment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-assessment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-dependency-patterns.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-dependency-patterns.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-dependency-patterns.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-dependency-patterns.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-deployment-guide.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-deployment-guide.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/container-apps/spring-deployment-guide.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/container-apps/spring-deployment-guide.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/assessment.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/assessment.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/assessment.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/assessment.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/code-migration.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/code-migration.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/code-migration.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/code-migration.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/global-rules.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/global-rules.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/global-rules.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/global-rules.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/lambda-to-functions.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/lambda-to-functions.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/lambda-to-functions.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/lambda-to-functions.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/csharp.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/csharp.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/csharp.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/csharp.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/java.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/java.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/java.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/java.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/javascript.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/javascript.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/javascript.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/javascript.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/powershell.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/powershell.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/powershell.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/powershell.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/python.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/python.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/python.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/python.md diff --git a/plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/typescript.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/typescript.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/typescript.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/services/functions/runtimes/typescript.md diff --git a/plugin/skills/azure-cloud-migrate/references/workflow-details.md b/plugins/azure-skills/skills/azure-cloud-migrate/references/workflow-details.md similarity index 100% rename from plugin/skills/azure-cloud-migrate/references/workflow-details.md rename to plugins/azure-skills/skills/azure-cloud-migrate/references/workflow-details.md diff --git a/plugin/skills/azure-cloud-migrate/version.json b/plugins/azure-skills/skills/azure-cloud-migrate/version.json similarity index 100% rename from plugin/skills/azure-cloud-migrate/version.json rename to plugins/azure-skills/skills/azure-cloud-migrate/version.json diff --git a/plugin/skills/azure-compliance/SKILL.md b/plugins/azure-skills/skills/azure-compliance/SKILL.md similarity index 100% rename from plugin/skills/azure-compliance/SKILL.md rename to plugins/azure-skills/skills/azure-compliance/SKILL.md diff --git a/plugin/skills/azure-compliance/references/auth-best-practices.md b/plugins/azure-skills/skills/azure-compliance/references/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-compliance/references/auth-best-practices.md rename to plugins/azure-skills/skills/azure-compliance/references/auth-best-practices.md diff --git a/plugin/skills/azure-compliance/references/azqr-recommendations.md b/plugins/azure-skills/skills/azure-compliance/references/azqr-recommendations.md similarity index 100% rename from plugin/skills/azure-compliance/references/azqr-recommendations.md rename to plugins/azure-skills/skills/azure-compliance/references/azqr-recommendations.md diff --git a/plugin/skills/azure-compliance/references/azqr-remediation-patterns.md b/plugins/azure-skills/skills/azure-compliance/references/azqr-remediation-patterns.md similarity index 100% rename from plugin/skills/azure-compliance/references/azqr-remediation-patterns.md rename to plugins/azure-skills/skills/azure-compliance/references/azqr-remediation-patterns.md diff --git a/plugin/skills/azure-compliance/references/azure-keyvault-expiration-audit.md b/plugins/azure-skills/skills/azure-compliance/references/azure-keyvault-expiration-audit.md similarity index 100% rename from plugin/skills/azure-compliance/references/azure-keyvault-expiration-audit.md rename to plugins/azure-skills/skills/azure-compliance/references/azure-keyvault-expiration-audit.md diff --git a/plugin/skills/azure-compliance/references/azure-quick-review.md b/plugins/azure-skills/skills/azure-compliance/references/azure-quick-review.md similarity index 100% rename from plugin/skills/azure-compliance/references/azure-quick-review.md rename to plugins/azure-skills/skills/azure-compliance/references/azure-quick-review.md diff --git a/plugin/skills/azure-compliance/references/azure-resource-graph.md b/plugins/azure-skills/skills/azure-compliance/references/azure-resource-graph.md similarity index 100% rename from plugin/skills/azure-compliance/references/azure-resource-graph.md rename to plugins/azure-skills/skills/azure-compliance/references/azure-resource-graph.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-keyvault-certificates-rust.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-certificates-rust.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-keyvault-certificates-rust.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-certificates-rust.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-keyvault-keys-rust.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-keys-rust.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-keyvault-keys-rust.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-keys-rust.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-keyvault-keys-ts.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-keys-ts.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-keyvault-keys-ts.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-keys-ts.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-keyvault-py.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-py.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-keyvault-py.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-py.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-keyvault-secrets-rust.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-secrets-rust.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-keyvault-secrets-rust.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-secrets-rust.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-keyvault-secrets-ts.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-secrets-ts.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-keyvault-secrets-ts.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-keyvault-secrets-ts.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-dotnet.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-dotnet.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-dotnet.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-dotnet.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-java.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-java.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-java.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-security-keyvault-keys-java.md diff --git a/plugin/skills/azure-compliance/references/sdk/azure-security-keyvault-secrets-java.md b/plugins/azure-skills/skills/azure-compliance/references/sdk/azure-security-keyvault-secrets-java.md similarity index 100% rename from plugin/skills/azure-compliance/references/sdk/azure-security-keyvault-secrets-java.md rename to plugins/azure-skills/skills/azure-compliance/references/sdk/azure-security-keyvault-secrets-java.md diff --git a/plugin/skills/azure-app-onboard/version.json b/plugins/azure-skills/skills/azure-compliance/version.json similarity index 100% rename from plugin/skills/azure-app-onboard/version.json rename to plugins/azure-skills/skills/azure-compliance/version.json diff --git a/plugin/skills/azure-compute/SKILL.md b/plugins/azure-skills/skills/azure-compute/SKILL.md similarity index 100% rename from plugin/skills/azure-compute/SKILL.md rename to plugins/azure-skills/skills/azure-compute/SKILL.md diff --git a/plugin/skills/azure-compute/references/retail-prices-api.md b/plugins/azure-skills/skills/azure-compute/references/retail-prices-api.md similarity index 100% rename from plugin/skills/azure-compute/references/retail-prices-api.md rename to plugins/azure-skills/skills/azure-compute/references/retail-prices-api.md diff --git a/plugin/skills/azure-compute/references/vm-families.md b/plugins/azure-skills/skills/azure-compute/references/vm-families.md similarity index 100% rename from plugin/skills/azure-compute/references/vm-families.md rename to plugins/azure-skills/skills/azure-compute/references/vm-families.md diff --git a/plugin/skills/azure-compute/references/vm-quotas.md b/plugins/azure-skills/skills/azure-compute/references/vm-quotas.md similarity index 100% rename from plugin/skills/azure-compute/references/vm-quotas.md rename to plugins/azure-skills/skills/azure-compute/references/vm-quotas.md diff --git a/plugin/skills/azure-compute/references/vmss-guide.md b/plugins/azure-skills/skills/azure-compute/references/vmss-guide.md similarity index 100% rename from plugin/skills/azure-compute/references/vmss-guide.md rename to plugins/azure-skills/skills/azure-compute/references/vmss-guide.md diff --git a/plugin/skills/azure-compute/version.json b/plugins/azure-skills/skills/azure-compute/version.json similarity index 100% rename from plugin/skills/azure-compute/version.json rename to plugins/azure-skills/skills/azure-compute/version.json diff --git a/plugin/skills/azure-compute/workflows/capacity-reservation/capacity-reservation.md b/plugins/azure-skills/skills/azure-compute/workflows/capacity-reservation/capacity-reservation.md similarity index 100% rename from plugin/skills/azure-compute/workflows/capacity-reservation/capacity-reservation.md rename to plugins/azure-skills/skills/azure-compute/workflows/capacity-reservation/capacity-reservation.md diff --git a/plugin/skills/azure-compute/workflows/capacity-reservation/references/association-disassociation.md b/plugins/azure-skills/skills/azure-compute/workflows/capacity-reservation/references/association-disassociation.md similarity index 100% rename from plugin/skills/azure-compute/workflows/capacity-reservation/references/association-disassociation.md rename to plugins/azure-skills/skills/azure-compute/workflows/capacity-reservation/references/association-disassociation.md diff --git a/plugin/skills/azure-compute/workflows/capacity-reservation/references/capacity-reservation-overview.md b/plugins/azure-skills/skills/azure-compute/workflows/capacity-reservation/references/capacity-reservation-overview.md similarity index 100% rename from plugin/skills/azure-compute/workflows/capacity-reservation/references/capacity-reservation-overview.md rename to plugins/azure-skills/skills/azure-compute/workflows/capacity-reservation/references/capacity-reservation-overview.md diff --git a/plugin/skills/azure-compute/workflows/essential-machine-management/essential-machine-management.md b/plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/essential-machine-management.md similarity index 100% rename from plugin/skills/azure-compute/workflows/essential-machine-management/essential-machine-management.md rename to plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/essential-machine-management.md diff --git a/plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow-portal-guidance.md b/plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow-portal-guidance.md similarity index 100% rename from plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow-portal-guidance.md rename to plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow-portal-guidance.md diff --git a/plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow.md b/plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow.md similarity index 100% rename from plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow.md rename to plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-enable-flow.md diff --git a/plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-overview.md b/plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-overview.md similarity index 100% rename from plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-overview.md rename to plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-overview.md diff --git a/plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-prerequisites.md b/plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-prerequisites.md similarity index 100% rename from plugin/skills/azure-compute/workflows/essential-machine-management/references/emm-prerequisites.md rename to plugins/azure-skills/skills/azure-compute/workflows/essential-machine-management/references/emm-prerequisites.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/examples/bicep/README.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/bicep/README.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/examples/bicep/README.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/bicep/README.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/examples/bicep/main.bicep b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/bicep/main.bicep similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/examples/bicep/main.bicep rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/bicep/main.bicep diff --git a/plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/README.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/README.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/README.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/README.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/main.tf b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/main.tf similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/main.tf rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/main.tf diff --git a/plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/outputs.tf b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/outputs.tf similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/outputs.tf rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/outputs.tf diff --git a/plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/variables.tf b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/variables.tf similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/examples/terraform/variables.tf rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/examples/terraform/variables.tf diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/github-pr.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/github-pr.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/github-pr.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/github-pr.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/index.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/index.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/index.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/index.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/print.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/print.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/print.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/print.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/save-local.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/save-local.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/delivery-options/save-local.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/delivery-options/save-local.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/beginner.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/beginner.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/beginner.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/beginner.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/cost-deep.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/cost-deep.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/cost-deep.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/cost-deep.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/index.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/index.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/index.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/index.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/networking-deep.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/networking-deep.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/networking-deep.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/networking-deep.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/security-deep.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/security-deep.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/security-deep.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/security-deep.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/spec-deep.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/spec-deep.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/depth-probe/spec-deep.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/depth-probe/spec-deep.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/mcp-tools.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/mcp-tools.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/mcp-tools.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/mcp-tools.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/az-cli.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/az-cli.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/az-cli.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/az-cli.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/bicep.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/bicep.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/bicep.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/bicep.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/index.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/index.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/index.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/index.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/mcp-apply.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/mcp-apply.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/mcp-apply.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/mcp-apply.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/terraform.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/terraform.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/output-adapters/terraform.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/output-adapters/terraform.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/plan-card.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/plan-card.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/plan-card.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/plan-card.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/references/validation-gates.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/validation-gates.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/references/validation-gates.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/references/validation-gates.md diff --git a/plugin/skills/azure-compute/workflows/vm-creator/vm-creator.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-creator/vm-creator.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-creator/vm-creator.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-creator/vm-creator.md diff --git a/plugin/skills/azure-compute/workflows/vm-recommender/references/handoff-to-creator.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-recommender/references/handoff-to-creator.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-recommender/references/handoff-to-creator.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-recommender/references/handoff-to-creator.md diff --git a/plugin/skills/azure-compute/workflows/vm-recommender/references/web-fetch-policy.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-recommender/references/web-fetch-policy.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-recommender/references/web-fetch-policy.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-recommender/references/web-fetch-policy.md diff --git a/plugin/skills/azure-compute/workflows/vm-recommender/vm-recommender.md b/plugins/azure-skills/skills/azure-compute/workflows/vm-recommender/vm-recommender.md similarity index 100% rename from plugin/skills/azure-compute/workflows/vm-recommender/vm-recommender.md rename to plugins/azure-skills/skills/azure-compute/workflows/vm-recommender/vm-recommender.md diff --git a/plugin/skills/azure-cost/SKILL.md b/plugins/azure-skills/skills/azure-cost/SKILL.md similarity index 100% rename from plugin/skills/azure-cost/SKILL.md rename to plugins/azure-skills/skills/azure-cost/SKILL.md diff --git a/plugin/skills/azure-cost/cost-forecast/error-handling.md b/plugins/azure-skills/skills/azure-cost/cost-forecast/error-handling.md similarity index 100% rename from plugin/skills/azure-cost/cost-forecast/error-handling.md rename to plugins/azure-skills/skills/azure-cost/cost-forecast/error-handling.md diff --git a/plugin/skills/azure-cost/cost-forecast/examples.md b/plugins/azure-skills/skills/azure-cost/cost-forecast/examples.md similarity index 100% rename from plugin/skills/azure-cost/cost-forecast/examples.md rename to plugins/azure-skills/skills/azure-cost/cost-forecast/examples.md diff --git a/plugin/skills/azure-cost/cost-forecast/guardrails.md b/plugins/azure-skills/skills/azure-cost/cost-forecast/guardrails.md similarity index 100% rename from plugin/skills/azure-cost/cost-forecast/guardrails.md rename to plugins/azure-skills/skills/azure-cost/cost-forecast/guardrails.md diff --git a/plugin/skills/azure-cost/cost-forecast/request-body-schema.md b/plugins/azure-skills/skills/azure-cost/cost-forecast/request-body-schema.md similarity index 100% rename from plugin/skills/azure-cost/cost-forecast/request-body-schema.md rename to plugins/azure-skills/skills/azure-cost/cost-forecast/request-body-schema.md diff --git a/plugin/skills/azure-cost/cost-forecast/workflow.md b/plugins/azure-skills/skills/azure-cost/cost-forecast/workflow.md similarity index 100% rename from plugin/skills/azure-cost/cost-forecast/workflow.md rename to plugins/azure-skills/skills/azure-cost/cost-forecast/workflow.md diff --git a/plugin/skills/azure-cost/cost-optimization/auth-best-practices.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/auth-best-practices.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/auth-best-practices.md diff --git a/plugin/skills/azure-cost/cost-optimization/azure-aks-anomalies.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/azure-aks-anomalies.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/azure-aks-anomalies.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/azure-aks-anomalies.md diff --git a/plugin/skills/azure-cost/cost-optimization/azure-aks-cost-addon.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/azure-aks-cost-addon.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/azure-aks-cost-addon.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/azure-aks-cost-addon.md diff --git a/plugin/skills/azure-cost/cost-optimization/azure-quick-review.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/azure-quick-review.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/azure-quick-review.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/azure-quick-review.md diff --git a/plugin/skills/azure-cost/cost-optimization/azure-resource-graph.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/azure-resource-graph.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/azure-resource-graph.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/azure-resource-graph.md diff --git a/plugin/skills/azure-cost/cost-optimization/report-template.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/report-template.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/report-template.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/report-template.md diff --git a/plugin/skills/azure-cost/cost-optimization/sdk/azure-resource-manager-redis-dotnet.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/sdk/azure-resource-manager-redis-dotnet.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/sdk/azure-resource-manager-redis-dotnet.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/sdk/azure-resource-manager-redis-dotnet.md diff --git a/plugin/skills/azure-cost/cost-optimization/services/redis/azure-cache-for-redis.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/services/redis/azure-cache-for-redis.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/services/redis/azure-cache-for-redis.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/services/redis/azure-cache-for-redis.md diff --git a/plugin/skills/azure-cost/cost-optimization/services/storage/azure-storage.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/services/storage/azure-storage.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/services/storage/azure-storage.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/services/storage/azure-storage.md diff --git a/plugin/skills/azure-cost/cost-optimization/workflow.md b/plugins/azure-skills/skills/azure-cost/cost-optimization/workflow.md similarity index 100% rename from plugin/skills/azure-cost/cost-optimization/workflow.md rename to plugins/azure-skills/skills/azure-cost/cost-optimization/workflow.md diff --git a/plugin/skills/azure-cost/cost-query/dimensions-by-scope.md b/plugins/azure-skills/skills/azure-cost/cost-query/dimensions-by-scope.md similarity index 100% rename from plugin/skills/azure-cost/cost-query/dimensions-by-scope.md rename to plugins/azure-skills/skills/azure-cost/cost-query/dimensions-by-scope.md diff --git a/plugin/skills/azure-cost/cost-query/error-handling.md b/plugins/azure-skills/skills/azure-cost/cost-query/error-handling.md similarity index 100% rename from plugin/skills/azure-cost/cost-query/error-handling.md rename to plugins/azure-skills/skills/azure-cost/cost-query/error-handling.md diff --git a/plugin/skills/azure-cost/cost-query/examples.md b/plugins/azure-skills/skills/azure-cost/cost-query/examples.md similarity index 100% rename from plugin/skills/azure-cost/cost-query/examples.md rename to plugins/azure-skills/skills/azure-cost/cost-query/examples.md diff --git a/plugin/skills/azure-cost/cost-query/guardrails.md b/plugins/azure-skills/skills/azure-cost/cost-query/guardrails.md similarity index 100% rename from plugin/skills/azure-cost/cost-query/guardrails.md rename to plugins/azure-skills/skills/azure-cost/cost-query/guardrails.md diff --git a/plugin/skills/azure-cost/cost-query/request-body-schema.md b/plugins/azure-skills/skills/azure-cost/cost-query/request-body-schema.md similarity index 100% rename from plugin/skills/azure-cost/cost-query/request-body-schema.md rename to plugins/azure-skills/skills/azure-cost/cost-query/request-body-schema.md diff --git a/plugin/skills/azure-cost/cost-query/workflow.md b/plugins/azure-skills/skills/azure-cost/cost-query/workflow.md similarity index 100% rename from plugin/skills/azure-cost/cost-query/workflow.md rename to plugins/azure-skills/skills/azure-cost/cost-query/workflow.md diff --git a/plugin/skills/azure-cost/references/tools-and-best-practices.md b/plugins/azure-skills/skills/azure-cost/references/tools-and-best-practices.md similarity index 100% rename from plugin/skills/azure-cost/references/tools-and-best-practices.md rename to plugins/azure-skills/skills/azure-cost/references/tools-and-best-practices.md diff --git a/plugin/skills/azure-cost/version.json b/plugins/azure-skills/skills/azure-cost/version.json similarity index 100% rename from plugin/skills/azure-cost/version.json rename to plugins/azure-skills/skills/azure-cost/version.json diff --git a/plugin/skills/azure-deploy/SKILL.md b/plugins/azure-skills/skills/azure-deploy/SKILL.md similarity index 100% rename from plugin/skills/azure-deploy/SKILL.md rename to plugins/azure-skills/skills/azure-deploy/SKILL.md diff --git a/plugin/skills/azure-deploy/references/auth-best-practices.md b/plugins/azure-skills/skills/azure-deploy/references/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-deploy/references/auth-best-practices.md rename to plugins/azure-skills/skills/azure-deploy/references/auth-best-practices.md diff --git a/plugin/skills/azure-deploy/references/global-rules.md b/plugins/azure-skills/skills/azure-deploy/references/global-rules.md similarity index 100% rename from plugin/skills/azure-deploy/references/global-rules.md rename to plugins/azure-skills/skills/azure-deploy/references/global-rules.md diff --git a/plugin/skills/azure-deploy/references/live-role-verification.md b/plugins/azure-skills/skills/azure-deploy/references/live-role-verification.md similarity index 100% rename from plugin/skills/azure-deploy/references/live-role-verification.md rename to plugins/azure-skills/skills/azure-deploy/references/live-role-verification.md diff --git a/plugin/skills/azure-deploy/references/pre-deploy-checklist.md b/plugins/azure-skills/skills/azure-deploy/references/pre-deploy-checklist.md similarity index 100% rename from plugin/skills/azure-deploy/references/pre-deploy-checklist.md rename to plugins/azure-skills/skills/azure-deploy/references/pre-deploy-checklist.md diff --git a/plugin/skills/azure-deploy/references/recipes/README.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/README.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/README.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/README.md diff --git a/plugin/skills/azure-deploy/references/recipes/azcli/README.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azcli/README.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azcli/README.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azcli/README.md diff --git a/plugin/skills/azure-deploy/references/recipes/azcli/errors.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azcli/errors.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azcli/errors.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azcli/errors.md diff --git a/plugin/skills/azure-deploy/references/recipes/azcli/verify.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azcli/verify.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azcli/verify.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azcli/verify.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/README.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/README.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/README.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/README.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/ef-migrations.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/ef-migrations.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/ef-migrations.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/ef-migrations.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/errors.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/errors.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/errors.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/errors.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/functions-deploy.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/functions-deploy.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/functions-deploy.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/functions-deploy.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/post-deployment.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/post-deployment.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/post-deployment.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/post-deployment.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.ps1 b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.ps1 similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.ps1 rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.ps1 diff --git a/plugin/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.sh b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.sh similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.sh rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/apply-migrations.sh diff --git a/plugin/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.ps1 b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.ps1 similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.ps1 rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.ps1 diff --git a/plugin/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.sh b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.sh similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.sh rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/scripts/grant-and-migrate.sh diff --git a/plugin/skills/azure-deploy/references/recipes/azd/sql-entra-auth.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/sql-entra-auth.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/sql-entra-auth.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/sql-entra-auth.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/sql-managed-identity.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/sql-managed-identity.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/sql-managed-identity.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/sql-managed-identity.md diff --git a/plugin/skills/azure-deploy/references/recipes/azd/verify.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/azd/verify.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/azd/verify.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/azd/verify.md diff --git a/plugin/skills/azure-deploy/references/recipes/bicep/README.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/bicep/README.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/bicep/README.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/bicep/README.md diff --git a/plugin/skills/azure-deploy/references/recipes/bicep/errors.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/bicep/errors.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/bicep/errors.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/bicep/errors.md diff --git a/plugin/skills/azure-deploy/references/recipes/bicep/verify.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/bicep/verify.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/bicep/verify.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/bicep/verify.md diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/README.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/README.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/README.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/README.md diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/errors.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/errors.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/errors.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/errors.md diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/examples/azdo-azd.yml b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/azdo-azd.yml similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/examples/azdo-azd.yml rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/azdo-azd.yml diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/examples/azdo-multistage.yml b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/azdo-multistage.yml similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/examples/azdo-multistage.yml rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/azdo-multistage.yml diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/examples/github-azd.yml b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/github-azd.yml similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/examples/github-azd.yml rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/github-azd.yml diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/examples/github-bicep.yml b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/github-bicep.yml similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/examples/github-bicep.yml rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/examples/github-bicep.yml diff --git a/plugin/skills/azure-deploy/references/recipes/cicd/verify.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/verify.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/cicd/verify.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/cicd/verify.md diff --git a/plugin/skills/azure-deploy/references/recipes/terraform/README.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/terraform/README.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/terraform/README.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/terraform/README.md diff --git a/plugin/skills/azure-deploy/references/recipes/terraform/errors.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/terraform/errors.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/terraform/errors.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/terraform/errors.md diff --git a/plugin/skills/azure-deploy/references/recipes/terraform/verify.md b/plugins/azure-skills/skills/azure-deploy/references/recipes/terraform/verify.md similarity index 100% rename from plugin/skills/azure-deploy/references/recipes/terraform/verify.md rename to plugins/azure-skills/skills/azure-deploy/references/recipes/terraform/verify.md diff --git a/plugin/skills/azure-deploy/references/region-availability.md b/plugins/azure-skills/skills/azure-deploy/references/region-availability.md similarity index 100% rename from plugin/skills/azure-deploy/references/region-availability.md rename to plugins/azure-skills/skills/azure-deploy/references/region-availability.md diff --git a/plugin/skills/azure-deploy/references/sdk/azd-deployment.md b/plugins/azure-skills/skills/azure-deploy/references/sdk/azd-deployment.md similarity index 100% rename from plugin/skills/azure-deploy/references/sdk/azd-deployment.md rename to plugins/azure-skills/skills/azure-deploy/references/sdk/azd-deployment.md diff --git a/plugin/skills/azure-deploy/references/sdk/azure-identity-dotnet.md b/plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-dotnet.md similarity index 100% rename from plugin/skills/azure-deploy/references/sdk/azure-identity-dotnet.md rename to plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-dotnet.md diff --git a/plugin/skills/azure-deploy/references/sdk/azure-identity-java.md b/plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-java.md similarity index 100% rename from plugin/skills/azure-deploy/references/sdk/azure-identity-java.md rename to plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-java.md diff --git a/plugin/skills/azure-deploy/references/sdk/azure-identity-py.md b/plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-py.md similarity index 100% rename from plugin/skills/azure-deploy/references/sdk/azure-identity-py.md rename to plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-py.md diff --git a/plugin/skills/azure-deploy/references/sdk/azure-identity-ts.md b/plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-ts.md similarity index 100% rename from plugin/skills/azure-deploy/references/sdk/azure-identity-ts.md rename to plugins/azure-skills/skills/azure-deploy/references/sdk/azure-identity-ts.md diff --git a/plugin/skills/azure-deploy/references/troubleshooting.md b/plugins/azure-skills/skills/azure-deploy/references/troubleshooting.md similarity index 100% rename from plugin/skills/azure-deploy/references/troubleshooting.md rename to plugins/azure-skills/skills/azure-deploy/references/troubleshooting.md diff --git a/plugin/skills/azure-compliance/version.json b/plugins/azure-skills/skills/azure-deploy/version.json similarity index 100% rename from plugin/skills/azure-compliance/version.json rename to plugins/azure-skills/skills/azure-deploy/version.json diff --git a/plugin/skills/azure-diagnostics/SKILL.md b/plugins/azure-skills/skills/azure-diagnostics/SKILL.md similarity index 100% rename from plugin/skills/azure-diagnostics/SKILL.md rename to plugins/azure-skills/skills/azure-diagnostics/SKILL.md diff --git a/plugin/skills/azure-diagnostics/references/app-service/README.md b/plugins/azure-skills/skills/azure-diagnostics/references/app-service/README.md similarity index 100% rename from plugin/skills/azure-diagnostics/references/app-service/README.md rename to plugins/azure-skills/skills/azure-diagnostics/references/app-service/README.md diff --git a/plugin/skills/azure-diagnostics/references/azure-resource-graph.md b/plugins/azure-skills/skills/azure-diagnostics/references/azure-resource-graph.md similarity index 100% rename from plugin/skills/azure-diagnostics/references/azure-resource-graph.md rename to plugins/azure-skills/skills/azure-diagnostics/references/azure-resource-graph.md diff --git a/plugin/skills/azure-diagnostics/references/container-apps/README.md b/plugins/azure-skills/skills/azure-diagnostics/references/container-apps/README.md similarity index 100% rename from plugin/skills/azure-diagnostics/references/container-apps/README.md rename to plugins/azure-skills/skills/azure-diagnostics/references/container-apps/README.md diff --git a/plugin/skills/azure-diagnostics/references/functions/README.md b/plugins/azure-skills/skills/azure-diagnostics/references/functions/README.md similarity index 100% rename from plugin/skills/azure-diagnostics/references/functions/README.md rename to plugins/azure-skills/skills/azure-diagnostics/references/functions/README.md diff --git a/plugin/skills/azure-diagnostics/references/kql-queries.md b/plugins/azure-skills/skills/azure-diagnostics/references/kql-queries.md similarity index 100% rename from plugin/skills/azure-diagnostics/references/kql-queries.md rename to plugins/azure-skills/skills/azure-diagnostics/references/kql-queries.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/aks-troubleshooting.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/aks-troubleshooting.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/aks-troubleshooting.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/aks-troubleshooting.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/general-diagnostics.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/general-diagnostics.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/general-diagnostics.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/general-diagnostics.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/load-balancer-and-ingress.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/load-balancer-and-ingress.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/load-balancer-and-ingress.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/load-balancer-and-ingress.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/network-policy.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/network-policy.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/network-policy.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/network-policy.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/networking.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/networking.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/networking.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/networking.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/node-issues.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/node-issues.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/node-issues.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/node-issues.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/pod-failures.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/pod-failures.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/pod-failures.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/pod-failures.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/references/aks-mcp.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/aks-mcp.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/references/aks-mcp.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/aks-mcp.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/references/command-flows.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/command-flows.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/references/command-flows.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/command-flows.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/references/inspektor-gadget.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/inspektor-gadget.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/references/inspektor-gadget.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/inspektor-gadget.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/references/structured-input-modes.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/structured-input-modes.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/references/structured-input-modes.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/references/structured-input-modes.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/spot-and-zone-issues.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/spot-and-zone-issues.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/spot-and-zone-issues.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/spot-and-zone-issues.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/aks/upgrade-operations.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/upgrade-operations.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/aks/upgrade-operations.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/aks/upgrade-operations.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/cannot-connect-to-vm.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/cannot-connect-to-vm.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/cannot-connect-to-vm.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/cannot-connect-to-vm.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/credential-auth-errors.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/credential-auth-errors.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/credential-auth-errors.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/credential-auth-errors.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/firewall-blocking.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/firewall-blocking.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/firewall-blocking.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/firewall-blocking.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/network-connectivity.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/network-connectivity.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/network-connectivity.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/network-connectivity.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/rdp-connectivity.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/rdp-connectivity.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/rdp-connectivity.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/rdp-connectivity.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/rdp-service-config.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/rdp-service-config.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/rdp-service-config.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/rdp-service-config.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/ssh-connectivity.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/ssh-connectivity.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/ssh-connectivity.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/ssh-connectivity.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/references/vm-agent-not-responding.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/vm-agent-not-responding.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/references/vm-agent-not-responding.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/references/vm-agent-not-responding.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/compute/vm-troubleshooting.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/vm-troubleshooting.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/compute/vm-troubleshooting.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/compute/vm-troubleshooting.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/README.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/README.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/README.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/README.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/auth-best-practices.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/auth-best-practices.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/auth-best-practices.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-dotnet.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-dotnet.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-dotnet.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-dotnet.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-java.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-java.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-java.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-java.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-js.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-js.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-js.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-js.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-py.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-py.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-py.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-eventhubs-py.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-dotnet.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-dotnet.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-dotnet.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-dotnet.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-java.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-java.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-java.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-java.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-js.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-js.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-js.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-js.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-py.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-py.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-py.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/azure-servicebus-py.md diff --git a/plugin/skills/azure-diagnostics/troubleshooting/messaging/service-troubleshooting.md b/plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/service-troubleshooting.md similarity index 100% rename from plugin/skills/azure-diagnostics/troubleshooting/messaging/service-troubleshooting.md rename to plugins/azure-skills/skills/azure-diagnostics/troubleshooting/messaging/service-troubleshooting.md diff --git a/plugin/skills/azure-deploy/version.json b/plugins/azure-skills/skills/azure-diagnostics/version.json similarity index 100% rename from plugin/skills/azure-deploy/version.json rename to plugins/azure-skills/skills/azure-diagnostics/version.json diff --git a/plugin/skills/azure-enterprise-infra-planner/SKILL.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/SKILL.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/SKILL.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/SKILL.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/bicep-generation.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/bicep-generation.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/bicep-generation.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/bicep-generation.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/README.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/README.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/README.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/README.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/ai-ml.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/ai-ml.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/ai-ml.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/ai-ml.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/compute-apps.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/compute-apps.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/compute-apps.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/compute-apps.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/compute-infra.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/compute-infra.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/compute-infra.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/compute-infra.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/data-analytics.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/data-analytics.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/data-analytics.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/data-analytics.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/data-relational.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/data-relational.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/data-relational.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/data-relational.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/messaging.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/messaging.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/messaging.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/messaging.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/monitoring.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/monitoring.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/monitoring.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/monitoring.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/networking-connectivity.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/networking-connectivity.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/networking-connectivity.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/networking-connectivity.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/networking-core.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/networking-core.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/networking-core.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/networking-core.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/networking-traffic.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/networking-traffic.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/networking-traffic.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/networking-traffic.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/constraints/security.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/security.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/constraints/security.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/constraints/security.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/deployment.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/deployment.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/deployment.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/deployment.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/pairing-checks.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/pairing-checks.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/pairing-checks.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/pairing-checks.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/1-extract-insights.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/1-extract-insights.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/1-extract-insights.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/1-extract-insights.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/2-research-best-practices.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/2-research-best-practices.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/2-research-best-practices.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/2-research-best-practices.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/3-research-resources.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/3-research-resources.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/3-research-resources.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/3-research-resources.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/4-generate-plan.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/4-generate-plan.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/4-generate-plan.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/4-generate-plan.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/5-verify.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/5-verify.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/5-verify.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/5-verify.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/6-generate-iac.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/6-generate-iac.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/6-generate-iac.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/6-generate-iac.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/phases/7-deploy.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/7-deploy.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/phases/7-deploy.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/phases/7-deploy.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/README.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/README.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/README.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/README.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/ai-ml.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/ai-ml.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/ai-ml.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/ai-ml.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/compute-apps.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/compute-apps.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/compute-apps.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/compute-apps.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/compute-infra.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/compute-infra.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/compute-infra.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/compute-infra.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/data-analytics.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/data-analytics.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/data-analytics.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/data-analytics.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/data-relational.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/data-relational.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/data-relational.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/data-relational.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/messaging.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/messaging.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/messaging.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/messaging.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/monitoring.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/monitoring.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/monitoring.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/monitoring.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/networking-connectivity.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/networking-connectivity.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/networking-connectivity.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/networking-connectivity.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/networking-core.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/networking-core.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/networking-core.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/networking-core.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/networking-traffic.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/networking-traffic.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/networking-traffic.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/networking-traffic.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/resources/security.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/security.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/resources/security.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/resources/security.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/schema.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/schema.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/schema.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/schema.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/terraform-generation.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/terraform-generation.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/terraform-generation.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/terraform-generation.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/verification.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/verification.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/verification.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/verification.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/waf-checklist.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/waf-checklist.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/waf-checklist.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/waf-checklist.md diff --git a/plugin/skills/azure-enterprise-infra-planner/references/workflow.md b/plugins/azure-skills/skills/azure-enterprise-infra-planner/references/workflow.md similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/references/workflow.md rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/references/workflow.md diff --git a/plugin/skills/azure-enterprise-infra-planner/version.json b/plugins/azure-skills/skills/azure-enterprise-infra-planner/version.json similarity index 100% rename from plugin/skills/azure-enterprise-infra-planner/version.json rename to plugins/azure-skills/skills/azure-enterprise-infra-planner/version.json diff --git a/plugin/skills/azure-kubernetes/SKILL.md b/plugins/azure-skills/skills/azure-kubernetes/SKILL.md similarity index 100% rename from plugin/skills/azure-kubernetes/SKILL.md rename to plugins/azure-skills/skills/azure-kubernetes/SKILL.md diff --git a/plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/SKILL.md b/plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/SKILL.md similarity index 100% rename from plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/SKILL.md rename to plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/SKILL.md diff --git a/plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/common-fixes.md b/plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/common-fixes.md similarity index 100% rename from plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/common-fixes.md rename to plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/common-fixes.md diff --git a/plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/constraint-spec-v1.yaml b/plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/constraint-spec-v1.yaml similarity index 100% rename from plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/constraint-spec-v1.yaml rename to plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/constraint-spec-v1.yaml diff --git a/plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/mcp-integration.md b/plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/mcp-integration.md similarity index 100% rename from plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/mcp-integration.md rename to plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/mcp-integration.md diff --git a/plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/migration-guide-summary.md b/plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/migration-guide-summary.md similarity index 100% rename from plugin/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/migration-guide-summary.md rename to plugins/azure-skills/skills/azure-kubernetes/azure-kubernetes-automatic-readiness/references/migration-guide-summary.md diff --git a/plugin/skills/azure-kubernetes/references/azure-aks-autoscaler.md b/plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-autoscaler.md similarity index 100% rename from plugin/skills/azure-kubernetes/references/azure-aks-autoscaler.md rename to plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-autoscaler.md diff --git a/plugin/skills/azure-kubernetes/references/azure-aks-rightsizing.md b/plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-rightsizing.md similarity index 100% rename from plugin/skills/azure-kubernetes/references/azure-aks-rightsizing.md rename to plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-rightsizing.md diff --git a/plugin/skills/azure-kubernetes/references/azure-aks-spot.md b/plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-spot.md similarity index 100% rename from plugin/skills/azure-kubernetes/references/azure-aks-spot.md rename to plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-spot.md diff --git a/plugin/skills/azure-kubernetes/references/azure-aks-vpa.md b/plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-vpa.md similarity index 100% rename from plugin/skills/azure-kubernetes/references/azure-aks-vpa.md rename to plugins/azure-skills/skills/azure-kubernetes/references/azure-aks-vpa.md diff --git a/plugin/skills/azure-kubernetes/references/cli-reference.md b/plugins/azure-skills/skills/azure-kubernetes/references/cli-reference.md similarity index 100% rename from plugin/skills/azure-kubernetes/references/cli-reference.md rename to plugins/azure-skills/skills/azure-kubernetes/references/cli-reference.md diff --git a/plugin/skills/azure-diagnostics/version.json b/plugins/azure-skills/skills/azure-kubernetes/version.json similarity index 100% rename from plugin/skills/azure-diagnostics/version.json rename to plugins/azure-skills/skills/azure-kubernetes/version.json diff --git a/plugin/skills/azure-kusto/SKILL.md b/plugins/azure-skills/skills/azure-kusto/SKILL.md similarity index 100% rename from plugin/skills/azure-kusto/SKILL.md rename to plugins/azure-skills/skills/azure-kusto/SKILL.md diff --git a/plugin/skills/azure-kubernetes/version.json b/plugins/azure-skills/skills/azure-kusto/version.json similarity index 100% rename from plugin/skills/azure-kubernetes/version.json rename to plugins/azure-skills/skills/azure-kusto/version.json diff --git a/plugin/skills/azure-messaging/SKILL.md b/plugins/azure-skills/skills/azure-messaging/SKILL.md similarity index 100% rename from plugin/skills/azure-messaging/SKILL.md rename to plugins/azure-skills/skills/azure-messaging/SKILL.md diff --git a/plugin/skills/azure-kusto/version.json b/plugins/azure-skills/skills/azure-messaging/version.json similarity index 100% rename from plugin/skills/azure-kusto/version.json rename to plugins/azure-skills/skills/azure-messaging/version.json diff --git a/plugin/skills/azure-prepare/SKILL.md b/plugins/azure-skills/skills/azure-prepare/SKILL.md similarity index 100% rename from plugin/skills/azure-prepare/SKILL.md rename to plugins/azure-skills/skills/azure-prepare/SKILL.md diff --git a/plugin/skills/azure-prepare/references/analyze.md b/plugins/azure-skills/skills/azure-prepare/references/analyze.md similarity index 100% rename from plugin/skills/azure-prepare/references/analyze.md rename to plugins/azure-skills/skills/azure-prepare/references/analyze.md diff --git a/plugin/skills/azure-prepare/references/apim.md b/plugins/azure-skills/skills/azure-prepare/references/apim.md similarity index 100% rename from plugin/skills/azure-prepare/references/apim.md rename to plugins/azure-skills/skills/azure-prepare/references/apim.md diff --git a/plugin/skills/azure-prepare/references/architecture.md b/plugins/azure-skills/skills/azure-prepare/references/architecture.md similarity index 100% rename from plugin/skills/azure-prepare/references/architecture.md rename to plugins/azure-skills/skills/azure-prepare/references/architecture.md diff --git a/plugin/skills/azure-prepare/references/aspire.md b/plugins/azure-skills/skills/azure-prepare/references/aspire.md similarity index 100% rename from plugin/skills/azure-prepare/references/aspire.md rename to plugins/azure-skills/skills/azure-prepare/references/aspire.md diff --git a/plugin/skills/azure-prepare/references/auth-best-practices.md b/plugins/azure-skills/skills/azure-prepare/references/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-prepare/references/auth-best-practices.md rename to plugins/azure-skills/skills/azure-prepare/references/auth-best-practices.md diff --git a/plugin/skills/azure-prepare/references/azure-context.md b/plugins/azure-skills/skills/azure-prepare/references/azure-context.md similarity index 100% rename from plugin/skills/azure-prepare/references/azure-context.md rename to plugins/azure-skills/skills/azure-prepare/references/azure-context.md diff --git a/plugin/skills/azure-prepare/references/functional-verification.md b/plugins/azure-skills/skills/azure-prepare/references/functional-verification.md similarity index 100% rename from plugin/skills/azure-prepare/references/functional-verification.md rename to plugins/azure-skills/skills/azure-prepare/references/functional-verification.md diff --git a/plugin/skills/azure-prepare/references/generate.md b/plugins/azure-skills/skills/azure-prepare/references/generate.md similarity index 100% rename from plugin/skills/azure-prepare/references/generate.md rename to plugins/azure-skills/skills/azure-prepare/references/generate.md diff --git a/plugin/skills/azure-prepare/references/global-rules.md b/plugins/azure-skills/skills/azure-prepare/references/global-rules.md similarity index 100% rename from plugin/skills/azure-prepare/references/global-rules.md rename to plugins/azure-skills/skills/azure-prepare/references/global-rules.md diff --git a/plugin/skills/azure-prepare/references/plan-template.md b/plugins/azure-skills/skills/azure-prepare/references/plan-template.md similarity index 100% rename from plugin/skills/azure-prepare/references/plan-template.md rename to plugins/azure-skills/skills/azure-prepare/references/plan-template.md diff --git a/plugin/skills/azure-prepare/references/recipe-selection.md b/plugins/azure-skills/skills/azure-prepare/references/recipe-selection.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipe-selection.md rename to plugins/azure-skills/skills/azure-prepare/references/recipe-selection.md diff --git a/plugin/skills/azure-prepare/references/recipes/azcli/README.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azcli/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azcli/README.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azcli/README.md diff --git a/plugin/skills/azure-prepare/references/recipes/azcli/commands.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azcli/commands.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azcli/commands.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azcli/commands.md diff --git a/plugin/skills/azure-prepare/references/recipes/azcli/scripts.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azcli/scripts.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azcli/scripts.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azcli/scripts.md diff --git a/plugin/skills/azure-prepare/references/recipes/azd/README.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azd/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azd/README.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azd/README.md diff --git a/plugin/skills/azure-prepare/references/recipes/azd/aspire.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azd/aspire.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azd/aspire.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azd/aspire.md diff --git a/plugin/skills/azure-prepare/references/recipes/azd/azure-yaml.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azd/azure-yaml.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azd/azure-yaml.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azd/azure-yaml.md diff --git a/plugin/skills/azure-prepare/references/recipes/azd/docker.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azd/docker.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azd/docker.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azd/docker.md diff --git a/plugin/skills/azure-prepare/references/recipes/azd/iac-rules.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azd/iac-rules.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azd/iac-rules.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azd/iac-rules.md diff --git a/plugin/skills/azure-prepare/references/recipes/azd/terraform.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/azd/terraform.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/azd/terraform.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/azd/terraform.md diff --git a/plugin/skills/azure-prepare/references/recipes/bicep/README.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/bicep/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/bicep/README.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/bicep/README.md diff --git a/plugin/skills/azure-prepare/references/recipes/bicep/patterns.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/bicep/patterns.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/bicep/patterns.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/bicep/patterns.md diff --git a/plugin/skills/azure-prepare/references/recipes/terraform/README.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/terraform/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/terraform/README.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/terraform/README.md diff --git a/plugin/skills/azure-prepare/references/recipes/terraform/patterns.md b/plugins/azure-skills/skills/azure-prepare/references/recipes/terraform/patterns.md similarity index 100% rename from plugin/skills/azure-prepare/references/recipes/terraform/patterns.md rename to plugins/azure-skills/skills/azure-prepare/references/recipes/terraform/patterns.md diff --git a/plugin/skills/azure-prepare/references/region-availability.md b/plugins/azure-skills/skills/azure-prepare/references/region-availability.md similarity index 100% rename from plugin/skills/azure-prepare/references/region-availability.md rename to plugins/azure-skills/skills/azure-prepare/references/region-availability.md diff --git a/plugin/skills/azure-prepare/references/requirements.md b/plugins/azure-skills/skills/azure-prepare/references/requirements.md similarity index 100% rename from plugin/skills/azure-prepare/references/requirements.md rename to plugins/azure-skills/skills/azure-prepare/references/requirements.md diff --git a/plugin/skills/azure-prepare/references/research.md b/plugins/azure-skills/skills/azure-prepare/references/research.md similarity index 100% rename from plugin/skills/azure-prepare/references/research.md rename to plugins/azure-skills/skills/azure-prepare/references/research.md diff --git a/plugin/skills/azure-prepare/references/resources-limits-quotas.md b/plugins/azure-skills/skills/azure-prepare/references/resources-limits-quotas.md similarity index 100% rename from plugin/skills/azure-prepare/references/resources-limits-quotas.md rename to plugins/azure-skills/skills/azure-prepare/references/resources-limits-quotas.md diff --git a/plugin/skills/azure-prepare/references/runtimes/nodejs.md b/plugins/azure-skills/skills/azure-prepare/references/runtimes/nodejs.md similarity index 100% rename from plugin/skills/azure-prepare/references/runtimes/nodejs.md rename to plugins/azure-skills/skills/azure-prepare/references/runtimes/nodejs.md diff --git a/plugin/skills/azure-prepare/references/scan.md b/plugins/azure-skills/skills/azure-prepare/references/scan.md similarity index 100% rename from plugin/skills/azure-prepare/references/scan.md rename to plugins/azure-skills/skills/azure-prepare/references/scan.md diff --git a/plugin/skills/azure-prepare/references/sdk/azd-deployment.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azd-deployment.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azd-deployment.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azd-deployment.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-appconfiguration-java.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-appconfiguration-java.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-appconfiguration-java.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-appconfiguration-java.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-appconfiguration-py.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-appconfiguration-py.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-appconfiguration-py.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-appconfiguration-py.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-appconfiguration-ts.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-appconfiguration-ts.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-appconfiguration-ts.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-appconfiguration-ts.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-identity-dotnet.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-dotnet.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-identity-dotnet.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-dotnet.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-identity-java.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-java.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-identity-java.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-java.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-identity-py.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-py.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-identity-py.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-py.md diff --git a/plugin/skills/azure-prepare/references/sdk/azure-identity-ts.md b/plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-ts.md similarity index 100% rename from plugin/skills/azure-prepare/references/sdk/azure-identity-ts.md rename to plugins/azure-skills/skills/azure-prepare/references/sdk/azure-identity-ts.md diff --git a/plugin/skills/azure-prepare/references/security.md b/plugins/azure-skills/skills/azure-prepare/references/security.md similarity index 100% rename from plugin/skills/azure-prepare/references/security.md rename to plugins/azure-skills/skills/azure-prepare/references/security.md diff --git a/plugin/skills/azure-prepare/references/services/aks/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/aks/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/aks/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/aks/README.md diff --git a/plugin/skills/azure-prepare/references/services/aks/addons.md b/plugins/azure-skills/skills/azure-prepare/references/services/aks/addons.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/aks/addons.md rename to plugins/azure-skills/skills/azure-prepare/references/services/aks/addons.md diff --git a/plugin/skills/azure-prepare/references/services/aks/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/aks/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/aks/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/aks/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/aks/manifests.md b/plugins/azure-skills/skills/azure-prepare/references/services/aks/manifests.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/aks/manifests.md rename to plugins/azure-skills/skills/azure-prepare/references/services/aks/manifests.md diff --git a/plugin/skills/azure-prepare/references/services/app-insights/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-insights/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-insights/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-insights/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/custom-domains.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/custom-domains.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/custom-domains.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/custom-domains.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/deployment-slots.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/deployment-slots.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/deployment-slots.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/deployment-slots.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/networking.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/networking.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/networking.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/networking.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/scaling.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/scaling.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/scaling.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/scaling.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/sku-selection.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/sku-selection.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/sku-selection.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/sku-selection.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/dotnet.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/dotnet.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/dotnet.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/dotnet.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/nodejs.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/nodejs.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/nodejs.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/nodejs.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/auth/source/python.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/composition.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/composition.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/composition.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/composition.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/dotnet.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/dotnet.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/dotnet.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/dotnet.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/nodejs.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/nodejs.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/nodejs.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/nodejs.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/cosmos/source/python.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/dotnet.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/dotnet.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/dotnet.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/dotnet.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/nodejs.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/nodejs.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/nodejs.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/nodejs.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/redis/source/python.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/README.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/dotnet.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/dotnet.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/dotnet.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/dotnet.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/nodejs.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/nodejs.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/nodejs.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/nodejs.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/recipes/sql/source/python.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/selection.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/selection.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/selection.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/selection.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/web-api.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/web-api.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/web-api.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/web-api.md diff --git a/plugin/skills/azure-prepare/references/services/app-service/templates/web-app.md b/plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/web-app.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/app-service/templates/web-app.md rename to plugins/azure-skills/skills/azure-prepare/references/services/app-service/templates/web-app.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/README.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/day2-operations.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/day2-operations.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/day2-operations.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/day2-operations.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/environment.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/environment.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/environment.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/environment.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/health-probes.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/health-probes.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/health-probes.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/health-probes.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/networking.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/networking.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/networking.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/networking.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/revisions.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/revisions.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/revisions.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/revisions.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/scaling.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/scaling.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/scaling.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/scaling.md diff --git a/plugin/skills/azure-prepare/references/services/container-apps/terraform.md b/plugins/azure-skills/skills/azure-prepare/references/services/container-apps/terraform.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/container-apps/terraform.md rename to plugins/azure-skills/skills/azure-prepare/references/services/container-apps/terraform.md diff --git a/plugin/skills/azure-prepare/references/services/cosmos-db/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/cosmos-db/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/README.md diff --git a/plugin/skills/azure-prepare/references/services/cosmos-db/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/cosmos-db/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/cosmos-db/partitioning.md b/plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/partitioning.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/cosmos-db/partitioning.md rename to plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/partitioning.md diff --git a/plugin/skills/azure-prepare/references/services/cosmos-db/sdk.md b/plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/sdk.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/cosmos-db/sdk.md rename to plugins/azure-skills/skills/azure-prepare/references/services/cosmos-db/sdk.md diff --git a/plugin/skills/azure-prepare/references/services/durable-task-scheduler/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/durable-task-scheduler/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/README.md diff --git a/plugin/skills/azure-prepare/references/services/durable-task-scheduler/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/durable-task-scheduler/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/durable-task-scheduler/dotnet.md b/plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/dotnet.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/durable-task-scheduler/dotnet.md rename to plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/dotnet.md diff --git a/plugin/skills/azure-prepare/references/services/durable-task-scheduler/java.md b/plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/java.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/durable-task-scheduler/java.md rename to plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/java.md diff --git a/plugin/skills/azure-prepare/references/services/durable-task-scheduler/javascript.md b/plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/javascript.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/durable-task-scheduler/javascript.md rename to plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/javascript.md diff --git a/plugin/skills/azure-prepare/references/services/durable-task-scheduler/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/durable-task-scheduler/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/durable-task-scheduler/python.md diff --git a/plugin/skills/azure-prepare/references/services/event-grid/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/event-grid/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/event-grid/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/event-grid/README.md diff --git a/plugin/skills/azure-prepare/references/services/event-grid/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/event-grid/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/event-grid/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/event-grid/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/event-grid/subscriptions.md b/plugins/azure-skills/skills/azure-prepare/references/services/event-grid/subscriptions.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/event-grid/subscriptions.md rename to plugins/azure-skills/skills/azure-prepare/references/services/event-grid/subscriptions.md diff --git a/plugin/skills/azure-prepare/references/services/foundry/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/foundry/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/foundry/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/foundry/README.md diff --git a/plugin/skills/azure-prepare/references/services/foundry/region-availability.md b/plugins/azure-skills/skills/azure-prepare/references/services/foundry/region-availability.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/foundry/region-availability.md rename to plugins/azure-skills/skills/azure-prepare/references/services/foundry/region-availability.md diff --git a/plugin/skills/azure-prepare/references/services/functions/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/aspire-containerapps.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/aspire-containerapps.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/aspire-containerapps.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/aspire-containerapps.md diff --git a/plugin/skills/azure-prepare/references/services/functions/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/functions/durable.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/durable.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/durable.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/durable.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/base/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/base/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/base/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/base/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/base/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/base/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/base/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/base/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/base/eval/typescript.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/base/eval/typescript.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/base/eval/typescript.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/base/eval/typescript.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/dotnet-entry-point.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/dotnet-entry-point.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/dotnet-entry-point.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/dotnet-entry-point.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/error-handling.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/error-handling.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/error-handling.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/error-handling.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/health-check.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/health-check.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/health-check.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/health-check.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/nodejs-entry-point.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/nodejs-entry-point.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/nodejs-entry-point.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/common/nodejs-entry-point.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/composition.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/composition.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/composition.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/composition.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/typescript.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/typescript.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/typescript.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/eval/typescript.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/durable/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/durable/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/durable/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/mcp/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/mcp/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/mcp/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/typescript.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/typescript.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/typescript.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/eval/typescript.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/sql/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/sql/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/sql/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/timer/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/timer/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/timer/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/timer/README.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/python.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/python.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/python.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/python.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/summary.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/summary.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/summary.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/recipes/timer/eval/summary.md diff --git a/plugin/skills/azure-prepare/references/services/functions/templates/selection.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/selection.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/templates/selection.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/templates/selection.md diff --git a/plugin/skills/azure-prepare/references/services/functions/terraform.md b/plugins/azure-skills/skills/azure-prepare/references/services/functions/terraform.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/functions/terraform.md rename to plugins/azure-skills/skills/azure-prepare/references/services/functions/terraform.md diff --git a/plugin/skills/azure-prepare/references/services/key-vault/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/key-vault/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/key-vault/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/key-vault/README.md diff --git a/plugin/skills/azure-prepare/references/services/key-vault/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/key-vault/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/key-vault/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/key-vault/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/key-vault/sdk.md b/plugins/azure-skills/skills/azure-prepare/references/services/key-vault/sdk.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/key-vault/sdk.md rename to plugins/azure-skills/skills/azure-prepare/references/services/key-vault/sdk.md diff --git a/plugin/skills/azure-prepare/references/services/logic-apps/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/logic-apps/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/logic-apps/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/logic-apps/README.md diff --git a/plugin/skills/azure-prepare/references/services/logic-apps/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/logic-apps/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/logic-apps/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/logic-apps/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/logic-apps/triggers.md b/plugins/azure-skills/skills/azure-prepare/references/services/logic-apps/triggers.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/logic-apps/triggers.md rename to plugins/azure-skills/skills/azure-prepare/references/services/logic-apps/triggers.md diff --git a/plugin/skills/azure-prepare/references/services/service-bus/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/service-bus/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/service-bus/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/service-bus/README.md diff --git a/plugin/skills/azure-prepare/references/services/service-bus/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/service-bus/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/service-bus/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/service-bus/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/service-bus/patterns.md b/plugins/azure-skills/skills/azure-prepare/references/services/service-bus/patterns.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/service-bus/patterns.md rename to plugins/azure-skills/skills/azure-prepare/references/services/service-bus/patterns.md diff --git a/plugin/skills/azure-prepare/references/services/sql-database/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/sql-database/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/sql-database/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/sql-database/README.md diff --git a/plugin/skills/azure-prepare/references/services/sql-database/auth.md b/plugins/azure-skills/skills/azure-prepare/references/services/sql-database/auth.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/sql-database/auth.md rename to plugins/azure-skills/skills/azure-prepare/references/services/sql-database/auth.md diff --git a/plugin/skills/azure-prepare/references/services/sql-database/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/sql-database/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/sql-database/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/sql-database/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.ps1 b/plugins/azure-skills/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.ps1 similarity index 100% rename from plugin/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.ps1 rename to plugins/azure-skills/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.ps1 diff --git a/plugin/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.sh b/plugins/azure-skills/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.sh similarity index 100% rename from plugin/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.sh rename to plugins/azure-skills/skills/azure-prepare/references/services/sql-database/scripts/grant-sql-access.sh diff --git a/plugin/skills/azure-prepare/references/services/sql-database/sdk.md b/plugins/azure-skills/skills/azure-prepare/references/services/sql-database/sdk.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/sql-database/sdk.md rename to plugins/azure-skills/skills/azure-prepare/references/services/sql-database/sdk.md diff --git a/plugin/skills/azure-prepare/references/services/static-web-apps/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/static-web-apps/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/README.md diff --git a/plugin/skills/azure-prepare/references/services/static-web-apps/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/static-web-apps/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/bicep.md diff --git a/plugin/skills/azure-prepare/references/services/static-web-apps/deployment.md b/plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/deployment.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/static-web-apps/deployment.md rename to plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/deployment.md diff --git a/plugin/skills/azure-prepare/references/services/static-web-apps/region-availability.md b/plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/region-availability.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/static-web-apps/region-availability.md rename to plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/region-availability.md diff --git a/plugin/skills/azure-prepare/references/services/static-web-apps/routing.md b/plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/routing.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/static-web-apps/routing.md rename to plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/routing.md diff --git a/plugin/skills/azure-prepare/references/services/static-web-apps/terraform.md b/plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/terraform.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/static-web-apps/terraform.md rename to plugins/azure-skills/skills/azure-prepare/references/services/static-web-apps/terraform.md diff --git a/plugin/skills/azure-prepare/references/services/storage/README.md b/plugins/azure-skills/skills/azure-prepare/references/services/storage/README.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/storage/README.md rename to plugins/azure-skills/skills/azure-prepare/references/services/storage/README.md diff --git a/plugin/skills/azure-prepare/references/services/storage/access.md b/plugins/azure-skills/skills/azure-prepare/references/services/storage/access.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/storage/access.md rename to plugins/azure-skills/skills/azure-prepare/references/services/storage/access.md diff --git a/plugin/skills/azure-prepare/references/services/storage/bicep.md b/plugins/azure-skills/skills/azure-prepare/references/services/storage/bicep.md similarity index 100% rename from plugin/skills/azure-prepare/references/services/storage/bicep.md rename to plugins/azure-skills/skills/azure-prepare/references/services/storage/bicep.md diff --git a/plugin/skills/azure-prepare/references/specialized-routing.md b/plugins/azure-skills/skills/azure-prepare/references/specialized-routing.md similarity index 100% rename from plugin/skills/azure-prepare/references/specialized-routing.md rename to plugins/azure-skills/skills/azure-prepare/references/specialized-routing.md diff --git a/plugin/skills/azure-prepare/version.json b/plugins/azure-skills/skills/azure-prepare/version.json similarity index 100% rename from plugin/skills/azure-prepare/version.json rename to plugins/azure-skills/skills/azure-prepare/version.json diff --git a/plugin/skills/azure-quotas/SKILL.md b/plugins/azure-skills/skills/azure-quotas/SKILL.md similarity index 100% rename from plugin/skills/azure-quotas/SKILL.md rename to plugins/azure-skills/skills/azure-quotas/SKILL.md diff --git a/plugin/skills/azure-quotas/references/advanced-commands.md b/plugins/azure-skills/skills/azure-quotas/references/advanced-commands.md similarity index 100% rename from plugin/skills/azure-quotas/references/advanced-commands.md rename to plugins/azure-skills/skills/azure-quotas/references/advanced-commands.md diff --git a/plugin/skills/azure-quotas/references/commands.md b/plugins/azure-skills/skills/azure-quotas/references/commands.md similarity index 100% rename from plugin/skills/azure-quotas/references/commands.md rename to plugins/azure-skills/skills/azure-quotas/references/commands.md diff --git a/plugin/skills/azure-quotas/scripts/check-quota.ps1 b/plugins/azure-skills/skills/azure-quotas/scripts/check-quota.ps1 similarity index 100% rename from plugin/skills/azure-quotas/scripts/check-quota.ps1 rename to plugins/azure-skills/skills/azure-quotas/scripts/check-quota.ps1 diff --git a/plugin/skills/azure-quotas/scripts/check-quota.sh b/plugins/azure-skills/skills/azure-quotas/scripts/check-quota.sh similarity index 100% rename from plugin/skills/azure-quotas/scripts/check-quota.sh rename to plugins/azure-skills/skills/azure-quotas/scripts/check-quota.sh diff --git a/plugin/skills/azure-messaging/version.json b/plugins/azure-skills/skills/azure-quotas/version.json similarity index 100% rename from plugin/skills/azure-messaging/version.json rename to plugins/azure-skills/skills/azure-quotas/version.json diff --git a/plugin/skills/azure-reliability/SKILL.md b/plugins/azure-skills/skills/azure-reliability/SKILL.md similarity index 100% rename from plugin/skills/azure-reliability/SKILL.md rename to plugins/azure-skills/skills/azure-reliability/SKILL.md diff --git a/plugin/skills/azure-reliability/references/configure-health-probes.md b/plugins/azure-skills/skills/azure-reliability/references/configure-health-probes.md similarity index 100% rename from plugin/skills/azure-reliability/references/configure-health-probes.md rename to plugins/azure-skills/skills/azure-reliability/references/configure-health-probes.md diff --git a/plugin/skills/azure-reliability/references/configure-multi-region.md b/plugins/azure-skills/skills/azure-reliability/references/configure-multi-region.md similarity index 100% rename from plugin/skills/azure-reliability/references/configure-multi-region.md rename to plugins/azure-skills/skills/azure-reliability/references/configure-multi-region.md diff --git a/plugin/skills/azure-reliability/references/configure-storage.md b/plugins/azure-skills/skills/azure-reliability/references/configure-storage.md similarity index 100% rename from plugin/skills/azure-reliability/references/configure-storage.md rename to plugins/azure-skills/skills/azure-reliability/references/configure-storage.md diff --git a/plugin/skills/azure-reliability/references/configure-zone-redundancy.md b/plugins/azure-skills/skills/azure-reliability/references/configure-zone-redundancy.md similarity index 100% rename from plugin/skills/azure-reliability/references/configure-zone-redundancy.md rename to plugins/azure-skills/skills/azure-reliability/references/configure-zone-redundancy.md diff --git a/plugin/skills/azure-reliability/references/health-probe-checks.md b/plugins/azure-skills/skills/azure-reliability/references/health-probe-checks.md similarity index 100% rename from plugin/skills/azure-reliability/references/health-probe-checks.md rename to plugins/azure-skills/skills/azure-reliability/references/health-probe-checks.md diff --git a/plugin/skills/azure-reliability/references/iac-patching-bicep.md b/plugins/azure-skills/skills/azure-reliability/references/iac-patching-bicep.md similarity index 100% rename from plugin/skills/azure-reliability/references/iac-patching-bicep.md rename to plugins/azure-skills/skills/azure-reliability/references/iac-patching-bicep.md diff --git a/plugin/skills/azure-reliability/references/iac-patching-terraform.md b/plugins/azure-skills/skills/azure-reliability/references/iac-patching-terraform.md similarity index 100% rename from plugin/skills/azure-reliability/references/iac-patching-terraform.md rename to plugins/azure-skills/skills/azure-reliability/references/iac-patching-terraform.md diff --git a/plugin/skills/azure-reliability/references/multi-region-checks.md b/plugins/azure-skills/skills/azure-reliability/references/multi-region-checks.md similarity index 100% rename from plugin/skills/azure-reliability/references/multi-region-checks.md rename to plugins/azure-skills/skills/azure-reliability/references/multi-region-checks.md diff --git a/plugin/skills/azure-reliability/references/services/app-service/reliability.md b/plugins/azure-skills/skills/azure-reliability/references/services/app-service/reliability.md similarity index 100% rename from plugin/skills/azure-reliability/references/services/app-service/reliability.md rename to plugins/azure-skills/skills/azure-reliability/references/services/app-service/reliability.md diff --git a/plugin/skills/azure-reliability/references/services/functions/reliability.md b/plugins/azure-skills/skills/azure-reliability/references/services/functions/reliability.md similarity index 100% rename from plugin/skills/azure-reliability/references/services/functions/reliability.md rename to plugins/azure-skills/skills/azure-reliability/references/services/functions/reliability.md diff --git a/plugin/skills/azure-reliability/references/storage-redundancy-checks.md b/plugins/azure-skills/skills/azure-reliability/references/storage-redundancy-checks.md similarity index 100% rename from plugin/skills/azure-reliability/references/storage-redundancy-checks.md rename to plugins/azure-skills/skills/azure-reliability/references/storage-redundancy-checks.md diff --git a/plugin/skills/azure-reliability/references/zone-redundancy-checks.md b/plugins/azure-skills/skills/azure-reliability/references/zone-redundancy-checks.md similarity index 100% rename from plugin/skills/azure-reliability/references/zone-redundancy-checks.md rename to plugins/azure-skills/skills/azure-reliability/references/zone-redundancy-checks.md diff --git a/plugin/skills/azure-reliability/version.json b/plugins/azure-skills/skills/azure-reliability/version.json similarity index 100% rename from plugin/skills/azure-reliability/version.json rename to plugins/azure-skills/skills/azure-reliability/version.json diff --git a/plugin/skills/azure-resource-lookup/SKILL.md b/plugins/azure-skills/skills/azure-resource-lookup/SKILL.md similarity index 100% rename from plugin/skills/azure-resource-lookup/SKILL.md rename to plugins/azure-skills/skills/azure-resource-lookup/SKILL.md diff --git a/plugin/skills/azure-resource-lookup/references/azure-resource-graph.md b/plugins/azure-skills/skills/azure-resource-lookup/references/azure-resource-graph.md similarity index 100% rename from plugin/skills/azure-resource-lookup/references/azure-resource-graph.md rename to plugins/azure-skills/skills/azure-resource-lookup/references/azure-resource-graph.md diff --git a/plugin/skills/azure-quotas/version.json b/plugins/azure-skills/skills/azure-resource-lookup/version.json similarity index 100% rename from plugin/skills/azure-quotas/version.json rename to plugins/azure-skills/skills/azure-resource-lookup/version.json diff --git a/plugin/skills/azure-resource-visualizer/SKILL.md b/plugins/azure-skills/skills/azure-resource-visualizer/SKILL.md similarity index 100% rename from plugin/skills/azure-resource-visualizer/SKILL.md rename to plugins/azure-skills/skills/azure-resource-visualizer/SKILL.md diff --git a/plugin/skills/azure-resource-visualizer/assets/example-diagram.md b/plugins/azure-skills/skills/azure-resource-visualizer/assets/example-diagram.md similarity index 100% rename from plugin/skills/azure-resource-visualizer/assets/example-diagram.md rename to plugins/azure-skills/skills/azure-resource-visualizer/assets/example-diagram.md diff --git a/plugin/skills/azure-resource-visualizer/assets/template-architecture.md b/plugins/azure-skills/skills/azure-resource-visualizer/assets/template-architecture.md similarity index 100% rename from plugin/skills/azure-resource-visualizer/assets/template-architecture.md rename to plugins/azure-skills/skills/azure-resource-visualizer/assets/template-architecture.md diff --git a/plugin/skills/azure-resource-visualizer/references/azure-resource-graph.md b/plugins/azure-skills/skills/azure-resource-visualizer/references/azure-resource-graph.md similarity index 100% rename from plugin/skills/azure-resource-visualizer/references/azure-resource-graph.md rename to plugins/azure-skills/skills/azure-resource-visualizer/references/azure-resource-graph.md diff --git a/plugin/skills/azure-resource-lookup/version.json b/plugins/azure-skills/skills/azure-resource-visualizer/version.json similarity index 100% rename from plugin/skills/azure-resource-lookup/version.json rename to plugins/azure-skills/skills/azure-resource-visualizer/version.json diff --git a/plugin/skills/azure-storage/SKILL.md b/plugins/azure-skills/skills/azure-storage/SKILL.md similarity index 100% rename from plugin/skills/azure-storage/SKILL.md rename to plugins/azure-skills/skills/azure-storage/SKILL.md diff --git a/plugin/skills/azure-storage/references/auth-best-practices.md b/plugins/azure-skills/skills/azure-storage/references/auth-best-practices.md similarity index 100% rename from plugin/skills/azure-storage/references/auth-best-practices.md rename to plugins/azure-skills/skills/azure-storage/references/auth-best-practices.md diff --git a/plugin/skills/azure-storage/references/sdk-usage.md b/plugins/azure-skills/skills/azure-storage/references/sdk-usage.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk-usage.md rename to plugins/azure-skills/skills/azure-storage/references/sdk-usage.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-data-tables-java.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-data-tables-java.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-data-tables-java.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-data-tables-java.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-data-tables-py.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-data-tables-py.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-data-tables-py.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-data-tables-py.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-blob-java.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-java.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-blob-java.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-java.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-blob-py.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-py.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-blob-py.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-py.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-blob-rust.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-rust.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-blob-rust.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-rust.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-blob-ts.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-ts.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-blob-ts.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-blob-ts.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-file-datalake-py.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-file-datalake-py.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-file-datalake-py.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-file-datalake-py.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-file-share-py.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-file-share-py.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-file-share-py.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-file-share-py.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-file-share-ts.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-file-share-ts.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-file-share-ts.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-file-share-ts.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-queue-py.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-queue-py.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-queue-py.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-queue-py.md diff --git a/plugin/skills/azure-storage/references/sdk/azure-storage-queue-ts.md b/plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-queue-ts.md similarity index 100% rename from plugin/skills/azure-storage/references/sdk/azure-storage-queue-ts.md rename to plugins/azure-skills/skills/azure-storage/references/sdk/azure-storage-queue-ts.md diff --git a/plugin/skills/azure-resource-visualizer/version.json b/plugins/azure-skills/skills/azure-storage/version.json similarity index 100% rename from plugin/skills/azure-resource-visualizer/version.json rename to plugins/azure-skills/skills/azure-storage/version.json diff --git a/plugin/skills/azure-upgrade/SKILL.md b/plugins/azure-skills/skills/azure-upgrade/SKILL.md similarity index 100% rename from plugin/skills/azure-upgrade/SKILL.md rename to plugins/azure-skills/skills/azure-upgrade/SKILL.md diff --git a/plugin/skills/azure-upgrade/references/global-rules.md b/plugins/azure-skills/skills/azure-upgrade/references/global-rules.md similarity index 100% rename from plugin/skills/azure-upgrade/references/global-rules.md rename to plugins/azure-skills/skills/azure-upgrade/references/global-rules.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/INSTRUCTION.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/INSTRUCTION.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/INSTRUCTION.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/INSTRUCTION.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/README.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/README.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/README.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/README.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-settings.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-settings.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-settings.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-settings.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-toml.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-toml.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-toml.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle-toml.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-gradle.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-maven.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-maven.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-maven.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-maven.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-migration.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-migration.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-migration.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-migration.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-validation.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-validation.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/bom-migration/bom-validation.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/bom-migration/bom-validation.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.eventprocessorhost.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.eventprocessorhost.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.eventprocessorhost.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.eventprocessorhost.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.management.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.management.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.management.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/package-specific/com.microsoft.azure.management.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/rules/efficiency.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/efficiency.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/rules/efficiency.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/efficiency.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/rules/execution-guidelines.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/execution-guidelines.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/rules/execution-guidelines.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/execution-guidelines.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/rules/review-code-changes.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/review-code-changes.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/rules/review-code-changes.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/review-code-changes.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/rules/troubleshooting.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/troubleshooting.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/rules/troubleshooting.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/troubleshooting.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/rules/upgrade-strategy.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/upgrade-strategy.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/rules/upgrade-strategy.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/upgrade-strategy.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/rules/upgrade-success-criteria.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/upgrade-success-criteria.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/rules/upgrade-success-criteria.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/rules/upgrade-success-criteria.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/scripts/upgrade_bom.py b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/scripts/upgrade_bom.py similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/scripts/upgrade_bom.py rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/scripts/upgrade_bom.py diff --git a/plugin/skills/azure-upgrade/references/languages/java/templates/PLAN_TEMPLATE.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/templates/PLAN_TEMPLATE.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/templates/PLAN_TEMPLATE.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/templates/PLAN_TEMPLATE.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/templates/PROGRESS_TEMPLATE.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/templates/PROGRESS_TEMPLATE.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/templates/PROGRESS_TEMPLATE.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/templates/PROGRESS_TEMPLATE.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/templates/SUMMARY_TEMPLATE.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/templates/SUMMARY_TEMPLATE.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/templates/SUMMARY_TEMPLATE.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/templates/SUMMARY_TEMPLATE.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/workflow/phase-1-precheck.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-1-precheck.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/workflow/phase-1-precheck.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-1-precheck.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/workflow/phase-2-plan.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-2-plan.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/workflow/phase-2-plan.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-2-plan.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/workflow/phase-3-execute.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-3-execute.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/workflow/phase-3-execute.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-3-execute.md diff --git a/plugin/skills/azure-upgrade/references/languages/java/workflow/phase-4-summarize.md b/plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-4-summarize.md similarity index 100% rename from plugin/skills/azure-upgrade/references/languages/java/workflow/phase-4-summarize.md rename to plugins/azure-skills/skills/azure-upgrade/references/languages/java/workflow/phase-4-summarize.md diff --git a/plugin/skills/azure-upgrade/references/services/functions/assessment.md b/plugins/azure-skills/skills/azure-upgrade/references/services/functions/assessment.md similarity index 100% rename from plugin/skills/azure-upgrade/references/services/functions/assessment.md rename to plugins/azure-skills/skills/azure-upgrade/references/services/functions/assessment.md diff --git a/plugin/skills/azure-upgrade/references/services/functions/automation.md b/plugins/azure-skills/skills/azure-upgrade/references/services/functions/automation.md similarity index 100% rename from plugin/skills/azure-upgrade/references/services/functions/automation.md rename to plugins/azure-skills/skills/azure-upgrade/references/services/functions/automation.md diff --git a/plugin/skills/azure-upgrade/references/services/functions/consumption-to-flex.md b/plugins/azure-skills/skills/azure-upgrade/references/services/functions/consumption-to-flex.md similarity index 100% rename from plugin/skills/azure-upgrade/references/services/functions/consumption-to-flex.md rename to plugins/azure-skills/skills/azure-upgrade/references/services/functions/consumption-to-flex.md diff --git a/plugin/skills/azure-upgrade/references/services/redis/redis-to-amr.md b/plugins/azure-skills/skills/azure-upgrade/references/services/redis/redis-to-amr.md similarity index 100% rename from plugin/skills/azure-upgrade/references/services/redis/redis-to-amr.md rename to plugins/azure-skills/skills/azure-upgrade/references/services/redis/redis-to-amr.md diff --git a/plugin/skills/azure-upgrade/references/workflow-details.md b/plugins/azure-skills/skills/azure-upgrade/references/workflow-details.md similarity index 100% rename from plugin/skills/azure-upgrade/references/workflow-details.md rename to plugins/azure-skills/skills/azure-upgrade/references/workflow-details.md diff --git a/plugin/skills/azure-storage/version.json b/plugins/azure-skills/skills/azure-upgrade/version.json similarity index 100% rename from plugin/skills/azure-storage/version.json rename to plugins/azure-skills/skills/azure-upgrade/version.json diff --git a/plugin/skills/azure-validate/SKILL.md b/plugins/azure-skills/skills/azure-validate/SKILL.md similarity index 100% rename from plugin/skills/azure-validate/SKILL.md rename to plugins/azure-skills/skills/azure-validate/SKILL.md diff --git a/plugin/skills/azure-validate/references/aspire-functions-secrets.md b/plugins/azure-skills/skills/azure-validate/references/aspire-functions-secrets.md similarity index 100% rename from plugin/skills/azure-validate/references/aspire-functions-secrets.md rename to plugins/azure-skills/skills/azure-validate/references/aspire-functions-secrets.md diff --git a/plugin/skills/azure-validate/references/global-rules.md b/plugins/azure-skills/skills/azure-validate/references/global-rules.md similarity index 100% rename from plugin/skills/azure-validate/references/global-rules.md rename to plugins/azure-skills/skills/azure-validate/references/global-rules.md diff --git a/plugin/skills/azure-validate/references/policy-validation.md b/plugins/azure-skills/skills/azure-validate/references/policy-validation.md similarity index 100% rename from plugin/skills/azure-validate/references/policy-validation.md rename to plugins/azure-skills/skills/azure-validate/references/policy-validation.md diff --git a/plugin/skills/azure-validate/references/recipes/README.md b/plugins/azure-skills/skills/azure-validate/references/recipes/README.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/README.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/README.md diff --git a/plugin/skills/azure-validate/references/recipes/azcli/README.md b/plugins/azure-skills/skills/azure-validate/references/recipes/azcli/README.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azcli/README.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/azcli/README.md diff --git a/plugin/skills/azure-validate/references/recipes/azcli/errors.md b/plugins/azure-skills/skills/azure-validate/references/recipes/azcli/errors.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azcli/errors.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/azcli/errors.md diff --git a/plugin/skills/azure-validate/references/recipes/azd/README.md b/plugins/azure-skills/skills/azure-validate/references/recipes/azd/README.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azd/README.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/azd/README.md diff --git a/plugin/skills/azure-validate/references/recipes/azd/aspire.md b/plugins/azure-skills/skills/azure-validate/references/recipes/azd/aspire.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azd/aspire.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/azd/aspire.md diff --git a/plugin/skills/azure-validate/references/recipes/azd/environment.md b/plugins/azure-skills/skills/azure-validate/references/recipes/azd/environment.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azd/environment.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/azd/environment.md diff --git a/plugin/skills/azure-validate/references/recipes/azd/errors.md b/plugins/azure-skills/skills/azure-validate/references/recipes/azd/errors.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azd/errors.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/azd/errors.md diff --git a/plugin/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.ps1 b/plugins/azure-skills/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.ps1 similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.ps1 rename to plugins/azure-skills/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.ps1 diff --git a/plugin/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.sh b/plugins/azure-skills/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.sh similarity index 100% rename from plugin/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.sh rename to plugins/azure-skills/skills/azure-validate/references/recipes/azd/scripts/set-aspire-aca-env.sh diff --git a/plugin/skills/azure-validate/references/recipes/bicep/README.md b/plugins/azure-skills/skills/azure-validate/references/recipes/bicep/README.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/bicep/README.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/bicep/README.md diff --git a/plugin/skills/azure-validate/references/recipes/bicep/errors.md b/plugins/azure-skills/skills/azure-validate/references/recipes/bicep/errors.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/bicep/errors.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/bicep/errors.md diff --git a/plugin/skills/azure-validate/references/recipes/scripts/validate-deployment.ps1 b/plugins/azure-skills/skills/azure-validate/references/recipes/scripts/validate-deployment.ps1 similarity index 100% rename from plugin/skills/azure-validate/references/recipes/scripts/validate-deployment.ps1 rename to plugins/azure-skills/skills/azure-validate/references/recipes/scripts/validate-deployment.ps1 diff --git a/plugin/skills/azure-validate/references/recipes/scripts/validate-deployment.sh b/plugins/azure-skills/skills/azure-validate/references/recipes/scripts/validate-deployment.sh similarity index 100% rename from plugin/skills/azure-validate/references/recipes/scripts/validate-deployment.sh rename to plugins/azure-skills/skills/azure-validate/references/recipes/scripts/validate-deployment.sh diff --git a/plugin/skills/azure-validate/references/recipes/terraform/README.md b/plugins/azure-skills/skills/azure-validate/references/recipes/terraform/README.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/terraform/README.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/terraform/README.md diff --git a/plugin/skills/azure-validate/references/recipes/terraform/errors.md b/plugins/azure-skills/skills/azure-validate/references/recipes/terraform/errors.md similarity index 100% rename from plugin/skills/azure-validate/references/recipes/terraform/errors.md rename to plugins/azure-skills/skills/azure-validate/references/recipes/terraform/errors.md diff --git a/plugin/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.ps1 b/plugins/azure-skills/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.ps1 similarity index 100% rename from plugin/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.ps1 rename to plugins/azure-skills/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.ps1 diff --git a/plugin/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.sh b/plugins/azure-skills/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.sh similarity index 100% rename from plugin/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.sh rename to plugins/azure-skills/skills/azure-validate/references/recipes/terraform/scripts/validate-terraform.sh diff --git a/plugin/skills/azure-validate/references/region-availability.md b/plugins/azure-skills/skills/azure-validate/references/region-availability.md similarity index 100% rename from plugin/skills/azure-validate/references/region-availability.md rename to plugins/azure-skills/skills/azure-validate/references/region-availability.md diff --git a/plugin/skills/azure-validate/references/role-verification.md b/plugins/azure-skills/skills/azure-validate/references/role-verification.md similarity index 100% rename from plugin/skills/azure-validate/references/role-verification.md rename to plugins/azure-skills/skills/azure-validate/references/role-verification.md diff --git a/plugin/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.ps1 b/plugins/azure-skills/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.ps1 similarity index 100% rename from plugin/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.ps1 rename to plugins/azure-skills/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.ps1 diff --git a/plugin/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.sh b/plugins/azure-skills/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.sh similarity index 100% rename from plugin/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.sh rename to plugins/azure-skills/skills/azure-validate/references/scripts/scan-aspire-functions-secrets.sh diff --git a/plugin/skills/azure-upgrade/version.json b/plugins/azure-skills/skills/azure-validate/version.json similarity index 100% rename from plugin/skills/azure-upgrade/version.json rename to plugins/azure-skills/skills/azure-validate/version.json diff --git a/plugin/skills/entra-agent-id/SKILL.md b/plugins/azure-skills/skills/entra-agent-id/SKILL.md similarity index 100% rename from plugin/skills/entra-agent-id/SKILL.md rename to plugins/azure-skills/skills/entra-agent-id/SKILL.md diff --git a/plugin/skills/entra-agent-id/references/known-limitations.md b/plugins/azure-skills/skills/entra-agent-id/references/known-limitations.md similarity index 100% rename from plugin/skills/entra-agent-id/references/known-limitations.md rename to plugins/azure-skills/skills/entra-agent-id/references/known-limitations.md diff --git a/plugin/skills/entra-agent-id/references/oauth2-token-flow.md b/plugins/azure-skills/skills/entra-agent-id/references/oauth2-token-flow.md similarity index 100% rename from plugin/skills/entra-agent-id/references/oauth2-token-flow.md rename to plugins/azure-skills/skills/entra-agent-id/references/oauth2-token-flow.md diff --git a/plugin/skills/entra-agent-id/references/obo-blueprint-setup.md b/plugins/azure-skills/skills/entra-agent-id/references/obo-blueprint-setup.md similarity index 100% rename from plugin/skills/entra-agent-id/references/obo-blueprint-setup.md rename to plugins/azure-skills/skills/entra-agent-id/references/obo-blueprint-setup.md diff --git a/plugin/skills/entra-agent-id/references/runtime-token-exchange.md b/plugins/azure-skills/skills/entra-agent-id/references/runtime-token-exchange.md similarity index 100% rename from plugin/skills/entra-agent-id/references/runtime-token-exchange.md rename to plugins/azure-skills/skills/entra-agent-id/references/runtime-token-exchange.md diff --git a/plugin/skills/entra-agent-id/references/sdk-sidecar-deployment.md b/plugins/azure-skills/skills/entra-agent-id/references/sdk-sidecar-deployment.md similarity index 100% rename from plugin/skills/entra-agent-id/references/sdk-sidecar-deployment.md rename to plugins/azure-skills/skills/entra-agent-id/references/sdk-sidecar-deployment.md diff --git a/plugin/skills/entra-agent-id/references/sdk-sidecar.md b/plugins/azure-skills/skills/entra-agent-id/references/sdk-sidecar.md similarity index 100% rename from plugin/skills/entra-agent-id/references/sdk-sidecar.md rename to plugins/azure-skills/skills/entra-agent-id/references/sdk-sidecar.md diff --git a/plugin/skills/entra-agent-id/version.json b/plugins/azure-skills/skills/entra-agent-id/version.json similarity index 100% rename from plugin/skills/entra-agent-id/version.json rename to plugins/azure-skills/skills/entra-agent-id/version.json diff --git a/plugin/skills/entra-app-registration/SKILL.md b/plugins/azure-skills/skills/entra-app-registration/SKILL.md similarity index 100% rename from plugin/skills/entra-app-registration/SKILL.md rename to plugins/azure-skills/skills/entra-app-registration/SKILL.md diff --git a/plugin/skills/entra-app-registration/references/BICEP-EXAMPLE.bicep b/plugins/azure-skills/skills/entra-app-registration/references/BICEP-EXAMPLE.bicep similarity index 100% rename from plugin/skills/entra-app-registration/references/BICEP-EXAMPLE.bicep rename to plugins/azure-skills/skills/entra-app-registration/references/BICEP-EXAMPLE.bicep diff --git a/plugin/skills/entra-app-registration/references/api-permissions.md b/plugins/azure-skills/skills/entra-app-registration/references/api-permissions.md similarity index 100% rename from plugin/skills/entra-app-registration/references/api-permissions.md rename to plugins/azure-skills/skills/entra-app-registration/references/api-permissions.md diff --git a/plugin/skills/entra-app-registration/references/auth-best-practices.md b/plugins/azure-skills/skills/entra-app-registration/references/auth-best-practices.md similarity index 100% rename from plugin/skills/entra-app-registration/references/auth-best-practices.md rename to plugins/azure-skills/skills/entra-app-registration/references/auth-best-practices.md diff --git a/plugin/skills/entra-app-registration/references/cli-commands.md b/plugins/azure-skills/skills/entra-app-registration/references/cli-commands.md similarity index 100% rename from plugin/skills/entra-app-registration/references/cli-commands.md rename to plugins/azure-skills/skills/entra-app-registration/references/cli-commands.md diff --git a/plugin/skills/entra-app-registration/references/console-app-example.md b/plugins/azure-skills/skills/entra-app-registration/references/console-app-example.md similarity index 100% rename from plugin/skills/entra-app-registration/references/console-app-example.md rename to plugins/azure-skills/skills/entra-app-registration/references/console-app-example.md diff --git a/plugin/skills/entra-app-registration/references/first-app-registration.md b/plugins/azure-skills/skills/entra-app-registration/references/first-app-registration.md similarity index 100% rename from plugin/skills/entra-app-registration/references/first-app-registration.md rename to plugins/azure-skills/skills/entra-app-registration/references/first-app-registration.md diff --git a/plugin/skills/entra-app-registration/references/oauth-flows.md b/plugins/azure-skills/skills/entra-app-registration/references/oauth-flows.md similarity index 100% rename from plugin/skills/entra-app-registration/references/oauth-flows.md rename to plugins/azure-skills/skills/entra-app-registration/references/oauth-flows.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-identity-dotnet.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-dotnet.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-identity-dotnet.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-dotnet.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-identity-java.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-java.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-identity-java.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-java.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-identity-py.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-py.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-identity-py.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-py.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-identity-rust.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-rust.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-identity-rust.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-rust.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-identity-ts.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-ts.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-identity-ts.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-identity-ts.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-keyvault-py.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-keyvault-py.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-keyvault-py.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-keyvault-py.md diff --git a/plugin/skills/entra-app-registration/references/sdk/azure-keyvault-secrets-ts.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-keyvault-secrets-ts.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/azure-keyvault-secrets-ts.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/azure-keyvault-secrets-ts.md diff --git a/plugin/skills/entra-app-registration/references/sdk/microsoft-azure-webjobs-extensions-authentication-events-dotnet.md b/plugins/azure-skills/skills/entra-app-registration/references/sdk/microsoft-azure-webjobs-extensions-authentication-events-dotnet.md similarity index 100% rename from plugin/skills/entra-app-registration/references/sdk/microsoft-azure-webjobs-extensions-authentication-events-dotnet.md rename to plugins/azure-skills/skills/entra-app-registration/references/sdk/microsoft-azure-webjobs-extensions-authentication-events-dotnet.md diff --git a/plugin/skills/entra-app-registration/references/troubleshooting.md b/plugins/azure-skills/skills/entra-app-registration/references/troubleshooting.md similarity index 100% rename from plugin/skills/entra-app-registration/references/troubleshooting.md rename to plugins/azure-skills/skills/entra-app-registration/references/troubleshooting.md diff --git a/plugin/skills/azure-validate/version.json b/plugins/azure-skills/skills/entra-app-registration/version.json similarity index 100% rename from plugin/skills/azure-validate/version.json rename to plugins/azure-skills/skills/entra-app-registration/version.json diff --git a/plugin/skills/microsoft-foundry/.gitignore b/plugins/azure-skills/skills/microsoft-foundry/.gitignore similarity index 100% rename from plugin/skills/microsoft-foundry/.gitignore rename to plugins/azure-skills/skills/microsoft-foundry/.gitignore diff --git a/plugin/skills/microsoft-foundry/SKILL.md b/plugins/azure-skills/skills/microsoft-foundry/SKILL.md similarity index 100% rename from plugin/skills/microsoft-foundry/SKILL.md rename to plugins/azure-skills/skills/microsoft-foundry/SKILL.md diff --git a/plugin/skills/microsoft-foundry/finetuning/SKILL.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/SKILL.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/SKILL.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/SKILL.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/agentic-rft.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/agentic-rft.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/agentic-rft.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/agentic-rft.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/dataset-formats.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/dataset-formats.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/dataset-formats.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/dataset-formats.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/deployment.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/deployment.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/deployment.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/deployment.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/evaluation.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/evaluation.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/evaluation.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/evaluation.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/grader-design.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/grader-design.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/grader-design.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/grader-design.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/hyperparameters.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/hyperparameters.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/hyperparameters.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/hyperparameters.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/large-file-uploads.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/large-file-uploads.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/large-file-uploads.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/large-file-uploads.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/platform-gotchas.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/platform-gotchas.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/platform-gotchas.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/platform-gotchas.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/reward-hacking.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/reward-hacking.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/reward-hacking.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/reward-hacking.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/training-curves.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/training-curves.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/training-curves.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/training-curves.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/training-types.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/training-types.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/training-types.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/training-types.md diff --git a/plugin/skills/microsoft-foundry/finetuning/references/vision-fine-tuning.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/references/vision-fine-tuning.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/references/vision-fine-tuning.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/references/vision-fine-tuning.md diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/calibrate_grader.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/calibrate_grader.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/calibrate_grader.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/calibrate_grader.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/check_training.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/check_training.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/check_training.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/check_training.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/cleanup.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/cleanup.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/cleanup.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/cleanup.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/common.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/common.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/common.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/common.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/convert_dataset.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/convert_dataset.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/convert_dataset.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/convert_dataset.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/deploy_model.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/deploy_model.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/deploy_model.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/deploy_model.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/evaluate_model.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/evaluate_model.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/evaluate_model.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/evaluate_model.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/generate_distillation_data.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/generate_distillation_data.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/generate_distillation_data.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/generate_distillation_data.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/monitor_training.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/monitor_training.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/monitor_training.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/monitor_training.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/score_dataset.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/score_dataset.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/score_dataset.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/score_dataset.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/submit_training.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/submit_training.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/submit_training.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/submit_training.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/validate/__init__.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/__init__.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/validate/__init__.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/__init__.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/validate/data_stats.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/data_stats.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/validate/data_stats.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/data_stats.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/validate/validate_dpo.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/validate_dpo.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/validate/validate_dpo.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/validate_dpo.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/validate/validate_rft.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/validate_rft.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/validate/validate_rft.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/validate_rft.py diff --git a/plugin/skills/microsoft-foundry/finetuning/scripts/validate/validate_sft.py b/plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/validate_sft.py similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/scripts/validate/validate_sft.py rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/scripts/validate/validate_sft.py diff --git a/plugin/skills/microsoft-foundry/finetuning/workflows/dataset-creation.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/dataset-creation.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/workflows/dataset-creation.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/dataset-creation.md diff --git a/plugin/skills/microsoft-foundry/finetuning/workflows/diagnose-poor-results.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/diagnose-poor-results.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/workflows/diagnose-poor-results.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/diagnose-poor-results.md diff --git a/plugin/skills/microsoft-foundry/finetuning/workflows/full-pipeline.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/full-pipeline.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/workflows/full-pipeline.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/full-pipeline.md diff --git a/plugin/skills/microsoft-foundry/finetuning/workflows/iterative-training.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/iterative-training.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/workflows/iterative-training.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/iterative-training.md diff --git a/plugin/skills/microsoft-foundry/finetuning/workflows/quickstart.md b/plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/quickstart.md similarity index 100% rename from plugin/skills/microsoft-foundry/finetuning/workflows/quickstart.md rename to plugins/azure-skills/skills/microsoft-foundry/finetuning/workflows/quickstart.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/agent-optimizer.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/agent-optimizer.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/agent-optimizer.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/agent-optimizer.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/azd-setup.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/azd-setup.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/azd-setup.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/azd-setup.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/eval-yaml.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/eval-yaml.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/eval-yaml.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/eval-yaml.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/optimize-workflow.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/optimize-workflow.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/optimize-workflow.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/optimize-workflow.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/python-patterns.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/python-patterns.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/python-patterns.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/python-patterns.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/scaffold.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/scaffold.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/scaffold.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/agent-optimizer/references/scaffold.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/azd-guidance/azd-guidance.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/azd-guidance/azd-guidance.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/azd-guidance/azd-guidance.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/azd-guidance/azd-guidance.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/azd-guidance/references/azd-ai-cli.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/azd-guidance/references/azd-ai-cli.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/azd-guidance/references/azd-ai-cli.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/azd-guidance/references/azd-ai-cli.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/cicd/cicd.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/cicd/cicd.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/cicd/cicd.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/cicd/cicd.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/create-hosted.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/create-hosted.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/create-hosted.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/create-hosted.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/create-prompt.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/create-prompt.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/create-prompt.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/create-prompt.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/quick-start-hosted.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/quick-start-hosted.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/quick-start-hosted.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/quick-start-hosted.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/agentframework.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/agentframework.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/agentframework.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/agentframework.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/enable-incoming-a2a.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/enable-incoming-a2a.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/enable-incoming-a2a.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/enable-incoming-a2a.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/foundry-tool-catalog.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/foundry-tool-catalog.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/foundry-tool-catalog.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/foundry-tool-catalog.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-api-create.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-api-create.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-api-create.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-api-create.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-attach.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-attach.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-attach.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-attach.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-manage.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-manage.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-manage.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/guardrails/guardrail-manage.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/local-run.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/local-run.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/local-run.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/local-run.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/sdk-operations.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/sdk-operations.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/sdk-operations.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/sdk-operations.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-attach.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-attach.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-attach.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-attach.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-manage.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-manage.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-manage.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-manage.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-toolbox-attach.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-toolbox-attach.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-toolbox-attach.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/skills/skill-toolbox-attach.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/agent-tools.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/agent-tools.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/agent-tools.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/agent-tools.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-a2a.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-a2a.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-a2a.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-a2a.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-azure-ai-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-azure-ai-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-azure-ai-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-azure-ai-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-bing-grounding.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-bing-grounding.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-bing-grounding.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-bing-grounding.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-code-interpreter.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-code-interpreter.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-code-interpreter.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-code-interpreter.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-fabric-iq.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-fabric-iq.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-fabric-iq.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-fabric-iq.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-file-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-file-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-file-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-file-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-function-calling.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-function-calling.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-function-calling.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-function-calling.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-mcp.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-mcp.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-mcp.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-mcp.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-memory.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-memory.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-memory.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-memory.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-openapi.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-openapi.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-openapi.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-openapi.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-web-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-web-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-web-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-web-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-work-iq.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-work-iq.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-work-iq.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/tools/prompt-agent/tool-work-iq.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/references/use-toolbox-in-hosted-agent.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/use-toolbox-in-hosted-agent.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/references/use-toolbox-in-hosted-agent.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/references/use-toolbox-in-hosted-agent.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.ps1 b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.ps1 diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.sh b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.sh similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.sh rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/check-copilot-app-entry.sh diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.ps1 b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.ps1 diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.sh b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.sh similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.sh rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/resolve-project-id.sh diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.ps1 b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.ps1 diff --git a/plugin/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.sh b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.sh similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.sh rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/create/scripts/verify-environment.sh diff --git a/plugin/skills/microsoft-foundry/foundry-agent/deploy/deploy.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/deploy/deploy.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/deploy/deploy.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/deploy/deploy.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/eval-datasets.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/eval-datasets.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/eval-datasets.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/eval-datasets.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-comparison.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-comparison.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-comparison.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-comparison.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-curation.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-curation.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-curation.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-curation.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-organization.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-organization.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-organization.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-organization.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-versioning.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-versioning.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-versioning.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/dataset-versioning.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-lineage.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-lineage.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-lineage.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-lineage.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-regression.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-regression.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-regression.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-regression.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-trending.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-trending.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-trending.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/eval-trending.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/generate-seed-dataset.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/generate-seed-dataset.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/generate-seed-dataset.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/generate-seed-dataset.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/trace-to-dataset.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/trace-to-dataset.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/trace-to-dataset.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/eval-datasets/references/trace-to-dataset.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/invocations-ws/invocations-ws.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invocations-ws/invocations-ws.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/invocations-ws/invocations-ws.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invocations-ws/invocations-ws.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/invocations-ws/references/invocations-ws-protocol.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invocations-ws/references/invocations-ws-protocol.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/invocations-ws/references/invocations-ws-protocol.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invocations-ws/references/invocations-ws-protocol.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/invoke/invoke.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/invoke.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/invoke/invoke.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/invoke.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/invoke/references/file-operations.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/references/file-operations.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/invoke/references/file-operations.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/references/file-operations.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/invoke/references/invocations-protocol.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/references/invocations-protocol.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/invoke/references/invocations-protocol.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/references/invocations-protocol.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/invoke/references/session-management.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/references/session-management.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/invoke/references/session-management.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/invoke/references/session-management.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/observe.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/observe.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/observe.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/observe.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/analyze-results.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/analyze-results.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/analyze-results.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/analyze-results.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/cicd-monitoring.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/cicd-monitoring.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/cicd-monitoring.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/cicd-monitoring.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/compare-iterate.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/compare-iterate.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/compare-iterate.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/compare-iterate.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/continuous-eval.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/continuous-eval.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/continuous-eval.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/continuous-eval.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/deploy-and-setup.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/deploy-and-setup.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/deploy-and-setup.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/deploy-and-setup.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/evaluate-step.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/evaluate-step.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/evaluate-step.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/evaluate-step.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/evaluation-suite-generation.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/evaluation-suite-generation.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/evaluation-suite-generation.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/evaluation-suite-generation.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/observe/references/optimize-deploy.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/optimize-deploy.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/observe/references/optimize-deploy.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/observe/references/optimize-deploy.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/routine/references/azure-yaml.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/references/azure-yaml.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/routine/references/azure-yaml.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/references/azure-yaml.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/routine/references/cli-crud.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/references/cli-crud.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/routine/references/cli-crud.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/references/cli-crud.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/routine/routine.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/routine.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/routine/routine.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/routine/routine.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/mcp-protocol.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/mcp-protocol.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/mcp-protocol.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/mcp-protocol.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/test-endpoint.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/test-endpoint.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/test-endpoint.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/test-endpoint.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-a2a.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-a2a.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-a2a.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-a2a.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-azure-ai-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-azure-ai-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-azure-ai-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-azure-ai-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-browser-automation.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-browser-automation.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-browser-automation.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-browser-automation.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-code-interpreter.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-code-interpreter.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-code-interpreter.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-code-interpreter.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-fabric-iq.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-fabric-iq.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-fabric-iq.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-fabric-iq.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-file-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-file-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-file-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-file-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-agent-identity.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-agent-identity.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-agent-identity.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-agent-identity.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth-azure-starter.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth-azure-starter.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth-azure-starter.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth-azure-starter.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-custom-oauth.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-key-auth.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-key-auth.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-key-auth.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-key-auth.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-managed-oauth.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-managed-oauth.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-managed-oauth.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-managed-oauth.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-noauth.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-noauth.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-noauth.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-noauth.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-user-entra-token.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-user-entra-token.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-user-entra-token.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-mcp-user-entra-token.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-openapi.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-openapi.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-openapi.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-openapi.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-tool-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-tool-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-tool-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-tool-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-web-search.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-web-search.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-web-search.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-web-search.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-work-iq.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-work-iq.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-work-iq.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/tool-work-iq.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/toolbox-azd.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/toolbox-azd.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/references/toolbox-azd.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/references/toolbox-azd.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.ps1 b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.ps1 diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.sh b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.sh similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.sh rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/scripts/get-catalog-inputs.sh diff --git a/plugin/skills/microsoft-foundry/foundry-agent/toolbox/toolbox.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/toolbox.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/toolbox/toolbox.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/toolbox/toolbox.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/analyze-failures.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/analyze-failures.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/analyze-failures.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/analyze-failures.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/analyze-latency.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/analyze-latency.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/analyze-latency.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/analyze-latency.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/conversation-detail.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/conversation-detail.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/conversation-detail.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/conversation-detail.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/eval-correlation.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/eval-correlation.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/eval-correlation.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/eval-correlation.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/kql-templates.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/kql-templates.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/kql-templates.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/kql-templates.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/search-traces.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/search-traces.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/search-traces.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/search-traces.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/references/tracing-insights-api.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/tracing-insights-api.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/references/tracing-insights-api.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/references/tracing-insights-api.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/trace/trace.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/trace.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/trace/trace.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/trace/trace.md diff --git a/plugin/skills/microsoft-foundry/foundry-agent/troubleshoot/troubleshoot.md b/plugins/azure-skills/skills/microsoft-foundry/foundry-agent/troubleshoot/troubleshoot.md similarity index 100% rename from plugin/skills/microsoft-foundry/foundry-agent/troubleshoot/troubleshoot.md rename to plugins/azure-skills/skills/microsoft-foundry/foundry-agent/troubleshoot/troubleshoot.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/SKILL.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/SKILL.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/SKILL.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/SKILL.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/TEST_PROMPTS.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/TEST_PROMPTS.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/TEST_PROMPTS.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/TEST_PROMPTS.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/capacity/SKILL.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/SKILL.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/capacity/SKILL.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/SKILL.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.ps1 b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.ps1 diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.sh b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.sh similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.sh rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/discover_and_rank.sh diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.ps1 b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.ps1 diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.sh b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.sh similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.sh rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/capacity/scripts/query_capacity.sh diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/customize/EXAMPLES.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/EXAMPLES.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/customize/EXAMPLES.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/EXAMPLES.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/customize/SKILL.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/SKILL.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/customize/SKILL.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/SKILL.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/customize/references/customize-guides.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/references/customize-guides.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/customize/references/customize-guides.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/references/customize-guides.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/customize/references/customize-workflow.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/references/customize-workflow.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/customize/references/customize-workflow.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/customize/references/customize-workflow.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/preset/EXAMPLES.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/EXAMPLES.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/preset/EXAMPLES.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/EXAMPLES.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/preset/SKILL.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/SKILL.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/preset/SKILL.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/SKILL.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/preset/references/preset-workflow.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/references/preset-workflow.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/preset/references/preset-workflow.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/references/preset-workflow.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/preset/references/workflow.md b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/references/workflow.md similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/preset/references/workflow.md rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/preset/references/workflow.md diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.ps1 b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.ps1 similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.ps1 rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.ps1 diff --git a/plugin/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.sh b/plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.sh similarity index 100% rename from plugin/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.sh rename to plugins/azure-skills/skills/microsoft-foundry/models/deploy-model/scripts/generate_deployment_url.sh diff --git a/plugin/skills/microsoft-foundry/project/connections.md b/plugins/azure-skills/skills/microsoft-foundry/project/connections.md similarity index 100% rename from plugin/skills/microsoft-foundry/project/connections.md rename to plugins/azure-skills/skills/microsoft-foundry/project/connections.md diff --git a/plugin/skills/microsoft-foundry/project/create/create-foundry-project.md b/plugins/azure-skills/skills/microsoft-foundry/project/create/create-foundry-project.md similarity index 100% rename from plugin/skills/microsoft-foundry/project/create/create-foundry-project.md rename to plugins/azure-skills/skills/microsoft-foundry/project/create/create-foundry-project.md diff --git a/plugin/skills/microsoft-foundry/quota/quota.md b/plugins/azure-skills/skills/microsoft-foundry/quota/quota.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/quota.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/quota.md diff --git a/plugin/skills/microsoft-foundry/quota/references/capacity-planning.md b/plugins/azure-skills/skills/microsoft-foundry/quota/references/capacity-planning.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/references/capacity-planning.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/references/capacity-planning.md diff --git a/plugin/skills/microsoft-foundry/quota/references/error-resolution.md b/plugins/azure-skills/skills/microsoft-foundry/quota/references/error-resolution.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/references/error-resolution.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/references/error-resolution.md diff --git a/plugin/skills/microsoft-foundry/quota/references/optimization.md b/plugins/azure-skills/skills/microsoft-foundry/quota/references/optimization.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/references/optimization.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/references/optimization.md diff --git a/plugin/skills/microsoft-foundry/quota/references/ptu-guide.md b/plugins/azure-skills/skills/microsoft-foundry/quota/references/ptu-guide.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/references/ptu-guide.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/references/ptu-guide.md diff --git a/plugin/skills/microsoft-foundry/quota/references/troubleshooting.md b/plugins/azure-skills/skills/microsoft-foundry/quota/references/troubleshooting.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/references/troubleshooting.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/references/troubleshooting.md diff --git a/plugin/skills/microsoft-foundry/quota/references/workflows.md b/plugins/azure-skills/skills/microsoft-foundry/quota/references/workflows.md similarity index 100% rename from plugin/skills/microsoft-foundry/quota/references/workflows.md rename to plugins/azure-skills/skills/microsoft-foundry/quota/references/workflows.md diff --git a/plugin/skills/microsoft-foundry/rbac/rbac.md b/plugins/azure-skills/skills/microsoft-foundry/rbac/rbac.md similarity index 100% rename from plugin/skills/microsoft-foundry/rbac/rbac.md rename to plugins/azure-skills/skills/microsoft-foundry/rbac/rbac.md diff --git a/plugin/skills/microsoft-foundry/references/agent-metadata-contract.md b/plugins/azure-skills/skills/microsoft-foundry/references/agent-metadata-contract.md similarity index 100% rename from plugin/skills/microsoft-foundry/references/agent-metadata-contract.md rename to plugins/azure-skills/skills/microsoft-foundry/references/agent-metadata-contract.md diff --git a/plugin/skills/microsoft-foundry/references/auth-best-practices.md b/plugins/azure-skills/skills/microsoft-foundry/references/auth-best-practices.md similarity index 100% rename from plugin/skills/microsoft-foundry/references/auth-best-practices.md rename to plugins/azure-skills/skills/microsoft-foundry/references/auth-best-practices.md diff --git a/plugin/skills/microsoft-foundry/references/sdk/foundry-sdk-py.md b/plugins/azure-skills/skills/microsoft-foundry/references/sdk/foundry-sdk-py.md similarity index 100% rename from plugin/skills/microsoft-foundry/references/sdk/foundry-sdk-py.md rename to plugins/azure-skills/skills/microsoft-foundry/references/sdk/foundry-sdk-py.md diff --git a/plugin/skills/microsoft-foundry/references/standard-agent-setup.md b/plugins/azure-skills/skills/microsoft-foundry/references/standard-agent-setup.md similarity index 100% rename from plugin/skills/microsoft-foundry/references/standard-agent-setup.md rename to plugins/azure-skills/skills/microsoft-foundry/references/standard-agent-setup.md diff --git a/plugin/skills/microsoft-foundry/resource/create/create-foundry-resource.md b/plugins/azure-skills/skills/microsoft-foundry/resource/create/create-foundry-resource.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/create/create-foundry-resource.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/create/create-foundry-resource.md diff --git a/plugin/skills/microsoft-foundry/resource/create/references/patterns.md b/plugins/azure-skills/skills/microsoft-foundry/resource/create/references/patterns.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/create/references/patterns.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/create/references/patterns.md diff --git a/plugin/skills/microsoft-foundry/resource/create/references/troubleshooting.md b/plugins/azure-skills/skills/microsoft-foundry/resource/create/references/troubleshooting.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/create/references/troubleshooting.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/create/references/troubleshooting.md diff --git a/plugin/skills/microsoft-foundry/resource/create/references/workflows.md b/plugins/azure-skills/skills/microsoft-foundry/resource/create/references/workflows.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/create/references/workflows.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/create/references/workflows.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/private-network.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/private-network.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/private-network.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/private-network.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/custom-template-adaptation.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/custom-template-adaptation.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/custom-template-adaptation.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/custom-template-adaptation.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/deploy.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/deploy.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/deploy.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/deploy.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/end-to-end-test.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/end-to-end-test.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/end-to-end-test.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/end-to-end-test.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/intake.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/intake.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/intake.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/intake.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/post-deployment-validation.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/post-deployment-validation.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/post-deployment-validation.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/post-deployment-validation.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/scaffold.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/scaffold.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/scaffold.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/scaffold.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/template-index.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/template-index.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/template-index.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/template-index.md diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.bicep b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.bicep similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.bicep rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.bicep diff --git a/plugin/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.md b/plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.md similarity index 100% rename from plugin/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.md rename to plugins/azure-skills/skills/microsoft-foundry/resource/private-network/references/vpn-dns-setup.md diff --git a/plugin/skills/entra-app-registration/version.json b/plugins/azure-skills/skills/microsoft-foundry/version.json similarity index 100% rename from plugin/skills/entra-app-registration/version.json rename to plugins/azure-skills/skills/microsoft-foundry/version.json diff --git a/plugin/skills/python-appservice-deploy/SKILL.md b/plugins/azure-skills/skills/python-appservice-deploy/SKILL.md similarity index 100% rename from plugin/skills/python-appservice-deploy/SKILL.md rename to plugins/azure-skills/skills/python-appservice-deploy/SKILL.md diff --git a/plugin/skills/python-appservice-deploy/references/create-app.md b/plugins/azure-skills/skills/python-appservice-deploy/references/create-app.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/create-app.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/create-app.md diff --git a/plugin/skills/python-appservice-deploy/references/deploy-azcli.md b/plugins/azure-skills/skills/python-appservice-deploy/references/deploy-azcli.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/deploy-azcli.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/deploy-azcli.md diff --git a/plugin/skills/python-appservice-deploy/references/deploy-azd.md b/plugins/azure-skills/skills/python-appservice-deploy/references/deploy-azd.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/deploy-azd.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/deploy-azd.md diff --git a/plugin/skills/python-appservice-deploy/references/detect.md b/plugins/azure-skills/skills/python-appservice-deploy/references/detect.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/detect.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/detect.md diff --git a/plugin/skills/python-appservice-deploy/references/errors.md b/plugins/azure-skills/skills/python-appservice-deploy/references/errors.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/errors.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/errors.md diff --git a/plugin/skills/python-appservice-deploy/references/post-deploy-message.md b/plugins/azure-skills/skills/python-appservice-deploy/references/post-deploy-message.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/post-deploy-message.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/post-deploy-message.md diff --git a/plugin/skills/python-appservice-deploy/references/startup-commands.md b/plugins/azure-skills/skills/python-appservice-deploy/references/startup-commands.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/startup-commands.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/startup-commands.md diff --git a/plugin/skills/python-appservice-deploy/references/transient-retry.md b/plugins/azure-skills/skills/python-appservice-deploy/references/transient-retry.md similarity index 100% rename from plugin/skills/python-appservice-deploy/references/transient-retry.md rename to plugins/azure-skills/skills/python-appservice-deploy/references/transient-retry.md diff --git a/plugin/skills/python-appservice-deploy/scripts/generate-app-name.ps1 b/plugins/azure-skills/skills/python-appservice-deploy/scripts/generate-app-name.ps1 similarity index 100% rename from plugin/skills/python-appservice-deploy/scripts/generate-app-name.ps1 rename to plugins/azure-skills/skills/python-appservice-deploy/scripts/generate-app-name.ps1 diff --git a/plugin/skills/python-appservice-deploy/scripts/generate-app-name.sh b/plugins/azure-skills/skills/python-appservice-deploy/scripts/generate-app-name.sh similarity index 100% rename from plugin/skills/python-appservice-deploy/scripts/generate-app-name.sh rename to plugins/azure-skills/skills/python-appservice-deploy/scripts/generate-app-name.sh diff --git a/plugin/skills/python-appservice-deploy/scripts/retry-az-create.ps1 b/plugins/azure-skills/skills/python-appservice-deploy/scripts/retry-az-create.ps1 similarity index 100% rename from plugin/skills/python-appservice-deploy/scripts/retry-az-create.ps1 rename to plugins/azure-skills/skills/python-appservice-deploy/scripts/retry-az-create.ps1 diff --git a/plugin/skills/python-appservice-deploy/scripts/retry-az-create.sh b/plugins/azure-skills/skills/python-appservice-deploy/scripts/retry-az-create.sh similarity index 100% rename from plugin/skills/python-appservice-deploy/scripts/retry-az-create.sh rename to plugins/azure-skills/skills/python-appservice-deploy/scripts/retry-az-create.sh diff --git a/plugin/skills/python-appservice-deploy/version.json b/plugins/azure-skills/skills/python-appservice-deploy/version.json similarity index 100% rename from plugin/skills/python-appservice-deploy/version.json rename to plugins/azure-skills/skills/python-appservice-deploy/version.json diff --git a/plugin/version.json b/plugins/azure-skills/version.json similarity index 100% rename from plugin/version.json rename to plugins/azure-skills/version.json diff --git a/scripts/package-lock.json b/scripts/package-lock.json index f3a226329..dcde97fd9 100644 --- a/scripts/package-lock.json +++ b/scripts/package-lock.json @@ -16,7 +16,6 @@ "fast-xml-parser": "^5.9.0", "gray-matter": "^4.0.3", "micromatch": "^4.0.8", - "sirv-cli": "^3.0.1", "tsx": "^4.22.1", "typescript": "~6.0.2", "typescript-eslint": "^8.61.0", @@ -810,13 +809,6 @@ "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", @@ -1658,16 +1650,6 @@ "node": ">=18" } }, - "node_modules/console-clear": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", - "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2144,19 +2126,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2387,16 +2356,6 @@ "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2672,16 +2631,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/local-access": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", - "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2777,26 +2726,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3035,19 +2964,6 @@ "@rolldown/binding-win32-x64-msvc": "1.0.3" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -3062,16 +2978,6 @@ "node": ">=4" } }, - "node_modules/semiver": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", - "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/semver": { "version": "7.7.3", "dev": true, @@ -3111,44 +3017,6 @@ "dev": true, "license": "ISC" }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/sirv-cli": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-3.0.1.tgz", - "integrity": "sha512-ICXaF2u6IQhLZ0EXF6nqUF4YODfSQSt+mGykt4qqO5rY+oIiwdg7B8w2PVDBJlQulaS2a3J8666CUoDoAuCGvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "console-clear": "^1.1.0", - "get-port": "^5.1.1", - "kleur": "^4.1.4", - "local-access": "^1.0.1", - "sade": "^1.6.0", - "semiver": "^1.0.0", - "sirv": "^3.0.0", - "tinydate": "^1.0.0" - }, - "bin": { - "sirv": "bin.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3220,16 +3088,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tinydate": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", - "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tinyexec": { "version": "1.0.2", "dev": true, @@ -3278,16 +3136,6 @@ "node": ">=8.0" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", diff --git a/scripts/package.json b/scripts/package.json index ca6094fa3..bce94c982 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -9,19 +9,14 @@ "checkPluginVersionPr": "node --import tsx src/check-plugin-version-pr.ts", "verifyBuildOutputVersions": "node --import tsx src/verify-build-output-versions.ts", "tokens": "node --import tsx src/tokens/cli.ts", - "local": "echo 'Removed: use npm run build at repo root + copilot --plugin-dir ./output instead' && exit 1", "references": "node --import tsx src/references/cli.ts", "frontmatter": "node --import tsx src/frontmatter/cli.ts", - "verify-local": "echo 'Removed: use npm run build at repo root + copilot --plugin-dir ./output instead' && exit 1", "test": "vitest run", - "test:watch": "vitest", "test:coverage": "vitest run --coverage", "typecheck": "tsc --noEmit", "lint": "eslint", "lint:fix": "eslint --fix", "dashboard:collect": "node --import tsx src/dashboard/compose.ts", - "dashboard:serve": "sirv ../dashboard --port 3000 --dev", - "dashboard": "npm run dashboard:collect && npm run dashboard:serve", "generateMcpAllowlists": "node --import tsx src/generate-mcp-allowlists.ts", "vally": "node --import tsx src/vally/cli.ts" }, @@ -34,7 +29,6 @@ "fast-xml-parser": "^5.9.0", "gray-matter": "^4.0.3", "micromatch": "^4.0.8", - "sirv-cli": "^3.0.1", "tsx": "^4.22.1", "typescript": "~6.0.2", "typescript-eslint": "^8.61.0", @@ -43,4 +37,4 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } -} +} \ No newline at end of file diff --git a/scripts/src/__tests__/update-plugin-version.test.ts b/scripts/src/__tests__/update-plugin-version.test.ts deleted file mode 100644 index c37777cbe..000000000 --- a/scripts/src/__tests__/update-plugin-version.test.ts +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Tests for update-plugin-version.ts - */ - -import { describe, it, expect, beforeEach, afterEach, vi, type MockInstance } from "vitest"; -import { join } from "node:path"; -import { mkdirSync, writeFileSync, rmSync, readFileSync, existsSync } from "node:fs"; - -const TEST_DIR = join(process.cwd(), "__test_fixtures_update_plugin__"); - -// Import the actual function we want to test -import { updatePluginVersion } from "../update-plugin-version.js"; - -describe("updatePluginVersion", () => { - let consoleLogSpy: MockInstance; - let consoleErrorSpy: MockInstance; - - beforeEach(() => { - // Clean up and create test directory - if (existsSync(TEST_DIR)) { - rmSync(TEST_DIR, { recursive: true, force: true }); - } - mkdirSync(TEST_DIR, { recursive: true }); - - // Setup spies - consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => {}); - consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); - - // Create the directory structure that the function expects - mkdirSync(join(TEST_DIR, "plugin", ".claude-plugin"), { recursive: true }); - mkdirSync(join(TEST_DIR, "plugin", ".plugin"), { recursive: true }); - }); - - afterEach(async () => { - // Restore spies - consoleLogSpy.mockRestore(); - consoleErrorSpy.mockRestore(); - - // Small delay to allow file handles to close - await new Promise(resolve => setTimeout(resolve, 10)); - - // Clean up test directory - try { - if (existsSync(TEST_DIR)) { - rmSync(TEST_DIR, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); - } - } catch { - // Ignore cleanup errors in tests - } - }); - - describe("successful version updates", () => { - it("updates both plugin.json files with the new version", () => { - // Create test plugin files - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - - const testPluginFiles = [claudePluginPath, regularPluginPath]; - - const initialConfig = { - version: "1.0.0", - name: "test-plugin", - description: "Test plugin" - }; - - writeFileSync(claudePluginPath, JSON.stringify(initialConfig, null, 2) + "\n"); - writeFileSync(regularPluginPath, JSON.stringify(initialConfig, null, 2) + "\n"); - - // Call the function with custom paths - const result = updatePluginVersion("2.0.0", testPluginFiles); - - // Verify function returned success (no errors) - expect(result).toBe(false); - - // Verify both files were updated - const claudePluginContent = JSON.parse(readFileSync(claudePluginPath, "utf8")); - const regularPluginContent = JSON.parse(readFileSync(regularPluginPath, "utf8")); - - expect(claudePluginContent.version).toBe("2.0.0"); - expect(regularPluginContent.version).toBe("2.0.0"); - - // Verify other properties were preserved - expect(claudePluginContent.name).toBe("test-plugin"); - expect(regularPluginContent.description).toBe("Test plugin"); - - // Verify console output - expect(consoleLogSpy).toHaveBeenCalledWith("Updating plugin files to version: 2.0.0"); - expect(consoleLogSpy).toHaveBeenCalledWith(`✓ Updated ${claudePluginPath} to version 2.0.0`); - expect(consoleLogSpy).toHaveBeenCalledWith(`✓ Updated ${regularPluginPath} to version 2.0.0`); - }); - - it("preserves existing properties while updating version", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - - const testPluginFiles = [claudePluginPath, regularPluginPath]; - - const complexConfig = { - version: "1.0.0", - name: "complex-plugin", - description: "A complex plugin with multiple properties", - author: "Test Author", - keywords: ["test", "plugin"], - settings: { - enabled: true, - theme: "dark" - } - }; - - writeFileSync(claudePluginPath, JSON.stringify(complexConfig, null, 2) + "\n"); - writeFileSync(regularPluginPath, JSON.stringify(complexConfig, null, 2) + "\n"); - - const result = updatePluginVersion("3.0.0", testPluginFiles); - - // Verify function returned success (no errors) - expect(result).toBe(false); - - const claudeUpdatedConfig = JSON.parse(readFileSync(claudePluginPath, "utf8")); - const regularUpdatedConfig = JSON.parse(readFileSync(regularPluginPath, "utf8")); - - // Verify version was updated - expect(claudeUpdatedConfig.version).toBe("3.0.0"); - expect(regularUpdatedConfig.version).toBe("3.0.0"); - - // Verify other properties were preserved - expect(claudeUpdatedConfig.name).toBe("complex-plugin"); - expect(claudeUpdatedConfig.keywords).toEqual(["test", "plugin"]); - expect(claudeUpdatedConfig.settings).toEqual({ enabled: true, theme: "dark" }); - }); - - it("formats JSON with proper indentation and trailing newline", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - - const testPluginFiles = [claudePluginPath, regularPluginPath]; - const initialConfig = { version: "1.0.0", name: "test" }; - - // Write without proper formatting - writeFileSync(claudePluginPath, JSON.stringify(initialConfig)); - writeFileSync(regularPluginPath, JSON.stringify(initialConfig)); - - const result = updatePluginVersion("2.0.0", testPluginFiles); - - // Verify function returned success (no errors) - expect(result).toBe(false); - - const claudeFileContent = readFileSync(claudePluginPath, "utf8"); - const regularFileContent = readFileSync(regularPluginPath, "utf8"); - - // Check proper formatting (2-space indentation and trailing newline) - const expectedFormat = '{\n "version": "2.0.0",\n "name": "test"\n}\n'; - expect(claudeFileContent).toBe(expectedFormat); - expect(regularFileContent).toBe(expectedFormat); - expect(claudeFileContent.endsWith("\n")).toBe(true); - expect(regularFileContent.endsWith("\n")).toBe(true); - }); - }); - - describe("error handling", () => { - it("handles file not found error and returns true", () => { - const nonExistentFiles = [join(TEST_DIR, "nonexistent1.json"), join(TEST_DIR, "nonexistent2.json")]; - - const result = updatePluginVersion("2.0.0", nonExistentFiles); - - expect(result).toBe(true); - expect(consoleErrorSpy).toHaveBeenCalledWith(`File not found: ${nonExistentFiles[0]}`); - }); - - it("handles invalid JSON content and returns true", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const testPluginFiles = [claudePluginPath]; - - // Create file with invalid JSON - writeFileSync(claudePluginPath, "{ invalid json content"); - - const result = updatePluginVersion("2.0.0", testPluginFiles); - - expect(result).toBe(true); - expect(consoleErrorSpy).toHaveBeenCalledWith( - `Failed to update ${claudePluginPath}:`, - expect.any(String) - ); - }); - - it("stops processing further files after first error", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - const testPluginFiles = [claudePluginPath, regularPluginPath]; - - // Create first file with invalid JSON, second file doesn't matter - writeFileSync(claudePluginPath, "{ invalid json }"); - writeFileSync(regularPluginPath, JSON.stringify({ version: "1.0.0" }, null, 2) + "\n"); - - const result = updatePluginVersion("2.0.0", testPluginFiles); - - // Should return true indicating an error occurred - expect(result).toBe(true); - // Should only see error for first file, not attempt second - expect(consoleErrorSpy).toHaveBeenCalledTimes(1); - }); - }); - - describe("version parameter validation", () => { - it("accepts semantic versioning format", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - const testPluginFiles = [claudePluginPath, regularPluginPath]; - - const initialConfig = { version: "1.0.0" }; - - const versions = ["1.0.0", "2.1.3", "1.0.0-alpha.1", "1.0.0+build.123"]; - - for (const version of versions) { - writeFileSync(claudePluginPath, JSON.stringify(initialConfig, null, 2) + "\n"); - writeFileSync(regularPluginPath, JSON.stringify(initialConfig, null, 2) + "\n"); - - const result = updatePluginVersion(version, testPluginFiles); - - expect(result).toBe(false); - const claudeUpdatedConfig = JSON.parse(readFileSync(claudePluginPath, "utf8")); - const regularUpdatedConfig = JSON.parse(readFileSync(regularPluginPath, "utf8")); - - expect(claudeUpdatedConfig.version).toBe(version); - expect(regularUpdatedConfig.version).toBe(version); - } - }); - - it("accepts any string as version", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - const testPluginFiles = [claudePluginPath, regularPluginPath]; - - const initialConfig = { version: "1.0.0" }; - - writeFileSync(claudePluginPath, JSON.stringify(initialConfig, null, 2) + "\n"); - writeFileSync(regularPluginPath, JSON.stringify(initialConfig, null, 2) + "\n"); - - const result = updatePluginVersion("custom-version-string", testPluginFiles); - - expect(result).toBe(false); - const claudeUpdatedConfig = JSON.parse(readFileSync(claudePluginPath, "utf8")); - const regularUpdatedConfig = JSON.parse(readFileSync(regularPluginPath, "utf8")); - - expect(claudeUpdatedConfig.version).toBe("custom-version-string"); - expect(regularUpdatedConfig.version).toBe("custom-version-string"); - }); - }); - - describe("functionality verification", () => { - it("verifies the exported function from the original module exists", () => { - expect(updatePluginVersion).toBeDefined(); - expect(typeof updatePluginVersion).toBe("function"); - }); - - it("handles edge case of empty existing properties", () => { - const claudePluginPath = join(TEST_DIR, "plugin", ".claude-plugin", "plugin.json"); - const regularPluginPath = join(TEST_DIR, "plugin", ".plugin", "plugin.json"); - const testPluginFiles = [claudePluginPath, regularPluginPath]; - - const minimalConfig = { version: "0.0.1" }; - - writeFileSync(claudePluginPath, JSON.stringify(minimalConfig, null, 2) + "\n"); - writeFileSync(regularPluginPath, JSON.stringify(minimalConfig, null, 2) + "\n"); - - const result = updatePluginVersion("1.0.0", testPluginFiles); - - expect(result).toBe(false); - const claudeUpdatedConfig = JSON.parse(readFileSync(claudePluginPath, "utf8")); - const regularUpdatedConfig = JSON.parse(readFileSync(regularPluginPath, "utf8")); - - expect(claudeUpdatedConfig.version).toBe("1.0.0"); - expect(regularUpdatedConfig.version).toBe("1.0.0"); - expect(Object.keys(claudeUpdatedConfig)).toEqual(["version"]); - }); - }); -}); \ No newline at end of file diff --git a/scripts/src/check-plugin-version-pr.ts b/scripts/src/check-plugin-version-pr.ts index 8e3041338..131402d61 100755 --- a/scripts/src/check-plugin-version-pr.ts +++ b/scripts/src/check-plugin-version-pr.ts @@ -11,14 +11,35 @@ import * as fs from "node:fs"; import * as path from "node:path"; import { fileURLToPath } from "node:url"; -const PLUGIN_PATHS = [ - "plugin/.plugin/plugin.json", - "plugin/.claude-plugin/plugin.json", - "plugin/.cursor-plugin/plugin.json" +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const PLUGIN_RELATIVE_PATHS = [ + ".plugin/plugin.json", + ".claude-plugin/plugin.json", + ".cursor-plugin/plugin.json" ] as const; const EXPECTED_VERSION = "0.0.0-placeholder"; +function getPluginDirectoryNames(repoRoot: string): string[] { + const pluginsRoot = path.resolve(repoRoot, "plugins"); + if (!fs.existsSync(pluginsRoot)) { + return []; + } + + return fs + .readdirSync(pluginsRoot, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .sort(); +} + +function getPluginJsonPaths(repoRoot: string, pluginDirname: string): string[] { + const pluginRoot = path.resolve(repoRoot, "plugins", pluginDirname); + return PLUGIN_RELATIVE_PATHS.map(relativePath => path.resolve(pluginRoot, relativePath)); +} + interface PluginConfig { version: string; [key: string]: unknown; @@ -28,29 +49,37 @@ interface PluginConfig { * Check that all plugin.json files have the placeholder version. */ function checkPluginVersionPlaceholders(): void { - const repoRoot = path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - "../.." - ); + const repoRoot = path.resolve(__dirname, "../.."); + const pluginDirs = getPluginDirectoryNames(repoRoot); let hasErrors = false; - for (const pluginPath of PLUGIN_PATHS) { - const fullPath = path.resolve(repoRoot, pluginPath); + if (pluginDirs.length === 0) { + console.log(" ℹ️ No plugin directories found under plugins/, skipping..."); + } - if (!fs.existsSync(fullPath)) { - console.log(` ℹ️ ${pluginPath} not found, skipping...`); - continue; - } + for (const pluginDir of pluginDirs) { + const pluginJsonPaths = getPluginJsonPaths(repoRoot, pluginDir); + + for (let index = 0; index < pluginJsonPaths.length; index += 1) { + const fullPath = pluginJsonPaths[index]; + const relativePath = PLUGIN_RELATIVE_PATHS[index]; + const displayPath = path.join("plugins", pluginDir, relativePath).replace(/\\/g, "/"); + + if (!fs.existsSync(fullPath)) { + console.log(` ℹ️ ${displayPath} not found, skipping...`); + continue; + } - const content = fs.readFileSync(fullPath, "utf8"); - const json: PluginConfig = JSON.parse(content); + const content = fs.readFileSync(fullPath, "utf8"); + const json: PluginConfig = JSON.parse(content); - if (json.version === EXPECTED_VERSION) { - console.log(` ✅ ${pluginPath}: version is "${EXPECTED_VERSION}"`); - } else { - console.error(` ❌ ${pluginPath}: expected version "${EXPECTED_VERSION}", found "${json.version}"`); - hasErrors = true; + if (json.version === EXPECTED_VERSION) { + console.log(` ✅ ${displayPath}: version is "${EXPECTED_VERSION}"`); + } else { + console.error(` ❌ ${displayPath}: expected version "${EXPECTED_VERSION}", found "${json.version}"`); + hasErrors = true; + } } } @@ -69,7 +98,7 @@ function main(): void { checkPluginVersionPlaceholders(); } -if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) { +if (__filename === path.resolve(process.argv[1])) { main(); } diff --git a/scripts/src/copilot-cli-char-budget.ts b/scripts/src/copilot-cli-char-budget.ts index 72755b1f5..3ef8fba96 100644 --- a/scripts/src/copilot-cli-char-budget.ts +++ b/scripts/src/copilot-cli-char-budget.ts @@ -3,7 +3,7 @@ * See https://github.com/github/copilot-agent-runtime/blob/0e43d66f7570421ba4b27a36a86ea908de188e59/src/skills/skillToolDescription.ts#L30 */ -import { listSkills, loadSkill } from "./shared/skill-helper.js"; +import { listPlugins, listSkills, loadSkill, SkillRef } from "./shared/skill-helper.js"; import { escapeXml } from "./shared/string-helpers.js"; const SKILL_CHAR_BUDGET_ENV = "SKILL_CHAR_BUDGET"; @@ -23,8 +23,8 @@ function getSkillCharBudget() { return DEFAULT_SKILL_CHAR_BUDGET; } -function formatSkillForToolDescription(skillName: string): string { - const skill = loadSkill(skillName); +function formatSkillForToolDescription(skillRef: SkillRef): string { + const skill = loadSkill(skillRef); // azure plugin skills are loaded from "Custom" locations when they are installed via marketplace. // The formatted text may be different but the char count would be similar. @@ -41,22 +41,17 @@ type CheckSkillCharBudgetResult = { actualCharCount: number; }; +type PluginCheckResult = CheckSkillCharBudgetResult & { + plugin: string; +}; + /** - * Checks if the formatted skill description of azure plugin skills can fit in Copilot CLI's skill char budget. + * Checks the char budget for a single plugin's skills. */ -function checkCopilotCliSkillsCharBudget(): CheckSkillCharBudgetResult { - const skills = listSkills(); - const budget = getSkillCharBudget(); - if (skills.length === 0) { - return { - canFitInBudget: true, - budget: budget, - actualCharCount: 0 - } - } +function checkPluginCharBudget(pluginName: string, budget: number): PluginCheckResult { + const skills = listSkills(pluginName); let charCount = 0; - for (const skill of skills) { const skillXml = formatSkillForToolDescription(skill); // +1 for newline between skills @@ -64,20 +59,45 @@ function checkCopilotCliSkillsCharBudget(): CheckSkillCharBudgetResult { } return { + plugin: pluginName, canFitInBudget: charCount <= budget, - budget: budget, - actualCharCount: charCount + budget, + actualCharCount: charCount, + }; +} + +/** + * Checks if the formatted skill description of all plugins' skills can fit in Copilot CLI's skill char budget. + * Iterates over every directory in plugins/ and checks each one independently. + */ +function checkCopilotCliSkillsCharBudget(): Record { + const pluginNames = listPlugins().map((p) => p.dirname); + const budget = getSkillCharBudget(); + + const result: Record = {}; + if (pluginNames.length === 0) { + return result; } + + for (const pluginName of pluginNames) { + const pluginResult = checkPluginCharBudget(pluginName, budget); + result[pluginName] = pluginResult; + } + + return result; } function main() { const result = checkCopilotCliSkillsCharBudget(); - if (!result.canFitInBudget) { - console.error(`Formatted skill description char count exceeds the Copilot CLI skill char budget. budget: ${result.budget}, actualCharCount: ${result.actualCharCount}`); - process.exitCode = 1; - return; - } else { - console.log(`Formatted skill description char count fits within the Copilot CLI skill char budget. budget: ${result.budget}, actualCharCount: ${result.actualCharCount}`); + for (const pluginName in result) { + const pluginResult = result[pluginName]; + if (!pluginResult.canFitInBudget) { + console.error(`plugin ${pluginName}: formatted skill description char count exceeds the Copilot CLI skill char budget. budget: ${pluginResult.budget}, actualCharCount: ${pluginResult.actualCharCount}`); + process.exitCode = 1; + return; + } else { + console.log(`plugin ${pluginName}: formatted skill description char count fits within the Copilot CLI skill char budget. budget: ${pluginResult.budget}, actualCharCount: ${pluginResult.actualCharCount}`); + } } } diff --git a/scripts/src/dashboard/__tests__/collectors/frontmatter.test.ts b/scripts/src/dashboard/__tests__/collectors/frontmatter.test.ts index 8bca210b7..43c426c30 100644 --- a/scripts/src/dashboard/__tests__/collectors/frontmatter.test.ts +++ b/scripts/src/dashboard/__tests__/collectors/frontmatter.test.ts @@ -26,7 +26,7 @@ function makeFrontmatterJson(overrides?: { skills: [ { name: "skill-a", - path: "plugin/skills/skill-a/SKILL.md", + path: "plugins/plugin-a/skills/skill-a/SKILL.md", status: "pass" as const, errors: [], warnings: [], @@ -34,7 +34,7 @@ function makeFrontmatterJson(overrides?: { }, { name: "skill-b", - path: "plugin/skills/skill-b/SKILL.md", + path: "plugins/plugin-b/skills/skill-b/SKILL.md", status: "pass" as const, errors: [], warnings: [], @@ -231,7 +231,7 @@ describe("frontmatterCollector.collect", () => { expect(report.status).toBe("pass"); expect(report.items).toHaveLength(2); expect(execSync).toHaveBeenCalledWith( - expect.stringContaining(`--json "${resolve(fakeRoot, "output", "skills")}"`), + expect.stringContaining(`--json "${resolve(fakeRoot, "output")}"`), expect.objectContaining({ cwd: resolve(fakeRoot, "scripts"), timeout: 5000, diff --git a/scripts/src/dashboard/collectors/frontmatter.ts b/scripts/src/dashboard/collectors/frontmatter.ts index 0b46c1782..8b52798ea 100644 --- a/scripts/src/dashboard/collectors/frontmatter.ts +++ b/scripts/src/dashboard/collectors/frontmatter.ts @@ -159,10 +159,10 @@ export const frontmatterCollector: Collector = { // The frontmatter npm script lives in scripts/package.json, so we // must run from the scripts/ directory, not the repo root. const scriptsCwd = resolve(options.cwd, "scripts"); - // Validate the built output (output/skills/) rather than the source - // (plugin/skills/) so that stamped version numbers are used and the + // Validate the built output (output/) rather than the source + // (plugins/) so that stamped version numbers are used and the // CLI does not fail on placeholder versions. - const builtSkillsDir = resolve(options.cwd, "output", "skills"); + const builtSkillsDir = resolve(options.cwd, "output"); let stdout: string; try { stdout = execSync( diff --git a/scripts/src/frontmatter/__tests__/frontmatter.test.ts b/scripts/src/frontmatter/__tests__/frontmatter.test.ts index 137726804..472be006b 100644 --- a/scripts/src/frontmatter/__tests__/frontmatter.test.ts +++ b/scripts/src/frontmatter/__tests__/frontmatter.test.ts @@ -21,7 +21,7 @@ import { hasPreferOverClause, validateTriggerOverlapDisambiguation, validateSkillFile, -} from "../cli.js"; +} from "../helpers.js"; import { parseSkillContent } from "../../shared/skill-helper.js"; const TEST_DIR = resolve(__dirname, "__test_frontmatter__"); diff --git a/scripts/src/frontmatter/cli.ts b/scripts/src/frontmatter/cli.ts index db42cff57..51bc40dd7 100644 --- a/scripts/src/frontmatter/cli.ts +++ b/scripts/src/frontmatter/cli.ts @@ -12,688 +12,15 @@ * 4. Name must not start with reserved prefixes (claude- or anthropic-). * * Usage: + * npm run frontmatter # Validate skills in all plugins * npm run frontmatter # Validate a specific SKILL.md file * npm run frontmatter # Validate a single skill folder * npm run frontmatter # Validate all skills in a directory * npm run frontmatter ... # Mix of the above */ -import { dirname, resolve, basename, relative } from "node:path"; -import { fileURLToPath } from "node:url"; -import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; import { parseArgs } from "node:util"; -import { parseSkillContent } from "../shared/skill-helper.js"; - -// ── Paths ──────────────────────────────────────────────────────────────────── - -function getRepoRoot(): string { - const scriptDir = dirname(fileURLToPath(import.meta.url)); - return resolve(scriptDir, "../../.."); -} - -const REPO_ROOT = getRepoRoot(); - -// ── Types ──────────────────────────────────────────────────────────────────── - -export interface ValidationIssue { - check: string; // Check identifier (e.g., "name-format", "description-format") - message: string; // Human-readable explanation - severity?: "error" | "warning"; // Defaults to "error" if omitted -} - -export interface ValidationResult { - skill: string; - file: string; - issues: ValidationIssue[]; - /** Raw description text, or null when missing/unparseable. */ - description?: string | null; -} - -export interface SkillRoutingContext { - name: string; - file: string; - description: string; - triggerPhrases: string[]; - broad: boolean; -} - -// ── Validation checks ──────────────────────────────────────────────────────── - -const NAME_RE = /^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$/; -const RESERVED_PREFIXES = ["claude-", "anthropic-"]; - -/** - * Check 1: Validate the `name` field per the agentskills.io spec. - * - * Rules: - * - Lowercase alphanumeric + hyphens only - * - No consecutive hyphens (--) - * - Must not start or end with a hyphen - * - Length 1–64 - * - Must match the parent directory name - */ -export function validateName(name: string | null, parentDirName: string): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - if (name === null || name === "") { - issues.push({ check: "name-format", message: "Missing required 'name' field" }); - return issues; - } - - if (name.length > 64) { - issues.push({ check: "name-format", message: `Name is ${name.length} chars (max 64)` }); - } - - if (!NAME_RE.test(name)) { - if (/[A-Z]/.test(name)) { - issues.push({ check: "name-format", message: `Name contains uppercase characters: ${name}` }); - } else if (/[^a-z0-9-]/.test(name)) { - issues.push({ check: "name-format", message: `Name contains invalid characters (only a-z, 0-9, - allowed): ${name}` }); - } else if (name.startsWith("-") || name.endsWith("-")) { - issues.push({ check: "name-format", message: `Name must not start or end with a hyphen: ${name}` }); - } else { - issues.push({ check: "name-format", message: `Name does not match spec pattern: ${name}` }); - } - } - - if (name.includes("--")) { - issues.push({ check: "name-format", message: `Name contains consecutive hyphens (--): ${name}` }); - } - - if (name !== parentDirName) { - issues.push({ check: "name-format", message: `Name "${name}" does not match parent directory "${parentDirName}"` }); - } - - return issues; -} - -/** - * Check 2: Validate the description uses inline double-quoted format. - * - * Rejects >- folded scalars and | literal blocks which are incompatible - * with skills.sh. - */ -export function validateDescriptionFormat(rawFrontmatter: string): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - // Match description field followed by a block scalar indicator - if (/^description:\s*>-?\s*$/m.test(rawFrontmatter)) { - issues.push({ - check: "description-format", - message: "Description uses >- folded scalar (incompatible with skills.sh) — use inline double-quoted string instead", - }); - } - - if (/^description:\s*\|\s*$/m.test(rawFrontmatter)) { - issues.push({ - check: "description-format", - message: "Description uses | literal block (preserves newlines) — use inline double-quoted string instead", - }); - } - - if (/^description:\s*\|-\s*$/m.test(rawFrontmatter)) { - issues.push({ - check: "description-format", - message: "Description uses |- literal block (strip) — use inline double-quoted string instead", - }); - } - - return issues; -} - -/** - * Check 3: Validate no XML tags (< or >) in frontmatter. - * - * Frontmatter appears in the system prompt — XML tags are a security risk - * (injection vector). - */ -export function validateNoXmlTags(rawFrontmatter: string): ValidationIssue[] { - const issues: ValidationIssue[] = []; - const lines = rawFrontmatter.split("\n"); - - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - // Look for < or > that appear to be tags (not comparison operators or arrows) - if (/<[a-zA-Z/!]/.test(line) || />[^-]/.test(line) && / 1024) { - issues.push({ - check: "description-length", - message: `Description is ${description.length} chars (max 1024)`, - }); - } - - return issues; -} - -const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/; - -/** - * Check 6: Validate that `license` field is present and is a string. - */ -export function validateLicense(license: unknown): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - if (license === undefined || license === null || license === "") { - issues.push({ - check: "license", - message: "Missing 'license' field in frontmatter", - severity: "warning", - }); - } else if (typeof license !== "string") { - issues.push({ - check: "license", - message: `'license' field must be a string, got ${typeof license}`, - }); - } - - return issues; -} - -/** - * Check 7: Validate `metadata` field structure (optional, map of string keys to string values per spec). - */ -export function validateMetadata(metadata: unknown): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - if (metadata === undefined || metadata === null) { - issues.push({ - check: "metadata", - message: "Missing 'metadata' block in frontmatter", - severity: "warning", - }); - return issues; - } - - if (typeof metadata !== "object" || Array.isArray(metadata)) { - issues.push({ - check: "metadata", - message: `'metadata' field must be a key-value mapping, got ${Array.isArray(metadata) ? "array" : typeof metadata}`, - }); - return issues; - } - - const meta = metadata as Record; - for (const [key, value] of Object.entries(meta)) { - if (typeof value !== "string") { - issues.push({ - check: "metadata", - message: `metadata.${key} must be a string, got ${typeof value}`, - severity: "warning", - }); - } - } - - return issues; -} - -/** - * Check 8: Validate `metadata.version` is present and follows semver (X.Y.Z). - */ -export function validateMetadataVersion(metadata: unknown): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - if (metadata === undefined || metadata === null || typeof metadata !== "object") { - issues.push({ - check: "metadata-version", - message: "Missing 'metadata' block with 'version' field in frontmatter", - severity: "warning", - }); - return issues; - } - - const meta = metadata as Record; - const version = meta.version; - - if (version === undefined || version === null || version === "") { - issues.push({ - check: "metadata-version", - message: "Missing 'version' in metadata block", - severity: "warning", - }); - return issues; - } - - const versionStr = String(version); - if (!SEMVER_RE.test(versionStr)) { - issues.push({ - check: "metadata-version", - message: `metadata.version "${versionStr}" is not valid semver (expected X.Y.Z)`, - }); - } - - return issues; -} - -/** - * Check 8: Validate `compatibility` field (optional, max 500 chars per spec). - */ -export function validateCompatibility(compatibility: unknown): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - if (compatibility === undefined || compatibility === null) { - return issues; // Optional field - } - - if (typeof compatibility !== "string") { - issues.push({ - check: "compatibility", - message: `'compatibility' field must be a string, got ${typeof compatibility}`, - }); - return issues; - } - - if (compatibility === "") { - issues.push({ - check: "compatibility", - message: "'compatibility' field must not be empty if provided", - }); - return issues; - } - - if (compatibility.length > 500) { - issues.push({ - check: "compatibility", - message: `Compatibility is ${compatibility.length} chars (max 500)`, - }); - } - - return issues; -} - -/** - * Check 9: Validate `allowed-tools` field (optional, space-delimited string per spec). - */ -export function validateAllowedTools(allowedTools: unknown): ValidationIssue[] { - const issues: ValidationIssue[] = []; - - if (allowedTools === undefined || allowedTools === null) { - return issues; // Optional field - } - - if (typeof allowedTools !== "string") { - issues.push({ - check: "allowed-tools", - message: `'allowed-tools' field must be a string, got ${typeof allowedTools}`, - }); - return issues; - } - - if (allowedTools === "") { - issues.push({ - check: "allowed-tools", - message: "'allowed-tools' field must not be empty if provided", - }); - } - - return issues; -} - -const TRIGGER_SECTION_KEYWORDS = ["WHEN", "USE FOR", "TRIGGERS"] as const; -const TRIGGER_SECTION_STOP_HEADERS = ["DO NOT USE FOR", ...TRIGGER_SECTION_KEYWORDS] as const; -// Extracts only explicit trigger sections and stops before disambiguation/next trigger section. -// Section headers must include a trailing colon; `PREFER OVER` is handled separately -// because it may appear without one. -const TRIGGER_SECTION_RE = new RegExp( - `\\b(?:${TRIGGER_SECTION_KEYWORDS.join("|")}):\\s*([^]*?)(?=(?:\\b(?:${TRIGGER_SECTION_STOP_HEADERS.join("|")}):|\\bPREFER OVER\\b|$))`, - "gi", -); -const DO_NOT_USE_FOR_RE = /\bDO NOT USE FOR:/i; -const SANITIZED_DO_NOT_USE_FOR_MARKER = "DO_NOT_USE_FOR:"; -const DISAMBIGUATION_CLAUSE_MARKER_RE = new RegExp(`(?:${SANITIZED_DO_NOT_USE_FOR_MARKER}|PREFER OVER\\b)`, "i"); -const BROAD_SKILL_NAMES = new Set(["azure-prepare", "azure-deploy"]); -const MIN_TRIGGER_PHRASE_LENGTH = 4; -const OVERLAP_PREVIEW_LIMIT = 3; - -function normalizeTriggerPhrase(phrase: string): string { - return phrase - .toLowerCase() - .replace(/^["'`]+|["'`]+$/g, "") - .replace(/\([^)]*\)/g, "") - .replace(/[^a-z0-9]+/g, " ") - .trim(); -} - -export function extractTriggerPhrases(description: string | null): string[] { - if (!description) return []; - - // Prevent `USE FOR:` inside `DO NOT USE FOR:` from being treated as a trigger section. - const sanitizedDescription = description.replace(/\bDO NOT USE FOR:/gi, SANITIZED_DO_NOT_USE_FOR_MARKER); - const phrases: string[] = []; - let match: RegExpExecArray | null; - while ((match = TRIGGER_SECTION_RE.exec(sanitizedDescription)) !== null) { - const section = match[1]; - const disambiguationStart = section.search(DISAMBIGUATION_CLAUSE_MARKER_RE); - const triggerSection = disambiguationStart >= 0 ? section.slice(0, disambiguationStart) : section; - for (const rawPhrase of triggerSection.split(/[;,]/)) { - const normalized = normalizeTriggerPhrase(rawPhrase); - if (normalized.length >= MIN_TRIGGER_PHRASE_LENGTH) { - phrases.push(normalized); - } - } - } - - return [...new Set(phrases)]; -} - -export function hasDoNotUseForClause(description: string | null): boolean { - if (!description) return false; - return DO_NOT_USE_FOR_RE.test(description); -} - -export function hasPreferOverClause(description: string | null, competingSkillName: string): boolean { - if (!description) return false; - const escapedName = competingSkillName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(`\\bPREFER OVER\\s+${escapedName}\\b`, "i").test(description); -} - -function hasAnyDisambiguationClause(description: string | null, competingSkillName: string): boolean { - return hasDoNotUseForClause(description) || hasPreferOverClause(description, competingSkillName); -} - -function buildSkillRoutingContexts(skillFiles: string[]): SkillRoutingContext[] { - const contexts: SkillRoutingContext[] = []; - for (const file of skillFiles) { - const content = readFileSync(file, "utf-8"); - const parsed = parseSkillContent(content); - if (parsed === null) continue; - const name = typeof parsed.data.name === "string" ? parsed.data.name : basename(dirname(file)); - const description = typeof parsed.data.description === "string" ? parsed.data.description : ""; - const triggerPhrases = extractTriggerPhrases(description); - contexts.push({ - name, - file, - description, - triggerPhrases, - broad: isBroadRoutingSkill(name), - }); - } - return contexts; -} - -function isBroadRoutingSkill(name: string): boolean { - // Restrict "broad" classification to an explicit allowlist to avoid - // specialized skills being accidentally reclassified as broad. - return BROAD_SKILL_NAMES.has(name); -} - -export function validateTriggerOverlapDisambiguation( - skill: SkillRoutingContext, - allSkills: SkillRoutingContext[], -): ValidationIssue[] { - if (skill.broad || skill.triggerPhrases.length === 0) return []; - - const issues: ValidationIssue[] = []; - const skillTriggerSet = new Set(skill.triggerPhrases); - - for (const competitor of allSkills) { - if (competitor.name === skill.name || !competitor.broad) continue; - if (competitor.triggerPhrases.length === 0) continue; - - const overlaps = competitor.triggerPhrases.filter( - (trigger) => skillTriggerSet.has(trigger), - ); - if (overlaps.length === 0) continue; - - if (!hasAnyDisambiguationClause(skill.description, competitor.name)) { - const overlapPreview = overlaps.slice(0, OVERLAP_PREVIEW_LIMIT).join(", "); - const overlapSuffix = overlaps.length > OVERLAP_PREVIEW_LIMIT ? ", ..." : ""; - issues.push({ - check: "trigger-overlap-disambiguation", - severity: "error", - message: `Trigger overlap with broad skill "${competitor.name}" (${overlapPreview}${overlapSuffix}). Add DO NOT USE FOR: or PREFER OVER ${competitor.name}.`, - }); - } - } - - return issues; -} - -// ── Validate a single SKILL.md ────────────────────────────────────────────── - -export function validateSkillFile(filePath: string): ValidationResult { - const parentDir = basename(dirname(filePath)); - const content = readFileSync(filePath, "utf-8"); - const parsed = parseSkillContent(content); - const issues: ValidationIssue[] = []; - - if (parsed === null) { - issues.push({ check: "frontmatter", message: "Missing YAML frontmatter (file must start with ---)" }); - return { skill: parentDir, file: filePath, issues, description: null }; - } - - const name = typeof parsed.data.name === "string" ? parsed.data.name : null; - const description = typeof parsed.data.description === "string" ? parsed.data.description : null; - - // Check required fields - if (description === null) { - issues.push({ check: "missing-field", message: "Missing required 'description' field" }); - } - - // Check 1: Name validation - issues.push(...validateName(name, parentDir)); - - // Check 2: Description format (needs raw YAML source) - issues.push(...validateDescriptionFormat(parsed.raw)); - - // Check 3: No XML tags (needs raw YAML source) - issues.push(...validateNoXmlTags(parsed.raw)); - - // Check 4: No reserved prefixes - issues.push(...validateNoReservedPrefix(name)); - - // Check 5: Description length - issues.push(...validateDescriptionLength(description)); - - // Check 6: License field - issues.push(...validateLicense(parsed.data.license)); - - // Check 7: Metadata structure - issues.push(...validateMetadata(parsed.data.metadata)); - - // Check 8: metadata.version (semver) - issues.push(...validateMetadataVersion(parsed.data.metadata)); - - // Check 9: Compatibility field - issues.push(...validateCompatibility(parsed.data.compatibility)); - - // Check 10: Allowed tools field - issues.push(...validateAllowedTools(parsed.data["allowed-tools"])); - - return { skill: parentDir, file: filePath, issues, description }; -} - -// ── Skill discovery ────────────────────────────────────────────────────────── - -function findSkillFiles(skillsDir: string): string[] { - if (!existsSync(skillsDir)) return []; - - return readdirSync(skillsDir) - .filter((name) => { - const full = resolve(skillsDir, name); - if (!statSync(full).isDirectory()) return false; - return existsSync(resolve(full, "SKILL.md")); - }) - .sort() - .map((name) => resolve(skillsDir, name, "SKILL.md")); -} - -/** - * Resolve a CLI positional argument to one or more SKILL.md file paths. - * - * Three accepted forms: - * 1. Path to a SKILL.md file directly → [that file] - * 2. Path to a skill folder (directory containing SKILL.md) → [/SKILL.md] - * 3. Path to a skills container (directory of skill subdirectories) → all SKILL.md inside - */ -function resolveSkillFiles(arg: string): string[] | string { - const resolved = resolve(arg); - - if (!existsSync(resolved)) { - return `Path not found: ${arg}`; - } - - const st = statSync(resolved); - - if (st.isFile()) { - if (basename(resolved) !== "SKILL.md") { - return `Expected a SKILL.md file but got: ${arg}`; - } - return [resolved]; - } - - if (st.isDirectory()) { - const directSkillMd = resolve(resolved, "SKILL.md"); - if (existsSync(directSkillMd)) { - // Skill folder — the directory itself is the skill - return [directSkillMd]; - } - // Skills container — enumerate subdirectories - const found = findSkillFiles(resolved); - if (found.length === 0) { - return `No skills found in directory: ${arg}`; - } - return found; - } - - return `Path is neither a file nor a directory: ${arg}`; -} - -// ── JSON output ────────────────────────────────────────────────────────────── - -/** All check identifiers produced by the validator */ -const ALL_CHECKS = [ - "frontmatter", - "name-format", - "missing-field", - "description-format", - "no-xml-tags", - "reserved-prefix", - "description-length", - "license", - "metadata", - "metadata-version", - "compatibility", - "allowed-tools", - "trigger-overlap-disambiguation", - "disambiguation-removal", -] as const; - -export interface FrontmatterSkillResult { - name: string; - path: string; - status: "pass" | "fail" | "warn"; - errors: string[]; - warnings: string[]; - checks: Record; - /** Raw description text ("" when missing). Length is derivable by consumers. */ - description: string; -} - -export interface FrontmatterJsonResult { - skills: FrontmatterSkillResult[]; - summary: { - total: number; - passed: number; - failed: number; - warnings: number; - }; -} - -function buildJsonResult(results: ValidationResult[]): FrontmatterJsonResult { - const skills: FrontmatterSkillResult[] = []; - let passed = 0; - let failed = 0; - let warningCount = 0; - - for (const result of results) { - const errors = result.issues.filter(i => i.severity !== "warning"); - const warnings = result.issues.filter(i => i.severity === "warning"); - - // Build checks map: true = passed, false = has issue for that check - const failedChecks = new Set(result.issues.map(i => i.check)); - const checks: Record = {}; - for (const check of ALL_CHECKS) { - checks[check] = !failedChecks.has(check); - } - - let status: "pass" | "fail" | "warn"; - if (errors.length > 0) { - status = "fail"; - failed++; - } else if (warnings.length > 0) { - status = "warn"; - warningCount++; - } else { - status = "pass"; - passed++; - } - - const description = result.description ?? ""; - skills.push({ - name: result.skill, - path: relative(REPO_ROOT, result.file).replace(/\\/g, "/"), - status, - errors: errors.map(e => `[${e.check}] ${e.message}`), - warnings: warnings.map(w => `[${w.check}] ${w.message}`), - checks, - description, - }); - } - - return { - skills, - summary: { - total: results.length, - passed, - failed, - warnings: warningCount, - }, - }; -} - -// ── CLI entry point ────────────────────────────────────────────────────────── +import { buildJsonResult, buildSkillRoutingContexts, resolveSkillFiles, validateSkillFile, validateTriggerOverlapDisambiguation, ValidationResult } from "./helpers.js"; function main(): void { const { values, positionals } = parseArgs({ @@ -708,26 +35,21 @@ function main(): void { const jsonOutput = values.json ?? false; if (positionals.length === 0) { - console.error("\n❌ No path specified.\n"); - console.error("Usage:"); - console.error(" npm run frontmatter # Validate a specific SKILL.md file"); - console.error(" npm run frontmatter # Validate a single skill folder"); - console.error(" npm run frontmatter # Validate all skills in a directory"); - console.error(" npm run frontmatter ... # Mix of the above\n"); - process.exitCode = 1; - return; + // Use default build output location + // Note that the path is relative to the scripts/ directory, not this module. + positionals.push("../output"); } const skillFiles: string[] = []; - for (const arg of positionals) { - const result = resolveSkillFiles(arg); - if (typeof result === "string") { - console.error(`\n❌ ${result}\n`); + for (const relativePath of positionals) { + const result = resolveSkillFiles(relativePath); + if (result.errorMessage) { + console.error(`\n❌ ${result.errorMessage}\n`); process.exitCode = 1; return; } - skillFiles.push(...result); + skillFiles.push(...result.files); } // Validate all skill files diff --git a/scripts/src/frontmatter/helpers.ts b/scripts/src/frontmatter/helpers.ts new file mode 100644 index 000000000..f77c37033 --- /dev/null +++ b/scripts/src/frontmatter/helpers.ts @@ -0,0 +1,697 @@ +// ── Types ──────────────────────────────────────────────────────────────────── + +import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; +import { basename, dirname, relative, resolve } from "node:path"; +import { getRepoRoot, parseSkillContent } from "../shared/skill-helper.js"; + +export interface ValidationIssue { + check: string; // Check identifier (e.g., "name-format", "description-format") + message: string; // Human-readable explanation + severity?: "error" | "warning"; // Defaults to "error" if omitted +} + +export interface ValidationResult { + skill: string; + file: string; + issues: ValidationIssue[]; + /** Raw description text, or null when missing/unparseable. */ + description?: string | null; +} + +export interface SkillRoutingContext { + name: string; + file: string; + description: string; + triggerPhrases: string[]; + broad: boolean; +} + +const NAME_RE = /^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$/; +const RESERVED_PREFIXES = ["claude-", "anthropic-"]; + +/** + * Check 1: Validate the `name` field per the agentskills.io spec. + * + * Rules: + * - Lowercase alphanumeric + hyphens only + * - No consecutive hyphens (--) + * - Must not start or end with a hyphen + * - Length 1–64 + * - Must match the parent directory name + */ +export function validateName(name: string | null, parentDirName: string): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + if (name === null || name === "") { + issues.push({ check: "name-format", message: "Missing required 'name' field" }); + return issues; + } + + if (name.length > 64) { + issues.push({ check: "name-format", message: `Name is ${name.length} chars (max 64)` }); + } + + if (!NAME_RE.test(name)) { + if (/[A-Z]/.test(name)) { + issues.push({ check: "name-format", message: `Name contains uppercase characters: ${name}` }); + } else if (/[^a-z0-9-]/.test(name)) { + issues.push({ check: "name-format", message: `Name contains invalid characters (only a-z, 0-9, - allowed): ${name}` }); + } else if (name.startsWith("-") || name.endsWith("-")) { + issues.push({ check: "name-format", message: `Name must not start or end with a hyphen: ${name}` }); + } else { + issues.push({ check: "name-format", message: `Name does not match spec pattern: ${name}` }); + } + } + + if (name.includes("--")) { + issues.push({ check: "name-format", message: `Name contains consecutive hyphens (--): ${name}` }); + } + + if (name !== parentDirName) { + issues.push({ check: "name-format", message: `Name "${name}" does not match parent directory "${parentDirName}"` }); + } + + return issues; +} + +/** + * Check 2: Validate the description uses inline double-quoted format. + * + * Rejects >- folded scalars and | literal blocks which are incompatible + * with skills.sh. + */ +export function validateDescriptionFormat(rawFrontmatter: string): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + // Match description field followed by a block scalar indicator + if (/^description:\s*>-?\s*$/m.test(rawFrontmatter)) { + issues.push({ + check: "description-format", + message: "Description uses >- folded scalar (incompatible with skills.sh) — use inline double-quoted string instead", + }); + } + + if (/^description:\s*\|\s*$/m.test(rawFrontmatter)) { + issues.push({ + check: "description-format", + message: "Description uses | literal block (preserves newlines) — use inline double-quoted string instead", + }); + } + + if (/^description:\s*\|-\s*$/m.test(rawFrontmatter)) { + issues.push({ + check: "description-format", + message: "Description uses |- literal block (strip) — use inline double-quoted string instead", + }); + } + + return issues; +} + +/** + * Check 3: Validate no XML tags (< or >) in frontmatter. + * + * Frontmatter appears in the system prompt — XML tags are a security risk + * (injection vector). + */ +export function validateNoXmlTags(rawFrontmatter: string): ValidationIssue[] { + const issues: ValidationIssue[] = []; + const lines = rawFrontmatter.split("\n"); + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + // Look for < or > that appear to be tags (not comparison operators or arrows) + if (/<[a-zA-Z/!]/.test(line) || />[^-]/.test(line) && / 1024) { + issues.push({ + check: "description-length", + message: `Description is ${description.length} chars (max 1024)`, + }); + } + + return issues; +} + +const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/; + +/** + * Check 6: Validate that `license` field is present and is a string. + */ +export function validateLicense(license: unknown): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + if (license === undefined || license === null || license === "") { + issues.push({ + check: "license", + message: "Missing 'license' field in frontmatter", + severity: "warning", + }); + } else if (typeof license !== "string") { + issues.push({ + check: "license", + message: `'license' field must be a string, got ${typeof license}`, + }); + } + + return issues; +} + +/** + * Check 7: Validate `metadata` field structure (optional, map of string keys to string values per spec). + */ +export function validateMetadata(metadata: unknown): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + if (metadata === undefined || metadata === null) { + issues.push({ + check: "metadata", + message: "Missing 'metadata' block in frontmatter", + severity: "warning", + }); + return issues; + } + + if (typeof metadata !== "object" || Array.isArray(metadata)) { + issues.push({ + check: "metadata", + message: `'metadata' field must be a key-value mapping, got ${Array.isArray(metadata) ? "array" : typeof metadata}`, + }); + return issues; + } + + const meta = metadata as Record; + for (const [key, value] of Object.entries(meta)) { + if (typeof value !== "string") { + issues.push({ + check: "metadata", + message: `metadata.${key} must be a string, got ${typeof value}`, + severity: "warning", + }); + } + } + + return issues; +} + +/** + * Check 8: Validate `metadata.version` is present and follows semver (X.Y.Z). + */ +export function validateMetadataVersion(metadata: unknown): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + if (metadata === undefined || metadata === null || typeof metadata !== "object") { + issues.push({ + check: "metadata-version", + message: "Missing 'metadata' block with 'version' field in frontmatter", + severity: "warning", + }); + return issues; + } + + const meta = metadata as Record; + const version = meta.version; + + if (version === undefined || version === null || version === "") { + issues.push({ + check: "metadata-version", + message: "Missing 'version' in metadata block", + severity: "warning", + }); + return issues; + } + + const versionStr = String(version); + if (!SEMVER_RE.test(versionStr)) { + issues.push({ + check: "metadata-version", + message: `metadata.version "${versionStr}" is not valid semver (expected X.Y.Z)`, + }); + } + + return issues; +} + +/** + * Check 8: Validate `compatibility` field (optional, max 500 chars per spec). + */ +export function validateCompatibility(compatibility: unknown): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + if (compatibility === undefined || compatibility === null) { + return issues; // Optional field + } + + if (typeof compatibility !== "string") { + issues.push({ + check: "compatibility", + message: `'compatibility' field must be a string, got ${typeof compatibility}`, + }); + return issues; + } + + if (compatibility === "") { + issues.push({ + check: "compatibility", + message: "'compatibility' field must not be empty if provided", + }); + return issues; + } + + if (compatibility.length > 500) { + issues.push({ + check: "compatibility", + message: `Compatibility is ${compatibility.length} chars (max 500)`, + }); + } + + return issues; +} + +/** + * Check 9: Validate `allowed-tools` field (optional, space-delimited string per spec). + */ +export function validateAllowedTools(allowedTools: unknown): ValidationIssue[] { + const issues: ValidationIssue[] = []; + + if (allowedTools === undefined || allowedTools === null) { + return issues; // Optional field + } + + if (typeof allowedTools !== "string") { + issues.push({ + check: "allowed-tools", + message: `'allowed-tools' field must be a string, got ${typeof allowedTools}`, + }); + return issues; + } + + if (allowedTools === "") { + issues.push({ + check: "allowed-tools", + message: "'allowed-tools' field must not be empty if provided", + }); + } + + return issues; +} + +const TRIGGER_SECTION_KEYWORDS = ["WHEN", "USE FOR", "TRIGGERS"] as const; +const TRIGGER_SECTION_STOP_HEADERS = ["DO NOT USE FOR", ...TRIGGER_SECTION_KEYWORDS] as const; + +// Extracts only explicit trigger sections and stops before disambiguation/next trigger section. +// Section headers must include a trailing colon; `PREFER OVER` is handled separately +// because it may appear without one. +const TRIGGER_SECTION_RE = new RegExp( + `\\b(?:${TRIGGER_SECTION_KEYWORDS.join("|")}):\\s*([^]*?)(?=(?:\\b(?:${TRIGGER_SECTION_STOP_HEADERS.join("|")}):|\\bPREFER OVER\\b|$))`, + "gi", +); +const DO_NOT_USE_FOR_RE = /\bDO NOT USE FOR:/i; +const SANITIZED_DO_NOT_USE_FOR_MARKER = "DO_NOT_USE_FOR:"; +const DISAMBIGUATION_CLAUSE_MARKER_RE = new RegExp(`(?:${SANITIZED_DO_NOT_USE_FOR_MARKER}|PREFER OVER\\b)`, "i"); +export const BROAD_SKILL_NAMES = new Set(["azure-prepare", "azure-deploy"]); +const MIN_TRIGGER_PHRASE_LENGTH = 4; +export const OVERLAP_PREVIEW_LIMIT = 3; + +function normalizeTriggerPhrase(phrase: string): string { + return phrase + .toLowerCase() + .replace(/^["'`]+|["'`]+$/g, "") + .replace(/\([^)]*\)/g, "") + .replace(/[^a-z0-9]+/g, " ") + .trim(); +} + +export function extractTriggerPhrases(description: string | null): string[] { + if (!description) return []; + + // Prevent `USE FOR:` inside `DO NOT USE FOR:` from being treated as a trigger section. + const sanitizedDescription = description.replace(/\bDO NOT USE FOR:/gi, SANITIZED_DO_NOT_USE_FOR_MARKER); + const phrases: string[] = []; + let match: RegExpExecArray | null; + while ((match = TRIGGER_SECTION_RE.exec(sanitizedDescription)) !== null) { + const section = match[1]; + const disambiguationStart = section.search(DISAMBIGUATION_CLAUSE_MARKER_RE); + const triggerSection = disambiguationStart >= 0 ? section.slice(0, disambiguationStart) : section; + for (const rawPhrase of triggerSection.split(/[;,]/)) { + const normalized = normalizeTriggerPhrase(rawPhrase); + if (normalized.length >= MIN_TRIGGER_PHRASE_LENGTH) { + phrases.push(normalized); + } + } + } + + return [...new Set(phrases)]; +} + +export function hasDoNotUseForClause(description: string | null): boolean { + if (!description) return false; + return DO_NOT_USE_FOR_RE.test(description); +} + +export function hasPreferOverClause(description: string | null, competingSkillName: string): boolean { + if (!description) return false; + const escapedName = competingSkillName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(`\\bPREFER OVER\\s+${escapedName}\\b`, "i").test(description); +} + +export function validateSkillFile(filePath: string): ValidationResult { + const parentDir = basename(dirname(filePath)); + const content = readFileSync(filePath, "utf-8"); + const parsed = parseSkillContent(content); + const issues: ValidationIssue[] = []; + + if (parsed === null) { + issues.push({ check: "frontmatter", message: "Missing YAML frontmatter (file must start with ---)" }); + return { skill: parentDir, file: filePath, issues, description: null }; + } + + const name = typeof parsed.data.name === "string" ? parsed.data.name : null; + const description = typeof parsed.data.description === "string" ? parsed.data.description : null; + + // Check required fields + if (description === null) { + issues.push({ check: "missing-field", message: "Missing required 'description' field" }); + } + + // Check 1: Name validation + issues.push(...validateName(name, parentDir)); + + // Check 2: Description format (needs raw YAML source) + issues.push(...validateDescriptionFormat(parsed.raw)); + + // Check 3: No XML tags (needs raw YAML source) + issues.push(...validateNoXmlTags(parsed.raw)); + + // Check 4: No reserved prefixes + issues.push(...validateNoReservedPrefix(name)); + + // Check 5: Description length + issues.push(...validateDescriptionLength(description)); + + // Check 6: License field + issues.push(...validateLicense(parsed.data.license)); + + // Check 7: Metadata structure + issues.push(...validateMetadata(parsed.data.metadata)); + + // Check 8: metadata.version (semver) + issues.push(...validateMetadataVersion(parsed.data.metadata)); + + // Check 9: Compatibility field + issues.push(...validateCompatibility(parsed.data.compatibility)); + + // Check 10: Allowed tools field + issues.push(...validateAllowedTools(parsed.data["allowed-tools"])); + + return { skill: parentDir, file: filePath, issues, description }; +} + +export function validateTriggerOverlapDisambiguation( + skill: SkillRoutingContext, + allSkills: SkillRoutingContext[], +): ValidationIssue[] { + if (skill.broad || skill.triggerPhrases.length === 0) return []; + + const issues: ValidationIssue[] = []; + const skillTriggerSet = new Set(skill.triggerPhrases); + + for (const competitor of allSkills) { + if (competitor.name === skill.name || !competitor.broad) continue; + if (competitor.triggerPhrases.length === 0) continue; + + const overlaps = competitor.triggerPhrases.filter( + (trigger) => skillTriggerSet.has(trigger), + ); + if (overlaps.length === 0) continue; + + if (!hasAnyDisambiguationClause(skill.description, competitor.name)) { + const overlapPreview = overlaps.slice(0, OVERLAP_PREVIEW_LIMIT).join(", "); + const overlapSuffix = overlaps.length > OVERLAP_PREVIEW_LIMIT ? ", ..." : ""; + issues.push({ + check: "trigger-overlap-disambiguation", + severity: "error", + message: `Trigger overlap with broad skill "${competitor.name}" (${overlapPreview}${overlapSuffix}). Add DO NOT USE FOR: or PREFER OVER ${competitor.name}.`, + }); + } + } + + return issues; +} + +const REPO_ROOT = getRepoRoot(); + +function hasAnyDisambiguationClause(description: string | null, competingSkillName: string): boolean { + return hasDoNotUseForClause(description) || hasPreferOverClause(description, competingSkillName); +} + +export function buildSkillRoutingContexts(skillFiles: string[]): SkillRoutingContext[] { + const contexts: SkillRoutingContext[] = []; + for (const file of skillFiles) { + const content = readFileSync(file, "utf-8"); + const parsed = parseSkillContent(content); + if (parsed === null) continue; + const name = typeof parsed.data.name === "string" ? parsed.data.name : basename(dirname(file)); + const description = typeof parsed.data.description === "string" ? parsed.data.description : ""; + const triggerPhrases = extractTriggerPhrases(description); + contexts.push({ + name, + file, + description, + triggerPhrases, + broad: isBroadRoutingSkill(name), + }); + } + return contexts; +} + +function isBroadRoutingSkill(name: string): boolean { + // Restrict "broad" classification to an explicit allowlist to avoid + // specialized skills being accidentally reclassified as broad. + return BROAD_SKILL_NAMES.has(name); +} + +/** + * Resolve a CLI positional argument to one or more SKILL.md file paths. + * + * Three accepted forms: + * 1. Path to a SKILL.md file directly → [that file] + * 2. Path to a directory that has a skill nested within, but has no ancestor directory that is a skill directory. + * + * If a directory contains a SKILL.md, it will be considered as a skill directory. + * Nested SKILL.md files under skill directories won't be included in the result. + * + * For example, consider the following files. + * - plugins/plugin-A/skills/skill-A/SKILL.md + * - plugins/plugin-A/skills/skill-A/references/SKILL.md + * + * The input path can be plugins/, plugins/plugin-A, plugins/plugin-A/skills, plugins/plugin-A/skills/skill-A + * It cannot be plugins/plugin-A/skills/skill-A/references because plugins/plugin-A/skills/skill-A is a skill directory. + * + * @returns Paths to discovered SKILL.md files. + */ +export function resolveSkillFiles(relativePath: string): { + files: string[], + errorMessage?: string +} { + const resolved = resolve(relativePath); + + if (!existsSync(resolved)) { + return { + files: [], + errorMessage: `Path not found: ${relativePath}` + }; + } + + const st = statSync(resolved); + + if (st.isFile()) { + if (basename(resolved) !== "SKILL.md") { + return { + files: [], + errorMessage: `Expected a SKILL.md file but got: ${relativePath}`, + }; + } + return { files: [resolved] }; + } + + if (st.isDirectory()) { + const files: string[] = []; + const candidates: string[] = [resolved]; + + while (candidates.length > 0) { + const dir = candidates.pop()!; + let entries: string[]; + try { + entries = readdirSync(dir); + } catch { + continue; + } + + const skillMd = resolve(dir, "SKILL.md"); + if (existsSync(skillMd)) { + // This directory is a skill — record its SKILL.md and don't recurse into subdirs + // Since we only check for nested directories, the directory to search must not be nested in a skill directory. + files.push(skillMd); + } else { + // Not a skill directory — add subdirectories to the search queue + for (const entry of entries) { + const full = resolve(dir, entry); + try { + if (statSync(full).isDirectory()) { + candidates.push(full); + } + } catch { + // skip inaccessible entries + } + } + } + } + + files.sort(); + + if (files.length === 0) { + return { files: [], errorMessage: `No skills found in directory: ${relativePath}` }; + } + return { files }; + } + + return { + files: [], + errorMessage: `Path is neither a file nor a directory: ${relativePath}`, + }; +} + +// ── JSON output ────────────────────────────────────────────────────────────── + +/** All check identifiers produced by the validator */ +const ALL_CHECKS = [ + "frontmatter", + "name-format", + "missing-field", + "description-format", + "no-xml-tags", + "reserved-prefix", + "description-length", + "license", + "metadata", + "metadata-version", + "compatibility", + "allowed-tools", + "trigger-overlap-disambiguation", + "disambiguation-removal", +] as const; + +export interface FrontmatterSkillResult { + name: string; + path: string; + status: "pass" | "fail" | "warn"; + errors: string[]; + warnings: string[]; + checks: Record; + /** Raw description text ("" when missing). Length is derivable by consumers. */ + description: string; +} + +export interface FrontmatterJsonResult { + skills: FrontmatterSkillResult[]; + summary: { + total: number; + passed: number; + failed: number; + warnings: number; + }; +} + +export function buildJsonResult(results: ValidationResult[]): FrontmatterJsonResult { + const skills: FrontmatterSkillResult[] = []; + let passed = 0; + let failed = 0; + let warningCount = 0; + + for (const result of results) { + const errors = result.issues.filter(i => i.severity !== "warning"); + const warnings = result.issues.filter(i => i.severity === "warning"); + + // Build checks map: true = passed, false = has issue for that check + const failedChecks = new Set(result.issues.map(i => i.check)); + const checks: Record = {}; + for (const check of ALL_CHECKS) { + checks[check] = !failedChecks.has(check); + } + + let status: "pass" | "fail" | "warn"; + if (errors.length > 0) { + status = "fail"; + failed++; + } else if (warnings.length > 0) { + status = "warn"; + warningCount++; + } else { + status = "pass"; + passed++; + } + + const description = result.description ?? ""; + skills.push({ + name: result.skill, + path: relative(REPO_ROOT, result.file).replace(/\\/g, "/"), + status, + errors: errors.map(e => `[${e.check}] ${e.message}`), + warnings: warnings.map(w => `[${w.check}] ${w.message}`), + checks, + description, + }); + } + + return { + skills, + summary: { + total: results.length, + passed, + failed, + warnings: warningCount, + }, + }; +} \ No newline at end of file diff --git a/scripts/src/references/cli.ts b/scripts/src/references/cli.ts index 1a30a528e..a6d60cf4d 100644 --- a/scripts/src/references/cli.ts +++ b/scripts/src/references/cli.ts @@ -12,7 +12,7 @@ * * Usage: * npm run references # Validate all skills - * npm run references # Validate a single skill + * npm run references # Validate a single skill. Both and are optional, but can only be used if is provided. Note that pluginDirname is the name of the directory containing the plugin files, not the name of the plugin. For example, use "azure-skills" instead of "azure". * npm run references -- --json # Emit validation results as JSON * npm run references -- --list # Emit every discovered local * # and remote link as JSON @@ -23,21 +23,15 @@ * npm run --silent references -- --list > out.json */ -import { dirname, resolve, relative, normalize } from "node:path"; +import { resolve, relative, normalize, dirname } from "node:path"; import { existsSync, readdirSync, statSync } from "node:fs"; import { extractLocalLinks, extractRemoteLinks } from "./link-helpers.js"; -import { fileURLToPath } from "node:url"; import { parseArgs } from "node:util"; +import { getRepoRoot, listPlugins, listSkills, SkillRef } from "../shared/skill-helper.js"; // ── Paths ──────────────────────────────────────────────────────────────────── -function getRepoRoot(): string { - const scriptDir = dirname(fileURLToPath(import.meta.url)); - return resolve(scriptDir, "../../.."); -} - const REPO_ROOT = getRepoRoot(); -let SKILLS_DIR = resolve(REPO_ROOT, "plugin", "skills"); const FILTERED_REMOTE_HOSTS = new Set([]); const FILTERED_REMOTE_HOST_SUFFICES: string[] = []; @@ -86,7 +80,7 @@ interface LocalLinkDetail { } interface ValidationResult { - skill: string; + skillRef: SkillRef; issues: LinkIssue[]; orphanedFiles: OrphanedFile[]; remoteLinks: RemoteLinkDetail[]; @@ -169,6 +163,8 @@ function validateFile(mdFile: string, skillDir: string): { remoteLinks: RemoteLinkDetail[]; localLinks: LocalLinkDetail[]; } { + const skillsDir = dirname(skillDir); + // Local links const localLinks = extractLocalLinks(mdFile, skillDir); const remoteLinks = extractRemoteLinks(mdFile, skillDir); @@ -208,7 +204,7 @@ function validateFile(mdFile: string, skillDir: string): { || normalizedResolved === normalizedSkillDir; if (!insideSkill) { - const rel = relative(SKILLS_DIR, item.absPath).replace(/\\/g, "/"); + const rel = relative(skillsDir, item.absPath).replace(/\\/g, "/"); return { file: mdFile, line: item.line, @@ -247,8 +243,8 @@ function validateFile(mdFile: string, skillDir: string): { }; } -function validateSkill(skillName: string): ValidationResult { - const skillDir = resolve(SKILLS_DIR, skillName); +function validateSkill(skillRef: SkillRef): ValidationResult { + const skillDir = resolve(REPO_ROOT, `plugins/${skillRef.pluginDirname}/skills/${skillRef.name}`); const mdFiles = findMarkdownFiles(skillDir); const issues: LinkIssue[] = []; const remoteLinks: RemoteLinkDetail[] = []; @@ -307,7 +303,7 @@ function validateSkill(skillName: string): ValidationResult { } } - return { skill: skillName, issues, orphanedFiles, remoteLinks, localLinks }; + return { skillRef: skillRef, issues, orphanedFiles, remoteLinks, localLinks }; } // ── JSON output ────────────────────────────────────────────────────────────── @@ -330,7 +326,7 @@ export interface ReferencesJsonResult { } function buildReferencesJson( - skills: string[], + skills: SkillRef[], results: ValidationResult[], ): ReferencesJsonResult { const references: ReferenceEntry[] = []; @@ -361,7 +357,7 @@ function buildReferencesJson( for (const orphan of result.orphanedFiles) { references.push({ source: formatPath(orphan.file), - target: result.skill + "/SKILL.md", + target: result.skillRef + "/SKILL.md", status: "warning", message: orphan.reason, }); @@ -400,7 +396,7 @@ export interface RemoteLinkListEntry extends LinkListEntry { } export interface SkillLinkList { - skill: string; + skill: SkillRef; localLinks: LocalLinkListEntry[]; remoteLinks: RemoteLinkListEntry[]; } @@ -436,7 +432,7 @@ function buildListJson(results: ValidationResult[]): ReferencesListResult { })); totalLocal += localLinks.length; totalRemote += remoteLinks.length; - return { skill: result.skill, localLinks, remoteLinks }; + return { skill: result.skillRef, localLinks, remoteLinks }; }); return { @@ -451,15 +447,6 @@ function buildListJson(results: ValidationResult[]): ReferencesListResult { // ── CLI entry point ────────────────────────────────────────────────────────── -function listSkills(): string[] { - return readdirSync(SKILLS_DIR) - .filter((name) => { - const full = resolve(SKILLS_DIR, name); - return statSync(full).isDirectory(); - }) - .sort(); -} - function formatPath(absPath: string): string { return relative(REPO_ROOT, absPath).replace(/\\/g, "/"); } @@ -470,38 +457,30 @@ function main(): void { options: { json: { type: "boolean", default: false }, list: { type: "boolean", default: false }, - "skills-dir": { type: "string" }, }, strict: false, allowPositionals: true, }); - if (values["skills-dir"] && typeof values["skills-dir"] === "string") { - const dir = resolve(values["skills-dir"]); - if (!existsSync(dir) || !statSync(dir).isDirectory()) { - console.error(`\n❌ Skills directory not found: ${dir}\n`); - process.exit(1); - } - SKILLS_DIR = dir; - } - const jsonOutput = values.json ?? false; const listOutput = values.list ?? false; - const requestedSkill = positionals[0]; - - const skills = requestedSkill ? [requestedSkill] : listSkills(); - - // Verify requested skill exists - if (requestedSkill) { - const skillDir = resolve(SKILLS_DIR, requestedSkill); - if (!existsSync(skillDir) || !statSync(skillDir).isDirectory()) { - console.error(`\n❌ Skill "${requestedSkill}" not found in ${formatPath(SKILLS_DIR)}\n`); - console.error("Available skills:"); - for (const s of listSkills()) { - console.error(` - ${s}`); + const requestedPluginDirname = positionals[0]; + const requestedSkill = positionals[1]; + + let skills: SkillRef[] = []; + if (requestedPluginDirname && requestedSkill) { + skills = [{ + pluginDirname: requestedPluginDirname, + name: requestedSkill + }]; + } else { + if (requestedPluginDirname) { + skills = listSkills(requestedPluginDirname); + } else { + const plugins = listPlugins(); + for (const plugin of plugins) { + skills.push(...plugin.skills); } - process.exitCode = 1; - return; } } @@ -542,14 +521,14 @@ function main(): void { const hasOrphanedFiles = result.orphanedFiles.length > 0; if (!hasLinkIssues && !hasOrphanedFiles) { - console.log(` ✅ ${result.skill}`); + console.log(` ✅ ${result.skillRef.pluginDirname} - ${result.skillRef.name}`); } else { skillsWithIssues++; const issueCount = result.issues.length + result.orphanedFiles.length; totalIssues += result.issues.length; totalOrphanedFiles += result.orphanedFiles.length; - console.log(` ❌ ${result.skill} — ${issueCount} issue(s)`); + console.log(` ❌ ${result.skillRef} — ${issueCount} issue(s)`); // Report link issues for (const issue of result.issues) { diff --git a/scripts/src/shared/skill-helper.ts b/scripts/src/shared/skill-helper.ts index 5674f4153..f4855ac69 100644 --- a/scripts/src/shared/skill-helper.ts +++ b/scripts/src/shared/skill-helper.ts @@ -15,6 +15,10 @@ import matter from "gray-matter"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); +export function getRepoRoot(): string { + return path.resolve(__dirname, "../../.."); +} + // ── Types ──────────────────────────────────────────────────────────────────── /** Parsed frontmatter result from a SKILL.md file. */ @@ -31,18 +35,54 @@ export interface ParsedSkill { raw: string; } -interface SkillMetadata { +export type SkillMetadata = { + /** + * The directory name containing the plugin files in the shared plugins directory. + */ + pluginDirname: string; name: string; description: string; [key: string]: unknown; +}; + +export type SkillRef = { + /** + * The directory name containing the plugin files in the shared plugins directory. + */ + pluginDirname: string; + name: string; } -export interface LoadedSkill { +export type LoadedSkill = { metadata: SkillMetadata; content: string; + + /** + * Absolute path to the skill's directory. + */ path: string; + + /** + * Absolute path to the skill's SKILL.md file. + */ filePath: string; -} +}; + +export type Plugin = { + /** + * The directory name containing the plugin files in the shared plugins directory. + * + * Plugin directory name can be different from from the plugin's name. + * For example, the directory name of "azure" plugin is "azure-skills". + * Some external marketplaces already depend on it. + * For example, see https://github.com/github/awesome-copilot/blob/30472ecf0fe34cc561df958c08501ecc5ca80ea4/.github/plugin/marketplace.json#L142 + * Given a plugin's directory name, we can easily retrieve its plugin name by reading the plugin.json file. + * Discover a plugin directory name from the plugin name is much harder. + * Therefore we maintain references to plugins by their directory names. + */ + dirname: string; + skills: SkillRef[]; +}; // ── Parser ─────────────────────────────────────────────────────────────────── @@ -91,6 +131,16 @@ export function parseSkillContent(fileContent: string): ParsedSkill | null { // ── Loaders ────────────────────────────────────────────────────────────────── +/** + * By default the directory of the plugin in the build output should be the exact name of the plugin. + * However, "azure" plugin has been published with "azure-skills" and external marketplaces that references our plugin already depend on it. + * For example, https://github.com/github/awesome-copilot/blob/30472ecf0fe34cc561df958c08501ecc5ca80ea4/.github/plugin/marketplace.json#L142 + * If a plugin has a mapped directory name here, its build output will be written under the mapped directory name. + */ +const pluginDirnameMap = new Map([ + ["azure", "azure-skills"] +]); + /** * Load a skill by name. * @@ -98,27 +148,29 @@ export function parseSkillContent(fileContent: string): ParsedSkill | null { * via `parseSkillContent`. Throws when the file is missing or contains * no valid frontmatter. */ -export function loadSkill(skillName: string): LoadedSkill { +export function loadSkill(skillRef: SkillRef): LoadedSkill { + const pluginDirname = pluginDirnameMap.get(skillRef.pluginDirname) ?? skillRef.pluginDirname; const skillPath = path.join( - path.resolve(__dirname, "../../../plugin/skills"), - skillName + getRepoRoot(), + `plugins/${pluginDirname}/skills/${skillRef.name}` ); const skillFile = path.join(skillPath, "SKILL.md"); if (!fs.existsSync(skillFile)) { - throw new Error(`SKILL.md not found for skill: ${skillName} at ${skillFile}`); + throw new Error(`SKILL.md not found for skill: ${skillRef} at ${skillFile} in plugin ${skillRef.pluginDirname}`); } const fileContent = fs.readFileSync(skillFile, "utf-8"); const parsed = parseSkillContent(fileContent); if (!parsed) { - throw new Error(`Invalid or missing frontmatter in SKILL.md for skill: ${skillName}`); + throw new Error(`Invalid or missing frontmatter in SKILL.md for skill: ${skillRef}`); } return { metadata: { - name: (parsed.data.name as string) || skillName, + pluginDirname: skillRef.pluginDirname, + name: (parsed.data.name as string) || skillRef.name, description: (parsed.data.description as string) || "", ...parsed.data }, @@ -129,10 +181,14 @@ export function loadSkill(skillName: string): LoadedSkill { } /** - * @returns Names of skills in azure plugin. + * @returns SkillRef objects in a given plugin. */ -export function listSkills(): string[] { - const skillsDir = path.resolve(__dirname, "../../../plugin/skills"); +export function listSkills(pluginDirname: string): SkillRef[] { + const skillsDir = path.resolve( + getRepoRoot(), + `output/${pluginDirname}/skills` + ); + const items = fs.readdirSync(skillsDir, { withFileTypes: true }); return items .filter((item) => item.isDirectory()) @@ -140,5 +196,27 @@ export function listSkills(): string[] { const skillMdPath = path.join(skillsDir, item.name, "SKILL.md"); return fs.existsSync(skillMdPath); }) - .map((item) => item.name); + .map((item) => { + return { + pluginDirname: pluginDirname, + name: item.name + } + }); +} + +export function listPlugins(): Plugin[] { + const pluginsDir = path.resolve( + __dirname, + getRepoRoot(), + "output" + ); + const items = fs.readdirSync(pluginsDir, { withFileTypes: true }); + return items + .filter((item) => item.isDirectory()) + .map((item) => { + return { + dirname: item.name, + skills: listSkills(item.name) + } + }); } \ No newline at end of file diff --git a/scripts/src/tokens/__tests__/integration/count.integration.test.ts b/scripts/src/tokens/__tests__/integration/count.integration.test.ts index 809dc2102..eab3cbf95 100644 --- a/scripts/src/tokens/__tests__/integration/count.integration.test.ts +++ b/scripts/src/tokens/__tests__/integration/count.integration.test.ts @@ -20,7 +20,7 @@ describe("count command integration", () => { // Ignore clean up errors in tests } mkdirSync(join(TEST_DIR, ".github", "skills"), { recursive: true }); - mkdirSync(join(TEST_DIR, "plugin", "skills"), { recursive: true }); + mkdirSync(join(TEST_DIR, "plugins", "test-plugin", "skills"), { recursive: true }); // Spy on console.log to capture output consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { }); @@ -40,7 +40,7 @@ describe("count command integration", () => { it("counts tokens in default directories", () => { // Create test files writeFileSync(join(TEST_DIR, ".github", "skills", "test.md"), "a".repeat(400)); // 100 tokens - writeFileSync(join(TEST_DIR, "plugin", "skills", "another.md"), "b".repeat(800)); // 200 tokens + writeFileSync(join(TEST_DIR, "plugins", "test-plugin", "skills", "another.md"), "b".repeat(800)); // 200 tokens count(TEST_DIR, []); diff --git a/scripts/src/tokens/__tests__/utils.test.ts b/scripts/src/tokens/__tests__/utils.test.ts index 361943a22..fc3494462 100644 --- a/scripts/src/tokens/__tests__/utils.test.ts +++ b/scripts/src/tokens/__tests__/utils.test.ts @@ -114,7 +114,7 @@ describe("getLimitForFile", () => { defaults: { "*.md": 2000, "SKILL.md": 3500, - "plugin/skills/**/SKILL.md": 4000 + "plugins/*/skills/**/SKILL.md": 4000 }, overrides: {} }; diff --git a/scripts/src/tokens/cli.ts b/scripts/src/tokens/cli.ts index 28c741369..3000cff8f 100644 --- a/scripts/src/tokens/cli.ts +++ b/scripts/src/tokens/cli.ts @@ -12,21 +12,15 @@ * npm run tokens help # Show help */ -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; import { count } from "./commands/count.js"; import { check } from "./commands/check.js"; import { compare } from "./commands/compare.js"; import { suggest } from "./commands/suggest.js"; +import { getRepoRoot } from "../shared/skill-helper.js"; const COMMANDS = ["count", "check", "compare", "suggest", "help"] as const; type Command = typeof COMMANDS[number]; -function getRepoRoot(): string { - const scriptDir = dirname(fileURLToPath(import.meta.url)); - return resolve(scriptDir, "../../.."); -} - function printHelp(): void { console.log(` 📊 Token Management CLI @@ -43,7 +37,7 @@ Commands: Default Scope: All commands scan these directories by default: - .github/skills - - plugin/skills + - plugins/ - .github/agents Options vary by command. Use --help with any command for details. diff --git a/scripts/src/tokens/commands/types.ts b/scripts/src/tokens/commands/types.ts index 38176a8a7..f9470980e 100644 --- a/scripts/src/tokens/commands/types.ts +++ b/scripts/src/tokens/commands/types.ts @@ -122,7 +122,7 @@ export const TOKENS_PER_TABLE_ROW = 12; export const EXCLUDED_DIRS = ["node_modules", ".git", "dist", "coverage"] as const; /** Default directories to scan for skills/agents */ -export const DEFAULT_SCAN_DIRS = [".github/skills", "plugin/skills", ".github/agents"] as const; +export const DEFAULT_SCAN_DIRS = [".github/skills", "plugins", ".github/agents"] as const; /** Supported markdown extensions */ export const MARKDOWN_EXTENSIONS = [".md", ".mdx"] as const; @@ -139,7 +139,7 @@ export const DEFAULT_LIMITS: TokenLimitsConfig = { overrides: { "README.md": 3000, "CONTRIBUTING.md": 2500, - "plugin/README.md": 3000 + "plugins/**/README.md": 3000 } }; diff --git a/scripts/src/update-plugin-version.ts b/scripts/src/update-plugin-version.ts deleted file mode 100644 index 6048d2531..000000000 --- a/scripts/src/update-plugin-version.ts +++ /dev/null @@ -1,101 +0,0 @@ -import * as fs from "node:fs"; -import * as path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -interface PluginConfig { - version: string; - [key: string]: any; -} - -/** - * Updates both plugin.json files with the specified version - * @param version - The new version to set - * @param pluginFiles - Array of paths to plugin.json files (defaults to standard locations) - * @returns true if there was an error, false otherwise - */ -export function updatePluginVersion( - version: string, - pluginFiles: string[] = [ - "../../plugin/.claude-plugin/plugin.json", - "../../plugin/.cursor-plugin/plugin.json", - "../../plugin/.plugin/plugin.json" - ] -): boolean { - console.log(`Updating plugin files to version: ${version}`); - - let hadError = false; - - for (const filePath of pluginFiles) { - let fd: number | undefined; - try { - const fullPath = path.resolve(__dirname, filePath); - - // Open file for reading and writing - fd = fs.openSync(fullPath, "r+"); - - // Read current content - const content: string = fs.readFileSync(fd, "utf8"); - const pluginConfig: PluginConfig = JSON.parse(content); - - // Update version - pluginConfig.version = version; - - // Prepare new content - const newContent: string = JSON.stringify(pluginConfig, null, 2) + "\n"; - - // Truncate and write back with formatted JSON - fs.ftruncateSync(fd, 0); - - // Seek back to the beginning of the file after truncation - fs.writeSync(fd, newContent, 0); - - console.log(`✓ Updated ${filePath} to version ${version}`); - } catch (error: unknown) { - const err = error as NodeJS.ErrnoException; - if (err.code === "ENOENT") { - console.error(`File not found: ${filePath}`); - } else { - console.error(`Failed to update ${filePath}:`, err.message); - } - hadError = true; - break; // Stop processing further files if there's an error - } finally { - // Always close the file descriptor if it was opened - if (fd !== undefined) { - try { - fs.closeSync(fd); - } catch (closeError: unknown) { - const err = closeError as NodeJS.ErrnoException; - console.error(`Failed to close file ${filePath}:`, err.message); - } - } - } - } - - return hadError; -} - -/** - * Main function for CLI execution - */ -function main(): void { - const version: string | undefined = process.argv[2]; - - if (!version) { - console.error("Usage: npx tsx update-plugin-version.ts "); - process.exit(1); - } - - const hadError = updatePluginVersion(version); - if (hadError) { - process.exit(1); - } -} - -// Only run main if this file is executed directly (not imported) -// Convert import.meta.url to file path and compare with resolved argv[1] -if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) { - main(); -} \ No newline at end of file diff --git a/scripts/src/vally/cli.ts b/scripts/src/vally/cli.ts index 09af4a7f6..b2a93eb1f 100644 --- a/scripts/src/vally/cli.ts +++ b/scripts/src/vally/cli.ts @@ -9,18 +9,12 @@ * npm run vally help # Show help */ -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; import { validateStimulus } from "./validate-stimulus.js"; +import { getRepoRoot } from "../shared/skill-helper.js"; const COMMANDS = ["validate-stimulus", "help"] as const; type Command = typeof COMMANDS[number]; -function getRepoRoot(): string { - const scriptDir = dirname(fileURLToPath(import.meta.url)); - return resolve(scriptDir, "../../.."); -} - function printHelp(): void { console.log(` 🔬 Vally CLI diff --git a/tests/azure-cloud-migrate/triggers.test.ts b/tests/azure-cloud-migrate/triggers.test.ts index b5b5117b8..5a756d69d 100644 --- a/tests/azure-cloud-migrate/triggers.test.ts +++ b/tests/azure-cloud-migrate/triggers.test.ts @@ -17,7 +17,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/azure-deploy/triggers.test.ts b/tests/azure-deploy/triggers.test.ts index c82685a81..37d00a45e 100644 --- a/tests/azure-deploy/triggers.test.ts +++ b/tests/azure-deploy/triggers.test.ts @@ -15,7 +15,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/azure-validate/triggers.test.ts b/tests/azure-validate/triggers.test.ts index 782e25061..69a3de9d4 100644 --- a/tests/azure-validate/triggers.test.ts +++ b/tests/azure-validate/triggers.test.ts @@ -15,7 +15,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/globals.d.ts b/tests/globals.d.ts index a4f2041bc..6838ace01 100644 --- a/tests/globals.d.ts +++ b/tests/globals.d.ts @@ -5,10 +5,8 @@ import { TriggerMatcher } from "./utils/trigger-matcher"; declare global { - var SKILLS_PATH: string; + var OUTPUT_PATH: string; var TESTS_PATH: string; - function getSkillPath(skillName: string): string; - function getFixturesPath(skillName: string): string; function setTestResult(data: { isPass: boolean, message?: string, skillInvocationRate?: number, expectsScreenshot: boolean }): void; namespace jest { diff --git a/tests/jest.setup.ts b/tests/jest.setup.ts index 5d4af56e6..c9c02212b 100644 --- a/tests/jest.setup.ts +++ b/tests/jest.setup.ts @@ -17,7 +17,7 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Make utils available globally for convenience -global.SKILLS_PATH = path.resolve(__dirname, "../output/skills"); +global.OUTPUT_PATH = path.resolve(__dirname, "../output"); global.TESTS_PATH = __dirname; // Custom matcher: check if a skill should trigger on a prompt @@ -57,16 +57,6 @@ if (!process.env.DEBUG) { }; } -// Helper to get skill path -global.getSkillPath = (skillName: string): string => { - return path.join(global.SKILLS_PATH, skillName); -}; - -// Helper to get test fixtures path -global.getFixturesPath = (skillName: string): string => { - return path.join(global.TESTS_PATH, skillName, "fixtures"); -}; - // ── Global test results collection ────────────────────────────── // Each worker accumulates results in-memory, then flushes to a // per-worker JSON file in afterAll so globalTeardown can merge them. diff --git a/tests/microsoft-foundry/finetuning/triggers.test.ts b/tests/microsoft-foundry/finetuning/triggers.test.ts index 337065110..acf1d64ef 100644 --- a/tests/microsoft-foundry/finetuning/triggers.test.ts +++ b/tests/microsoft-foundry/finetuning/triggers.test.ts @@ -15,7 +15,7 @@ describe("finetuning - Trigger Tests", () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/foundry-agent/create/toolbox-paths.unit.test.ts b/tests/microsoft-foundry/foundry-agent/create/toolbox-paths.unit.test.ts index b515e73b3..ef542b4de 100644 --- a/tests/microsoft-foundry/foundry-agent/create/toolbox-paths.unit.test.ts +++ b/tests/microsoft-foundry/foundry-agent/create/toolbox-paths.unit.test.ts @@ -10,7 +10,7 @@ import path from "path"; const SKILL_NAME = "microsoft-foundry"; const readSkillFile = (relativePath: string) => - readFile(path.join(SKILLS_PATH, SKILL_NAME, relativePath), "utf-8"); + readFile(path.join(OUTPUT_PATH, "azure-skills", "skills", SKILL_NAME, relativePath), "utf-8"); describe("foundry-agent create toolbox reference paths", () => { test("uses current toolbox sample and docs paths", async () => { diff --git a/tests/microsoft-foundry/foundry-agent/direct-code.unit.test.ts b/tests/microsoft-foundry/foundry-agent/direct-code.unit.test.ts index 8f163aea8..59b3537bc 100644 --- a/tests/microsoft-foundry/foundry-agent/direct-code.unit.test.ts +++ b/tests/microsoft-foundry/foundry-agent/direct-code.unit.test.ts @@ -12,7 +12,7 @@ import path from "path"; const SKILL_NAME = "microsoft-foundry"; const readSkillFile = (relativePath: string) => - readFile(path.join(SKILLS_PATH, SKILL_NAME, relativePath), "utf-8"); + readFile(path.join(OUTPUT_PATH, "azure-skills", "skills", SKILL_NAME, relativePath), "utf-8"); describe("foundry-agent direct-code workflow docs", () => { test("create and deploy workflows prefer azd direct-code deployment", async () => { diff --git a/tests/microsoft-foundry/foundry-agent/eval-datasets/triggers.test.ts b/tests/microsoft-foundry/foundry-agent/eval-datasets/triggers.test.ts index 57d2e0e02..8f3c35d88 100644 --- a/tests/microsoft-foundry/foundry-agent/eval-datasets/triggers.test.ts +++ b/tests/microsoft-foundry/foundry-agent/eval-datasets/triggers.test.ts @@ -12,7 +12,7 @@ describe("eval-datasets - Trigger Tests", () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/foundry-agent/observe/triggers.test.ts b/tests/microsoft-foundry/foundry-agent/observe/triggers.test.ts index 32531b483..21258bc94 100644 --- a/tests/microsoft-foundry/foundry-agent/observe/triggers.test.ts +++ b/tests/microsoft-foundry/foundry-agent/observe/triggers.test.ts @@ -15,7 +15,7 @@ describe("observe - Trigger Tests", () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/foundry-agent/trace/triggers.test.ts b/tests/microsoft-foundry/foundry-agent/trace/triggers.test.ts index 84b336ceb..305dbc985 100644 --- a/tests/microsoft-foundry/foundry-agent/trace/triggers.test.ts +++ b/tests/microsoft-foundry/foundry-agent/trace/triggers.test.ts @@ -15,7 +15,7 @@ describe("trace - Trigger Tests", () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/models/deploy/capacity/triggers.test.ts b/tests/microsoft-foundry/models/deploy/capacity/triggers.test.ts index d9525c261..87e8fcab7 100644 --- a/tests/microsoft-foundry/models/deploy/capacity/triggers.test.ts +++ b/tests/microsoft-foundry/models/deploy/capacity/triggers.test.ts @@ -15,7 +15,7 @@ describe("capacity - Trigger Tests", () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/models/deploy/customize-deployment/triggers.test.ts b/tests/microsoft-foundry/models/deploy/customize-deployment/triggers.test.ts index 34d87120d..afb79f0f1 100644 --- a/tests/microsoft-foundry/models/deploy/customize-deployment/triggers.test.ts +++ b/tests/microsoft-foundry/models/deploy/customize-deployment/triggers.test.ts @@ -15,7 +15,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/models/deploy/deploy-model-optimal-region/triggers.test.ts b/tests/microsoft-foundry/models/deploy/deploy-model-optimal-region/triggers.test.ts index a16f05fe2..fa0a95705 100644 --- a/tests/microsoft-foundry/models/deploy/deploy-model-optimal-region/triggers.test.ts +++ b/tests/microsoft-foundry/models/deploy/deploy-model-optimal-region/triggers.test.ts @@ -15,7 +15,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/models/deploy/deploy-model/triggers.test.ts b/tests/microsoft-foundry/models/deploy/deploy-model/triggers.test.ts index b5146d5c5..e119df1a2 100644 --- a/tests/microsoft-foundry/models/deploy/deploy-model/triggers.test.ts +++ b/tests/microsoft-foundry/models/deploy/deploy-model/triggers.test.ts @@ -15,7 +15,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/resource/create/integration.test.ts b/tests/microsoft-foundry/resource/create/integration.test.ts index 4de266321..00a7f31aa 100644 --- a/tests/microsoft-foundry/resource/create/integration.test.ts +++ b/tests/microsoft-foundry/resource/create/integration.test.ts @@ -12,7 +12,7 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; }); describe("Skill Loading", () => { @@ -37,7 +37,9 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { const path = await import("path"); const mainFilePath = path.join( - SKILLS_PATH, + OUTPUT_PATH, + "azure-skills", + "skills", "microsoft-foundry/resource/create/create-foundry-resource.md" ); @@ -55,7 +57,9 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { const path = await import("path"); const mainFilePath = path.join( - SKILLS_PATH, + OUTPUT_PATH, + "azure-skills", + "skills", "microsoft-foundry/resource/create/create-foundry-resource.md" ); @@ -73,7 +77,9 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { const path = await import("path"); const mainFilePath = path.join( - SKILLS_PATH, + OUTPUT_PATH, + "azure-skills", + "skills", "microsoft-foundry/resource/create/create-foundry-resource.md" ); @@ -92,7 +98,9 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { const path = await import("path"); const mainFilePath = path.join( - SKILLS_PATH, + OUTPUT_PATH, + "azure-skills", + "skills", "microsoft-foundry/resource/create/create-foundry-resource.md" ); @@ -108,7 +116,9 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { const path = await import("path"); const referencesPath = path.join( - SKILLS_PATH, + OUTPUT_PATH, + "azure-skills", + "skills", "microsoft-foundry/resource/create/references" ); @@ -130,7 +140,9 @@ describe(`${SKILL_NAME}_resource-create - Integration Tests`, () => { const path = await import("path"); const mainFilePath = path.join( - SKILLS_PATH, + OUTPUT_PATH, + "azure-skills", + "skills", "microsoft-foundry/resource/create/create-foundry-resource.md" ); diff --git a/tests/microsoft-foundry/resource/create/triggers.test.ts b/tests/microsoft-foundry/resource/create/triggers.test.ts index d3284e9b4..e0c35f92e 100644 --- a/tests/microsoft-foundry/resource/create/triggers.test.ts +++ b/tests/microsoft-foundry/resource/create/triggers.test.ts @@ -15,7 +15,7 @@ describe("microsoft-foundry:resource/create - Trigger Tests", () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/microsoft-foundry/triggers.test.ts b/tests/microsoft-foundry/triggers.test.ts index 653eb806c..2824a516f 100644 --- a/tests/microsoft-foundry/triggers.test.ts +++ b/tests/microsoft-foundry/triggers.test.ts @@ -15,7 +15,7 @@ describe(`${SKILL_NAME} - Trigger Tests`, () => { let skill: LoadedSkill; beforeAll(async () => { - skill = await loadSkill(SKILL_NAME); + skill = await loadSkill({ pluginDirname: "azure-skills", name: SKILL_NAME });; triggerMatcher = new TriggerMatcher(skill); }); diff --git a/tests/package.json b/tests/package.json index cc7368b29..b3e85d348 100644 --- a/tests/package.json +++ b/tests/package.json @@ -21,9 +21,7 @@ "update:snapshots": "node scripts/update-snapshots.js", "typecheck": "tsc --noEmit", "lint": "eslint", - "lint:fix": "eslint --fix", - "eval": "vally eval", - "eval:lint": "vally lint plugin/skills/ --eval evals/ --strict" + "lint:fix": "eslint --fix" }, "engines": { "node": "^22.14.0 || >=24" diff --git a/tests/run-vally-test.ts b/tests/run-vally-test.ts index 52a11f938..f4d62cbed 100644 --- a/tests/run-vally-test.ts +++ b/tests/run-vally-test.ts @@ -2,7 +2,7 @@ * CLI wrapper for running vally tests. * * Example: - * npm run test:vally -- --skill azure-ai [...vally eval arguments] + * npm run test:vally -- --plugin azure-skills --skill azure-ai [...vally eval arguments] */ import * as path from "node:path"; @@ -164,6 +164,7 @@ async function convertTestResults(vallyResultsPath: string, testCaseDirPath: str } type CliOptions = { + plugin?: string; skill?: string; passRate?: number; forwardedArgs: string[]; @@ -171,12 +172,32 @@ type CliOptions = { function parseCliOptions(argv: string[]): CliOptions { const forwardedArgs: string[] = []; + let plugin: string | undefined; let skill: string | undefined; let passRate: number | undefined; for (let i = 0; i < argv.length; i += 1) { const arg = argv[i]; + if (arg === "--plugin") { + const value = argv[i + 1]; + if (!value || value.startsWith("--")) { + throw new Error("Missing value for --plugin"); + } + plugin = value; + i += 1; + continue; + } + + if (arg.startsWith("--plugin=")) { + const value = arg.slice("--plugin=".length); + if (!value) { + throw new Error("Missing value for --plugin"); + } + plugin = value; + continue; + } + if (arg === "--skill") { const value = argv[i + 1]; if (!value || value.startsWith("--")) { @@ -241,6 +262,7 @@ function parseCliOptions(argv: string[]): CliOptions { } return { + plugin, skill, passRate, forwardedArgs, @@ -252,6 +274,7 @@ function printUsage(): void { "Usage: tsx tests/run-vally-test.ts [options] [-- ]", "", "Options:", + " --plugin Plugin dirname for plugin content and eval specs (default: azure-skills). Note that a plugin's dirname may be different from its name.", " --skill Skill name used by this wrapper", " --pass-rate <0..1> Required pass rate for each aggregated test (default: 0.75)", " --help Show this help", @@ -305,6 +328,7 @@ async function main(): Promise { } const options = parseCliOptions(rawArgs); + const pluginDirname = options.plugin ?? "azure-skills"; const passRateThreshold = options.passRate ?? 0.75; // Wrapper-specific args are parsed above; all other args are preserved here. @@ -319,7 +343,7 @@ async function main(): Promise { forwardedArgs.splice(0, 0, "--executor-plugin", path.join(__dirname, "vally", "vally-executor.ts")); forwardedArgs.splice(0, 0, "--grader-plugin", path.join(__dirname, "vally", "vally-graders.ts")); if (options.skill) { - const evalSpecDir = path.join(__dirname, `../evals/${options.skill}/`); + const evalSpecDir = path.join(__dirname, `../evals/${pluginDirname}/${options.skill}/`); const evalSpecPaths: string[] = []; const allFiles = await fs.readdir(evalSpecDir); for (const file of allFiles) { diff --git a/tests/skills.json b/tests/skills.json index df2857e72..2920e0ee3 100644 --- a/tests/skills.json +++ b/tests/skills.json @@ -1,37 +1,43 @@ { - "skills": [ - "airunway-aks-setup", - "appinsights-instrumentation", - "azure-ai", - "azure-aigateway", - "azure-app-onboard", - "azure-app-onboard-prereq", - "azure-cloud-migrate", - "azure-compliance", - "azure-compute", - "azure-cost", - "azure-deploy", - "azure-diagnostics", - "azure-enterprise-infra-planner", - "azure-kubernetes", - "azure-kusto", - "azure-messaging", - "azure-prepare", - "azure-quotas", - "azure-reliability", - "azure-resource-lookup", - "azure-resource-visualizer", - "azure-storage", - "azure-upgrade", - "azure-validate", - "entra-agent-id", - "entra-app-registration", - "microsoft-foundry", - "python-appservice-deploy" - ], - "integrationTestSchedule": { - "0 5 * * 2-6": "microsoft-foundry", - "0 8 * * 2-6": "azure-deploy", - "0 12 * * 2-6": "airunway-aks-setup,appinsights-instrumentation,azure-ai,azure-aigateway,azure-cloud-migrate,azure-compliance,azure-compute,azure-cost,azure-diagnostics,azure-enterprise-infra-planner,azure-kubernetes,azure-kusto,azure-messaging,azure-prepare,azure-quotas,azure-resource-lookup,azure-resource-visualizer,azure-storage,azure-upgrade,azure-validate,entra-agent-id,entra-app-registration,azure-reliability,python-appservice-deploy,azure-app-onboard,azure-app-onboard-prereq" - } -} \ No newline at end of file + "plugins": [ + { + "name": "azure", + "dirname": "azure-skills", + "skills": [ + "airunway-aks-setup", + "appinsights-instrumentation", + "azure-ai", + "azure-aigateway", + "azure-app-onboard", + "azure-app-onboard-prereq", + "azure-cloud-migrate", + "azure-compliance", + "azure-compute", + "azure-cost", + "azure-deploy", + "azure-diagnostics", + "azure-enterprise-infra-planner", + "azure-kubernetes", + "azure-kusto", + "azure-messaging", + "azure-prepare", + "azure-quotas", + "azure-reliability", + "azure-resource-lookup", + "azure-resource-visualizer", + "azure-storage", + "azure-upgrade", + "azure-validate", + "entra-agent-id", + "entra-app-registration", + "microsoft-foundry", + "python-appservice-deploy" + ], + "integrationTestSchedule": { + "0 5 * * 2-6": "microsoft-foundry", + "0 8 * * 2-6": "azure-deploy", + "0 12 * * 2-6": "airunway-aks-setup,appinsights-instrumentation,azure-ai,azure-aigateway,azure-cloud-migrate,azure-compliance,azure-compute,azure-cost,azure-diagnostics,azure-enterprise-infra-planner,azure-kubernetes,azure-kusto,azure-messaging,azure-prepare,azure-quotas,azure-resource-lookup,azure-resource-visualizer,azure-storage,azure-upgrade,azure-validate,entra-agent-id,entra-app-registration,azure-reliability,python-appservice-deploy,azure-app-onboard,azure-app-onboard-prereq" + } + } + ] +} diff --git a/tests/utils/__tests__/char-budget.test.ts b/tests/utils/__tests__/char-budget.test.ts index 21af9f9fb..2bfd17ad1 100644 --- a/tests/utils/__tests__/char-budget.test.ts +++ b/tests/utils/__tests__/char-budget.test.ts @@ -3,25 +3,26 @@ */ import { jest } from "@jest/globals"; +import { SkillRef } from "../skill-loader.ts"; type CharBudgetModule = typeof import("../char-budget.ts"); async function importCharBudgetWithMocks( - skills: string[], + skills: SkillRef[], descriptions: Record ): Promise { jest.resetModules(); jest.unstable_mockModule("../skill-loader.ts", () => ({ listSkills: () => skills, - loadSkill: async (skillName: string) => { - const description = descriptions[skillName]; + loadSkill: async (skillRef: SkillRef) => { + const description = descriptions[skillRef.name]; if (description === undefined) { - throw new Error(`Missing mocked description for skill: ${skillName}`); + throw new Error(`Missing mocked description for skill: ${skillRef.name} in plugin ${skillRef.pluginDirname}`); } return { metadata: { - name: skillName, + name: skillRef.name, description, }, }; @@ -39,27 +40,30 @@ describe("truncateSkills", () => { test("throws when requiredSkills contains an invalid skill", async () => { const { truncateSkills } = await importCharBudgetWithMocks( - ["azure-ai", "azure-storage"], + [ + { pluginDirname: "azure-skills", name: "azure-ai" }, + { pluginDirname: "azure-skills", name: "azure-storage" } + ], { "azure-ai": "Azure AI skill", "azure-storage": "Azure Storage skill", } ); - await expect(truncateSkills(["azure-ai", "not-a-skill"], 20000)).rejects.toThrow( + await expect(truncateSkills(["azure-skills"], [{ pluginDirname: "azure-skills", name: "azure-ai" }, { pluginDirname: "azure-skills", name: "not-a-skill" }], 20000)).rejects.toThrow( "Invalid requiredSkills" ); }); test("throws when required skills alone exceed char budget", async () => { const { truncateSkills } = await importCharBudgetWithMocks( - ["azure-ai"], + [{ pluginDirname: "azure-skills", name: "azure-ai" }], { "azure-ai": "x".repeat(200), } ); - await expect(truncateSkills(["azure-ai"], 20)).rejects.toThrow( + await expect(truncateSkills(["azure-skills"], [{ pluginDirname: "azure-skills", name: "azure-ai" }], 20)).rejects.toThrow( "requiredSkills exceed SKILL_CHAR_BUDGET (20)" ); }); @@ -70,7 +74,10 @@ describe("truncateSkills", () => { edge: "edge desc", }; const { truncateSkills, getFormattedSkillDescription } = await importCharBudgetWithMocks( - ["required", "edge"], + [ + { pluginDirname: "plugin-dir", name: "required" }, + { pluginDirname: "plugin-dir", name: "edge" } + ], descriptions ); @@ -78,8 +85,8 @@ describe("truncateSkills", () => { const edgeLen = (await getFormattedSkillDescription("edge", descriptions.edge)).length; const equalBudget = requiredLen + 1 + edgeLen + 1; - const disabled = await truncateSkills(["required"], equalBudget); + const disabled = await truncateSkills(["plugin-dir"], [{ pluginDirname: "plugin-dir", name: "required" }], equalBudget); - expect(disabled).toEqual(["edge"]); + expect(disabled).toEqual([{ pluginDirname: "plugin-dir", name: "edge" }]); }); }); diff --git a/tests/utils/agent-runner.ts b/tests/utils/agent-runner.ts index 183e29842..86cdf61f4 100644 --- a/tests/utils/agent-runner.ts +++ b/tests/utils/agent-runner.ts @@ -18,7 +18,7 @@ import * as path from "path"; import { fileURLToPath } from "url"; import { type CopilotSession, CopilotClient, type SessionEvent, approveAll, type SystemMessageConfig, RuntimeConnection } from "@github/copilot-sdk"; import { redactSecrets } from "./redact.ts"; -import { listSkills } from "./skill-loader.ts"; +import { listSkills, type SkillRef } from "./skill-loader.ts"; import { DEFAULT_SKILL_CHAR_BUDGET, truncateSkills } from "./char-budget.ts"; import { sanitizeTestName } from "../vally/utils.ts"; @@ -127,12 +127,17 @@ export interface AgentMetadata { /** * Map from skill name to the sorted, deduped list of files under that skill's - * directory (i.e., paths under `output/skills//`) that were referenced + * directory (i.e., paths under `output//skills//`) that were referenced * by tool invocations during the run. * Populated from tool arguments that reference files in a skill directory, and may * also include a synthesized `SKILL.md` entry for `skill` tool calls. */ skillFiles: Record; + + /** + * Loaded skills after applying the filters in the configuration and environment variable. + */ + skillsLoaded: SkillRef[]; } /** @@ -221,7 +226,7 @@ export interface AgentRunConfig { * If undefined, all the skills in azure plugin will be included. * If specified, only the skills in this array will be included. This option overrides the required skills specified in the {@link requiredSkills}. */ - includeSkills?: string[]; + includeSkills?: SkillRef[]; /** * Maximum number of assistant turns allowed before the run is aborted. @@ -248,7 +253,7 @@ export interface AgentRunConfig { * Skills that must be present with full description. * Skills other than the required ones will be randomly disabled until the estimated char count falls below the char count budget. */ - requiredSkills?: string[]; + requiredSkills?: SkillRef[]; } interface KeywordOptions { @@ -267,61 +272,65 @@ interface RunnerCleanup { /** * Extract file-system paths from the serialized arguments of a tool call that - * reference the given `skillDirectory`. Checks common argument keys + * reference any skill directory path in the given `skillDirectories`. Checks common argument keys * (`filePath`, `path`, `file`, `uri`) and also scans the full serialized args * for any substring rooted at the skill directory. Returned paths are * normalized to forward slashes. */ -function extractSkillDirPaths(args: unknown, skillDirectory: string): string[] { - const normalizedDir = skillDirectory.replace(/\\/g, "/").replace(/\/+$/, ""); +function extractSkillDirPaths(args: unknown, skillDirectories: string[]): string[] { const found = new Set(); - let obj: Record | undefined; - if (args && typeof args === "object") { - obj = args as Record; - } else if (typeof args === "string") { - try { - const parsed: unknown = JSON.parse(args); - if (parsed && typeof parsed === "object") { - obj = parsed as Record; - } - } catch { /* ignore */ } - } + // A path can match exactly one skill directory in skillDirectories + skillDirectories.forEach(dir => { + const normalizedDir = dir.replace(/\\/g, "/").replace(/\/+$/, ""); + + let obj: Record | undefined; + if (args && typeof args === "object") { + obj = args as Record; + } else if (typeof args === "string") { + try { + const parsed: unknown = JSON.parse(args); + if (parsed && typeof parsed === "object") { + obj = parsed as Record; + } + } catch { /* ignore */ } + } - if (obj) { - for (const key of ["filePath", "path", "file", "uri"]) { - const v = obj[key]; - if (typeof v === "string" && v.length > 0) { - const normalized = v.replace(/\\/g, "/"); - if (normalized.startsWith(normalizedDir + "/")) { - found.add(normalized); + if (obj) { + for (const key of ["filePath", "path", "file", "uri"]) { + const v = obj[key]; + if (typeof v === "string" && v.length > 0) { + const normalized = v.replace(/\\/g, "/"); + if (normalized.startsWith(normalizedDir + "/")) { + found.add(normalized); + } } } } - } - // Fallback: scan serialized args for any occurrence of the skill directory - let serialized: string; - if (typeof args === "string") { - serialized = args; - } else { - try { - serialized = JSON.stringify(args ?? ""); - } catch { - serialized = String(args ?? ""); + // Fallback: scan serialized args for any occurrence of the skill directory + let serialized: string; + if (typeof args === "string") { + serialized = args; + } else { + try { + serialized = JSON.stringify(args ?? ""); + } catch { + serialized = String(args ?? ""); + } } - } - const normalizedSerialized = serialized.replace(/\\\\/g, "/").replace(/\\/g, "/"); - const needle = normalizedDir + "/"; - let searchFrom = 0; - while (true) { - const idx = normalizedSerialized.indexOf(needle, searchFrom); - if (idx < 0) break; - const tail = normalizedSerialized.slice(idx); - const endMatch = tail.match(/^[^"',\s\\]+/); - if (endMatch) found.add(endMatch[0]); - searchFrom = idx + needle.length; - } + const normalizedSerialized = serialized.replace(/\\\\/g, "/").replace(/\\/g, "/"); + const needle = normalizedDir + "/"; + let searchFrom = 0; + while (true) { + const idx = normalizedSerialized.indexOf(needle, searchFrom); + if (idx < 0) break; + const tail = normalizedSerialized.slice(idx); + const endMatch = tail.match(/^[^"',\s\\]+/); + if (endMatch) found.add(endMatch[0]); + searchFrom = idx + needle.length; + } + }); return Array.from(found); } @@ -332,16 +341,16 @@ function extractSkillDirPaths(args: unknown, skillDirectory: string): string[] { * * - `toolCounts` keys are raw `event.data.toolName`, excluding the `skill` pseudo-tool. * - `skillFiles` is populated from any tool invocation whose arguments reference - * a path under the given skill directory (`output/skills//...`). + * a path under the given skill directory (`output//skills//...`). */ function computeToolAndSkillStats( events: SessionEvent[], - skillDirectory: string + skillDirectories: string[] ): { toolCounts: Record; skillFiles: Record } { const toolCounts: Record = {}; const skillFilesSet: Record> = {}; - const normalizedSkillDir = skillDirectory.replace(/\\/g, "/").replace(/\/+$/, ""); + const normalizedSkillDirs = skillDirectories.map(dir => dir.replace(/\\/g, "/").replace(/\/+$/, "")); for (const event of events) { if (event.type !== "tool.execution_start") continue; @@ -369,16 +378,22 @@ function computeToolAndSkillStats( } } if (skillName) { + const normalizedSkillDir = normalizedSkillDirs.filter(dir => dir.endsWith(`${skillName}/SKILLS.md`)).at(0); (skillFilesSet[skillName] ??= new Set()).add(`${normalizedSkillDir}/${skillName}/SKILL.md`); } } - for (const filePath of extractSkillDirPaths(event.data.arguments, skillDirectory)) { - const relative = filePath.slice(normalizedSkillDir.length + 1); - const slashIdx = relative.indexOf("/"); - if (slashIdx <= 0) continue; - const skillName = relative.slice(0, slashIdx); - (skillFilesSet[skillName] ??= new Set()).add(filePath); + for (const filePath of extractSkillDirPaths(event.data.arguments, skillDirectories)) { + // filePath is /output//skills// + // normalizedSkillDirs has paths like /output//skills// + const matchingSkillDir = normalizedSkillDirs.filter(dir => filePath.startsWith(dir)).at(0); + if (matchingSkillDir) { + const relative = filePath.slice(matchingSkillDir.length + 1); + const slashIdx = relative.indexOf("/"); + if (slashIdx <= 0) continue; + const skillName = relative.slice(0, slashIdx); + (skillFilesSet[skillName] ??= new Set()).add(filePath); + } } } @@ -851,7 +866,7 @@ export function useAgentRunner(agentRunnerConfig: AgentRunnerConfig) { entry.workspace = testWorkspace; entry.preserveWorkspace = runConfig.preserveWorkspace; - const agentMetadata: AgentMetadata = { events: [], testComments: [], turnCount: 0, toolCounts: {}, skillFiles: {} }; + const agentMetadata: AgentMetadata = { events: [], testComments: [], turnCount: 0, toolCounts: {}, skillFiles: {}, skillsLoaded: [] }; entry.agentMetadata = agentMetadata; try { @@ -892,33 +907,46 @@ export function useAgentRunner(agentRunnerConfig: AgentRunnerConfig) { }) as CopilotClient; entry.client = client; - const skillDirectory = path.resolve(__dirname, "../../output/skills"); + // The plugins to include are inferred by the requiredSkills. + // We include a plugin if and only if there is at least one required skill from it. + const pluginDirnames = new Set(); + runConfig.requiredSkills?.forEach(skillRef => { + pluginDirnames.add(skillRef.pluginDirname); + }); + const pluginDirnamesList = [...pluginDirnames.values()]; + const skillDirectories = pluginDirnamesList.map(pluginDir => { + return path.resolve(__dirname, `../../output/${pluginDir}/skills`) + }); - let disabledSkills: string[] | undefined; + let disabledSkills: SkillRef[] | undefined; + const skillRefs = pluginDirnamesList.map(plugin => listSkills(plugin)).flat(); if (runConfig.includeSkills) { - const skills = listSkills(); - if (runConfig.includeSkills.some((skillName) => !skills.includes(skillName))) { - const invalidSkills = runConfig.includeSkills.filter((skillName) => !skills.includes(skillName)); + if (runConfig.includeSkills.some((includeSkillRef) => !skillRefs.some(ref => ref.name === includeSkillRef.name))) { + const invalidSkills = runConfig.includeSkills.filter((includeSkillRef) => !skillRefs.some(ref => ref.name === includeSkillRef.name)); throw new Error(`Invalid includeSkills. ${invalidSkills} are not valid skills.`); } - disabledSkills = skills.filter((skillName) => !runConfig.includeSkills?.includes(skillName)); + disabledSkills = skillRefs.filter((ref) => !runConfig.includeSkills + ?.some(includeSkillRef => ref.name === includeSkillRef.name)); } else { // Keep all the required skills, then randomly drop the remaining skills until the estimated char count falls below the budget. // Copilot CLI effectively randomly truncates skills after exceeding the char count budget. // We emulate Copilot CLI's behavior by preserving the required skills and randomly disable the rest of the skills. if (runConfig.requiredSkills) { - disabledSkills = await truncateSkills(runConfig.requiredSkills, DEFAULT_SKILL_CHAR_BUDGET); + disabledSkills = (await truncateSkills(pluginDirnamesList, runConfig.requiredSkills, DEFAULT_SKILL_CHAR_BUDGET)); } } - const noSkills = process.env.NO_SKILLS === "true"; + if (!noSkills) { + const skillsLoaded = skillRefs.filter(s => !disabledSkills?.some(disableSkillRef => disableSkillRef.name === s.name)); + agentMetadata.skillsLoaded = skillsLoaded; + } const disableAzureMcp = process.env.VALLY_RUNNER_DISABLE_AZURE_MCP === "true"; const model = runConfig.model ?? modelOverride ?? "claude-sonnet-4.6"; const session = await client.createSession({ model: model, onPermissionRequest: approveAll, - skillDirectories: noSkills ? [] : [skillDirectory], - disabledSkills: disabledSkills, + skillDirectories: noSkills ? [] : skillDirectories, + disabledSkills: disabledSkills?.map(s => s.name), ...(disableAzureMcp ? {} : { mcpServers: { azure: { @@ -1045,7 +1073,7 @@ export function useAgentRunner(agentRunnerConfig: AgentRunnerConfig) { agentMetadata.tokenUsage = tokenUsage; // Aggregate tool invocation counts and skill-file reads - const { toolCounts, skillFiles } = computeToolAndSkillStats(agentMetadata.events, skillDirectory); + const { toolCounts, skillFiles } = computeToolAndSkillStats(agentMetadata.events, skillDirectories); agentMetadata.toolCounts = toolCounts; agentMetadata.skillFiles = skillFiles; diff --git a/tests/utils/char-budget.ts b/tests/utils/char-budget.ts index 753205726..1add662aa 100644 --- a/tests/utils/char-budget.ts +++ b/tests/utils/char-budget.ts @@ -1,4 +1,4 @@ -import { listSkills, loadSkill } from "./skill-loader.ts"; +import { listSkills, loadSkill, type SkillRef } from "./skill-loader.ts"; export const DEFAULT_SKILL_CHAR_BUDGET = 20000; @@ -7,17 +7,17 @@ export const DEFAULT_SKILL_CHAR_BUDGET = 20000; * @param requiredSkills skills that cannot be truncated. * @returns the skills to disable to emulate truncation. */ -export async function truncateSkills(requiredSkills: string[], charBudget: number): Promise { - const skills = listSkills(); - const invalidSkills = requiredSkills.filter((s) => !skills.includes(s)); +export async function truncateSkills(pluginDirnames: string[], requiredSkills: SkillRef[], charBudget: number): Promise { + const skillRefs = pluginDirnames.map(p => listSkills(p)).flat(); + const invalidSkills = requiredSkills.filter((s) => !skillRefs.some(ref => ref.name === s.name)); if (invalidSkills.length > 0) { throw new Error(`Invalid requiredSkills. ${invalidSkills} do not exist in azure-skills plugin.`); } - const nonRequiredSkills = skills.filter((s) => !requiredSkills.includes(s)); + const nonRequiredSkills = skillRefs.filter((s) => !requiredSkills.some(rs => rs.name === s.name)); let charCount = 0; - for (const skill of requiredSkills) { - const skillObject = await loadSkill(skill); + for (const skillRef of requiredSkills) { + const skillObject = await loadSkill(skillRef); const skillXml = await getFormattedSkillDescription(skillObject.metadata.name, skillObject.metadata.description); // +1 for newline between skills charCount += skillXml.length + 1; @@ -36,8 +36,8 @@ export async function truncateSkills(requiredSkills: string[], charBudget: numbe } for (let i = 0; i < nonRequiredSkills.length; i++) { - const skill = nonRequiredSkills[i]; - const skillObject = await loadSkill(skill); + const skillRef = nonRequiredSkills[i]; + const skillObject = await loadSkill(skillRef); const skillXml = await getFormattedSkillDescription(skillObject.metadata.name, skillObject.metadata.description); if (charCount + skillXml.length + 1 >= charBudget) { // Return a list of skills including and after the current one diff --git a/tests/utils/skill-loader.ts b/tests/utils/skill-loader.ts index c84b2fd2c..680bd3d4d 100644 --- a/tests/utils/skill-loader.ts +++ b/tests/utils/skill-loader.ts @@ -13,31 +13,78 @@ import matter from "gray-matter"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -interface SkillMetadata { +export type SkillMetadata = { + /** + * The directory name containing the plugin files in the shared plugins directory. + */ + pluginDirname: string; name: string; description: string; [key: string]: unknown; +}; + +export type SkillRef = { + /** + * The directory name containing the plugin files in the shared plugins directory. + */ + pluginDirname: string; + name: string; } -export interface LoadedSkill { +export type LoadedSkill = { metadata: SkillMetadata; content: string; + + /** + * Absolute path to the skill's directory. + */ path: string; + + /** + * Absolute path to the skill's SKILL.md file. + */ filePath: string; -} +}; + +export type Plugin = { + /** + * The directory name containing the plugin files in the shared plugins directory. + * + * Plugin directory name can be different from from the plugin's name. + * For example, the directory name of "azure" plugin is "azure-skills". + * Some external marketplaces already depend on it. + * For example, see https://github.com/github/awesome-copilot/blob/30472ecf0fe34cc561df958c08501ecc5ca80ea4/.github/plugin/marketplace.json#L142 + * Given a plugin's directory name, we can easily retrieve its plugin name by reading the plugin.json file. + * Discover a plugin directory name from the plugin name is much harder. + * Therefore we maintain references to plugins by their directory names. + */ + dirname: string; + skills: SkillRef[]; +}; /** * Load a skill by name */ -export async function loadSkill(skillName: string): Promise { - const skillPath = path.join( - global.SKILLS_PATH || path.resolve(__dirname, "../../output/skills"), - skillName - ); +export async function loadSkill(skillRef: SkillRef): Promise { + let skillPath; + if (global.OUTPUT_PATH) { + // global.OUTPUT_PATH is only defined in JEST context + skillPath = path.join( + global.OUTPUT_PATH, + skillRef.pluginDirname, + "skills", + skillRef.name + ); + } else { + skillPath = path.join( + path.resolve(__dirname, `../../output/${skillRef.pluginDirname}/skills`), + skillRef.name + ); + } const skillFile = path.join(skillPath, "SKILL.md"); if (!fs.existsSync(skillFile)) { - throw new Error(`SKILL.md not found for skill: ${skillName} at ${skillFile}`); + throw new Error(`SKILL.md not found for skill: ${skillRef.name} at ${skillFile} in plugin ${skillRef.pluginDirname}`); } const fileContent = fs.readFileSync(skillFile, "utf-8"); @@ -45,7 +92,8 @@ export async function loadSkill(skillName: string): Promise { return { metadata: { - name: (metadata.name as string) || skillName, + pluginDirname: skillRef.pluginDirname, + name: (metadata.name as string) || skillRef.name, description: (metadata.description as string) || "", ...metadata }, @@ -56,10 +104,16 @@ export async function loadSkill(skillName: string): Promise { } /** - * @returns Names of skills in azure plugin. + * @returns SkillRef objects in a given plugin. */ -export function listSkills(): string[] { - const skillsDir = global.SKILLS_PATH || path.resolve(__dirname, "../../output/skills"); +export function listSkills(pluginDirname: string): SkillRef[] { + let skillsDir; + if (global.OUTPUT_PATH) { + // global.OUTPUT_PATH is only defined in JEST context + skillsDir = path.join(global.OUTPUT_PATH, pluginDirname, "skills") + } else { + skillsDir = path.resolve(__dirname, `../../output/${pluginDirname}/skills`); + } const items = fs.readdirSync(skillsDir, { withFileTypes: true }); return items .filter((item) => item.isDirectory()) @@ -67,5 +121,29 @@ export function listSkills(): string[] { const skillMdPath = path.join(skillsDir, item.name, "SKILL.md"); return fs.existsSync(skillMdPath); }) - .map((item) => item.name); + .map((item) => { + return { + pluginDirname: pluginDirname, + name: item.name + } + }); +} + +export function listPlugins(): Plugin[] { + let pluginsDir; + if (global.OUTPUT_PATH) { + // global.OUTPUT_PATH is only defined in JEST context + pluginsDir = global.OUTPUT_PATH + } else { + pluginsDir = path.resolve(__dirname, "../../output/"); + } + const items = fs.readdirSync(pluginsDir, { withFileTypes: true }); + return items + .filter((item) => item.isDirectory()) + .map((item) => { + return { + dirname: item.name, + skills: listSkills(item.name) + } + }); } \ No newline at end of file diff --git a/tests/vally/vally-executor.ts b/tests/vally/vally-executor.ts index d4ab22d3d..e5b0a210c 100644 --- a/tests/vally/vally-executor.ts +++ b/tests/vally/vally-executor.ts @@ -3,9 +3,9 @@ import { computeMetrics } from "@microsoft/vally"; import * as path from "node:path"; import type { AgentMetadata, AgentRunConfig } from "../utils/agent-runner.ts"; import { useAgentRunner, createMarkdownReport } from "../utils/agent-runner.ts"; -import { listSkills } from "../utils/skill-loader.ts"; import { getEarlyTerminateCondition, getFollowUp, getRequiredSkillsCondition, getSkillName, getSystemPrompt, getTakeScreenshotCondition } from "./tag-helpers.ts"; import { normalizeTestName } from "./utils.ts"; +import { listPlugins, type SkillRef } from "../utils/skill-loader.ts"; export class IntegrationTestAgentRunner implements Executor { name = "integration-test-agent-runner"; @@ -34,6 +34,19 @@ export class IntegrationTestAgentRunner implements Executor { const requiredSkills = getRequiredSkillsCondition(tags); const timeout = options.timeout; + // Detect the owning plugin of the required skills and construct SkillRef objects for downstream processing + const plugins = listPlugins(); + const requiredSkillRefs: SkillRef[] = []; + requiredSkills?.forEach(skillName => { + const owningPlugin = plugins.filter(plugin => plugin.skills.some(skillRef => skillRef.name === skillName)).at(0); + if (owningPlugin) { + requiredSkillRefs.push({ + pluginDirname: owningPlugin.dirname, + name: skillName + }); + } + }); + const runConfig: AgentRunConfig = { workspace: workDir, env: { @@ -47,7 +60,7 @@ export class IntegrationTestAgentRunner implements Executor { systemPrompt: systemPrompt, followUpTimeout: timeout, takeScreenshot: takeScreenshot, - requiredSkills: requiredSkills, + requiredSkills: requiredSkillRefs.length > 0 ? requiredSkillRefs : undefined, maxTurns: stimulus.constraints?.max_turns, // Always make our agent runner preserve workspace. // vally will delete the test workspace by default. @@ -85,7 +98,7 @@ export class IntegrationTestAgentRunner implements Executor { completedAt, model: model, executor: this.name, - skillsLoaded: getSkills(), + skillsLoaded: agentMetadata.skillsLoaded.map(ref => ref.name), sessionID: sessionId ?? "unknown", }, metrics: { @@ -236,11 +249,3 @@ function convertToTrajectoryEvents(agentMetadata: AgentMetadata): TrajectoryEven export function registerExecutors(registry: ExecutorRegistry): void { registry.register(new IntegrationTestAgentRunner()); } - -function getSkills(): string[] { - const noSkills = process.env.NO_SKILLS === "true"; - if (noSkills) { - return []; - } - return listSkills(); -}