From 36520e240ab77f4ce97ce191534a92c32234a839 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:11:18 +0300 Subject: [PATCH 001/176] Change pull_request to pull_request_target --- .github/workflows/semantic-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index 26b2dec0..7179ead3 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -3,7 +3,7 @@ name: 🔍 Semantic PR Validation on: - pull_request: + pull_request_target: branches: - main types: @@ -113,4 +113,4 @@ jobs: repo: context.repo.repo, name: 'invalid', }); - } \ No newline at end of file + } From 55020f077694e45ca67d9ff6a940c5e44d286173 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 002/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 852b6b7f..1d912e3d 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From beb01490bffaf32ff5321eb53f91264f535a3ea1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 003/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 98a1aa04..479c7cb5 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From ca313c305ad010157171ee7bfd9af66dc9a5d957 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 004/176] Introduce release workflow --- .github/workflows/create-release.yml | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/create-release.yml diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 00000000..819cd8cf --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,37 @@ +name: 🚀 Create GitHub Release + +on: + workflow_dispatch: + inputs: + version: + description: 'The version to release (e.g., v1.2.0)' + required: true + +jobs: + create-release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up release variables + id: set_vars + run: | + VERSION="${{ github.event.inputs.version }}" + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT + echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + + - name: Validate release notes file + run: | + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + exit 1 + fi + + - name: Create Release with GitHub CLI + run: | + gh release create ${{ steps.set_vars.outputs.tag_name }} \ + --title "${{ steps.set_vars.outputs.tag_name }}" \ + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 39f2d851274d5d302ba9caeaf0a3768a69e13c2c Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 005/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 5e3b68e2d33a6373f56631b15e6b17abc05e2b33 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 006/176] Initial plan From 7c573b0285782f74cafea72d6db1d7b5c145c5b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 007/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From f9a4bb2a434fc2f23857477b38cb7d7be416c674 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 008/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 641c4e768f65e6e348b1897e352bd4f0cbc39bae Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 009/176] Update release notes for v1.3.1 --- docs/release-notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 479c7cb5..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions @@ -165,4 +165,4 @@ hide: * Initial public release * Released to PyPI -* Onboarded to GitHub Pages \ No newline at end of file +* Onboarded to GitHub Pages From 516dbb8cb5dcbbcb1f76372ec9f1236498a10fcf Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 010/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 484993f8291512a108bed94c975fc2bab2647399 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 011/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 3a42a5cc88c1846bc164ea73a3e43a2a7549f4f1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 012/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 0755733cee4f5bf85a6ef9533c5e44caaeb49a0e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 013/176] Initial plan From 5917da7c91f018d0fedbacfe5d889e8651318d53 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 014/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From 635eadc107fdd33d7d22239951eab46eef0f3b66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 015/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 22cc9cb859a54276701237c8a19c5afaafd93f81 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 016/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 5897cdee55590c6a9a34d699541a1c8455fea100 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 017/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 845fcb529a00f3602b50ca71425d0b7c6a2564a2 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 018/176] Introduce release workflow --- .github/workflows/create-release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 61dc03f4..ca613e7a 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,11 +113,8 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 5278b73827523058ab8721b8deb4c2c154398f0f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 019/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index ca613e7a..f5f9c1f0 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -115,6 +115,8 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 3c75e8846bacc12b60921d03996937390481b2f2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 020/176] Initial plan From 326c42954094236bdc2aebbdd3cfddd64bbf31df Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 021/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f5f9c1f0..61dc03f4 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,6 +113,7 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: From aca88241ad1635fc6994aceaa5bf9bea9100fabf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 022/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 42 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 61dc03f4..026a334d 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -29,14 +29,14 @@ jobs: else TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - + cat >> $GITHUB_STEP_SUMMARY << EOF # 🚀 Create Release Workflow - + ## â„šī¸ Workflow Information - **Version:** ${{ github.event.inputs.version }} $TARGET_INFO - + EOF - name: Validate commit SHA (if provided) @@ -46,14 +46,14 @@ jobs: if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then cat >> $GITHUB_STEP_SUMMARY << EOF ## ❌ Error: Invalid Commit SHA - + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - + ### 📝 Troubleshooting - Verify the commit SHA exists in the repository - Ensure you are using the full commit SHA (or at least 7 characters) - Check that the commit is in the current branch history - + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 @@ -92,23 +92,23 @@ jobs: if [ ! -f "$CHANGELOG_FILE" ]; then cat >> $GITHUB_STEP_SUMMARY << EOF ## ❌ Error: Release Notes File Not Found - + The release notes file was not found at the expected location: - + \`\`\` $CHANGELOG_FILE \`\`\` - + ### 📝 What to do: 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` 3. You can use \`changie batch \` to generate the changelog file - + ### 📂 Available changelog files: \`\`\` $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") \`\`\` - + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 @@ -121,14 +121,14 @@ jobs: run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release - + Creating release with the following details: - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - + EOF - + # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ @@ -137,32 +137,32 @@ jobs: cat >> $GITHUB_STEP_SUMMARY << EOF ## ✅ Release Created Successfully! - + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - + ### 📋 Release Details: - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - + EOF else cat >> $GITHUB_STEP_SUMMARY << EOF ## ❌ Error: Failed to Create Release - + The GitHub CLI failed to create the release. This could be due to: - + ### 🔍 Common Issues: - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - Insufficient permissions to create releases - Network connectivity issues - Invalid release notes format - + ### 📝 Next Steps: 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` 2. Verify you have the necessary permissions to create releases 3. Review the workflow run logs for detailed error messages - + EOF echo "Error: Failed to create release" exit 1 From c2ac8ba9ab7ddb4522a93dfa06bce24d52ecce2f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 023/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 2dc9582dab18e56219605a7a035ddf586c2fd171 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 024/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 7b9fc6925fb70c4dd003319f679a79e9864acb9c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 025/176] Initial plan From 31fe14a4447ff77583d2e10137d85932f710927f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 026/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From b5580f2d256bf19fcc8dfe0e99d640550524e3a2 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 29 Jan 2026 11:58:35 +0000 Subject: [PATCH 027/176] merge --- .github/ISSUE_TEMPLATE/4-documentation.yml | 81 + ...st_set_connection_displayName_success.yaml | 2054 +++++++++++++++++ ..._success[privacyLevel-Organizational].yaml | 1899 +++++++++++++++ ...way_virtualNetwork_capacityId_success.yaml | 614 +++++ ...tualNetwork_success[displayName-None].yaml | 828 +++++++ ...cess[inactivityMinutesBeforeSleep-60].yaml | 614 +++++ ...ork_success[numberOfMemberGateways-2].yaml | 614 +++++ ...test_set_sparkpool_success[name-None].yaml | 1008 ++++++++ 8 files changed, 7712 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/4-documentation.yml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_connection_displayName_success.yaml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_connection_metadata_success[privacyLevel-Organizational].yaml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_capacityId_success.yaml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[displayName-None].yaml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[inactivityMinutesBeforeSleep-60].yaml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[numberOfMemberGateways-2].yaml create mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[name-None].yaml diff --git a/.github/ISSUE_TEMPLATE/4-documentation.yml b/.github/ISSUE_TEMPLATE/4-documentation.yml new file mode 100644 index 00000000..0f1057e3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4-documentation.yml @@ -0,0 +1,81 @@ +name: "📝 Documentation Feedback" +description: Provide documentation feedback +title: "[DOCUMENTATION] " +labels: ["documentation"] +body: + - type: markdown + attributes: + value: Thanks for taking the time to provide documentation feedback! Please include as much detail as possible to help us improve our documentation. + + - type: input + id: documentation-location + attributes: + label: URL to documentation + description: Provide a URL to the documentation location. + placeholder: "https://microsoft.github.io/fabric-cli/..." + validations: + required: true + + - type: dropdown + id: feedback-type + attributes: + label: Type of feedback + description: What kind of documentation issue is this? + options: + - Unclear or confusing content + - Missing information + - Incorrect or outdated information + - Typo or grammatical error + - Code example issue + - Broken link + - Suggestion for improvement + - Other + validations: + required: true + + - type: textarea + id: current-content + attributes: + label: Current content + description: Copy the relevant section of documentation that needs improvement (if applicable). + placeholder: "Paste the current text or describe what exists..." + validations: + required: false + + - type: textarea + id: feedback + attributes: + label: Feedback + description: What is the issue or what improvement would you suggest? + placeholder: "Describe what's wrong or what could be better..." + validations: + required: true + + - type: textarea + id: suggested-change + attributes: + label: Suggested change + description: If you have a specific suggestion, please provide it here. + placeholder: "Provide your suggested text, code, or improvement..." + validations: + required: false + + - type: dropdown + id: user-experience + attributes: + label: Experience with fabric-cli + description: This helps us understand our audience better. + options: + - New to fabric-cli + - Some experience with fabric-cli + - Experienced user + validations: + required: false + + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context, screenshots, or related links here. + validations: + required: false \ No newline at end of file diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_connection_displayName_success.yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_connection_displayName_success.yaml new file mode 100644 index 00000000..987a36d6 --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_connection_displayName_success.yaml @@ -0,0 +1,2054 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": []}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '907' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:14:52 GMT + Pragma: + - no-cache + RequestId: + - a556188b-3c60-41f2-891a-95ef8c6a1db4 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/supportedConnectionTypes + response: + body: + string: '{"value": [{"type": "SQL", "creationMethods": [{"name": "Sql", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic", "ServicePrincipal", "WorkspaceIdentity"]}, {"type": "AnalysisServices", + "creationMethods": [{"name": "AnalysisServices", "parameters": [{"name": "server", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "database", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic", "WorkspaceIdentity"]}, {"type": "SharePoint", "creationMethods": + [{"name": "SharePointList", "parameters": [{"name": "sharePointSiteUrl", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous", "OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "ServicePrincipal", "WorkspaceIdentity"]}, {"type": "Web", "creationMethods": + [{"name": "Web", "parameters": [{"name": "url", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous", + "Basic", "OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": true, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "Basic", "ServicePrincipal", "WorkspaceIdentity"]}, {"type": + "OData", "creationMethods": [{"name": "OData", "parameters": [{"name": "url", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous", "Basic", "Key", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": true, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "Basic", "Key"]}, {"type": "MySql", "creationMethods": [{"name": + "MySql", "parameters": [{"name": "server", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "database", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic"]}, {"type": "PostgreSQL", "creationMethods": [{"name": "PostgreSql", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic"]}, {"type": "AzureTables", "creationMethods": [{"name": "AzureTables", + "parameters": [{"name": "account", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "domain", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "OAuth2", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": ["Key", "WorkspaceIdentity"]}, + {"type": "AzureBlobs", "creationMethods": [{"name": "AzureBlobs", "parameters": + [{"name": "account", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "domain", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Anonymous", "Key", "OAuth2", "SharedAccessSignature", + "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "Key", "SharedAccessSignature", "ServicePrincipal", "WorkspaceIdentity"]}, + {"type": "GoogleAnalytics", "creationMethods": [{"name": "GoogleAnalytics", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "Salesforce", "creationMethods": [{"name": "Salesforce", "parameters": + [{"name": "loginServer", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "classInfo", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "AdobeAnalytics", "creationMethods": [{"name": "AdobeAnalytics", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "AzureDataLakeStorage", "creationMethods": [{"name": "AzureDataLakeStorage", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "path", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "OAuth2", "SharedAccessSignature", + "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Key", "SharedAccessSignature", "ServicePrincipal", "WorkspaceIdentity"]}, + {"type": "Exchange", "creationMethods": [{"name": "Exchange", "parameters": + [{"name": "emailAddress", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "appFigures", "creationMethods": [{"name": "appFigures.Tables", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleBigQuery", "creationMethods": [{"name": "GoogleBigQuery.Database", + "parameters": [{"name": "BillingProject", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "UseStorageApi", "dataType": "Boolean", + "required": false, "allowedValues": null}, {"name": "ConnectionTimeout", "dataType": + "Duration", "required": false, "allowedValues": null}, {"name": "CommandTimeout", + "dataType": "Duration", "required": false, "allowedValues": null}, {"name": + "ProjectId", "dataType": "Text", "required": false, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleBigQueryAad", "creationMethods": [{"name": "GoogleBigQueryAad.Database", + "parameters": [{"name": "billingProject", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "Implementation", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "UseStorageApi", "dataType": + "Boolean", "required": false, "allowedValues": null}, {"name": "ConnectionTimeout", + "dataType": "Duration", "required": false, "allowedValues": null}, {"name": + "CommandTimeout", "dataType": "Duration", "required": false, "allowedValues": + null}, {"name": "BYOID_AudienceUri", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "ProjectId", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "PowerBI", "creationMethods": [{"name": "PowerBI.Dataflows", "parameters": + []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cds", "creationMethods": [{"name": "Cds.Entities", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "ReorderColumns", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "UseFormattedValue", "dataType": "Boolean", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DataLake", "creationMethods": [{"name": "DataLake.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "PageSize", "dataType": "Number", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DataWorld", "creationMethods": [{"name": "DataWorld.Dataset", "parameters": + [{"name": "owner", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "id", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "query", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DocumentDB", "creationMethods": [{"name": "DocumentDB.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "collection", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Dynamics365BusinessCentral", "creationMethods": [{"name": + "Dynamics365BusinessCentral.ApiContentsWithOptions", "parameters": [{"name": + "environment", "dataType": "Text", "required": false, "allowedValues": null}, + {"name": "company", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "apiRoute", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "UseReadOnlyReplica", "dataType": "Boolean", "required": false, + "allowedValues": null}, {"name": "AcceptLanguage", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "Timeout", "dataType": "Duration", + "required": false, "allowedValues": null}, {"name": "ODataMaxPageSize", "dataType": + "Number", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Dynamics 365 Business Central (on-premises)", "creationMethods": [{"name": + "Dynamics365BusinessCentralOnPremises.Contents", "parameters": [{"name": "url", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "company", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Dynamics NAV", "creationMethods": [{"name": "DynamicsNav.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "company", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "github", "creationMethods": [{"name": "Github.Tables", "parameters": + [{"name": "RepositoryOwner", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Repository", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureHive", "creationMethods": [{"name": "AzureHiveLLAP.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ApacheHive", "creationMethods": [{"name": "ApacheHiveLLAP.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "thriftTransport", "dataType": "Number", "required": true, + "allowedValues": ["1", "2"]}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Impala", "creationMethods": [{"name": "Impala.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Implementation", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ConnectionTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}, {"name": "CommandTimeout", "dataType": "Duration", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous", "Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDataExplorer", "creationMethods": [{"name": "AzureDataExplorer.Contents", + "parameters": [{"name": "cluster", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "tableOrQuery", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "MaxRows", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "MaxSize", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "NoTruncate", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "AdditionalSetStatements", "dataType": "Text", "required": + false, "allowedValues": null}]}, {"name": "AzureDataExplorer.KqlDatabase", + "parameters": [{"name": "cluster", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "database", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "tableOrQuery", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "MaxRows", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "MaxSize", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "NoTruncate", + "dataType": "Boolean", "required": false, "allowedValues": null}, {"name": + "AdditionalSetStatements", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "LinkedIn", "creationMethods": [{"name": "LinkedIn.SalesNavigator", "parameters": + [{"name": "selectContracts", "dataType": "Text", "required": true, "allowedValues": + ["All Contracts", "Selected Contracts"]}, {"name": "startAt", "dataType": + "Date", "required": false, "allowedValues": null}, {"name": "endAt", "dataType": + "Date", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "mixpanel", "creationMethods": [{"name": "Mixpanel.Tables", "parameters": + []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Netezza", "creationMethods": [{"name": "Netezza.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ConnectionTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}, {"name": "CommandTimeout", "dataType": "Duration", + "required": false, "allowedValues": null}, {"name": "NormalizeDatabaseName", + "dataType": "Boolean", "required": false, "allowedValues": null}, {"name": + "HierarchicalNavigation", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "CreateNavigationProperties", "dataType": "Boolean", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PlanviewEnterprise", "creationMethods": [{"name": "PlanviewEnterprise.Feed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonRedshift", "creationMethods": [{"name": "AmazonRedshift.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ProviderName", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "BatchSize", "dataType": "Number", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Snowflake", "creationMethods": [{"name": "Snowflake.Databases", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "warehouse", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Role", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "CreateNavigationProperties", "dataType": "Boolean", "required": + false, "allowedValues": null}, {"name": "ConnectionTimeout", "dataType": "Number", + "required": false, "allowedValues": null}, {"name": "CommandTimeout", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "Implementation", + "dataType": "Text", "required": false, "allowedValues": [null, "2.0"]}]}], + "supportedCredentialTypes": ["Basic", "OAuth2", "KeyPair"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Spark", "creationMethods": [{"name": "AzureSpark.Tables", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "BatchSize", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "HierarchicalNavigation", "dataType": "Boolean", "required": + false, "allowedValues": null}, {"name": "Implementation", "dataType": "Text", + "required": false, "allowedValues": null}]}, {"name": "ApacheSpark.Tables", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "protocol", "dataType": "Number", "required": true, "allowedValues": + ["0", "2"]}, {"name": "BatchSize", "dataType": "Number", "required": false, + "allowedValues": null}, {"name": "HierarchicalNavigation", "dataType": "Boolean", + "required": false, "allowedValues": null}, {"name": "Implementation", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SparkPost", "creationMethods": [{"name": "SparkPost.NavTable", "parameters": + [{"name": "DaysToAggregate", "dataType": "Number", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SweetIQ", "creationMethods": [{"name": "SweetIQ.Tables", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Troux", "creationMethods": [{"name": "Troux.Feed", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "VSTS", "creationMethods": [{"name": "VSTS.AnalyticsViews", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "project", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Vertica", "creationMethods": [{"name": "Vertica.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Acterys", "creationMethods": [{"name": "Acterys.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ADPAnalytics", "creationMethods": [{"name": "ADPAnalytics.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Anaplan", "creationMethods": [{"name": "Anaplan.Contents", + "parameters": [{"name": "apiUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "authUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Asana", "creationMethods": [{"name": "Asana.Tables", "parameters": + [{"name": "link", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AssembleViews", "creationMethods": [{"name": "AssembleViews.Feed", + "parameters": [{"name": "resourceUrl", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AutodeskConstructionCloud", "creationMethods": [{"name": + "AutodeskConstructionCloud.Feed", "parameters": [{"name": "region", "dataType": + "Text", "required": true, "allowedValues": ["Australia", "Canada", "Europe", + "Germany", "India", "Japan", "UK", "United States"]}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AutomationAnywhere", "creationMethods": [{"name": "AutomationAnywhere.Feed", + "parameters": [{"name": "CRVersion", "dataType": "Text", "required": true, + "allowedValues": ["10.x/11.x", "Automation 360", "11.3.5.1 Or Higher"]}, {"name": + "CRHostName", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AutomyDataAnalytics", "creationMethods": [{"name": "AutomyDataAnalytics.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BI360", "creationMethods": [{"name": "BI360.Contents", "parameters": + [{"name": "Url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BitSightSecurityRatings", "creationMethods": [{"name": "BitSightSecurityRatings.Contents", + "parameters": [{"name": "company_guid", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "affects_rating_findings", "dataType": "Boolean", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Key"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Bloomberg", "creationMethods": [{"name": "Bloomberg.Query", "parameters": + [{"name": "Bloomberg", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BQECore", "creationMethods": [{"name": "BQECore.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BuildingConnected", "creationMethods": [{"name": "BuildingConnected.Contents", + "parameters": [{"name": "rangeStart", "dataType": "DateTimeZone", "required": + false, "allowedValues": null}, {"name": "rangeEnd", "dataType": "DateTimeZone", + "required": false, "allowedValues": null}, {"name": "includeClosed", "dataType": + "Boolean", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "CCHTagetik", "creationMethods": [{"name": "CCHTagetik.Contents2", "parameters": + [{"name": "URL", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "Database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "AW", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Dataset", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "StartDate", "dataType": "DateTime", "required": false, "allowedValues": + null}, {"name": "EndDate", "dataType": "DateTime", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CDataConnectCloud", "creationMethods": [{"name": "CDataConnectCloud.ContentsV2", + "parameters": [{"name": "Query", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Celonis", "creationMethods": [{"name": "Celonis.Navigation", + "parameters": [{"name": "URL", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cherwell", "creationMethods": [{"name": "Cherwell.SavedSearches", + "parameters": [{"name": "API URL", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Client ID", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Locale", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Saved Search URL", "dataType": "Text", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CloudBluePSA", "creationMethods": [{"name": "CloudBluePSA.Feed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "filter", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cognite", "creationMethods": [{"name": "Cognite.Contents", + "parameters": [{"name": "project", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "environment", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CogniteDataSource", "creationMethods": [{"name": "CogniteDataSource.Contents", + "parameters": [{"name": "project", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "organization", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Databricks", "creationMethods": [{"name": "Databricks.Catalogs", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "httpPath", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Catalog", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "QueryTags", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "EnableAutomaticProxyDiscovery", "dataType": "Text", "required": + false, "allowedValues": ["enabled", "disabled"]}, {"name": "Implementation", + "dataType": "Text", "required": false, "allowedValues": [null, "2.0"]}]}], + "supportedCredentialTypes": ["OAuth2", "Key", "Basic", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DatabricksMultiCloud", "creationMethods": [{"name": "DatabricksMultiCloud.Catalogs", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "httpPath", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Catalog", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "QueryTags", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "EnableAutomaticProxyDiscovery", "dataType": "Text", "required": + false, "allowedValues": ["enabled", "disabled"]}, {"name": "Implementation", + "dataType": "Text", "required": false, "allowedValues": [null, "2.0"]}]}], + "supportedCredentialTypes": ["OAuth2", "Key", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DeltaSharing", "creationMethods": [{"name": "DeltaSharing.Contents", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "rowLimitHint", "dataType": "Number", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Dremio", "creationMethods": [{"name": "Dremio.DatabasesV370", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "encryption", "dataType": "Text", "required": true, "allowedValues": + ["Enabled", "Disabled", "Enabled-PEM"]}, {"name": "engine", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "routingTag", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "routingQueue", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DremioCloud", "creationMethods": [{"name": "DremioCloud.DatabasesByServerV370", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "projectId", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "engine", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "routingTag", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "routingQueue", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "encryption", "dataType": "Text", "required": false, "allowedValues": + ["Enabled-PEM"]}]}], "supportedCredentialTypes": ["OAuth2", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DynatraceGrail", "creationMethods": [{"name": "DynatraceGrail.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "QueryInput", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ScanGBParameter", "dataType": "Number", "required": false, + "allowedValues": null}, {"name": "MaxResultParameter", "dataType": "Number", + "required": false, "allowedValues": null}, {"name": "MaxBytesParameter", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "SamplingParameter", + "dataType": "Number", "required": false, "allowedValues": ["10", "100", "1000", + "10000"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "EduFrame", "creationMethods": [{"name": "EduFrame.Contents", + "parameters": [{"name": "domainSlug", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "Key"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "EmigoDataSourceConnector", "creationMethods": [{"name": "Emigo.Contents", + "parameters": [{"name": "DataRestrictionType", "dataType": "Text", "required": + false, "allowedValues": ["Not set", "Days", "Weeks", "Months", "Quarters", + "Years"]}, {"name": "DataRestrictionValue", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "DataRestrictionMode", "dataType": + "Text", "required": false, "allowedValues": ["Default", "Exact"]}, {"name": + "AuthorizationMode", "dataType": "Text", "required": false, "allowedValues": + ["Default", "EmigoObszary", "EmigoHierarchia", "CustomRestrictions"]}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "EntersoftBusinessSuite", "creationMethods": [{"name": "EntersoftBusinessSuite.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "EQuIS", "creationMethods": [{"name": "EQuIS.Contents", "parameters": + [{"name": "baseUri", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "eWayCRM", "creationMethods": [{"name": "eWayCRM.Contents2", + "parameters": [{"name": "IncludeRelations", "dataType": "Boolean", "required": + false, "allowedValues": ["false", "true"]}, {"name": "Query", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "QueryAmount", + "dataType": "Boolean", "required": false, "allowedValues": ["false", "true"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FactSetAnalytics", "creationMethods": [{"name": "FactSetAnalytics.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FactSetRMS", "creationMethods": [{"name": "FactSetRMS.Functions", + "parameters": []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Funnel", "creationMethods": [{"name": "Funnel.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "HexagonSmartApi", "creationMethods": [{"name": "HexagonSmartApi.Feed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "headers", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "odataFeedVersion", "dataType": "Text", "required": false, + "allowedValues": ["2.0", "1.0"]}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "IndustrialAppStore", "creationMethods": [{"name": "IndustrialAppStore.NavigationTable", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "InformationGrid", "creationMethods": [{"name": "InformationGrid.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "inwink", "creationMethods": [{"name": "inwink.ScopeContents", + "parameters": [{"name": "customerId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "scope", "dataType": "Text", "required": + true, "allowedValues": ["Audience", "Event", "Community"]}, {"name": "scopeId", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "JamfPro", "creationMethods": [{"name": "JamfPro.Contents", "parameters": + [{"name": "jamfUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Kognitwin", "creationMethods": [{"name": "Kognitwin.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "kxkdbinsightsenterprise", "creationMethods": [{"name": "kxkdbinsightsenterprise.Contents", + "parameters": [{"name": "HostUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "LEAP", "creationMethods": [{"name": "LEAP.Contents", "parameters": + []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "LinkedInLearning", "creationMethods": [{"name": "LinkedInLearning.Contents", + "parameters": [{"name": "start_date", "dataType": "DateTime", "required": + false, "allowedValues": null}, {"name": "end_date", "dataType": "DateTime", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MicroStrategyDataset", "creationMethods": [{"name": "MicroStrategyDataset.Contents", + "parameters": [{"name": "libraryUrl", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "authMode", "dataType": "Text", "required": + false, "allowedValues": ["Standard", "LDAP"]}, {"name": "limit", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "timeout", "dataType": + "Number", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "OneStream", "creationMethods": [{"name": "OneStream.Navigation", + "parameters": [{"name": "OneStreamURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Paxata", "creationMethods": [{"name": "Paxata.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PlanviewOKR", "creationMethods": [{"name": "PlanviewOKR.Contents", + "parameters": [{"name": "ODataURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PlanviewProjectplace", "creationMethods": [{"name": "PlanviewProjectplace.Contents", + "parameters": [{"name": "ODataURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Profisee", "creationMethods": [{"name": "Profisee.Tables", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "QuickBase", "creationMethods": [{"name": "QuickBase.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Roamler", "creationMethods": [{"name": "Roamler.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Samsara", "creationMethods": [{"name": "Samsara.Records", + "parameters": [{"name": "Region", "dataType": "Text", "required": true, "allowedValues": + ["US", "EU"]}, {"name": "RangeStart", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "RangeEnd", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SDMX", "creationMethods": [{"name": "SDMX.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "Option", "dataType": "Text", "required": true, "allowedValues": + ["Show codes and labels", "Show codes only", "Show labels only"]}, {"name": + "Language", "dataType": "Text", "required": false, "allowedValues": null}]}], + "supportedCredentialTypes": ["Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ShortcutsBI", "creationMethods": [{"name": "ShortcutsBI.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Siteimprove", "creationMethods": [{"name": "Siteimprove.Contents", + "parameters": []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SmartsheetGlobal", "creationMethods": [{"name": "SmartsheetGlobal.Contents", + "parameters": [{"name": "region", "dataType": "Text", "required": true, "allowedValues": + ["US", "EU"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SoftOneBI", "creationMethods": [{"name": "SoftOneBI.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SolarWindsServiceDesk", "creationMethods": [{"name": "SolarWindsServiceDesk.ContentsV113", + "parameters": [{"name": "RangeStart", "dataType": "DateTime", "required": + false, "allowedValues": null}, {"name": "RangeEnd", "dataType": "DateTime", + "required": false, "allowedValues": null}, {"name": "CustomFieldsStr", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Key"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Spigit", "creationMethods": [{"name": "Spigit.Contents", "parameters": [{"name": + "ODataURL", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SumTotal", "creationMethods": [{"name": "SumTotal.ODataFeed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Supermetrics", "creationMethods": [{"name": "Supermetrics.Render", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SurveyMonkey", "creationMethods": [{"name": "SurveyMonkey.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "TeamDesk", "creationMethods": [{"name": "TeamDesk.Database", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Tenforce", "creationMethods": [{"name": "Tenforce.Contents", + "parameters": [{"name": "ApplicationUrl", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "ListId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "DataType", "dataType": "Text", "required": + true, "allowedValues": ["Do not include", "Include"]}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Usercube", "creationMethods": [{"name": "Usercube.Universes", "parameters": + [{"name": "serverUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Vena", "creationMethods": [{"name": "Vena.Contents", "parameters": + [{"name": "source", "dataType": "Text", "required": true, "allowedValues": + ["https://ca3.vena.io", "https://ca4.vena.io", "https://eu1.vena.io", "https://eu2.vena.io", + "https://eu3.vena.io", "https://us1.vena.io", "https://us2.vena.io", "https://us3.vena.io", + "https://us4.vena.io", "https://us5.vena.io"]}, {"name": "modelQuery", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "apiVersion", + "dataType": "Text", "required": false, "allowedValues": ["v1", "v2"]}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "VesselInsight", "creationMethods": [{"name": "VesselInsight.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "WebtrendsAnalytics", "creationMethods": [{"name": "WebtrendsAnalytics.Tables", + "parameters": [{"name": "ProfileId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "Period", "dataType": "Text", "required": + true, "allowedValues": ["Custom Date", "Report Period"]}, {"name": "reportType", + "dataType": "Text", "required": true, "allowedValues": ["Summary", "Trend", + "Individual"]}, {"name": "startDate", "dataType": "Date", "required": false, + "allowedValues": null}, {"name": "endDate", "dataType": "Date", "required": + false, "allowedValues": null}, {"name": "startPeriod", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "endPeriod", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Windsor", "creationMethods": [{"name": "Windsor.Main", "parameters": []}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Witivio", "creationMethods": [{"name": "Witivio.Contents", + "parameters": [{"name": "botId", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Wrike", "creationMethods": [{"name": "Wrike.Contents", "parameters": + []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ZendeskData", "creationMethods": [{"name": "ZendeskData.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ZohoCreator", "creationMethods": [{"name": "ZohoCreator.Contents", + "parameters": [{"name": "creatordomain", "dataType": "Text", "required": true, + "allowedValues": ["zoho.com", "zoho.eu", "zoho.com.cn", "zoho.in", "zoho.com.au"]}, + {"name": "scopname", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "applinkname", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "reportlinkname", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Zucchetti", "creationMethods": [{"name": "Zucchetti.Contents", + "parameters": [{"name": "Url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Environment", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AtScale", "creationMethods": [{"name": "AtScale.Cubes", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ConnectionTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}, {"name": "CommandTimeout", "dataType": "Duration", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureCosmosDBForMongoDBvCore", "creationMethods": [{"name": "AzureCosmosDBForMongoDBvCore.Contents", + "parameters": [{"name": "baseURL", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "collection", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureCostManagement", "creationMethods": [{"name": "AzureCostManagement.Tables", + "parameters": [{"name": "scope", "dataType": "Text", "required": true, "allowedValues": + ["Billing Profile Id", "Enrollment Number", "Manually Input Scope"]}, {"name": + "scopeValue", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "numberOfMonths", "dataType": "Number", "required": true, "allowedValues": + null}, {"name": "startDate", "dataType": "Date", "required": false, "allowedValues": + null}, {"name": "endDate", "dataType": "Date", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDeviceRegistry", "creationMethods": [{"name": "AzureDeviceRegistry.Query", + "parameters": [{"name": "scope", "dataType": "Text", "required": true, "allowedValues": + ["Tenant", "Subscription"]}, {"name": "subscriptions", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "namespaces", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "customAttributes", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "resultTruncated", + "dataType": "Boolean", "required": false, "allowedValues": ["true", "false"]}, + {"name": "pagesize", "dataType": "Number", "required": false, "allowedValues": + ["5", "10", "25", "50", "100", "200", "300", "400", "500", "600", "700", "800", + "900", "1000"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureResourceGraph", "creationMethods": [{"name": "AzureResourceGraph.Query", + "parameters": [{"name": "query", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "scope", "dataType": "Text", "required": false, "allowedValues": + ["Tenant", "Subscription", "Management group"]}, {"name": "subscription", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "managementGroup", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "resultTruncated", + "dataType": "Boolean", "required": false, "allowedValues": ["true", "false"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CommonDataService", "creationMethods": [{"name": "CommonDataService.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "CreateNavigationProperties", "dataType": "Boolean", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CosmosDB", "creationMethods": [{"name": "CosmosDB.Contents", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "NUMBER_OF_RETRIES", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "ENABLE_AVERAGE_FUNCTION_PASSDOWN", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "ENABLE_SORT_PASSDOWN_FOR_MULTIPLE_COLUMNS", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Key", "OAuth2", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CustomerInsights", "creationMethods": [{"name": "CustomerInsights.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricSql", "creationMethods": [{"name": "FabricSql.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Fhir", "creationMethods": [{"name": "Fhir.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "searchQuery", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleSheets", "creationMethods": [{"name": "GoogleSheets.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "IntuneV2", "creationMethods": [{"name": "IntuneV2.Contents", + "parameters": [{"name": "dataWarehouseAsuUri", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "maxHistoryDays", "dataType": "Number", + "required": false, "allowedValues": ["1", "2", "3", "4", "5", "6", "7", "14", + "30"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Lakehouse", "creationMethods": [{"name": "Lakehouse.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MicrosoftAzureDataManagerForEnergy", "creationMethods": [{"name": + "MicrosoftAzureDataManagerForEnergy.Search", "parameters": [{"name": "serviceName", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "dataPartition", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "kind", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "query", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "limit", + "dataType": "Number", "required": false, "allowedValues": null}, {"name": + "returnedFields", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PowerBIDatamarts", "creationMethods": [{"name": "PowerBI.Datamarts", + "parameters": [{"name": "server", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PowerPlatformDataflows", "creationMethods": [{"name": "PowerPlatform.Dataflows", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ProductInsights", "creationMethods": [{"name": "ProductInsights.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Synapse", "creationMethods": [{"name": "Synapse.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Warehouse", "creationMethods": [{"name": "Fabric.Warehouse", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "VivaInsights", "creationMethods": [{"name": "VivaInsights.Data", + "parameters": [{"name": "scopeId", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "jobName", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "jobId", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "SchemaType", "dataType": "Text", "required": false, "allowedValues": + ["Pivoted", "Unpivoted"]}, {"name": "APIType", "dataType": "Text", "required": + false, "allowedValues": ["Aggregated data", "Row-level data"]}, {"name": "TableName", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AdlsGen2CosmosStructuredStream", "creationMethods": [{"name": "AdlsGen2CosmosStructuredStream.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonRdsForOracle", "creationMethods": [{"name": "AmazonRdsForOracle.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonRdsForSqlServer", "creationMethods": [{"name": "AmazonRdsForSqlServer.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonS3", "creationMethods": [{"name": "AmazonS3.Storage", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "roleArn", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPDatasphereAmazonS3", "creationMethods": [{"name": "SAPDatasphereAmazonS3.Actions", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "roleArn", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonS3Compatible", "creationMethods": [{"name": "AmazonS3Compatible.Storage", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AvevaConnect", "creationMethods": [{"name": "AvevaConnect.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureAISearch", "creationMethods": [{"name": "AzureAISearch.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureArtifactFeed", "creationMethods": [{"name": "AzureArtifactFeed.Contents", + "parameters": [{"name": "feedUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureBatch", "creationMethods": [{"name": "AzureBatch.Contents", + "parameters": [{"name": "accountName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "batchUrl", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "poolName", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureCosmosDBForMongoDB", "creationMethods": [{"name": "AzureCosmosDBForMongoDB.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "serverVersion", "dataType": "Text", "required": true, "allowedValues": + ["Above 3.2", "3.2"]}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDatabaseForMySQL", "creationMethods": [{"name": "AzureDatabaseForMySQL.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDatabricksWorkspace", "creationMethods": [{"name": "AzureDatabricksWorkspace.Actions", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureDataFactory", "creationMethods": [{"name": "AzureDataFactory.Actions", + "parameters": [{"name": "subscriptionId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "resourceGroup", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "dataFactoryName", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDataLakeStoreCosmosStructuredStream", "creationMethods": + [{"name": "AzureDataLakeStoreCosmosStructuredStream.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureFiles", "creationMethods": [{"name": "AzureFiles.Contents", + "parameters": [{"name": "shareUrl", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "snapshot", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureFunction", "creationMethods": [{"name": "AzureFunction.Contents", + "parameters": [{"name": "functionAppUrl", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Key", "Anonymous"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureHDInsightCluster", "creationMethods": [{"name": "AzureHDInsightCluster.Actions", + "parameters": [{"name": "hdiUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "entSecPackageEnabled", "dataType": "Boolean", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureHDInsightOnDemandCluster", "creationMethods": [{"name": + "AzureHDInsightOnDemandCluster.Actions", "parameters": [{"name": "subscriptionId", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "resourceGroupName", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureKeyVault", "creationMethods": [{"name": "AzureKeyVault.Actions", + "parameters": [{"name": "accountName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureMachineLearning", "creationMethods": [{"name": "AzureMachineLearning.Contents", + "parameters": [{"name": "subscriptionId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "resourceGroupName", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "workspaceName", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzurePostgreSQL", "creationMethods": [{"name": "AzurePostgreSQL.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "CommandTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureServiceBus", "creationMethods": [{"name": "AzureServiceBus.Contents", + "parameters": [{"name": "hostName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureSqlMI", "creationMethods": [{"name": "AzureSqlMI.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Query", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureSynapseWorkspace", "creationMethods": [{"name": "AzureSynapseWorkspace.Actions", + "parameters": [{"name": "workspaceName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cassandra", "creationMethods": [{"name": "Cassandra.Contents", + "parameters": [{"name": "Host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Port", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ConfluentCloud", "creationMethods": [{"name": "ConfluentCloud.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ConfluentSchemaRegistry", "creationMethods": [{"name": "ConfluentSchemaRegistry.Contents", + "parameters": [{"name": "schemaRegistryUrl", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CopyJob", "creationMethods": [{"name": "CopyJob.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "CustomStreamSource", "creationMethods": [{"name": "CustomStreamSource.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DataBuildToolJob", "creationMethods": [{"name": "DataBuildToolJob.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DataLakeAnalytics", "creationMethods": [{"name": "DataLakeAnalytics.Account", + "parameters": [{"name": "accountName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "subscriptionId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "resourceGroupName", "dataType": "Text", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Dynamics365", "creationMethods": [{"name": "Dynamics365.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DynamicsAX", "creationMethods": [{"name": "DynamicsAX.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DynamicsCrm", "creationMethods": [{"name": "DynamicsCrm.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "EventHub", "creationMethods": [{"name": "EventHub.Contents", "parameters": + [{"name": "endpoint", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "entityPath", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricDataPipelines", "creationMethods": [{"name": "FabricDataPipelines.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricMaterializedLakehouseView", "creationMethods": [{"name": + "FabricMaterializedLakehouseView.Actions", "parameters": []}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricSqlEndpointMetadata", "creationMethods": [{"name": + "FabricSqlEndpointMetadata.Actions", "parameters": []}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FTP", "creationMethods": [{"name": "FTP.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleCloudStorage", "creationMethods": [{"name": "GoogleCloudStorage.Storage", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SAPDatasphereGoogleCloudStorage", "creationMethods": [{"name": + "SAPDatasphereGoogleCloudStorage.Actions", "parameters": [{"name": "url", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "GooglePubSub", "creationMethods": [{"name": "GooglePubSub.Contents", "parameters": + [{"name": "projectId", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GreenplumForPipeline", "creationMethods": [{"name": "GreenplumForPipeline.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "connectionTimeout", "dataType": "Number", "required": false, + "allowedValues": null}, {"name": "commandTimeout", "dataType": "Number", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "HdfsForPipeline", "creationMethods": [{"name": "HdfsForPipeline.Contents", + "parameters": [{"name": "clusterURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "HttpServer", "creationMethods": [{"name": "HttpServer.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "InformixForPipeline", "creationMethods": [{"name": "InformixForPipeline.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "service", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "protocol", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Anonymous", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "IoTHub", "creationMethods": [{"name": "IoTHub.Contents", + "parameters": [{"name": "entityPath", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Kinesis", "creationMethods": [{"name": "Kinesis.Contents", + "parameters": [{"name": "streamName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MariaDBForPipeline", "creationMethods": [{"name": "MariaDBForPipeline.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MicrosoftAccess", "creationMethods": [{"name": "MicrosoftAccess.Contents", + "parameters": [{"name": "filePath", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous", "Basic"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MicrosoftOutlook", "creationMethods": [{"name": "MicrosoftOutlook.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MicrosoftTeams", "creationMethods": [{"name": "MicrosoftTeams.Actions", "parameters": + []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MongoDBAtlasForPipeline", "creationMethods": [{"name": "MongoDBAtlasForPipeline.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "cluster", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MongoDBForPipeline", "creationMethods": [{"name": "MongoDBForPipeline.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MQTT", "creationMethods": [{"name": "MQTT.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Notebook", "creationMethods": [{"name": "Notebook.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "OracleCloudStorage", "creationMethods": [{"name": "OracleCloudStorage.Contents", + "parameters": [{"name": "APIEndpoint", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PowerBIDatasets", "creationMethods": [{"name": "PowerBIDatasets.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Presto", "creationMethods": [{"name": "Presto.Contents", + "parameters": [{"name": "Server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Catalog", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Timezone", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ServerCertificateValidation", "dataType": "Text", "required": + false, "allowedValues": ["Enable", "Disable"]}]}], "supportedCredentialTypes": + ["Anonymous", "Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "RestService", "creationMethods": [{"name": "RestService.Contents", + "parameters": [{"name": "baseUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "audience", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Anonymous", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SalesforceServiceCloud", "creationMethods": [{"name": "SalesforceServiceCloud.Contents", + "parameters": [{"name": "environmentURL", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "apiVersion", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SAPAzureDataLakeStorageGen2", "creationMethods": [{"name": + "SAPAzureDataLakeStorageGen2.Actions", "parameters": [{"name": "url", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "Key", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SAPBWOpenHubApplicationServer", "creationMethods": [{"name": + "SAPBWOpenHubApplicationServer.Contents", "parameters": [{"name": "appServerName", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "systemNumber", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "clientID", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "languageCode", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPBWOpenHubMessageServer", "creationMethods": [{"name": "SAPBWOpenHubMessageServer.Contents", + "parameters": [{"name": "messageServer", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "clientID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "messageServerService", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "systemID", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "logonGroup", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "languageCode", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPTableApplicationServer", "creationMethods": [{"name": "SAPTableApplicationServer.Contents", + "parameters": [{"name": "appServerName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "systemNumber", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "clientID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "languageCode", "dataType": "Text", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPTableMessageServer", "creationMethods": [{"name": "SAPTableMessageServer.Contents", + "parameters": [{"name": "messageServer", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "clientID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "messageServerService", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "systemID", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "logonGroup", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "languageCode", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "ServiceNow", "creationMethods": [{"name": "ServiceNow.Data", "parameters": + [{"name": "instance", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SFTP", "creationMethods": [{"name": "SFTP.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "fingerprint", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Shopify", "creationMethods": [{"name": "Shopify.Database", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ShortcutsExtensibilityTest", "creationMethods": [{"name": + "ShortcutsExtensibilityTest.Contents", "parameters": [{"name": "baseUrl", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "audience", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SolacePubsub", "creationMethods": [{"name": "SolacePubsub.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SparkJobDefinition", "creationMethods": [{"name": "SparkJobDefinition.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SqlAnalyticsEndpoint", "creationMethods": [{"name": "SqlAnalyticsEndpoint.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "UserDataFunctions", "creationMethods": [{"name": "UserDataFunctions.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "WebForPipeline", "creationMethods": [{"name": "WebForPipeline.Contents", + "parameters": [{"name": "baseUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "audience", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Anonymous", "Key", + "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDevOpsSourceControl", "creationMethods": [{"name": "AzureDevOpsSourceControl.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GitHubSourceControl", "creationMethods": [{"name": "GitHubSourceControl.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleAds", "creationMethods": [{"name": "GoogleAds.Contents", + "parameters": [{"name": "googleAdsApiVersion", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "clientCustomerID", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "loginCustomerID", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Microsoft365", "creationMethods": [{"name": "Microsoft365.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "QuickBooksForPipeline", "creationMethods": [{"name": "QuickBooksForPipeline.Contents", + "parameters": [{"name": "endpoint", "dataType": "Text", "required": true, + "allowedValues": ["https://sandbox-quickbooks.api.intuit.com", "https://quickbooks.api.intuit.com"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AriaConnector", "creationMethods": [{"name": "AriaDataConnector.GetCubes", + "parameters": [{"name": "Project ID", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "interval", "dataType": "Text", "required": + false, "allowedValues": ["Last hour", "Last 2 hours", "Last 4 hours", "Last + 12 hours", "Last 24 hours", "Last 2 days", "Last 4 days", "Last week", "Last + 2 weeks", "Last 4 weeks", "Last 8 weeks", "Last 12 weeks", "Last 30 days", + "Last 60 days", "Last 90 days", "Last 180 days"]}, {"name": "granularity", + "dataType": "Text", "required": false, "allowedValues": ["Five seconds", "Ten + seconds", "Five minutes", "One hour", "One day", "One week", "One month"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureEnterprise", "creationMethods": [{"name": "AzureEnterprise.Tables", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CloudScope", "creationMethods": [{"name": "CloudScope.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CloudScopeInstagram", "creationMethods": [{"name": "CloudScopeInstagram.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "comScore", "creationMethods": [{"name": "comScore.NavTable", + "parameters": [{"name": "datacenter", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "client", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "startDate", "dataType": "Date", "required": + false, "allowedValues": null}, {"name": "endDate", "dataType": "Date", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "InfinityConnector", "creationMethods": [{"name": "InfinityConnector.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "JDIConnector", "creationMethods": [{"name": "JDIConnector.Contents", + "parameters": [{"name": "DataUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "KaizalaAttendanceReports", "creationMethods": [{"name": "KaizalaAttendanceReports.Feed", + "parameters": [{"name": "ContentPackName", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "KaizalaReports", "creationMethods": [{"name": "KaizalaReports.Feed", + "parameters": [{"name": "MethodName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "KaizalaSurveyReports", "creationMethods": [{"name": "KaizalaSurveyReports.Feed", + "parameters": [{"name": "ContentPackName", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AdMaD", "creationMethods": [{"name": "AdMaD.Feed", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": ["https://columnstoremt.azurewebsites.net/", + "https://admadmt.azurewebsites.net/", "https://firebirdapi.azure-api.net/", + "https://firebirdapptest.azurewebsites.net/"]}, {"name": "sourceName", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "request", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "myob_ar", "creationMethods": [{"name": "myob_ar.GetCompanyFiles", "parameters": + [{"name": "company", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Office365Mon2", "creationMethods": [{"name": "Office365Mon.Outages.Feed", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Plantronics", "creationMethods": [{"name": "Plantronics.Feed", + "parameters": [{"name": "URL", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Tenant", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "URL1", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "URL2", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Parameters", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ElementsPerPage", "dataType": "Number", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ProductioneerMExt", "creationMethods": [{"name": "ProductioneerMExt.Contents", + "parameters": [{"name": "CompanyName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "endpoint", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "StartDate", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ProjectIntelligence", "creationMethods": [{"name": "ProjectIntelligence.Service", + "parameters": [{"name": "ShareAdvanceWebAddress", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "Dimension", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "DataType", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "QuestionPro", "creationMethods": [{"name": "QuestionPro.Contents", + "parameters": [{"name": "access_id", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ScopevisioPowerBICon", "creationMethods": [{"name": "ScopevisioPowerBICon.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SentryOne", "creationMethods": [{"name": "SentryOne.Tables", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SpotlightCloudReports", "creationMethods": [{"name": "SpotlightCloudReports.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Timelog", "creationMethods": [{"name": "Timelog.Tables", + "parameters": [{"name": "SiteCode", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "ApiID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "ApiPassword", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "URLAccountName", "dataType": + "Text", "required": true, "allowedValues": null}, {"name": "DefaultNumberAccount", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "CurrentMonthOnly", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "UserVoice", "creationMethods": [{"name": "UserVoice.Tables", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "WtsParadigm", "creationMethods": [{"name": "WtsParadigm.GetDefaultData", + "parameters": []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Xero", "creationMethods": [{"name": "Xero.Contents", "parameters": + [{"name": "urlInput", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "countInput", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "company", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "tenantId", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AdminInsights", "creationMethods": [{"name": "AdminInsights.GetAzureBlobContents", + "parameters": [{"name": "_workload", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "_fileType", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_version", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_rangeStart", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "_rangeEnd", "dataType": + "Text", "required": true, "allowedValues": null}, {"name": "_desktopHostContainerUrl", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AutoPremium", "creationMethods": [{"name": "AutoPremium.GetMetricsData", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "isPbiAdmin", "dataType": "Boolean", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CapacityMetricsCES", "creationMethods": [{"name": "CapacityMetricsCES.GetMetricsData", + "parameters": [{"name": "_queryName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "_capacityId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_tenantId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_ago", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_cluster", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_database", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_utcOffset", "dataType": "Number", + "required": false, "allowedValues": null}, {"name": "_releaseType", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "_localTimepoint", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_byPassAdminCheckForTenantAdmin", + "dataType": "Boolean", "required": false, "allowedValues": null}, {"name": + "_shouldMaskUser", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "_targetCesRegion", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "_startDate", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "_endDate", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "_uniqueKey", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "_artifactId", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "_workspaceId", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_operationName", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_operationId", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_user", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_status", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_isOverride", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_aggCuThreshold", + "dataType": "Number", "required": false, "allowedValues": null}, {"name": + "_experience", "dataType": "Text", "required": false, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": true, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Goals", "creationMethods": [{"name": "Goals.GetScorecardData", + "parameters": [{"name": "scorecardId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "top", "dataType": "Number", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MetricsCES", "creationMethods": [{"name": "MetricsCES.GetMetricsData", "parameters": + [{"name": "_capacityId", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_ago", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_hour", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_kustoUri", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MetricsDataConnector", "creationMethods": [{"name": "MetricsDataConnector.GetMetricsData", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "isPbiAdmin", "dataType": "Boolean", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MicrosoftCallQuality", "creationMethods": [{"name": "MicrosoftCallQuality.GenerateTable", + "parameters": [{"name": "tenantId", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "filters", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "UsageMetricsDataConnector", "creationMethods": [{"name": "UsageMetricsDataConnector.GetMetricsData", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "UsageMetricsCES", "creationMethods": [{"name": "UsageMetricsCES.Contents", + "parameters": [{"name": "_tenantId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "_workspaceId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_database", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_ago", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_hour", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_kustoUri", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ElasticSearch", "creationMethods": [{"name": "ElasticSearch.Database", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "keyColumnName", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Looker", "creationMethods": [{"name": "Looker.DataSource", + "parameters": [{"name": "Host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ShowHidden", "dataType": "Boolean", "required": false, "allowedValues": + ["true", "false"]}, {"name": "EnableLogging", "dataType": "Boolean", "required": + false, "allowedValues": ["true", "false"]}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '8567' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:14:53 GMT + Pragma: + - no-cache + RequestId: + - 267cff08-f805-46ca-8200-8131e7a342da + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"description": "Created by fab", "displayName": "fabcli000001", "connectivityType": + "ShareableCloud", "privacyLevel": "None", "connectionDetails": "mock_request_connection_details", + "credentialDetails": "mocked_credential_details"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '586' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId,Location + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '306' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:14:55 GMT + Location: + - https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + Pragma: + - no-cache + RequestId: + - 58a4d8ca-ef12-492e-ab2a-fc4053cba857 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '949' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:14:57 GMT + Pragma: + - no-cache + RequestId: + - 5825bfdd-5dcb-4d37-910f-068177596631 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '306' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:14:59 GMT + Pragma: + - no-cache + RequestId: + - 00fe20d7-b3f0-4b08-9eef-ae9275b120f5 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000002", "connectivityType": "ShareableCloud"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '73' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000002", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:00 GMT + Pragma: + - no-cache + RequestId: + - 20c68a2f-d1d4-437c-a6e0-8dc2cededda2 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000002", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '947' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:02 GMT + Pragma: + - no-cache + RequestId: + - 48e9e961-bc41-43f3-a0f2-b13abcbdc4f9 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000002", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:03 GMT + Pragma: + - no-cache + RequestId: + - 581d5e98-d62f-47fc-9801-a79eda7a1e8c + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000002", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '947' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:05 GMT + Pragma: + - no-cache + RequestId: + - eb7ac956-d49c-4470-baa2-7b758772ab38 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000002", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:05 GMT + Pragma: + - no-cache + RequestId: + - e933655d-5e93-4d0d-a996-4a5885c47911 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000001", "connectivityType": "ShareableCloud"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '73' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '306' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:07 GMT + Pragma: + - no-cache + RequestId: + - 0b9d23c6-75d2-446b-b75c-6f54487bfbb7 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "41a127a8-1da4-40f7-a7e6-23e549a0625d", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '949' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:15:07 GMT + Pragma: + - no-cache + RequestId: + - 5d1f67ef-5691-42bc-8ff1-5201a01f6778 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/connections/41a127a8-1da4-40f7-a7e6-23e549a0625d + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Wed, 21 Jan 2026 12:15:09 GMT + Pragma: + - no-cache + RequestId: + - 23c383e5-7ec6-4b3f-8805-913354a775e0 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_connection_metadata_success[privacyLevel-Organizational].yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_connection_metadata_success[privacyLevel-Organizational].yaml new file mode 100644 index 00000000..c2c47c56 --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_connection_metadata_success[privacyLevel-Organizational].yaml @@ -0,0 +1,1899 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": []}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '860' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:18 GMT + Pragma: + - no-cache + RequestId: + - 11e3fa85-eee6-4905-a742-34c42adc0da9 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/supportedConnectionTypes + response: + body: + string: '{"value": [{"type": "SQL", "creationMethods": [{"name": "Sql", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic", "ServicePrincipal", "WorkspaceIdentity"]}, {"type": "AnalysisServices", + "creationMethods": [{"name": "AnalysisServices", "parameters": [{"name": "server", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "database", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic", "WorkspaceIdentity"]}, {"type": "SharePoint", "creationMethods": + [{"name": "SharePointList", "parameters": [{"name": "sharePointSiteUrl", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous", "OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "ServicePrincipal", "WorkspaceIdentity"]}, {"type": "Web", "creationMethods": + [{"name": "Web", "parameters": [{"name": "url", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous", + "Basic", "OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": true, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "Basic", "ServicePrincipal", "WorkspaceIdentity"]}, {"type": + "OData", "creationMethods": [{"name": "OData", "parameters": [{"name": "url", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous", "Basic", "Key", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": true, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "Basic", "Key"]}, {"type": "MySql", "creationMethods": [{"name": + "MySql", "parameters": [{"name": "server", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "database", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic"]}, {"type": "PostgreSQL", "creationMethods": [{"name": "PostgreSql", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Basic"]}, {"type": "AzureTables", "creationMethods": [{"name": "AzureTables", + "parameters": [{"name": "account", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "domain", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "OAuth2", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": ["Key", "WorkspaceIdentity"]}, + {"type": "AzureBlobs", "creationMethods": [{"name": "AzureBlobs", "parameters": + [{"name": "account", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "domain", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Anonymous", "Key", "OAuth2", "SharedAccessSignature", + "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Anonymous", "Key", "SharedAccessSignature", "ServicePrincipal", "WorkspaceIdentity"]}, + {"type": "GoogleAnalytics", "creationMethods": [{"name": "GoogleAnalytics", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "Salesforce", "creationMethods": [{"name": "Salesforce", "parameters": + [{"name": "loginServer", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "classInfo", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "AdobeAnalytics", "creationMethods": [{"name": "AdobeAnalytics", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "AzureDataLakeStorage", "creationMethods": [{"name": "AzureDataLakeStorage", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "path", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "OAuth2", "SharedAccessSignature", + "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + ["Key", "SharedAccessSignature", "ServicePrincipal", "WorkspaceIdentity"]}, + {"type": "Exchange", "creationMethods": [{"name": "Exchange", "parameters": + [{"name": "emailAddress", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + []}, {"type": "appFigures", "creationMethods": [{"name": "appFigures.Tables", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleBigQuery", "creationMethods": [{"name": "GoogleBigQuery.Database", + "parameters": [{"name": "BillingProject", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "UseStorageApi", "dataType": "Boolean", + "required": false, "allowedValues": null}, {"name": "ConnectionTimeout", "dataType": + "Duration", "required": false, "allowedValues": null}, {"name": "CommandTimeout", + "dataType": "Duration", "required": false, "allowedValues": null}, {"name": + "ProjectId", "dataType": "Text", "required": false, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleBigQueryAad", "creationMethods": [{"name": "GoogleBigQueryAad.Database", + "parameters": [{"name": "billingProject", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "Implementation", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "UseStorageApi", "dataType": + "Boolean", "required": false, "allowedValues": null}, {"name": "ConnectionTimeout", + "dataType": "Duration", "required": false, "allowedValues": null}, {"name": + "CommandTimeout", "dataType": "Duration", "required": false, "allowedValues": + null}, {"name": "BYOID_AudienceUri", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "ProjectId", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "PowerBI", "creationMethods": [{"name": "PowerBI.Dataflows", "parameters": + []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cds", "creationMethods": [{"name": "Cds.Entities", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "ReorderColumns", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "UseFormattedValue", "dataType": "Boolean", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DataLake", "creationMethods": [{"name": "DataLake.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "PageSize", "dataType": "Number", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DataWorld", "creationMethods": [{"name": "DataWorld.Dataset", "parameters": + [{"name": "owner", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "id", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "query", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DocumentDB", "creationMethods": [{"name": "DocumentDB.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "collection", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Dynamics365BusinessCentral", "creationMethods": [{"name": + "Dynamics365BusinessCentral.ApiContentsWithOptions", "parameters": [{"name": + "environment", "dataType": "Text", "required": false, "allowedValues": null}, + {"name": "company", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "apiRoute", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "UseReadOnlyReplica", "dataType": "Boolean", "required": false, + "allowedValues": null}, {"name": "AcceptLanguage", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "Timeout", "dataType": "Duration", + "required": false, "allowedValues": null}, {"name": "ODataMaxPageSize", "dataType": + "Number", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Dynamics 365 Business Central (on-premises)", "creationMethods": [{"name": + "Dynamics365BusinessCentralOnPremises.Contents", "parameters": [{"name": "url", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "company", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Dynamics NAV", "creationMethods": [{"name": "DynamicsNav.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "company", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "github", "creationMethods": [{"name": "Github.Tables", "parameters": + [{"name": "RepositoryOwner", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Repository", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureHive", "creationMethods": [{"name": "AzureHiveLLAP.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ApacheHive", "creationMethods": [{"name": "ApacheHiveLLAP.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "thriftTransport", "dataType": "Number", "required": true, + "allowedValues": ["1", "2"]}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Impala", "creationMethods": [{"name": "Impala.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Implementation", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ConnectionTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}, {"name": "CommandTimeout", "dataType": "Duration", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous", "Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDataExplorer", "creationMethods": [{"name": "AzureDataExplorer.Contents", + "parameters": [{"name": "cluster", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "tableOrQuery", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "MaxRows", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "MaxSize", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "NoTruncate", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "AdditionalSetStatements", "dataType": "Text", "required": + false, "allowedValues": null}]}, {"name": "AzureDataExplorer.KqlDatabase", + "parameters": [{"name": "cluster", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "database", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "tableOrQuery", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "MaxRows", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "MaxSize", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "NoTruncate", + "dataType": "Boolean", "required": false, "allowedValues": null}, {"name": + "AdditionalSetStatements", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "LinkedIn", "creationMethods": [{"name": "LinkedIn.SalesNavigator", "parameters": + [{"name": "selectContracts", "dataType": "Text", "required": true, "allowedValues": + ["All Contracts", "Selected Contracts"]}, {"name": "startAt", "dataType": + "Date", "required": false, "allowedValues": null}, {"name": "endAt", "dataType": + "Date", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "mixpanel", "creationMethods": [{"name": "Mixpanel.Tables", "parameters": + []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Netezza", "creationMethods": [{"name": "Netezza.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ConnectionTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}, {"name": "CommandTimeout", "dataType": "Duration", + "required": false, "allowedValues": null}, {"name": "NormalizeDatabaseName", + "dataType": "Boolean", "required": false, "allowedValues": null}, {"name": + "HierarchicalNavigation", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "CreateNavigationProperties", "dataType": "Boolean", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PlanviewEnterprise", "creationMethods": [{"name": "PlanviewEnterprise.Feed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonRedshift", "creationMethods": [{"name": "AmazonRedshift.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ProviderName", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "BatchSize", "dataType": "Number", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Snowflake", "creationMethods": [{"name": "Snowflake.Databases", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "warehouse", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Role", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "CreateNavigationProperties", "dataType": "Boolean", "required": + false, "allowedValues": null}, {"name": "ConnectionTimeout", "dataType": "Number", + "required": false, "allowedValues": null}, {"name": "CommandTimeout", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "Implementation", + "dataType": "Text", "required": false, "allowedValues": [null, "2.0"]}]}], + "supportedCredentialTypes": ["Basic", "OAuth2", "KeyPair"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Spark", "creationMethods": [{"name": "AzureSpark.Tables", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "BatchSize", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "HierarchicalNavigation", "dataType": "Boolean", "required": + false, "allowedValues": null}, {"name": "Implementation", "dataType": "Text", + "required": false, "allowedValues": null}]}, {"name": "ApacheSpark.Tables", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "protocol", "dataType": "Number", "required": true, "allowedValues": + ["0", "2"]}, {"name": "BatchSize", "dataType": "Number", "required": false, + "allowedValues": null}, {"name": "HierarchicalNavigation", "dataType": "Boolean", + "required": false, "allowedValues": null}, {"name": "Implementation", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SparkPost", "creationMethods": [{"name": "SparkPost.NavTable", "parameters": + [{"name": "DaysToAggregate", "dataType": "Number", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SweetIQ", "creationMethods": [{"name": "SweetIQ.Tables", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Troux", "creationMethods": [{"name": "Troux.Feed", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "VSTS", "creationMethods": [{"name": "VSTS.AnalyticsViews", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "project", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Vertica", "creationMethods": [{"name": "Vertica.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Acterys", "creationMethods": [{"name": "Acterys.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ADPAnalytics", "creationMethods": [{"name": "ADPAnalytics.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Anaplan", "creationMethods": [{"name": "Anaplan.Contents", + "parameters": [{"name": "apiUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "authUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Asana", "creationMethods": [{"name": "Asana.Tables", "parameters": + [{"name": "link", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AssembleViews", "creationMethods": [{"name": "AssembleViews.Feed", + "parameters": [{"name": "resourceUrl", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AutodeskConstructionCloud", "creationMethods": [{"name": + "AutodeskConstructionCloud.Feed", "parameters": [{"name": "region", "dataType": + "Text", "required": true, "allowedValues": ["Australia", "Canada", "Europe", + "Germany", "India", "Japan", "UK", "United States"]}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AutomationAnywhere", "creationMethods": [{"name": "AutomationAnywhere.Feed", + "parameters": [{"name": "CRVersion", "dataType": "Text", "required": true, + "allowedValues": ["10.x/11.x", "Automation 360", "11.3.5.1 Or Higher"]}, {"name": + "CRHostName", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AutomyDataAnalytics", "creationMethods": [{"name": "AutomyDataAnalytics.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BI360", "creationMethods": [{"name": "BI360.Contents", "parameters": + [{"name": "Url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BitSightSecurityRatings", "creationMethods": [{"name": "BitSightSecurityRatings.Contents", + "parameters": [{"name": "company_guid", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "affects_rating_findings", "dataType": "Boolean", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Key"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Bloomberg", "creationMethods": [{"name": "Bloomberg.Query", "parameters": + [{"name": "Bloomberg", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BQECore", "creationMethods": [{"name": "BQECore.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "BuildingConnected", "creationMethods": [{"name": "BuildingConnected.Contents", + "parameters": [{"name": "rangeStart", "dataType": "DateTimeZone", "required": + false, "allowedValues": null}, {"name": "rangeEnd", "dataType": "DateTimeZone", + "required": false, "allowedValues": null}, {"name": "includeClosed", "dataType": + "Boolean", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "CCHTagetik", "creationMethods": [{"name": "CCHTagetik.Contents2", "parameters": + [{"name": "URL", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "Database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "AW", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Dataset", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "StartDate", "dataType": "DateTime", "required": false, "allowedValues": + null}, {"name": "EndDate", "dataType": "DateTime", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CDataConnectCloud", "creationMethods": [{"name": "CDataConnectCloud.ContentsV2", + "parameters": [{"name": "Query", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Celonis", "creationMethods": [{"name": "Celonis.Navigation", + "parameters": [{"name": "URL", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cherwell", "creationMethods": [{"name": "Cherwell.SavedSearches", + "parameters": [{"name": "API URL", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Client ID", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Locale", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Saved Search URL", "dataType": "Text", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CloudBluePSA", "creationMethods": [{"name": "CloudBluePSA.Feed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "filter", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cognite", "creationMethods": [{"name": "Cognite.Contents", + "parameters": [{"name": "project", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "environment", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CogniteDataSource", "creationMethods": [{"name": "CogniteDataSource.Contents", + "parameters": [{"name": "project", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "organization", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Databricks", "creationMethods": [{"name": "Databricks.Catalogs", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "httpPath", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Catalog", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "QueryTags", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "EnableAutomaticProxyDiscovery", "dataType": "Text", "required": + false, "allowedValues": ["enabled", "disabled"]}, {"name": "Implementation", + "dataType": "Text", "required": false, "allowedValues": [null, "2.0"]}]}], + "supportedCredentialTypes": ["OAuth2", "Key", "Basic", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DatabricksMultiCloud", "creationMethods": [{"name": "DatabricksMultiCloud.Catalogs", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "httpPath", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Catalog", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "QueryTags", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "EnableAutomaticProxyDiscovery", "dataType": "Text", "required": + false, "allowedValues": ["enabled", "disabled"]}, {"name": "Implementation", + "dataType": "Text", "required": false, "allowedValues": [null, "2.0"]}]}], + "supportedCredentialTypes": ["OAuth2", "Key", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DeltaSharing", "creationMethods": [{"name": "DeltaSharing.Contents", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "rowLimitHint", "dataType": "Number", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Dremio", "creationMethods": [{"name": "Dremio.DatabasesV370", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "encryption", "dataType": "Text", "required": true, "allowedValues": + ["Enabled", "Disabled", "Enabled-PEM"]}, {"name": "engine", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "routingTag", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "routingQueue", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DremioCloud", "creationMethods": [{"name": "DremioCloud.DatabasesByServerV370", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "projectId", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "engine", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "routingTag", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "routingQueue", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "encryption", "dataType": "Text", "required": false, "allowedValues": + ["Enabled-PEM"]}]}], "supportedCredentialTypes": ["OAuth2", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DynatraceGrail", "creationMethods": [{"name": "DynatraceGrail.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "QueryInput", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ScanGBParameter", "dataType": "Number", "required": false, + "allowedValues": null}, {"name": "MaxResultParameter", "dataType": "Number", + "required": false, "allowedValues": null}, {"name": "MaxBytesParameter", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "SamplingParameter", + "dataType": "Number", "required": false, "allowedValues": ["10", "100", "1000", + "10000"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "EduFrame", "creationMethods": [{"name": "EduFrame.Contents", + "parameters": [{"name": "domainSlug", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "Key"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "EmigoDataSourceConnector", "creationMethods": [{"name": "Emigo.Contents", + "parameters": [{"name": "DataRestrictionType", "dataType": "Text", "required": + false, "allowedValues": ["Not set", "Days", "Weeks", "Months", "Quarters", + "Years"]}, {"name": "DataRestrictionValue", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "DataRestrictionMode", "dataType": + "Text", "required": false, "allowedValues": ["Default", "Exact"]}, {"name": + "AuthorizationMode", "dataType": "Text", "required": false, "allowedValues": + ["Default", "EmigoObszary", "EmigoHierarchia", "CustomRestrictions"]}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "EntersoftBusinessSuite", "creationMethods": [{"name": "EntersoftBusinessSuite.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "EQuIS", "creationMethods": [{"name": "EQuIS.Contents", "parameters": + [{"name": "baseUri", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "eWayCRM", "creationMethods": [{"name": "eWayCRM.Contents2", + "parameters": [{"name": "IncludeRelations", "dataType": "Boolean", "required": + false, "allowedValues": ["false", "true"]}, {"name": "Query", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "QueryAmount", + "dataType": "Boolean", "required": false, "allowedValues": ["false", "true"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FactSetAnalytics", "creationMethods": [{"name": "FactSetAnalytics.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FactSetRMS", "creationMethods": [{"name": "FactSetRMS.Functions", + "parameters": []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Funnel", "creationMethods": [{"name": "Funnel.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "HexagonSmartApi", "creationMethods": [{"name": "HexagonSmartApi.Feed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "headers", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "odataFeedVersion", "dataType": "Text", "required": false, + "allowedValues": ["2.0", "1.0"]}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "IndustrialAppStore", "creationMethods": [{"name": "IndustrialAppStore.NavigationTable", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "InformationGrid", "creationMethods": [{"name": "InformationGrid.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "inwink", "creationMethods": [{"name": "inwink.ScopeContents", + "parameters": [{"name": "customerId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "scope", "dataType": "Text", "required": + true, "allowedValues": ["Audience", "Event", "Community"]}, {"name": "scopeId", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "JamfPro", "creationMethods": [{"name": "JamfPro.Contents", "parameters": + [{"name": "jamfUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Kognitwin", "creationMethods": [{"name": "Kognitwin.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "kxkdbinsightsenterprise", "creationMethods": [{"name": "kxkdbinsightsenterprise.Contents", + "parameters": [{"name": "HostUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "LEAP", "creationMethods": [{"name": "LEAP.Contents", "parameters": + []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "LinkedInLearning", "creationMethods": [{"name": "LinkedInLearning.Contents", + "parameters": [{"name": "start_date", "dataType": "DateTime", "required": + false, "allowedValues": null}, {"name": "end_date", "dataType": "DateTime", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MicroStrategyDataset", "creationMethods": [{"name": "MicroStrategyDataset.Contents", + "parameters": [{"name": "libraryUrl", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "authMode", "dataType": "Text", "required": + false, "allowedValues": ["Standard", "LDAP"]}, {"name": "limit", "dataType": + "Number", "required": false, "allowedValues": null}, {"name": "timeout", "dataType": + "Number", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "OneStream", "creationMethods": [{"name": "OneStream.Navigation", + "parameters": [{"name": "OneStreamURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Paxata", "creationMethods": [{"name": "Paxata.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PlanviewOKR", "creationMethods": [{"name": "PlanviewOKR.Contents", + "parameters": [{"name": "ODataURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PlanviewProjectplace", "creationMethods": [{"name": "PlanviewProjectplace.Contents", + "parameters": [{"name": "ODataURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Profisee", "creationMethods": [{"name": "Profisee.Tables", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "QuickBase", "creationMethods": [{"name": "QuickBase.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Roamler", "creationMethods": [{"name": "Roamler.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Samsara", "creationMethods": [{"name": "Samsara.Records", + "parameters": [{"name": "Region", "dataType": "Text", "required": true, "allowedValues": + ["US", "EU"]}, {"name": "RangeStart", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "RangeEnd", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SDMX", "creationMethods": [{"name": "SDMX.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "Option", "dataType": "Text", "required": true, "allowedValues": + ["Show codes and labels", "Show codes only", "Show labels only"]}, {"name": + "Language", "dataType": "Text", "required": false, "allowedValues": null}]}], + "supportedCredentialTypes": ["Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ShortcutsBI", "creationMethods": [{"name": "ShortcutsBI.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Siteimprove", "creationMethods": [{"name": "Siteimprove.Contents", + "parameters": []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SmartsheetGlobal", "creationMethods": [{"name": "SmartsheetGlobal.Contents", + "parameters": [{"name": "region", "dataType": "Text", "required": true, "allowedValues": + ["US", "EU"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SoftOneBI", "creationMethods": [{"name": "SoftOneBI.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SolarWindsServiceDesk", "creationMethods": [{"name": "SolarWindsServiceDesk.ContentsV113", + "parameters": [{"name": "RangeStart", "dataType": "DateTime", "required": + false, "allowedValues": null}, {"name": "RangeEnd", "dataType": "DateTime", + "required": false, "allowedValues": null}, {"name": "CustomFieldsStr", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Key"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Spigit", "creationMethods": [{"name": "Spigit.Contents", "parameters": [{"name": + "ODataURL", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SumTotal", "creationMethods": [{"name": "SumTotal.ODataFeed", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Supermetrics", "creationMethods": [{"name": "Supermetrics.Render", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SurveyMonkey", "creationMethods": [{"name": "SurveyMonkey.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "TeamDesk", "creationMethods": [{"name": "TeamDesk.Database", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Tenforce", "creationMethods": [{"name": "Tenforce.Contents", + "parameters": [{"name": "ApplicationUrl", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "ListId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "DataType", "dataType": "Text", "required": + true, "allowedValues": ["Do not include", "Include"]}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Usercube", "creationMethods": [{"name": "Usercube.Universes", "parameters": + [{"name": "serverUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Vena", "creationMethods": [{"name": "Vena.Contents", "parameters": + [{"name": "source", "dataType": "Text", "required": true, "allowedValues": + ["https://ca3.vena.io", "https://ca4.vena.io", "https://eu1.vena.io", "https://eu2.vena.io", + "https://eu3.vena.io", "https://us1.vena.io", "https://us2.vena.io", "https://us3.vena.io", + "https://us4.vena.io", "https://us5.vena.io"]}, {"name": "modelQuery", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "apiVersion", + "dataType": "Text", "required": false, "allowedValues": ["v1", "v2"]}]}], + "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "VesselInsight", "creationMethods": [{"name": "VesselInsight.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "WebtrendsAnalytics", "creationMethods": [{"name": "WebtrendsAnalytics.Tables", + "parameters": [{"name": "ProfileId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "Period", "dataType": "Text", "required": + true, "allowedValues": ["Custom Date", "Report Period"]}, {"name": "reportType", + "dataType": "Text", "required": true, "allowedValues": ["Summary", "Trend", + "Individual"]}, {"name": "startDate", "dataType": "Date", "required": false, + "allowedValues": null}, {"name": "endDate", "dataType": "Date", "required": + false, "allowedValues": null}, {"name": "startPeriod", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "endPeriod", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "Windsor", "creationMethods": [{"name": "Windsor.Main", "parameters": []}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Witivio", "creationMethods": [{"name": "Witivio.Contents", + "parameters": [{"name": "botId", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Wrike", "creationMethods": [{"name": "Wrike.Contents", "parameters": + []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ZendeskData", "creationMethods": [{"name": "ZendeskData.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ZohoCreator", "creationMethods": [{"name": "ZohoCreator.Contents", + "parameters": [{"name": "creatordomain", "dataType": "Text", "required": true, + "allowedValues": ["zoho.com", "zoho.eu", "zoho.com.cn", "zoho.in", "zoho.com.au"]}, + {"name": "scopname", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "applinkname", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "reportlinkname", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Zucchetti", "creationMethods": [{"name": "Zucchetti.Contents", + "parameters": [{"name": "Url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Environment", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AtScale", "creationMethods": [{"name": "AtScale.Cubes", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ConnectionTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}, {"name": "CommandTimeout", "dataType": "Duration", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureCosmosDBForMongoDBvCore", "creationMethods": [{"name": "AzureCosmosDBForMongoDBvCore.Contents", + "parameters": [{"name": "baseURL", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "collection", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureCostManagement", "creationMethods": [{"name": "AzureCostManagement.Tables", + "parameters": [{"name": "scope", "dataType": "Text", "required": true, "allowedValues": + ["Billing Profile Id", "Enrollment Number", "Manually Input Scope"]}, {"name": + "scopeValue", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "numberOfMonths", "dataType": "Number", "required": true, "allowedValues": + null}, {"name": "startDate", "dataType": "Date", "required": false, "allowedValues": + null}, {"name": "endDate", "dataType": "Date", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDeviceRegistry", "creationMethods": [{"name": "AzureDeviceRegistry.Query", + "parameters": [{"name": "scope", "dataType": "Text", "required": true, "allowedValues": + ["Tenant", "Subscription"]}, {"name": "subscriptions", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "namespaces", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "customAttributes", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "resultTruncated", + "dataType": "Boolean", "required": false, "allowedValues": ["true", "false"]}, + {"name": "pagesize", "dataType": "Number", "required": false, "allowedValues": + ["5", "10", "25", "50", "100", "200", "300", "400", "500", "600", "700", "800", + "900", "1000"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureResourceGraph", "creationMethods": [{"name": "AzureResourceGraph.Query", + "parameters": [{"name": "query", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "scope", "dataType": "Text", "required": false, "allowedValues": + ["Tenant", "Subscription", "Management group"]}, {"name": "subscription", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "managementGroup", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "resultTruncated", + "dataType": "Boolean", "required": false, "allowedValues": ["true", "false"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CommonDataService", "creationMethods": [{"name": "CommonDataService.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "CreateNavigationProperties", "dataType": "Boolean", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CosmosDB", "creationMethods": [{"name": "CosmosDB.Contents", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "NUMBER_OF_RETRIES", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "ENABLE_AVERAGE_FUNCTION_PASSDOWN", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "ENABLE_SORT_PASSDOWN_FOR_MULTIPLE_COLUMNS", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Key", "OAuth2", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CustomerInsights", "creationMethods": [{"name": "CustomerInsights.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricSql", "creationMethods": [{"name": "FabricSql.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Fhir", "creationMethods": [{"name": "Fhir.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}, + {"name": "searchQuery", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleSheets", "creationMethods": [{"name": "GoogleSheets.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "IntuneV2", "creationMethods": [{"name": "IntuneV2.Contents", + "parameters": [{"name": "dataWarehouseAsuUri", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "maxHistoryDays", "dataType": "Number", + "required": false, "allowedValues": ["1", "2", "3", "4", "5", "6", "7", "14", + "30"]}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Lakehouse", "creationMethods": [{"name": "Lakehouse.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MicrosoftAzureDataManagerForEnergy", "creationMethods": [{"name": + "MicrosoftAzureDataManagerForEnergy.Search", "parameters": [{"name": "serviceName", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "dataPartition", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "kind", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "query", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "limit", + "dataType": "Number", "required": false, "allowedValues": null}, {"name": + "returnedFields", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PowerBIDatamarts", "creationMethods": [{"name": "PowerBI.Datamarts", + "parameters": [{"name": "server", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PowerPlatformDataflows", "creationMethods": [{"name": "PowerPlatform.Dataflows", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ProductInsights", "creationMethods": [{"name": "ProductInsights.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Synapse", "creationMethods": [{"name": "Synapse.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Warehouse", "creationMethods": [{"name": "Fabric.Warehouse", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "VivaInsights", "creationMethods": [{"name": "VivaInsights.Data", + "parameters": [{"name": "scopeId", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "jobName", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "jobId", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "SchemaType", "dataType": "Text", "required": false, "allowedValues": + ["Pivoted", "Unpivoted"]}, {"name": "APIType", "dataType": "Text", "required": + false, "allowedValues": ["Aggregated data", "Row-level data"]}, {"name": "TableName", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AdlsGen2CosmosStructuredStream", "creationMethods": [{"name": "AdlsGen2CosmosStructuredStream.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonRdsForOracle", "creationMethods": [{"name": "AmazonRdsForOracle.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonRdsForSqlServer", "creationMethods": [{"name": "AmazonRdsForSqlServer.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonS3", "creationMethods": [{"name": "AmazonS3.Storage", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "roleArn", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPDatasphereAmazonS3", "creationMethods": [{"name": "SAPDatasphereAmazonS3.Actions", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "roleArn", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AmazonS3Compatible", "creationMethods": [{"name": "AmazonS3Compatible.Storage", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AvevaConnect", "creationMethods": [{"name": "AvevaConnect.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureAISearch", "creationMethods": [{"name": "AzureAISearch.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureArtifactFeed", "creationMethods": [{"name": "AzureArtifactFeed.Contents", + "parameters": [{"name": "feedUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureBatch", "creationMethods": [{"name": "AzureBatch.Contents", + "parameters": [{"name": "accountName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "batchUrl", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "poolName", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureCosmosDBForMongoDB", "creationMethods": [{"name": "AzureCosmosDBForMongoDB.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "serverVersion", "dataType": "Text", "required": true, "allowedValues": + ["Above 3.2", "3.2"]}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDatabaseForMySQL", "creationMethods": [{"name": "AzureDatabaseForMySQL.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDatabricksWorkspace", "creationMethods": [{"name": "AzureDatabricksWorkspace.Actions", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key", "OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureDataFactory", "creationMethods": [{"name": "AzureDataFactory.Actions", + "parameters": [{"name": "subscriptionId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "resourceGroup", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "dataFactoryName", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDataLakeStoreCosmosStructuredStream", "creationMethods": + [{"name": "AzureDataLakeStoreCosmosStructuredStream.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureFiles", "creationMethods": [{"name": "AzureFiles.Contents", + "parameters": [{"name": "shareUrl", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "snapshot", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureFunction", "creationMethods": [{"name": "AzureFunction.Contents", + "parameters": [{"name": "functionAppUrl", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Key", "Anonymous"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureHDInsightCluster", "creationMethods": [{"name": "AzureHDInsightCluster.Actions", + "parameters": [{"name": "hdiUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "entSecPackageEnabled", "dataType": "Boolean", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureHDInsightOnDemandCluster", "creationMethods": [{"name": + "AzureHDInsightOnDemandCluster.Actions", "parameters": [{"name": "subscriptionId", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "resourceGroupName", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureKeyVault", "creationMethods": [{"name": "AzureKeyVault.Actions", + "parameters": [{"name": "accountName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureMachineLearning", "creationMethods": [{"name": "AzureMachineLearning.Contents", + "parameters": [{"name": "subscriptionId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "resourceGroupName", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "workspaceName", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzurePostgreSQL", "creationMethods": [{"name": "AzurePostgreSQL.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "CommandTimeout", "dataType": "Duration", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic", "OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureServiceBus", "creationMethods": [{"name": "AzureServiceBus.Contents", + "parameters": [{"name": "hostName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureSqlMI", "creationMethods": [{"name": "AzureSqlMI.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Query", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AzureSynapseWorkspace", "creationMethods": [{"name": "AzureSynapseWorkspace.Actions", + "parameters": [{"name": "workspaceName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Cassandra", "creationMethods": [{"name": "Cassandra.Contents", + "parameters": [{"name": "Host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Port", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ConfluentCloud", "creationMethods": [{"name": "ConfluentCloud.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ConfluentSchemaRegistry", "creationMethods": [{"name": "ConfluentSchemaRegistry.Contents", + "parameters": [{"name": "schemaRegistryUrl", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CopyJob", "creationMethods": [{"name": "CopyJob.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "CustomStreamSource", "creationMethods": [{"name": "CustomStreamSource.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "DataBuildToolJob", "creationMethods": [{"name": "DataBuildToolJob.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DataLakeAnalytics", "creationMethods": [{"name": "DataLakeAnalytics.Account", + "parameters": [{"name": "accountName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "subscriptionId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "resourceGroupName", "dataType": "Text", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Dynamics365", "creationMethods": [{"name": "Dynamics365.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DynamicsAX", "creationMethods": [{"name": "DynamicsAX.Contents", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "DynamicsCrm", "creationMethods": [{"name": "DynamicsCrm.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", "WorkspaceIdentity"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "EventHub", "creationMethods": [{"name": "EventHub.Contents", "parameters": + [{"name": "endpoint", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "entityPath", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricDataPipelines", "creationMethods": [{"name": "FabricDataPipelines.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricMaterializedLakehouseView", "creationMethods": [{"name": + "FabricMaterializedLakehouseView.Actions", "parameters": []}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FabricSqlEndpointMetadata", "creationMethods": [{"name": + "FabricSqlEndpointMetadata.Actions", "parameters": []}], "supportedCredentialTypes": + ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "FTP", "creationMethods": [{"name": "FTP.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleCloudStorage", "creationMethods": [{"name": "GoogleCloudStorage.Storage", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SAPDatasphereGoogleCloudStorage", "creationMethods": [{"name": + "SAPDatasphereGoogleCloudStorage.Actions", "parameters": [{"name": "url", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "GooglePubSub", "creationMethods": [{"name": "GooglePubSub.Contents", "parameters": + [{"name": "projectId", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GreenplumForPipeline", "creationMethods": [{"name": "GreenplumForPipeline.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "connectionTimeout", "dataType": "Number", "required": false, + "allowedValues": null}, {"name": "commandTimeout", "dataType": "Number", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "HdfsForPipeline", "creationMethods": [{"name": "HdfsForPipeline.Contents", + "parameters": [{"name": "clusterURL", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "HttpServer", "creationMethods": [{"name": "HttpServer.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "InformixForPipeline", "creationMethods": [{"name": "InformixForPipeline.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "service", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "protocol", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Anonymous", "Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "IoTHub", "creationMethods": [{"name": "IoTHub.Contents", + "parameters": [{"name": "entityPath", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Kinesis", "creationMethods": [{"name": "Kinesis.Contents", + "parameters": [{"name": "streamName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MariaDBForPipeline", "creationMethods": [{"name": "MariaDBForPipeline.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "database", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MicrosoftAccess", "creationMethods": [{"name": "MicrosoftAccess.Contents", + "parameters": [{"name": "filePath", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous", "Basic"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MicrosoftOutlook", "creationMethods": [{"name": "MicrosoftOutlook.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MicrosoftTeams", "creationMethods": [{"name": "MicrosoftTeams.Actions", "parameters": + []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MongoDBAtlasForPipeline", "creationMethods": [{"name": "MongoDBAtlasForPipeline.Database", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "cluster", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MongoDBForPipeline", "creationMethods": [{"name": "MongoDBForPipeline.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MQTT", "creationMethods": [{"name": "MQTT.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Notebook", "creationMethods": [{"name": "Notebook.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "OracleCloudStorage", "creationMethods": [{"name": "OracleCloudStorage.Contents", + "parameters": [{"name": "APIEndpoint", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "PowerBIDatasets", "creationMethods": [{"name": "PowerBIDatasets.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal", + "WorkspaceIdentity"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Presto", "creationMethods": [{"name": "Presto.Contents", + "parameters": [{"name": "Server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Catalog", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Timezone", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ServerCertificateValidation", "dataType": "Text", "required": + false, "allowedValues": ["Enable", "Disable"]}]}], "supportedCredentialTypes": + ["Anonymous", "Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted", + "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "RestService", "creationMethods": [{"name": "RestService.Contents", + "parameters": [{"name": "baseUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "audience", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Anonymous", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SalesforceServiceCloud", "creationMethods": [{"name": "SalesforceServiceCloud.Contents", + "parameters": [{"name": "environmentURL", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "apiVersion", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SAPAzureDataLakeStorageGen2", "creationMethods": [{"name": + "SAPAzureDataLakeStorageGen2.Actions", "parameters": [{"name": "url", "dataType": + "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "Key", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SAPBWOpenHubApplicationServer", "creationMethods": [{"name": + "SAPBWOpenHubApplicationServer.Contents", "parameters": [{"name": "appServerName", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "systemNumber", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "clientID", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "languageCode", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPBWOpenHubMessageServer", "creationMethods": [{"name": "SAPBWOpenHubMessageServer.Contents", + "parameters": [{"name": "messageServer", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "clientID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "messageServerService", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "systemID", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "logonGroup", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "languageCode", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPTableApplicationServer", "creationMethods": [{"name": "SAPTableApplicationServer.Contents", + "parameters": [{"name": "appServerName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "systemNumber", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "clientID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "languageCode", "dataType": "Text", + "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SAPTableMessageServer", "creationMethods": [{"name": "SAPTableMessageServer.Contents", + "parameters": [{"name": "messageServer", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "clientID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "messageServerService", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "systemID", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "logonGroup", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "languageCode", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "ServiceNow", "creationMethods": [{"name": "ServiceNow.Data", "parameters": + [{"name": "instance", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SFTP", "creationMethods": [{"name": "SFTP.Contents", "parameters": + [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "fingerprint", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Shopify", "creationMethods": [{"name": "Shopify.Database", + "parameters": [{"name": "host", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted", "Encrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ShortcutsExtensibilityTest", "creationMethods": [{"name": + "ShortcutsExtensibilityTest.Contents", "parameters": [{"name": "baseUrl", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "audience", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["Basic", "OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SolacePubsub", "creationMethods": [{"name": "SolacePubsub.Contents", + "parameters": [{"name": "server", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SparkJobDefinition", "creationMethods": [{"name": "SparkJobDefinition.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "SqlAnalyticsEndpoint", "creationMethods": [{"name": "SqlAnalyticsEndpoint.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "UserDataFunctions", "creationMethods": [{"name": "UserDataFunctions.Actions", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "WebForPipeline", "creationMethods": [{"name": "WebForPipeline.Contents", + "parameters": [{"name": "baseUrl", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "audience", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "Basic", "Anonymous", "Key", + "ServicePrincipal"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureDevOpsSourceControl", "creationMethods": [{"name": "AzureDevOpsSourceControl.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GitHubSourceControl", "creationMethods": [{"name": "GitHubSourceControl.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "GoogleAds", "creationMethods": [{"name": "GoogleAds.Contents", + "parameters": [{"name": "googleAdsApiVersion", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "clientCustomerID", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "loginCustomerID", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2", "Basic"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], + "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Microsoft365", "creationMethods": [{"name": "Microsoft365.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2", "ServicePrincipal"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "QuickBooksForPipeline", "creationMethods": [{"name": "QuickBooksForPipeline.Contents", + "parameters": [{"name": "endpoint", "dataType": "Text", "required": true, + "allowedValues": ["https://sandbox-quickbooks.api.intuit.com", "https://quickbooks.api.intuit.com"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AriaConnector", "creationMethods": [{"name": "AriaDataConnector.GetCubes", + "parameters": [{"name": "Project ID", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "interval", "dataType": "Text", "required": + false, "allowedValues": ["Last hour", "Last 2 hours", "Last 4 hours", "Last + 12 hours", "Last 24 hours", "Last 2 days", "Last 4 days", "Last week", "Last + 2 weeks", "Last 4 weeks", "Last 8 weeks", "Last 12 weeks", "Last 30 days", + "Last 60 days", "Last 90 days", "Last 180 days"]}, {"name": "granularity", + "dataType": "Text", "required": false, "allowedValues": ["Five seconds", "Ten + seconds", "Five minutes", "One hour", "One day", "One week", "One month"]}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AzureEnterprise", "creationMethods": [{"name": "AzureEnterprise.Tables", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CloudScope", "creationMethods": [{"name": "CloudScope.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CloudScopeInstagram", "creationMethods": [{"name": "CloudScopeInstagram.Contents", + "parameters": []}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "comScore", "creationMethods": [{"name": "comScore.NavTable", + "parameters": [{"name": "datacenter", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "client", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "startDate", "dataType": "Date", "required": + false, "allowedValues": null}, {"name": "endDate", "dataType": "Date", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "InfinityConnector", "creationMethods": [{"name": "InfinityConnector.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "JDIConnector", "creationMethods": [{"name": "JDIConnector.Contents", + "parameters": [{"name": "DataUrl", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "KaizalaAttendanceReports", "creationMethods": [{"name": "KaizalaAttendanceReports.Feed", + "parameters": [{"name": "ContentPackName", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "KaizalaReports", "creationMethods": [{"name": "KaizalaReports.Feed", + "parameters": [{"name": "MethodName", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "KaizalaSurveyReports", "creationMethods": [{"name": "KaizalaSurveyReports.Feed", + "parameters": [{"name": "ContentPackName", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AdMaD", "creationMethods": [{"name": "AdMaD.Feed", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": ["https://columnstoremt.azurewebsites.net/", + "https://admadmt.azurewebsites.net/", "https://firebirdapi.azure-api.net/", + "https://firebirdapptest.azurewebsites.net/"]}, {"name": "sourceName", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "request", "dataType": + "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "myob_ar", "creationMethods": [{"name": "myob_ar.GetCompanyFiles", "parameters": + [{"name": "company", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Office365Mon2", "creationMethods": [{"name": "Office365Mon.Outages.Feed", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Plantronics", "creationMethods": [{"name": "Plantronics.Feed", + "parameters": [{"name": "URL", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "Tenant", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "URL1", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "URL2", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "Parameters", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "ElementsPerPage", "dataType": "Number", "required": false, + "allowedValues": null}]}], "supportedCredentialTypes": ["Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ProductioneerMExt", "creationMethods": [{"name": "ProductioneerMExt.Contents", + "parameters": [{"name": "CompanyName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "endpoint", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "StartDate", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ProjectIntelligence", "creationMethods": [{"name": "ProjectIntelligence.Service", + "parameters": [{"name": "ShareAdvanceWebAddress", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "Dimension", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "DataType", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "QuestionPro", "creationMethods": [{"name": "QuestionPro.Contents", + "parameters": [{"name": "access_id", "dataType": "Text", "required": true, + "allowedValues": null}]}], "supportedCredentialTypes": ["Key"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ScopevisioPowerBICon", "creationMethods": [{"name": "ScopevisioPowerBICon.Contents", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SentryOne", "creationMethods": [{"name": "SentryOne.Tables", + "parameters": []}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "SpotlightCloudReports", "creationMethods": [{"name": "SpotlightCloudReports.Contents", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Timelog", "creationMethods": [{"name": "Timelog.Tables", + "parameters": [{"name": "SiteCode", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "ApiID", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "ApiPassword", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "URLAccountName", "dataType": + "Text", "required": true, "allowedValues": null}, {"name": "DefaultNumberAccount", + "dataType": "Text", "required": true, "allowedValues": null}, {"name": "CurrentMonthOnly", + "dataType": "Text", "required": true, "allowedValues": null}]}], "supportedCredentialTypes": + ["Anonymous"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "UserVoice", "creationMethods": [{"name": "UserVoice.Tables", "parameters": + [{"name": "url", "dataType": "Text", "required": true, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "WtsParadigm", "creationMethods": [{"name": "WtsParadigm.GetDefaultData", + "parameters": []}], "supportedCredentialTypes": ["Basic"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Xero", "creationMethods": [{"name": "Xero.Contents", "parameters": + [{"name": "urlInput", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "countInput", "dataType": "Number", "required": false, "allowedValues": + null}, {"name": "company", "dataType": "Text", "required": false, "allowedValues": + null}, {"name": "tenantId", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "AdminInsights", "creationMethods": [{"name": "AdminInsights.GetAzureBlobContents", + "parameters": [{"name": "_workload", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "_fileType", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_version", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_rangeStart", "dataType": "Text", + "required": true, "allowedValues": null}, {"name": "_rangeEnd", "dataType": + "Text", "required": true, "allowedValues": null}, {"name": "_desktopHostContainerUrl", + "dataType": "Text", "required": false, "allowedValues": null}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "AutoPremium", "creationMethods": [{"name": "AutoPremium.GetMetricsData", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "isPbiAdmin", "dataType": "Boolean", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "CapacityMetricsCES", "creationMethods": [{"name": "CapacityMetricsCES.GetMetricsData", + "parameters": [{"name": "_queryName", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "_capacityId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_tenantId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_ago", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_cluster", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_database", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_utcOffset", "dataType": "Number", + "required": false, "allowedValues": null}, {"name": "_releaseType", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "_localTimepoint", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_byPassAdminCheckForTenantAdmin", + "dataType": "Boolean", "required": false, "allowedValues": null}, {"name": + "_shouldMaskUser", "dataType": "Boolean", "required": false, "allowedValues": + null}, {"name": "_targetCesRegion", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "_startDate", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "_endDate", "dataType": "Text", "required": + false, "allowedValues": null}, {"name": "_uniqueKey", "dataType": "Text", + "required": false, "allowedValues": null}, {"name": "_artifactId", "dataType": + "Text", "required": false, "allowedValues": null}, {"name": "_workspaceId", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_operationName", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_operationId", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_user", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_status", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_isOverride", + "dataType": "Text", "required": false, "allowedValues": null}, {"name": "_aggCuThreshold", + "dataType": "Number", "required": false, "allowedValues": null}, {"name": + "_experience", "dataType": "Text", "required": false, "allowedValues": null}]}], + "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": true, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Goals", "creationMethods": [{"name": "Goals.GetScorecardData", + "parameters": [{"name": "scorecardId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "top", "dataType": "Number", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "MetricsCES", "creationMethods": [{"name": "MetricsCES.GetMetricsData", "parameters": + [{"name": "_capacityId", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_database", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_ago", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_hour", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "_kustoUri", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MetricsDataConnector", "creationMethods": [{"name": "MetricsDataConnector.GetMetricsData", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "isPbiAdmin", "dataType": "Boolean", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "MicrosoftCallQuality", "creationMethods": [{"name": "MicrosoftCallQuality.GenerateTable", + "parameters": [{"name": "tenantId", "dataType": "Text", "required": false, + "allowedValues": null}, {"name": "filters", "dataType": "Text", "required": + false, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], + "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}, {"type": + "UsageMetricsDataConnector", "creationMethods": [{"name": "UsageMetricsDataConnector.GetMetricsData", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "UsageMetricsCES", "creationMethods": [{"name": "UsageMetricsCES.Contents", + "parameters": [{"name": "_tenantId", "dataType": "Text", "required": true, + "allowedValues": null}, {"name": "_workspaceId", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_database", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_ago", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_hour", "dataType": "Text", "required": + true, "allowedValues": null}, {"name": "_kustoUri", "dataType": "Text", "required": + true, "allowedValues": null}]}], "supportedCredentialTypes": ["OAuth2"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "ElasticSearch", "creationMethods": [{"name": "ElasticSearch.Database", + "parameters": [{"name": "url", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "keyColumnName", "dataType": "Text", "required": false, "allowedValues": + null}]}], "supportedCredentialTypes": ["Basic", "Anonymous"], "supportedConnectionEncryptionTypes": + ["NotEncrypted"], "supportsSkipTestConnection": false, "supportedCredentialTypesForUsageInUserControlledCode": + null}, {"type": "Looker", "creationMethods": [{"name": "Looker.DataSource", + "parameters": [{"name": "Host", "dataType": "Text", "required": true, "allowedValues": + null}, {"name": "ShowHidden", "dataType": "Boolean", "required": false, "allowedValues": + ["true", "false"]}, {"name": "EnableLogging", "dataType": "Boolean", "required": + false, "allowedValues": ["true", "false"]}]}], "supportedCredentialTypes": + ["OAuth2"], "supportedConnectionEncryptionTypes": ["NotEncrypted"], "supportsSkipTestConnection": + false, "supportedCredentialTypesForUsageInUserControlledCode": null}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '8567' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:20 GMT + Pragma: + - no-cache + RequestId: + - a1563ab2-e730-4f27-b211-94fc55ef8b27 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"description": "Created by fab", "displayName": "fabcli000001", "connectivityType": + "ShareableCloud", "privacyLevel": "None", "connectionDetails": "mock_request_connection_details", + "credentialDetails": "mocked_credential_details"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '586' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId,Location + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:21 GMT + Location: + - https://api.fabric.microsoft.com/v1/connections/28b2782b-2401-4172-9cbd-66b1ceeb46cd + Pragma: + - no-cache + RequestId: + - f72f8bc7-e087-44b5-a4d4-ca6e5e3de316 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '906' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:22 GMT + Pragma: + - no-cache + RequestId: + - 15dd52ad-7bda-4ec3-bc12-65148da598ac + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/28b2782b-2401-4172-9cbd-66b1ceeb46cd + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "None", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:25 GMT + Pragma: + - no-cache + RequestId: + - 445802b6-a245-4edd-8381-6aa22c2995f6 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"privacyLevel": "Organizational", "connectivityType": "ShareableCloud"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '72' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/connections/28b2782b-2401-4172-9cbd-66b1ceeb46cd + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "Organizational", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '313' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:26 GMT + Pragma: + - no-cache + RequestId: + - 1e8895a5-5cab-4d77-8dbd-25a228c7873d + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "Organizational", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '902' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:28 GMT + Pragma: + - no-cache + RequestId: + - 0be9f6f0-11ab-43dd-9440-63a726f858b9 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections/28b2782b-2401-4172-9cbd-66b1ceeb46cd + response: + body: + string: '{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "Organizational", "credentialDetails": "mocked_credential_details"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '313' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:29 GMT + Pragma: + - no-cache + RequestId: + - de640af2-aaf4-4717-930b-bf0027322553 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/connections + response: + body: + string: '{"value": [{"allowConnectionUsageInGateway": false, "allowUsageInUserControlledCode": + false, "id": "28b2782b-2401-4172-9cbd-66b1ceeb46cd", "displayName": "fabcli000001", + "connectivityType": "ShareableCloud", "connectionDetails": {"path": "mocked_sql_server_server.database.windows.net;mocked_sql_server_database", + "type": "SQL"}, "privacyLevel": "Organizational", "credentialDetails": "mocked_credential_details"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '902' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:43:30 GMT + Pragma: + - no-cache + RequestId: + - de8166dc-38e2-485f-908f-29482763b578 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/connections/28b2782b-2401-4172-9cbd-66b1ceeb46cd + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Wed, 21 Jan 2026 09:43:31 GMT + Pragma: + - no-cache + RequestId: + - 0955682c-8e3b-4b80-b19e-235a5afdbdf4 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_capacityId_success.yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_capacityId_success.yaml new file mode 100644 index 00000000..6637e09e --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_capacityId_success.yaml @@ -0,0 +1,614 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": []}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1259' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:09:34 GMT + Pragma: + - no-cache + RequestId: + - 5cf4e4e0-647c-42fa-8d99-a80f2b9414d4 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/capacities + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000004", "displayName": + "mocked_fabriccli_capacity_name", "sku": "F32", "region": "Central US", "state": + "Active"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '425' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:09:40 GMT + Pragma: + - no-cache + RequestId: + - 442dcc33-22ed-450e-87f9-9bf4584b1670 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions?api-version=2022-12-01 + response: + body: + string: '{"value": [{"id": "/subscriptions/00000000-0000-0000-0000-000000000000"}], + "count": {"type": "Total", "value": 1}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '469' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:09:41 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/virtualNetworks?api-version=2024-05-01 + response: + body: + string: '{"value": [{"name": "mocked_fabriccli_vnet_name", "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name", + "properties": {"subnets": [{"name": "mocked_fabriccli_vnet_subnet", "id": + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name/subnets/mocked_fabriccli_vnet_subnet"}]}}]}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '2758' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:09:43 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "inactivityMinutesBeforeSleep": 30, "numberOfMemberGateways": 1, "type": "VirtualNetwork", + "virtualNetworkAzureResource": {"subscriptionId": "00000000-0000-0000-0000-000000000000", + "resourceGroupName": "mocked_fabriccli_resource_group", "virtualNetworkName": + "mocked_fabriccli_vnet_name", "subnetName": "mocked_fabriccli_vnet_subnet"}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '377' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId,Location + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:09:57 GMT + Location: + - https://api.fabric.microsoft.com/v1/gateways/f1152eab-8ae0-4150-8d6e-96ce8a9ecd81 + Pragma: + - no-cache + RequestId: + - 25522f4b-4add-4cd1-9383-d47458aab95f + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:09:59 GMT + Pragma: + - no-cache + RequestId: + - c779bb7e-1e96-4cde-97ac-a1a416704613 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/f1152eab-8ae0-4150-8d6e-96ce8a9ecd81 + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:10:01 GMT + Pragma: + - no-cache + RequestId: + - a49d67ff-4026-4a1e-b8f4-664ae0438ecd + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"capacityId": "00000000-0000-0000-0000-000000000004", "type": "VirtualNetwork"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/gateways/f1152eab-8ae0-4150-8d6e-96ce8a9ecd81 + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:10:12 GMT + Pragma: + - no-cache + RequestId: + - 5ffc69b7-ee68-4423-a2a3-0110c90bf8e8 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:10:13 GMT + Pragma: + - no-cache + RequestId: + - 07f8047c-3554-4e16-8601-3e6d7e608005 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/f1152eab-8ae0-4150-8d6e-96ce8a9ecd81 + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:10:15 GMT + Pragma: + - no-cache + RequestId: + - 8461dfb5-afc8-4188-b6bc-fd596f11c544 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "f1152eab-8ae0-4150-8d6e-96ce8a9ecd81", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:10:16 GMT + Pragma: + - no-cache + RequestId: + - ad4d3459-1c80-4e30-9753-1ec80cf0c716 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/gateways/f1152eab-8ae0-4150-8d6e-96ce8a9ecd81 + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 20 Jan 2026 12:10:18 GMT + Pragma: + - no-cache + RequestId: + - ebac870a-2e5e-45cc-b796-ec9dc4ef79ec + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[displayName-None].yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[displayName-None].yaml new file mode 100644 index 00000000..664f29ad --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[displayName-None].yaml @@ -0,0 +1,828 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": []}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1262' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:31 GMT + Pragma: + - no-cache + RequestId: + - 542265fa-49e6-47bd-bad8-f423c83727f9 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/capacities + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000004", "displayName": + "mocked_fabriccli_capacity_name", "sku": "F32", "region": "Central US", "state": + "Active"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '424' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:38 GMT + Pragma: + - no-cache + RequestId: + - 38dc1e10-2a53-4ad7-81d1-fdc823c9e1b3 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions?api-version=2022-12-01 + response: + body: + string: '{"value": [{"id": "/subscriptions/00000000-0000-0000-0000-000000000000"}], + "count": {"type": "Total", "value": 1}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '469' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:39 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/virtualNetworks?api-version=2024-05-01 + response: + body: + string: '{"value": [{"name": "mocked_fabriccli_vnet_name", "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name", + "properties": {"subnets": [{"name": "mocked_fabriccli_vnet_subnet", "id": + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name/subnets/mocked_fabriccli_vnet_subnet"}]}}]}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '2758' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:40 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "inactivityMinutesBeforeSleep": 30, "numberOfMemberGateways": 1, "type": "VirtualNetwork", + "virtualNetworkAzureResource": {"subscriptionId": "00000000-0000-0000-0000-000000000000", + "resourceGroupName": "mocked_fabriccli_resource_group", "virtualNetworkName": + "mocked_fabriccli_vnet_name", "subnetName": "mocked_fabriccli_vnet_subnet"}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '377' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId,Location + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '290' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:57 GMT + Location: + - https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + Pragma: + - no-cache + RequestId: + - 0b0da843-2521-4714-8401-461ea057d118 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:59 GMT + Pragma: + - no-cache + RequestId: + - b6d7ae17-c01e-40a5-805e-783801165f01 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '290' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:38:59 GMT + Pragma: + - no-cache + RequestId: + - ad661853-2f4c-47b8-af1e-900ba8bcb8f1 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000002", "type": "VirtualNetwork"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '61' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + response: + body: + string: '{"displayName": "fabcli000002", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '290' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:02 GMT + Pragma: + - no-cache + RequestId: + - c0ee9e8f-9645-4eca-a4c4-9596411db39d + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000002", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1303' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:05 GMT + Pragma: + - no-cache + RequestId: + - aff57473-f4be-48dd-b1e7-3f769a3a285b + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000002", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1303' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:06 GMT + Pragma: + - no-cache + RequestId: + - af8900a9-0e17-4527-9e86-e6851d5ed782 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + response: + body: + string: '{"displayName": "fabcli000002", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '290' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:08 GMT + Pragma: + - no-cache + RequestId: + - 2c52380f-d84e-49aa-b8d7-5d1941686264 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000002", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1303' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:09 GMT + Pragma: + - no-cache + RequestId: + - 09b537d6-86ce-4c8a-80e6-5934f484b424 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + response: + body: + string: '{"displayName": "fabcli000002", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '290' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:12 GMT + Pragma: + - no-cache + RequestId: + - c4549f6c-4c60-4311-885c-e7e868d9986a + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000001", "type": "VirtualNetwork"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '61' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '290' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:13 GMT + Pragma: + - no-cache + RequestId: + - 9eecda00-ca47-4643-9890-7b6921f85de4 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "b3d6d7e4-3372-47ee-8994-4a56fbb99c3f", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 09:39:14 GMT + Pragma: + - no-cache + RequestId: + - 69a4cd07-5a24-465d-87ad-eab118e99fe2 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/gateways/b3d6d7e4-3372-47ee-8994-4a56fbb99c3f + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Wed, 21 Jan 2026 09:39:16 GMT + Pragma: + - no-cache + RequestId: + - 3438a205-e6b2-4865-953f-61368978c882 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[inactivityMinutesBeforeSleep-60].yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[inactivityMinutesBeforeSleep-60].yaml new file mode 100644 index 00000000..11f45ff5 --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[inactivityMinutesBeforeSleep-60].yaml @@ -0,0 +1,614 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": []}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1259' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:21 GMT + Pragma: + - no-cache + RequestId: + - 57da9cfe-f9b3-4550-aba3-ebced0fafad9 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/capacities + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000004", "displayName": + "mocked_fabriccli_capacity_name", "sku": "F32", "region": "Central US", "state": + "Active"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '425' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:27 GMT + Pragma: + - no-cache + RequestId: + - 657b7e93-d9e2-407a-82f0-a013de470ec1 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions?api-version=2022-12-01 + response: + body: + string: '{"value": [{"id": "/subscriptions/00000000-0000-0000-0000-000000000000"}], + "count": {"type": "Total", "value": 1}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '469' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:29 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/virtualNetworks?api-version=2024-05-01 + response: + body: + string: '{"value": [{"name": "mocked_fabriccli_vnet_name", "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name", + "properties": {"subnets": [{"name": "mocked_fabriccli_vnet_subnet", "id": + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name/subnets/mocked_fabriccli_vnet_subnet"}]}}]}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '2758' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:29 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "inactivityMinutesBeforeSleep": 30, "numberOfMemberGateways": 1, "type": "VirtualNetwork", + "virtualNetworkAzureResource": {"subscriptionId": "00000000-0000-0000-0000-000000000000", + "resourceGroupName": "mocked_fabriccli_resource_group", "virtualNetworkName": + "mocked_fabriccli_vnet_name", "subnetName": "mocked_fabriccli_vnet_subnet"}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '377' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId,Location + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '291' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:42 GMT + Location: + - https://api.fabric.microsoft.com/v1/gateways/d616901d-c1aa-4195-9c36-a09f9b3cc32c + Pragma: + - no-cache + RequestId: + - 6badb1a6-e042-403c-a6d2-3c8da3a04116 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1302' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:44 GMT + Pragma: + - no-cache + RequestId: + - 2bdfb855-0326-4f4d-ac69-0dff1cb2d1a9 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/d616901d-c1aa-4195-9c36-a09f9b3cc32c + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '291' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:46 GMT + Pragma: + - no-cache + RequestId: + - b755acb2-48ed-4bb5-9aa1-3e1e9a2785a7 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"inactivityMinutesBeforeSleep": 60, "type": "VirtualNetwork"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '62' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/gateways/d616901d-c1aa-4195-9c36-a09f9b3cc32c + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 60, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '291' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:48 GMT + Pragma: + - no-cache + RequestId: + - 1438d881-e1e4-4d07-9779-d6044cd71480 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 60, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1305' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:50 GMT + Pragma: + - no-cache + RequestId: + - 6b4fad32-31cc-4385-a060-62476f21ef13 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/d616901d-c1aa-4195-9c36-a09f9b3cc32c + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 60, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '291' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:52 GMT + Pragma: + - no-cache + RequestId: + - ffb9f2f1-046a-4d0c-9aab-214808211d4c + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 60, "numberOfMemberGateways": 1, "id": "d616901d-c1aa-4195-9c36-a09f9b3cc32c", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1305' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:53 GMT + Pragma: + - no-cache + RequestId: + - 68555eeb-f039-48aa-bd4d-661857630ec6 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/gateways/d616901d-c1aa-4195-9c36-a09f9b3cc32c + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 20 Jan 2026 12:03:56 GMT + Pragma: + - no-cache + RequestId: + - 63c4c6b7-1dfd-4f7e-8a0b-41c14ce5ae60 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[numberOfMemberGateways-2].yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[numberOfMemberGateways-2].yaml new file mode 100644 index 00000000..ceb436f4 --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_gateway_virtualNetwork_success[numberOfMemberGateways-2].yaml @@ -0,0 +1,614 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": []}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1259' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:02:44 GMT + Pragma: + - no-cache + RequestId: + - deed64c6-baed-43cf-bd6e-85fe76fa468a + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/capacities + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000004", "displayName": + "mocked_fabriccli_capacity_name", "sku": "F32", "region": "Central US", "state": + "Active"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '424' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:02:48 GMT + Pragma: + - no-cache + RequestId: + - 9bf38367-49f2-4adc-a8e5-f5731c65b875 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions?api-version=2022-12-01 + response: + body: + string: '{"value": [{"id": "/subscriptions/00000000-0000-0000-0000-000000000000"}], + "count": {"type": "Total", "value": 1}}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '469' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:02:50 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/virtualNetworks?api-version=2024-05-01 + response: + body: + string: '{"value": [{"name": "mocked_fabriccli_vnet_name", "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name", + "properties": {"subnets": [{"name": "mocked_fabriccli_vnet_subnet", "id": + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mocked_fabriccli_resource_group/providers/Microsoft.Network/virtualNetworks/mocked_fabriccli_vnet_name/subnets/mocked_fabriccli_vnet_subnet"}]}}]}' + headers: + Cache-Control: + - no-cache + Content-Length: + - '2758' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:02:52 GMT + Expires: + - '-1' + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Cache: + - CONFIG_NOCACHE + X-Content-Type-Options: + - nosniff + status: + code: 200 + message: OK +- request: + body: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "inactivityMinutesBeforeSleep": 30, "numberOfMemberGateways": 1, "type": "VirtualNetwork", + "virtualNetworkAzureResource": {"subscriptionId": "00000000-0000-0000-0000-000000000000", + "resourceGroupName": "mocked_fabriccli_resource_group", "virtualNetworkName": + "mocked_fabriccli_vnet_name", "subnetName": "mocked_fabriccli_vnet_subnet"}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '377' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId,Location + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:06 GMT + Location: + - https://api.fabric.microsoft.com/v1/gateways/c08147ae-a498-466d-a53d-4077fb318741 + Pragma: + - no-cache + RequestId: + - a6be980d-b2d0-4075-b04d-d4f556c5f3c4 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1301' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:07 GMT + Pragma: + - no-cache + RequestId: + - 685186de-ade0-421f-abda-15045ad2b6c1 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/c08147ae-a498-466d-a53d-4077fb318741 + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 1, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:09 GMT + Pragma: + - no-cache + RequestId: + - f534924e-230e-4915-80ce-937c3bdee289 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"numberOfMemberGateways": 2, "type": "VirtualNetwork"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '55' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/gateways/c08147ae-a498-466d-a53d-4077fb318741 + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 2, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:11 GMT + Pragma: + - no-cache + RequestId: + - f28949a1-afca-47b0-aad9-1e4ddfdbebc4 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 2, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:13 GMT + Pragma: + - no-cache + RequestId: + - b168f8af-5f65-4771-bb52-473c893763ea + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways/c08147ae-a498-466d-a53d-4077fb318741 + response: + body: + string: '{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 2, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '289' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:15 GMT + Pragma: + - no-cache + RequestId: + - e74f73bb-53b6-4ebc-a169-15296fd971ca + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/gateways + response: + body: + string: '{"value": [{"displayName": "fabcli000001", "capacityId": "00000000-0000-0000-0000-000000000004", + "virtualNetworkAzureResource": {"virtualNetworkName": "mocked_fabriccli_vnet_name", + "subnetName": "mocked_fabriccli_vnet_subnet", "resourceGroupName": "mocked_fabriccli_resource_group", + "subscriptionId": "00000000-0000-0000-0000-000000000000"}, "inactivityMinutesBeforeSleep": + 30, "numberOfMemberGateways": 2, "id": "c08147ae-a498-466d-a53d-4077fb318741", + "type": "VirtualNetwork"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '1304' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 20 Jan 2026 12:03:17 GMT + Pragma: + - no-cache + RequestId: + - eedd040d-dc85-412b-a341-e5fdc64b0cf1 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/gateways/c08147ae-a498-466d-a53d-4077fb318741 + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 20 Jan 2026 12:03:19 GMT + Pragma: + - no-cache + RequestId: + - 1076e3ea-98a1-4edc-9543-5f3e02395cda + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[name-None].yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[name-None].yaml new file mode 100644 index 00000000..7ec8b6fa --- /dev/null +++ b/tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[name-None].yaml @@ -0,0 +1,1008 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces + response: + body: + string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": + "My workspace", "description": "", "type": "Personal"}, {"id": "f8c02512-00fa-470e-92c8-a4f875d5871b", + "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created + by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '2300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:25 GMT + Pragma: + - no-cache + RequestId: + - dcd4a51c-0a63-4f05-9a6e-e3a30a6ae7ab + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '460' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:28 GMT + RequestId: + - 2ad23b4b-4787-445c-90b9-6a8d30949ab5 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '460' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:30 GMT + RequestId: + - 17b3c270-9bcf-4d05-9f2f-ba8959b904d0 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false, "minExecutors": 1, "maxExecutors": 1}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '239' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: POST + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", "type": "Workspace", + "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false}}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '322' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:31 GMT + RequestId: + - adb85159-4cb1-40c4-bc81-1045fb9c8911 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces + response: + body: + string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": + "My workspace", "description": "", "type": "Personal"}, {"id": "f8c02512-00fa-470e-92c8-a4f875d5871b", + "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created + by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '2300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:33 GMT + Pragma: + - no-cache + RequestId: + - 20083136-4b78-4f66-948f-0d2d201874bb + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", + "type": "Workspace", "name": "fabcli000001", "nodeFamily": "MemoryOptimized", + "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": + 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '845' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:33 GMT + RequestId: + - 48838c90-ced1-44d7-a641-09f973cad95c + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools/968363b5-9119-4d5a-9283-ae95e78a25fb + response: + body: + string: '{"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", "type": "Workspace", + "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false}}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '322' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:38 GMT + RequestId: + - ba9ee5a4-a731-4ff4-9624-1ba8b1bc7058 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"name": "fabcli000002"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '28' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools/968363b5-9119-4d5a-9283-ae95e78a25fb + response: + body: + string: '{"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", "type": "Workspace", + "name": "fabcli000002", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false}}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '322' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:39 GMT + RequestId: + - d90258ff-24ac-4136-9d60-7c51fead084e + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces + response: + body: + string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": + "My workspace", "description": "", "type": "Personal"}, {"id": "f8c02512-00fa-470e-92c8-a4f875d5871b", + "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created + by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '2300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:41 GMT + Pragma: + - no-cache + RequestId: + - 9250750a-589e-40ce-965c-0ce4e7fc0f53 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", + "type": "Workspace", "name": "fabcli000002", "nodeFamily": "MemoryOptimized", + "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": + 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '845' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:43 GMT + RequestId: + - f3e16d75-eab9-42a3-8dca-3e9917d0e892 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", + "type": "Workspace", "name": "fabcli000002", "nodeFamily": "MemoryOptimized", + "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": + 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '845' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:44 GMT + RequestId: + - 4b228bf4-5ad5-46e5-823b-d7614b178479 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces + response: + body: + string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": + "My workspace", "description": "", "type": "Personal"}, {"id": "f8c02512-00fa-470e-92c8-a4f875d5871b", + "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created + by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '2300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:45 GMT + Pragma: + - no-cache + RequestId: + - 1005582c-4bba-4fcb-aed0-61ac02794ebe + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", + "type": "Workspace", "name": "fabcli000002", "nodeFamily": "MemoryOptimized", + "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": + 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '845' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:45 GMT + RequestId: + - 1d202ca0-1efa-451e-9827-c623757fe8c1 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools/968363b5-9119-4d5a-9283-ae95e78a25fb + response: + body: + string: '{"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", "type": "Workspace", + "name": "fabcli000002", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false}}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '322' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:47 GMT + RequestId: + - dce61418-ebe6-4828-9a5a-33e3f27db0a3 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces + response: + body: + string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": + "My workspace", "description": "", "type": "Personal"}, {"id": "f8c02512-00fa-470e-92c8-a4f875d5871b", + "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created + by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '2300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:49 GMT + Pragma: + - no-cache + RequestId: + - b658496b-f2de-4239-98b8-54439f984ca6 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", + "type": "Workspace", "name": "fabcli000002", "nodeFamily": "MemoryOptimized", + "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": + 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '845' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:50 GMT + RequestId: + - 4bb439cb-bd42-4006-8d5c-9f8301dce798 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools/968363b5-9119-4d5a-9283-ae95e78a25fb + response: + body: + string: '{"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", "type": "Workspace", + "name": "fabcli000002", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false}}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '322' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:51 GMT + RequestId: + - a4af6a84-5425-4f36-8fa9-a69a639537dc + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: '{"name": "fabcli000001"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '28' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: PATCH + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools/968363b5-9119-4d5a-9283-ae95e78a25fb + response: + body: + string: '{"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", "type": "Workspace", + "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": + {"enabled": false}}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '322' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:52 GMT + RequestId: + - 0e3c92ba-d3ba-4b6f-8ecf-11ee90b09dd1 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces + response: + body: + string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": + "My workspace", "description": "", "type": "Personal"}, {"id": "f8c02512-00fa-470e-92c8-a4f875d5871b", + "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created + by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Cache-Control: + - no-store, must-revalidate, no-cache + Content-Encoding: + - gzip + Content-Length: + - '2300' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:54 GMT + Pragma: + - no-cache + RequestId: + - 1a0e892c-6bc1-413b-b561-25818cfa46c5 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: GET + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools + response: + body: + string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", + "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", + "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": + {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "968363b5-9119-4d5a-9283-ae95e78a25fb", + "type": "Workspace", "name": "fabcli000001", "nodeFamily": "MemoryOptimized", + "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": + 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '845' + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 21 Jan 2026 12:55:55 GMT + RequestId: + - 116e472c-df9e-49d5-a1e2-9260e88ecef0 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - ms-fabric-cli-test/1.3.1 + method: DELETE + uri: https://api.fabric.microsoft.com/v1/workspaces/f8c02512-00fa-470e-92c8-a4f875d5871b/spark/pools/968363b5-9119-4d5a-9283-ae95e78a25fb + response: + body: + string: '' + headers: + Access-Control-Expose-Headers: + - RequestId + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Wed, 21 Jan 2026 12:55:56 GMT + RequestId: + - 6b143a3c-fc99-42f1-a48a-957f369cfdf0 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + home-cluster-uri: + - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ + request-redirected: + - 'true' + status: + code: 200 + message: OK +version: 1 From 5f4e7fe8960613ac22dd3d1be2535f4779dbe882 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 29 Jan 2026 12:00:09 +0000 Subject: [PATCH 028/176] merge --- ...kpool_success[autoScale.enabled-true].yaml | 670 ------------------ 1 file changed, 670 deletions(-) delete mode 100644 tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[autoScale.enabled-true].yaml diff --git a/tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[autoScale.enabled-true].yaml b/tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[autoScale.enabled-true].yaml deleted file mode 100644 index 33648aca..00000000 --- a/tests/test_commands/recordings/test_commands/test_set/test_set_sparkpool_success[autoScale.enabled-true].yaml +++ /dev/null @@ -1,670 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces - response: - body: - string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": - "My workspace", "description": "", "type": "Personal"}, {"id": "81065bd8-e334-4715-b170-dedb4cd514e6", - "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created - by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Cache-Control: - - no-store, must-revalidate, no-cache - Content-Encoding: - - gzip - Content-Length: - - '2061' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:11 GMT - Pragma: - - no-cache - RequestId: - - 1443515c-f541-4f17-a2bc-7f9a820366bc - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools - response: - body: - string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", - "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": - {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '460' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:11 GMT - RequestId: - - 3aff1b4e-b021-488b-b8fb-709792f3b34e - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools - response: - body: - string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", - "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": - {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '460' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:12 GMT - RequestId: - - 9b6ff5a9-945c-4f75-877b-7b019031144d - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: '{"name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": - {"enabled": false, "minExecutors": 1, "maxExecutors": 1}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '239' - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: POST - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools - response: - body: - string: '{"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", "type": "Workspace", - "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": - {"enabled": false}}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '322' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:12 GMT - RequestId: - - 77a91a8a-b19b-4775-88d8-797edb5e797c - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces - response: - body: - string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": - "My workspace", "description": "", "type": "Personal"}, {"id": "81065bd8-e334-4715-b170-dedb4cd514e6", - "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created - by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Cache-Control: - - no-store, must-revalidate, no-cache - Content-Encoding: - - gzip - Content-Length: - - '2061' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:12 GMT - Pragma: - - no-cache - RequestId: - - 67e5b716-d3ba-4f15-a945-108afe9f35b4 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools - response: - body: - string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", - "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": - {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", - "type": "Workspace", "name": "fabcli000001", "nodeFamily": "MemoryOptimized", - "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": - 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '845' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:12 GMT - RequestId: - - b095cdad-182a-4aa4-9764-5737a46819f7 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools/bf02ca4d-9f7d-4dec-a366-e8930cf8aeba - response: - body: - string: '{"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", "type": "Workspace", - "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": - {"enabled": false}}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '322' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:13 GMT - RequestId: - - 4645e20a-54e0-4f6c-ab09-c5a405f6b05f - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: '{"autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: PATCH - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools/bf02ca4d-9f7d-4dec-a366-e8930cf8aeba - response: - body: - string: '{"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", "type": "Workspace", - "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": - {"enabled": false}}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '322' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:13 GMT - RequestId: - - 32999cde-c3c1-43a2-9f09-106c6c2101e6 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces - response: - body: - string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": - "My workspace", "description": "", "type": "Personal"}, {"id": "81065bd8-e334-4715-b170-dedb4cd514e6", - "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created - by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Cache-Control: - - no-store, must-revalidate, no-cache - Content-Encoding: - - gzip - Content-Length: - - '2061' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:13 GMT - Pragma: - - no-cache - RequestId: - - e991c685-680f-4b4c-9399-01ed0455746f - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools - response: - body: - string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", - "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": - {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", - "type": "Workspace", "name": "fabcli000001", "nodeFamily": "MemoryOptimized", - "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": - 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '845' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:14 GMT - RequestId: - - fb634716-7fed-49d3-970b-c83431945019 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools/bf02ca4d-9f7d-4dec-a366-e8930cf8aeba - response: - body: - string: '{"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", "type": "Workspace", - "name": "fabcli000001", "nodeFamily": "MemoryOptimized", "nodeSize": "Small", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 3}, "dynamicExecutorAllocation": - {"enabled": false}}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '322' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:15 GMT - RequestId: - - f5c26e18-4779-4294-9879-52a0ccef75c5 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces - response: - body: - string: '{"value": [{"id": "3634a139-2c9e-4205-910b-3b089a31be47", "displayName": - "My workspace", "description": "", "type": "Personal"}, {"id": "81065bd8-e334-4715-b170-dedb4cd514e6", - "displayName": "fabriccli_WorkspacePerTestclass_000001", "description": "Created - by fab", "type": "Workspace", "capacityId": "00000000-0000-0000-0000-000000000004"}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Cache-Control: - - no-store, must-revalidate, no-cache - Content-Encoding: - - gzip - Content-Length: - - '2061' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:14 GMT - Pragma: - - no-cache - RequestId: - - 7868612d-12f5-43cf-a280-a6a7ec6e07f3 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: GET - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools - response: - body: - string: '{"value": [{"id": "00000000-0000-0000-0000-000000000000", "type": "Workspace", - "name": "Starter Pool", "nodeFamily": "MemoryOptimized", "nodeSize": "Medium", - "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": 10}, "dynamicExecutorAllocation": - {"enabled": true, "minExecutors": 1, "maxExecutors": 9}}, {"id": "bf02ca4d-9f7d-4dec-a366-e8930cf8aeba", - "type": "Workspace", "name": "fabcli000001", "nodeFamily": "MemoryOptimized", - "nodeSize": "Small", "autoScale": {"enabled": true, "minNodeCount": 1, "maxNodeCount": - 3}, "dynamicExecutorAllocation": {"enabled": false}}]}' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '845' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 31 Dec 2025 14:32:15 GMT - RequestId: - - 3af72a43-8a80-467f-b367-ef60cf509d8e - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - ms-fabric-cli-test/1.3.1 - method: DELETE - uri: https://api.fabric.microsoft.com/v1/workspaces/81065bd8-e334-4715-b170-dedb4cd514e6/spark/pools/bf02ca4d-9f7d-4dec-a366-e8930cf8aeba - response: - body: - string: '' - headers: - Access-Control-Expose-Headers: - - RequestId - Content-Length: - - '0' - Content-Type: - - application/octet-stream - Date: - - Wed, 31 Dec 2025 14:32:16 GMT - RequestId: - - fd9ec19a-1f56-4cab-90d8-3b8369dd29c6 - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - home-cluster-uri: - - https://wabi-us-central-b-primary-redirect.analysis.windows.net/ - request-redirected: - - 'true' - status: - code: 200 - message: OK -version: 1 From 73166a5c31d2673b6c8bd3ef97688d205eff5472 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 029/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 269107f68f2bcaf7a1e4ef2d4793a30b346b4794 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 030/176] Introduce release workflow --- .github/workflows/create-release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 026a334d..f49141dc 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,11 +113,8 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 43b04df72df589739714857e8b5d5a6e9d0e9d39 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 031/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f49141dc..696dd6d3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -115,6 +115,8 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 4eaca2cef8b1f907d32f3f505515042d40a948cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 032/176] Initial plan From 4ff4f18a60c1b89f21e7d05c7efa15257738cc57 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 033/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 696dd6d3..026a334d 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,6 +113,7 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: From 692e5d68dfd8a8985aedfd617c5817f51f5ead59 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 034/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 63e61f1a72873373d8792eef2de1cb72d9ce0b2c Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 035/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 9dc7758e0314fc96b43b080416c0aa8a3318d73f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 036/176] Initial plan From e2d5a0d4ef23be616d3d4e2f703fe44d6e6e9ed1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 037/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 0c9cfa240692cfb59a4e082d59aa512c1b96f546 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 038/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From c06933c295536f47cb955c6576988e27ba7fcdc4 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 039/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 026a334d..7200e840 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: "The version to release (e.g., v1.2.0)" required: true - commit_sha: - description: "Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)" - required: false - default: "" jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 980b4da447c7d1d2a61178df3ab7ef2cce3a9cbf Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 040/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 7200e840..ece87abc 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From a73b480ea9e5409a124c5a9207254b639fa98152 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 041/176] Initial plan From d1d5dc2c8383ea453bbd3ab27499c596e04bae29 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 042/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index ece87abc..497f5567 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: "The version to release (e.g., v1.2.0)" required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From 4005a96362dcaaaf9575ce74dae931ddaf9c192b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 043/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 497f5567..88b689df 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 31c17c1666cbc564cffb211b4048dc54fd0aae57 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 044/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From aa82800956077a32b7e0e482145a7359fc303b39 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 045/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 8a026ed1a8f732e62ed0994b4f2e7e2c62a6d62d Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 046/176] Introduce release workflow --- .github/workflows/create-release.yml | 142 +-------------------------- 1 file changed, 5 insertions(+), 137 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 88b689df..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -4,12 +4,8 @@ on: workflow_dispatch: inputs: version: - description: "The version to release (e.g., v1.2.0)" + description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From a4a7de2abdf7bf669d89cf3718e84f4948d07a00 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 047/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 28403cc7195b9e2c392594b7eb12c4320d4dc30d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 048/176] Initial plan From 2a42459ed157eb2facdc4aba7751168c9b61cf1a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 049/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From ed802ecfd7cba14e57cf80c3b6dc6c7b91ac5f49 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 050/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 75b7bf441974ab810f958373e45a92abc6ad4e91 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 051/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From e4db571f4bab71d8824b59d3266fba5b7cf16da2 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 052/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 0d7cff11aa74958e9b681150cdb4995b2b646ec5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 053/176] Introduce release workflow --- .github/workflows/create-release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 026a334d..f49141dc 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,11 +113,8 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From ff2aa75978148d4b3c9e4ffa0c2bef79fc6859dd Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 054/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f49141dc..696dd6d3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -115,6 +115,8 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 00144333b0d34f91924cd9a6d04d79b0940e4ec8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 055/176] Initial plan From 4abc444090b0836d5b58618522f3efc1a05c8cf6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 056/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 696dd6d3..026a334d 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,6 +113,7 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: From 24babb61c8302aeaaba7c3e2ebe836db4378c18d Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 057/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 642d10a2610ae3444a675d40644481b8e42d9919 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 058/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 1b3ad3f9f9281d91b7fb1349269ced841f18b6ad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 059/176] Initial plan From e5cf283a6c7581944973a7863279d3ad53f17de6 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 060/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From be6a304a49d64c8c50400b0d6674e2acbc712738 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 061/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From e7578247eacbca521b4d717e534dea528a2b6c4c Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 062/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 026a334d..7200e840 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: "The version to release (e.g., v1.2.0)" required: true - commit_sha: - description: "Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)" - required: false - default: "" jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 869bb6bd2a97f5d12d00cc6d0743b2cc5fff0f58 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 063/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 7200e840..ece87abc 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 8f4ba23eeee192703df42da92e403a0e511546de Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 064/176] Initial plan From fa7056864f4c024fa41551d631755869dbe3ccd4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 065/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index ece87abc..497f5567 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: "The version to release (e.g., v1.2.0)" required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From f57416ab582566ecab720423ff86ed499ed82974 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 066/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 497f5567..88b689df 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From c18c8d30b34c653b8b7893efe894ab7e1dd47e40 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 067/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 98fa381e573246ea4df706f5c1a04bf24bdb9fcd Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 068/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 3aa42353c1ab284d72612b47aab52edcf6f4f454 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 069/176] Introduce release workflow --- .github/workflows/create-release.yml | 142 +-------------------------- 1 file changed, 5 insertions(+), 137 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 88b689df..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -4,12 +4,8 @@ on: workflow_dispatch: inputs: version: - description: "The version to release (e.g., v1.2.0)" + description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 7e453d64ca2b8dc9bea68eb699d0712eec8eb765 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 070/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 097e44ff3208923e846078cf0cd41c8240a8bd1e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 071/176] Initial plan From aaf4c0a3a1dcfd5151c5db4ec7dcc5202d292947 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 072/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From b5fda2724ea36a42c369181e713b7b2b18af2680 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 073/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From c4d262553d4a6ef75d0b5b3f98a01cf027b4e957 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 074/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 22534b7b79736a5d8905969f775eb90e3326411f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 075/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 8218321d8e09fb006fcf80624104694c5f761e88 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 076/176] Introduce release workflow --- .github/workflows/create-release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..2feb06f7 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,11 +113,8 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 8f48c54f888b9acefbfb418eb0af3cd83c4d4190 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 077/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 2feb06f7..f4a9a119 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -115,6 +115,8 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 42d8e8866745f1001fa15738bf7a5d36d5dce5e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 078/176] Initial plan From d874933173938295cdc9ef4c28c6bb93bcb68eda Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 079/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f4a9a119..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,6 +113,7 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: From 9b087b7b6603bcbf8847fd1c0f0304b37c2c2386 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 080/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From ca2e8af8ade85be238e89b35db62c7e2b43098b5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 081/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 6d6995e7802631d10456f3c595ee19d8e1473523 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 082/176] Initial plan From 0d2f72ed0401c60be95dff323f166748b6f23548 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 083/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 8c835a3af54e92705fc88691e4ce61f6346f5bc3 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 084/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From c9d43338abd3dc43aeeafc370ac30bf1f230b4c7 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 085/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 683250486c360518401190641d1866dd1fedbf91 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 086/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 5d07d94bebef36e1a4b9e4f90d2765b41c6dd8fe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 087/176] Initial plan From f33129ecf9239e8bbc69f88059548bc6af8b20fb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 088/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From c1cbad8e0432f6ce898f2c79d44be1201239b3a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 089/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 8c7fc372a9aacec57a90c2083f59aa7b53baf8a3 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 090/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From a80d9ce2c1a1e1985c557f22c9a98d39394ee35f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 091/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From e88d7dc4bf04deded888e1469cf20d41798c9220 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 092/176] Initial plan From 7061a0ee41809de5b94ac99619125338f1a84a91 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 093/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 ++++++++++++--------------- 1 file changed, 65 insertions(+), 79 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,37 +24,31 @@ jobs: - name: Display workflow information run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF + echo "" >> $GITHUB_STEP_SUMMARY - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -90,26 +84,24 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -119,15 +111,13 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -135,35 +125,31 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY echo "Error: Failed to create release" exit 1 fi From ba8a91f25644d9bbe23dc72030b1a22436db3f43 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 094/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 29842dac996661b1c6d7014e3699306ac7654ab2 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 095/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From a54718d3f76b6bee35844f163ec32b647130ba48 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 096/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 54f76b01ee6dcb8cad079da38ccbdc5409bd8d61 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 097/176] Introduce release workflow --- .github/workflows/create-release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..2feb06f7 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,11 +113,8 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 5450d36b3d69010da9f3eddaec8e1f79ca1a52c4 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 098/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 2feb06f7..f4a9a119 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -115,6 +115,8 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From de233305883605e42ec3e1fb43c9925d1d926533 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 099/176] Initial plan From 2db59e01002330de96dcdcd104e3e913699b8acf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 100/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f4a9a119..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,6 +113,7 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: From c543b3d4e37dd78261413d54c26700c5c0e2b419 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 101/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 6cf16f14325b44092b5ff521f998f4e7aa601d1b Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 102/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From fc662ec6e4ab91fddaae87219a0001b77a4f0944 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 103/176] Initial plan From de4d51ce8fb08419d3d5cef1dd5162860a8cadb6 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 104/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 9cc9098260c020165698af00b58c63c718c535aa Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 105/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 8c3acaf671ed646f1a4405b2b17a726977e8a51a Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 106/176] Introduce release workflow --- .github/workflows/create-release.yml | 77 ++-------------------------- 1 file changed, 4 insertions(+), 73 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..c0810d67 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -88,82 +88,13 @@ jobs: - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 8f348332cf98aa9b50e84aa3caccacfc19338041 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 107/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c0810d67..09cd2ddc 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -94,7 +94,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 0aaa4e97ae9392b088e51f58dfc3b9b5386e2f05 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 108/176] Initial plan From 26f7921f75409ba792c462bd251fc5be1af47c6a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 109/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 109 ++++++++++++++++++++------- 1 file changed, 83 insertions(+), 26 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 09cd2ddc..c5bd8988 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -10,6 +10,10 @@ on: description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' required: false default: '' + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -24,37 +28,31 @@ jobs: - name: Display workflow information run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF + echo "" >> $GITHUB_STEP_SUMMARY - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -88,15 +86,74 @@ jobs: - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From b64c0324909c595ed99ea99247c30e67bed9b4e4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 110/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c5bd8988..6f0b3c4f 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -28,31 +28,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -88,24 +94,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -115,13 +123,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -129,31 +139,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From d70089f8a5425c46de5ba895e8b6edc1effe5c03 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 111/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 7b134921bbdb80aa68b210800f4035c764b92dd5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 112/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 2deaefd1db7a99f08d11d016ead6934c399f39a4 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 113/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 6f0b3c4f..0e98a3e9 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -10,10 +10,6 @@ on: description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' required: false default: '' - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -23,151 +19,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 58f421ead3a0a7fd218fadd9f906c0750c7d902d Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 114/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 0e98a3e9..11585f2f 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -35,7 +35,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From e9bd691b8745867e546bc78992549c582c9e0cbc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 115/176] Initial plan From 632dac0ae1e1e21949cb469c2462efa1bf7760a0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 116/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 120 ++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 11585f2f..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -19,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From 3bf5ac9c57509e73fac8b3c608094560283b00c6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 117/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 556b7d81e749474e549706949227721139f9e4dc Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 118/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From ebc4bfdd33fbabb87b3cb6638b7dd00b1881db15 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 119/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 1b781290d64c4c442c7fe61b59d65d1c7a3e0111 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 120/176] Introduce release workflow --- .github/workflows/create-release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..2feb06f7 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,11 +113,8 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From 6048a29ba94cc58f3c9eaeb7471333efef74cd00 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 121/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 2feb06f7..f4a9a119 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -115,6 +115,8 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | cat >> $GITHUB_STEP_SUMMARY << EOF ## đŸ—ī¸ Creating Release From c245e6047c28df4da4ecb00284bd800015b08577 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 122/176] Initial plan From fadeb9364f368ee559ce62bb1c9c851f9433f38e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 123/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index f4a9a119..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -113,6 +113,7 @@ jobs: echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: From d19fb66be290295be291be6a4eeb43930855defa Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 124/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 155acba2674fdfebd0488674986ba5ea7160d995 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 125/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 155991bfeb8f9eef5ac55a40ba7dfaf17429beff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 126/176] Initial plan From 94fe86292d02d965ac2db1ae80e0156d42f062e1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 127/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From f8307a21a2d1d0f8e8ad1471d7ff1d454b9ff0d5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 128/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 5852e12b40a983954257112ae02a6f9de0a50faa Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 129/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From e8400a324460fabd99c2347d9e615d24fc12c914 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 130/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 8419b52a59bcfd6cb51366eee149f9770d2791fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 131/176] Initial plan From 3d871ec3040295524ef5e9bdf0d86b0563efa155 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 132/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From 36ac241347a6e553928347d1462a1306b3e6b9e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 133/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 4678bbd3d729429a72582ed00d69f639c267790c Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 134/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 2ff6ce89f398b65becdd555e5999a4eb0bd7c745 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 135/176] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 4e23ee17e43287155fd0c953858f64f6b149ddfe Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 136/176] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 4ef6c5310e5104bbaa83aaaae7be1a90d4cb9da3 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 137/176] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From dd8ccac1f8f4fe60b71397082701ff1fd2df5d7a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 138/176] Initial plan From f3108ec49c5db09c10b07de26523b0ee8067ede2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 139/176] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From 06d3d82a93ee97cb2e1742062a3802453874010b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 140/176] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 56be8f369a2027fe3e208cca8dd2864b54135b00 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 141/176] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From a3c407a5cc3234fa41e677a3eea7e29d91ddcc09 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 12:27:11 +0200 Subject: [PATCH 142/176] feat: add AI-powered issue triage workflow Add automated issue triage using github/ai-assessment-comment-labeler: - Bug triage prompt: validates reports against CLI architecture and Fabric APIs - Feature triage prompt: assesses value, community implementability, long-term viability - Question prompt: answers using CLI/Fabric knowledge, redirects when needed - Workflow triggers on 'needs triage' label (existing policy) - Post-processing: auto-adds 'help wanted' and 'needs author feedback' labels - Removes 'needs triage' when AI handles it; keeps it for human-required reviews - Generates job summary + artifact for each triage run - Phase-controlled via SUPPRESS_COMMENTS/SUPPRESS_LABELS env vars - Add 'bug' label to bug issue template for prompt routing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/1-bug.yml | 2 +- .github/prompts/bug-triage.prompt.yml | 58 +++++++ .github/prompts/feature-triage.prompt.yml | 61 +++++++ .github/prompts/question-triage.prompt.yml | 77 +++++++++ .github/workflows/ai-issue-triage.yml | 176 +++++++++++++++++++++ 5 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 .github/prompts/bug-triage.prompt.yml create mode 100644 .github/prompts/feature-triage.prompt.yml create mode 100644 .github/prompts/question-triage.prompt.yml create mode 100644 .github/workflows/ai-issue-triage.yml diff --git a/.github/ISSUE_TEMPLATE/1-bug.yml b/.github/ISSUE_TEMPLATE/1-bug.yml index 39545588..175dc1c2 100644 --- a/.github/ISSUE_TEMPLATE/1-bug.yml +++ b/.github/ISSUE_TEMPLATE/1-bug.yml @@ -1,7 +1,7 @@ name: "🐛 Bug Report" description: Create a report to help us improve fabric-cli title: "[BUG] " -labels: [] +labels: ["bug"] body: - type: markdown attributes: diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml new file mode 100644 index 00000000..f4313827 --- /dev/null +++ b/.github/prompts/bug-triage.prompt.yml @@ -0,0 +1,58 @@ +messages: + - role: system + content: >+ + You are a senior engineer triaging bug reports for **Microsoft Fabric CLI** (`fab`), an open-source Python CLI for Microsoft Fabric. + + ## About the CLI + + - Python 3.10-3.13, argparse-based command parsing, pip-installable (`pip install ms-fabric-cli`). + - Models Fabric as a filesystem-like hierarchy with dot-suffix entity names: + `/Workspace1.Workspace/FolderA.Folder/SemanticModel1.SemanticModel` + - Supports nested folders (up to ~10 levels), hidden entities (`.capacities`, `.gateways`, `.sparkpools`). + - Two modes: **interactive** (REPL) and **command-line** (single process). + - Authentication: interactive browser, service principal (secret/cert/federated credential), managed identity, access token env var. + - Commands: `ls`, `get`, `set`, `rm`, `cd`, `import`, `export`, `open`, `auth login/logout/status`, etc. + - Official CLI docs: https://microsoft.github.io/fabric-cli + - Fabric REST API docs: https://learn.microsoft.com/en-us/rest/api/fabric/ + - Power BI REST API docs: https://learn.microsoft.com/en-us/rest/api/power-bi/ + - Fabric Capacity Azure REST API docs: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + + ## Your Task + + Analyze the bug report and determine: + + 1. **Completeness**: Does the report include reproduction steps, CLI version, Python version, OS, CLI mode, auth method, expected vs actual behavior? Identify any missing elements. + 2. **Plausibility**: Based on the CLI architecture and Fabric REST APIs, is this likely a genuine bug, a user misconfiguration, or a documentation gap? + 3. **Severity**: Could this be a data-loss, security, or authentication issue requiring urgent attention? + + ## Assessment Categories + + Use exactly one of these in your assessment header: + - **Confirmed Bug** — The report describes behavior that clearly deviates from expected CLI behavior or documented Fabric API behavior. + - **Likely Misconfiguration** — The described behavior is consistent with incorrect usage, wrong auth setup, or path syntax errors. Provide guidance on the correct approach. + - **Missing Details** — The report lacks critical information needed to evaluate. Specify exactly what is missing. + - **Needs Team Review** — The issue is complex, ambiguous, or touches sensitive areas (auth, security, data integrity) and requires human review. + + ## Response Guidelines + + - Be professional, gentle, and official. You represent the Fabric CLI project. + - Thank the reporter for taking the time to file the bug. + - If the issue seems like a misconfiguration, explain the correct approach with examples using the CLI's path syntax. + - If details are missing, list the specific information needed. + - Reference official Fabric CLI docs at `https://microsoft.github.io/fabric-cli` when helpful. + - Do not speculate about internal implementation details you are uncertain about. + - Keep your response concise but thorough. + + ## Response Format + + Start your response with a markdown header in this exact format: + ### AI Assessment: + + Then provide your analysis in clearly structured sections. + - role: user + content: '{{input}}' +model: openai/gpt-4o +modelParameters: + max_tokens: 1000 +testData: [] +evaluators: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml new file mode 100644 index 00000000..1630238e --- /dev/null +++ b/.github/prompts/feature-triage.prompt.yml @@ -0,0 +1,61 @@ +messages: + - role: system + content: >+ + You are a product-minded engineer evaluating feature requests for **Microsoft Fabric CLI** (`fab`), an open-source Python CLI for Microsoft Fabric. + + ## About the CLI + + - Python 3.10-3.13, argparse-based command parsing, pip-installable (`pip install ms-fabric-cli`). + - Models Fabric as a filesystem-like hierarchy with dot-suffix entity names: + `/Workspace1.Workspace/FolderA.Folder/SemanticModel1.SemanticModel` + - Key design principles: path-first UX, stable verbs (`ls`, `get`, `set`, `rm`), consistent flags across item types, backward compatibility. + - Supports nested folders, hidden entities (`.capacities`, `.gateways`), interactive and command-line modes. + - Authentication: interactive browser, service principal (secret/cert/federated credential), managed identity. + - Official CLI docs: https://microsoft.github.io/fabric-cli + - Fabric REST API docs: https://learn.microsoft.com/en-us/rest/api/fabric/ + - Power BI REST API docs: https://learn.microsoft.com/en-us/rest/api/power-bi/ + - Fabric Capacity Azure REST API docs: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + + ## Your Task + + Evaluate the feature request across these dimensions: + + 1. **Value Proposition**: Does this solve a real, recurring need? How many users would benefit? Does it reduce friction in common workflows? + 2. **Alignment**: Does it fit the CLI's design principles (path-first UX, stable verbs, dot-suffix entities, filesystem-like hierarchy)? Is it consistent with existing command patterns? + 3. **Backward Compatibility**: Can this be added without breaking existing commands, flags, or output formats? + 4. **Long-Term Viability**: Is this a durable addition that will remain useful as Fabric evolves, or is it a short-term workaround? Think mid-to-long term. + 5. **Feasibility**: Is there a supporting Fabric REST API? Is the implementation scope reasonable? + 6. **Community Implementability**: Is the feature well-scoped with clear API boundaries, making it suitable for a community contributor? If yes, suggest where in the codebase to start (e.g., commands directory, utils). + + ## Assessment Categories + + Use exactly one of these in your assessment header: + - **Valuable Enhancement** — The feature provides clear value, aligns with CLI design, and should be prioritized by the team. + - **Help Wanted** — The feature is valuable and well-scoped enough for community contribution. Provide implementation guidance. + - **Needs Discussion** — The feature has merit but raises design questions, scope concerns, or trade-offs that need team input. + - **Needs Team Review** — The feature is too complex, touches core architecture, or requires team expertise to evaluate properly. Escalate to the team. + - **Out of Scope** — The feature doesn't align with the CLI's purpose, duplicates existing functionality, or is better served by other tools (Fabric portal, REST API directly, PowerShell). + + ## Response Guidelines + + - Be professional, gentle, and official. You represent the Fabric CLI project. + - Thank the contributor for their suggestion. + - Be encouraging, especially for ideas that could become community contributions. + - If marking as "Help Wanted", suggest concrete starting points (relevant directories, similar existing commands to reference, applicable Fabric REST APIs). + - If marking as "Out of Scope", explain why kindly and suggest alternative approaches. + - Reference official CLI docs (https://microsoft.github.io/fabric-cli) and Fabric REST API docs when relevant. + - Keep your response concise but thorough. + + ## Response Format + + Start your response with a markdown header in this exact format: + ### AI Assessment: + + Then provide your analysis in clearly structured sections. + - role: user + content: '{{input}}' +model: openai/gpt-4o +modelParameters: + max_tokens: 1000 +testData: [] +evaluators: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml new file mode 100644 index 00000000..32bf0a50 --- /dev/null +++ b/.github/prompts/question-triage.prompt.yml @@ -0,0 +1,77 @@ +messages: + - role: system + content: >+ + You are a knowledgeable support engineer for **Microsoft Fabric CLI** (`fab`), an open-source Python CLI for Microsoft Fabric. + + ## About the CLI + + - Python 3.10-3.13, argparse-based command parsing, pip-installable (`pip install ms-fabric-cli`). + - Models Fabric as a filesystem-like hierarchy with dot-suffix entity names: + `/Workspace1.Workspace/FolderA.Folder/Item1.SemanticModel` + - Supports nested folders (up to ~10 levels), hidden entities accessed via `-a` flag or dot-prefix (`.capacities`, `.gateways`, `.sparkpools`, `.domains`, `.connections`). + - Two modes: **interactive** (REPL-like, no `fab` prefix needed) and **command-line** (single process, `fab `). + - Authentication methods: + - Interactive browser login: `fab auth login` + - Service principal with secret: env vars `FAB_SPN_ID`, `FAB_SPN_SECRET`, `FAB_TENANT_ID` + - Service principal with certificate: env vars with cert path + - Service principal with federated credential: `FAB_SPN_FEDERATED_TOKEN` + - Managed identity: `fab auth login --managed-identity` + - Access token: `FAB_ACCESS_TOKEN` env var + - Common commands: `ls`, `get`, `set`, `rm`, `cd`, `import`, `export`, `open`, `auth login/logout/status` + - Path examples: + - List workspace contents: `fab ls /MyWorkspace.Workspace/` + - Get an item: `fab get /MyWorkspace.Workspace/MyNotebook.Notebook` + - Navigate folders: `fab ls /MyWorkspace.Workspace/FolderA.Folder/` + - Hidden entities: `fab ls -a .capacities` + - Config stored in `~/.config/fab/` (config.json, auth.json, cache.bin) + - Official CLI docs: https://microsoft.github.io/fabric-cli + - Fabric REST API docs: https://learn.microsoft.com/en-us/rest/api/fabric/ + - Power BI REST API docs: https://learn.microsoft.com/en-us/rest/api/power-bi/ + - Fabric Capacity Azure REST API docs: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + + ## Your Task + + Answer the user's question as thoroughly and accurately as possible: + + 1. If the question is about **CLI usage**, provide clear instructions with command examples using the dot-suffix path syntax. + 2. If the question is about **Fabric concepts** (workspaces, lakehouses, semantic models, etc.), explain in the context of how the CLI interacts with them. + 3. If the question is about **authentication**, provide the relevant method and configuration steps. + 4. If the question is about **general Microsoft Fabric** (not CLI-specific), kindly redirect to the appropriate channel. + 5. If you are **uncertain** about the answer or the question requires internal knowledge, escalate to the team. + + ## Assessment Categories + + Use exactly one of these in your assessment header: + - **Answered** — You were able to provide a complete, accurate answer to the question. + - **Needs Maintainer Input** — The question requires internal knowledge, involves undocumented behavior, or touches on roadmap/design decisions that only the team can answer. + - **Redirect to Docs** — The question is better answered by existing documentation or is about general Fabric (not CLI-specific). Provide the relevant links. + + ## Response Guidelines + + - Be professional, gentle, and official. You represent the Fabric CLI project. + - Thank the user for their question. + - Provide concrete command examples when applicable. + - Always use the dot-suffix path syntax in examples (e.g., `MyWorkspace.Workspace`, not just `MyWorkspace`). + - Link to official documentation when relevant: + - CLI docs: https://microsoft.github.io/fabric-cli + - Fabric REST API: https://learn.microsoft.com/en-us/rest/api/fabric/ + - Power BI REST API: https://learn.microsoft.com/en-us/rest/api/power-bi/ + - Fabric Capacity Azure REST API: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + - Community Forum: https://community.fabric.microsoft.com/t5/Developer/bd-p/Developer + - Fabric Ideas Portal: https://ideas.fabric.microsoft.com/ + - If redirecting, be helpful — don't just say "go elsewhere", explain why and which specific resource would help. + - Keep your response concise but thorough. + + ## Response Format + + Start your response with a markdown header in this exact format: + ### AI Assessment: + + Then provide your answer in clearly structured sections. + - role: user + content: '{{input}}' +model: openai/gpt-4o +modelParameters: + max_tokens: 1500 +testData: [] +evaluators: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml new file mode 100644 index 00000000..af809684 --- /dev/null +++ b/.github/workflows/ai-issue-triage.yml @@ -0,0 +1,176 @@ +name: AI Issue Triage + +on: + issues: + types: [labeled] + +jobs: + ai-triage: + if: github.event.label.name == 'needs triage' + runs-on: ubuntu-latest + permissions: + issues: write + models: read + contents: read + + env: + SUPPRESS_LABELS: 'false' + SUPPRESS_COMMENTS: 'false' + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Run AI assessment + id: ai-assessment + uses: github/ai-assessment-comment-labeler@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + issue_number: ${{ github.event.issue.number }} + issue_body: ${{ github.event.issue.body }} + repo_name: ${{ github.event.repository.name }} + owner: ${{ github.repository_owner }} + ai_review_label: 'needs triage' + prompts_directory: '.github/prompts' + labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' + model: 'openai/gpt-4o' + max_tokens: 1500 + # ------------------------------------------------------- + # Phase control — toggle these two flags to switch phases: + # Phase 1 & 2 (fork): false / false + # Phase 3 (main): true / true + # Phase 4 (main): false / false + # ------------------------------------------------------- + suppress_comments: ${{ env.SUPPRESS_COMMENTS }} + suppress_labels: ${{ env.SUPPRESS_LABELS }} + + - name: Post-process triage results + if: steps.ai-assessment.outputs.ai_assessments != '' + uses: actions/github-script@v7 + env: + ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} + SUPPRESS_LABELS: ${{ env.SUPPRESS_LABELS }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const assessments = JSON.parse(process.env.ASSESSMENT_OUTPUT); + const issueNumber = context.issue.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + const suppressLabels = process.env.SUPPRESS_LABELS === 'true'; + + let needsHumanReview = false; + let addHelpWanted = false; + let needsAuthorFeedback = false; + + for (const assessment of assessments) { + const label = (assessment.assessmentLabel || '').toLowerCase(); + const response = assessment.response || ''; + + // Check if the assessment requires human review + if (label.includes('needs team review') || label.includes('needs maintainer input')) { + needsHumanReview = true; + } + + // Check if feature should be tagged as help wanted + if (label.includes('help wanted')) { + addHelpWanted = true; + } + + // Check if more information is needed from the issue author + if (label.includes('missing details')) { + needsAuthorFeedback = true; + } + + // Log for job summary + core.info(`Prompt: ${assessment.prompt}, Label: ${assessment.assessmentLabel}`); + } + + // Skip label changes in summary-only mode (Phase 3) + if (suppressLabels) { + core.info('Labels suppressed (summary-only mode) — skipping post-process label changes.'); + return; + } + + // Add 'needs author feedback' label if AI determined details are missing + if (needsAuthorFeedback) { + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: issueNumber, + labels: ['needs author feedback'] + }); + core.info('Added "needs author feedback" label based on AI assessment.'); + } + + // Add 'help wanted' label if AI recommended community contribution + if (addHelpWanted) { + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: issueNumber, + labels: ['help wanted'] + }); + core.info('Added "help wanted" label based on AI assessment.'); + } + + // If AI fully handled the issue, remove 'needs triage' so the team isn't notified + if (!needsHumanReview) { + try { + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: issueNumber, + name: 'needs triage' + }); + core.info('Removed "needs triage" — AI handled this issue.'); + } catch (e) { + // Label may have already been removed by the action + core.info(`Could not remove "needs triage" label: ${e.message}`); + } + } else { + core.info('Keeping "needs triage" — this issue requires human review.'); + } + + - name: Generate triage summary + if: always() && steps.ai-assessment.outputs.ai_assessments != '' + uses: actions/github-script@v7 + env: + ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} + with: + script: | + const assessments = JSON.parse(process.env.ASSESSMENT_OUTPUT); + const issueNumber = context.issue.number; + const issueTitle = context.payload.issue.title; + const issueUrl = context.payload.issue.html_url; + + let summary = `## 🤖 AI Triage Report\n\n`; + summary += `**Issue:** [#${issueNumber} — ${issueTitle}](${issueUrl})\n\n`; + + for (const assessment of assessments) { + summary += `### Prompt: \`${assessment.prompt}\`\n`; + summary += `**Assessment Label:** \`${assessment.assessmentLabel}\`\n\n`; + summary += `
Full AI Response\n\n`; + summary += `${assessment.response}\n\n`; + summary += `
\n\n---\n\n`; + } + + // Write to job summary + core.summary.addRaw(summary); + await core.summary.write(); + + // Also write to file for artifact upload + const fs = require('fs'); + fs.mkdirSync('triage-reports', { recursive: true }); + fs.writeFileSync( + `triage-reports/issue-${issueNumber}-triage.md`, + summary + ); + + - name: Upload triage report + if: always() && steps.ai-assessment.outputs.ai_assessments != '' + uses: actions/upload-artifact@v4 + with: + name: triage-report-issue-${{ github.event.issue.number }} + path: triage-reports/ + retention-days: 30 From e3342f3591819ba469565b2fc6a6856b401f4db3 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 12:32:20 +0200 Subject: [PATCH 143/176] feat: add workflow_dispatch trigger for manual testing Add manual dispatch input (issue_number) so the workflow can be tested from any branch without merging to main. All steps now resolve issue details dynamically via the GitHub API instead of relying on event payload. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 45 +++++++++++++++++++++------ 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index af809684..3ed90bd5 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -3,10 +3,16 @@ name: AI Issue Triage on: issues: types: [labeled] + workflow_dispatch: + inputs: + issue_number: + description: 'Issue number to triage' + required: true + type: number jobs: ai-triage: - if: github.event.label.name == 'needs triage' + if: github.event_name == 'workflow_dispatch' || github.event.label.name == 'needs triage' runs-on: ubuntu-latest permissions: issues: write @@ -21,14 +27,31 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Resolve issue details + id: issue + uses: actions/github-script@v7 + with: + script: | + const issueNumber = context.payload.issue?.number || ${{ inputs.issue_number || 0 }}; + const { data: issue } = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + }); + core.setOutput('number', issue.number); + core.setOutput('body', issue.body || ''); + core.setOutput('title', issue.title); + core.setOutput('html_url', issue.html_url); + core.setOutput('labels', issue.labels.map(l => l.name).join(',')); + - name: Run AI assessment id: ai-assessment uses: github/ai-assessment-comment-labeler@v1 with: token: ${{ secrets.GITHUB_TOKEN }} - issue_number: ${{ github.event.issue.number }} - issue_body: ${{ github.event.issue.body }} - repo_name: ${{ github.event.repository.name }} + issue_number: ${{ steps.issue.outputs.number }} + issue_body: ${{ steps.issue.outputs.body }} + repo_name: ${{ github.event.repository.name || github.repository }} owner: ${{ github.repository_owner }} ai_review_label: 'needs triage' prompts_directory: '.github/prompts' @@ -50,11 +73,12 @@ jobs: env: ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} SUPPRESS_LABELS: ${{ env.SUPPRESS_LABELS }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const assessments = JSON.parse(process.env.ASSESSMENT_OUTPUT); - const issueNumber = context.issue.number; + const issueNumber = parseInt(process.env.ISSUE_NUMBER); const owner = context.repo.owner; const repo = context.repo.repo; const suppressLabels = process.env.SUPPRESS_LABELS === 'true'; @@ -137,12 +161,15 @@ jobs: uses: actions/github-script@v7 env: ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + ISSUE_TITLE: ${{ steps.issue.outputs.title }} + ISSUE_URL: ${{ steps.issue.outputs.html_url }} with: script: | const assessments = JSON.parse(process.env.ASSESSMENT_OUTPUT); - const issueNumber = context.issue.number; - const issueTitle = context.payload.issue.title; - const issueUrl = context.payload.issue.html_url; + const issueNumber = process.env.ISSUE_NUMBER; + const issueTitle = process.env.ISSUE_TITLE; + const issueUrl = process.env.ISSUE_URL; let summary = `## 🤖 AI Triage Report\n\n`; summary += `**Issue:** [#${issueNumber} — ${issueTitle}](${issueUrl})\n\n`; @@ -171,6 +198,6 @@ jobs: if: always() && steps.ai-assessment.outputs.ai_assessments != '' uses: actions/upload-artifact@v4 with: - name: triage-report-issue-${{ github.event.issue.number }} + name: triage-report-issue-${{ steps.issue.outputs.number }} path: triage-reports/ retention-days: 30 From f7d3b324d7291a1ef6c1cf035473b48fcf679835 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 12:37:37 +0200 Subject: [PATCH 144/176] fix: use correct action version tag v1.0.1 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 3ed90bd5..c042b14f 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -46,7 +46,7 @@ jobs: - name: Run AI assessment id: ai-assessment - uses: github/ai-assessment-comment-labeler@v1 + uses: github/ai-assessment-comment-labeler@v1.0.1 with: token: ${{ secrets.GITHUB_TOKEN }} issue_number: ${{ steps.issue.outputs.number }} From cb9d9171b322dcb87195f4d318c8b49849ccc5ca Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 12:47:00 +0200 Subject: [PATCH 145/176] fix: rename Confirmed Bug to Potential Bug in triage AI should recommend potential bugs to the team rather than confirming them. Team makes the final determination based on AI input. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 4 +++- .github/workflows/ai-issue-triage.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index f4313827..30db2b9c 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -28,11 +28,13 @@ messages: ## Assessment Categories Use exactly one of these in your assessment header: - - **Confirmed Bug** — The report describes behavior that clearly deviates from expected CLI behavior or documented Fabric API behavior. + - **Potential Bug** — The report describes behavior that appears to deviate from expected CLI behavior or documented Fabric API behavior. Recommend to the team for further investigation and confirmation. - **Likely Misconfiguration** — The described behavior is consistent with incorrect usage, wrong auth setup, or path syntax errors. Provide guidance on the correct approach. - **Missing Details** — The report lacks critical information needed to evaluate. Specify exactly what is missing. - **Needs Team Review** — The issue is complex, ambiguous, or touches sensitive areas (auth, security, data integrity) and requires human review. + Important: You must never confirm that something is definitively a bug. Your role is to analyze the report and provide a recommendation to the team, who will make the final determination based on your input. + ## Response Guidelines - Be professional, gentle, and official. You represent the Fabric CLI project. diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index c042b14f..88313d78 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -92,7 +92,7 @@ jobs: const response = assessment.response || ''; // Check if the assessment requires human review - if (label.includes('needs team review') || label.includes('needs maintainer input')) { + if (label.includes('needs team review') || label.includes('needs maintainer input') || label.includes('potential bug')) { needsHumanReview = true; } From 1714b59da7eb1db4abcf44b7d7cc92cebb92b343 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 12:50:37 +0200 Subject: [PATCH 146/176] =?UTF-8?q?fix:=20tighten=20prompt=20tone=20?= =?UTF-8?q?=E2=80=94=20concise,=20crisp,=20expert-level=20responses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enforce 3-5 paragraph max, no filler, no repeating issue content, minimal pleasantries. Reference docs only when directly relevant. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 15 ++++++++------- .github/prompts/feature-triage.prompt.yml | 14 +++++++------- .github/prompts/question-triage.prompt.yml | 19 ++++++++----------- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 30db2b9c..021dc893 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -37,13 +37,14 @@ messages: ## Response Guidelines - - Be professional, gentle, and official. You represent the Fabric CLI project. - - Thank the reporter for taking the time to file the bug. - - If the issue seems like a misconfiguration, explain the correct approach with examples using the CLI's path syntax. - - If details are missing, list the specific information needed. - - Reference official Fabric CLI docs at `https://microsoft.github.io/fabric-cli` when helpful. - - Do not speculate about internal implementation details you are uncertain about. - - Keep your response concise but thorough. + - Be concise, crisp, and professional. You represent the Fabric CLI project. + - Write like an expert — short sentences, no filler, no pleasantries beyond a brief acknowledgment. + - Do not repeat information from the issue back to the reporter. + - If the issue seems like a misconfiguration, state the correct approach directly with a CLI example. + - If details are missing, list exactly what is needed — nothing more. + - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli + - Do not speculate about internal implementation details. + - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Response Format diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 1630238e..d760414d 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -38,13 +38,13 @@ messages: ## Response Guidelines - - Be professional, gentle, and official. You represent the Fabric CLI project. - - Thank the contributor for their suggestion. - - Be encouraging, especially for ideas that could become community contributions. - - If marking as "Help Wanted", suggest concrete starting points (relevant directories, similar existing commands to reference, applicable Fabric REST APIs). - - If marking as "Out of Scope", explain why kindly and suggest alternative approaches. - - Reference official CLI docs (https://microsoft.github.io/fabric-cli) and Fabric REST API docs when relevant. - - Keep your response concise but thorough. + - Be concise, crisp, and professional. You represent the Fabric CLI project. + - Write like an expert — short sentences, no filler, no pleasantries beyond a brief acknowledgment. + - Do not repeat the feature description back to the requester. + - If marking as "Help Wanted", give a concrete starting point (directory, similar command, relevant API). + - If marking as "Out of Scope", state why directly and suggest an alternative. + - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli + - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Response Format diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 32bf0a50..d32e0ef0 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -48,19 +48,16 @@ messages: ## Response Guidelines - - Be professional, gentle, and official. You represent the Fabric CLI project. - - Thank the user for their question. - - Provide concrete command examples when applicable. - - Always use the dot-suffix path syntax in examples (e.g., `MyWorkspace.Workspace`, not just `MyWorkspace`). - - Link to official documentation when relevant: - - CLI docs: https://microsoft.github.io/fabric-cli + - Be concise, crisp, and professional. You represent the Fabric CLI project. + - Write like an expert — short sentences, no filler, no pleasantries beyond a brief acknowledgment. + - Do not repeat the question back to the user. + - Provide concrete CLI examples using dot-suffix path syntax when applicable. + - Link to docs only when directly relevant: + - CLI: https://microsoft.github.io/fabric-cli - Fabric REST API: https://learn.microsoft.com/en-us/rest/api/fabric/ - - Power BI REST API: https://learn.microsoft.com/en-us/rest/api/power-bi/ - - Fabric Capacity Azure REST API: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities - Community Forum: https://community.fabric.microsoft.com/t5/Developer/bd-p/Developer - - Fabric Ideas Portal: https://ideas.fabric.microsoft.com/ - - If redirecting, be helpful — don't just say "go elsewhere", explain why and which specific resource would help. - - Keep your response concise but thorough. + - If redirecting, state where and why in one sentence. + - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Response Format From cbc51ba5336481adce70bf76df641b7e8f4cf7c1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 13:07:52 +0200 Subject: [PATCH 147/176] feat: add clear status footers and team escalation notifications - All prompts now end with a Next Steps section making it clear who needs to act (awaiting author / escalated to team / no action needed) - Workflow @mentions @microsoft/fabric-cli-dev on escalated issues so team gets email notifications only when attention is required Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 9 ++++ .github/prompts/feature-triage.prompt.yml | 9 ++++ .github/prompts/question-triage.prompt.yml | 9 ++++ .github/workflows/ai-issue-triage.yml | 54 ++++++++++++++++++++-- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 021dc893..98d23f20 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -46,12 +46,21 @@ messages: - Do not speculate about internal implementation details. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. + ## Re-triage + + If the input starts with `[RE-TRIAGE]`, this issue was previously assessed and the author has responded with additional information. Focus your assessment on the new information provided. Do not repeat your prior analysis — evaluate whether the author's response resolves the gaps or changes the assessment. + ## Response Format Start your response with a markdown header in this exact format: ### AI Assessment: Then provide your analysis in clearly structured sections. + + End every response with a **Next Steps** section using exactly one of these: + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing) + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) + - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' model: openai/gpt-4o diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index d760414d..a193c100 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -46,12 +46,21 @@ messages: - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. + ## Re-triage + + If the input starts with `[RE-TRIAGE]`, this issue was previously assessed and the author has responded with additional information. Focus your assessment on the new information provided. Do not repeat your prior analysis — evaluate whether the author's response resolves the gaps or changes the assessment. + ## Response Format Start your response with a markdown header in this exact format: ### AI Assessment: Then provide your analysis in clearly structured sections. + + End every response with a **Next Steps** section using exactly one of these: + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing) + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) + - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' model: openai/gpt-4o diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index d32e0ef0..efa520e6 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -59,12 +59,21 @@ messages: - If redirecting, state where and why in one sentence. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. + ## Re-triage + + If the input starts with `[RE-TRIAGE]`, this issue was previously assessed and the author has responded with additional information. Focus your assessment on the new information provided. Do not repeat your prior analysis — evaluate whether the author's response resolves the gaps or changes the assessment. + ## Response Format Start your response with a markdown header in this exact format: ### AI Assessment: Then provide your answer in clearly structured sections. + + End every response with a **Next Steps** section using exactly one of these: + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing or question needs clarification) + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) + - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) - role: user content: '{{input}}' model: openai/gpt-4o diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 88313d78..9d49dee8 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -33,16 +33,53 @@ jobs: with: script: | const issueNumber = context.payload.issue?.number || ${{ inputs.issue_number || 0 }}; + const owner = context.repo.owner; + const repo = context.repo.repo; + const { data: issue } = await github.rest.issues.get({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issueNumber, + owner, repo, issue_number: issueNumber, + }); + + // Detect re-triage: check if any ai: labels exist from a prior assessment + const hasAiLabels = issue.labels.some(l => l.name.startsWith('ai:')); + + // Check for prior AI assessment comments + const { data: comments } = await github.rest.issues.listComments({ + owner, repo, issue_number: issueNumber, per_page: 100, }); + const hasAiComment = comments.some(c => + c.body && c.body.includes('### AI Assessment:') + ); + + const isRetriage = hasAiLabels || hasAiComment; + let issueBody = issue.body || ''; + + if (isRetriage) { + // Find the last AI comment index + const lastAiIdx = comments.reduce((acc, c, i) => + c.body && c.body.includes('### AI Assessment:') ? i : acc, -1); + + // Collect author replies after the last AI comment + const authorReplies = comments + .slice(lastAiIdx + 1) + .filter(c => c.user.login === issue.user.login) + .map(c => c.body) + .join('\n\n---\n\n'); + + if (authorReplies) { + issueBody = `[RE-TRIAGE] The author has provided additional information in response to a prior AI assessment.\n\n` + + `## Original Issue Summary\n${issue.title}\n\n` + + `## Author's Follow-up Response\n${authorReplies}\n\n` + + `Focus your assessment on the new information provided above. Reference the original issue only if needed for context.`; + } + } + core.setOutput('number', issue.number); - core.setOutput('body', issue.body || ''); + core.setOutput('body', issueBody); core.setOutput('title', issue.title); core.setOutput('html_url', issue.html_url); core.setOutput('labels', issue.labels.map(l => l.name).join(',')); + core.setOutput('is_retriage', isRetriage.toString()); - name: Run AI assessment id: ai-assessment @@ -153,7 +190,14 @@ jobs: core.info(`Could not remove "needs triage" label: ${e.message}`); } } else { - core.info('Keeping "needs triage" — this issue requires human review.'); + // Notify team via comment on escalated issues + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issueNumber, + body: '🔔 @microsoft/fabric-cli-dev — This issue has been flagged by AI triage as requiring team attention. Please review the assessment above.' + }); + core.info('Keeping "needs triage" and notified team.'); } - name: Generate triage summary From cbc1e9b40a9ca9b4653501c5425ee5160507750f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 13:09:45 +0200 Subject: [PATCH 148/176] feat: add 'needs team attention' label for escalated issues Consolidated label applied to any issue requiring team review, regardless of type. Enables easy filtering across all escalated issues. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 9d49dee8..7cfe6e7f 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -190,6 +190,13 @@ jobs: core.info(`Could not remove "needs triage" label: ${e.message}`); } } else { + // Add consolidated label for easy filtering of all issues needing team attention + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: issueNumber, + labels: ['needs team attention'] + }); // Notify team via comment on escalated issues await github.rest.issues.createComment({ owner, From 2000b840c9f2974936ed3baac94f7178a11ad650 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 13:13:45 +0200 Subject: [PATCH 149/176] fix: rename label to ai:needs team attention Use ai: prefix for consistency with other AI-generated labels. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 7cfe6e7f..4445708b 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -195,7 +195,7 @@ jobs: owner, repo, issue_number: issueNumber, - labels: ['needs team attention'] + labels: ['ai:needs team attention'] }); // Notify team via comment on escalated issues await github.rest.issues.createComment({ From 4241854a3fdd1186cd1340dc2faee1af701b280f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 13:15:23 +0200 Subject: [PATCH 150/176] feat: auto-close issues fully resolved by AI triage Close issues when AI assessment is 'answered', 'likely misconfiguration', or 'redirect to docs' and no further action is needed. Issues needing feedback, team review, or community contribution are never auto-closed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 4445708b..65ac1d06 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -123,6 +123,7 @@ jobs: let needsHumanReview = false; let addHelpWanted = false; let needsAuthorFeedback = false; + let canAutoClose = false; for (const assessment of assessments) { const label = (assessment.assessmentLabel || '').toLowerCase(); @@ -143,6 +144,11 @@ jobs: needsAuthorFeedback = true; } + // Check if the AI fully resolved the issue (answered question, explained misconfiguration, redirected to docs) + if (label.includes('answered') || label.includes('likely misconfiguration') || label.includes('redirect to docs')) { + canAutoClose = true; + } + // Log for job summary core.info(`Prompt: ${assessment.prompt}, Label: ${assessment.assessmentLabel}`); } @@ -189,6 +195,18 @@ jobs: // Label may have already been removed by the action core.info(`Could not remove "needs triage" label: ${e.message}`); } + + // Auto-close if AI fully resolved (answered, misconfiguration, redirected) + if (canAutoClose && !needsAuthorFeedback && !addHelpWanted) { + await github.rest.issues.update({ + owner, + repo, + issue_number: issueNumber, + state: 'closed', + state_reason: 'completed' + }); + core.info('Auto-closed issue — AI fully resolved it.'); + } } else { // Add consolidated label for easy filtering of all issues needing team attention await github.rest.issues.addLabels({ From 097092800af1d384de44e874cbd8413e29b393eb Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 13:58:40 +0200 Subject: [PATCH 151/176] feat: upgrade model from gpt-4o to gpt-5.2 gpt-4o is being retired. gpt-5.2 is the current default in GitHub Models with improved reasoning and instruction-following. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 2 +- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 98d23f20..a4a134f1 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -63,7 +63,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-4o +model: openai/gpt-5.2 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index a193c100..5c63611e 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -63,7 +63,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-4o +model: openai/gpt-5.2 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index efa520e6..212a7f69 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -76,7 +76,7 @@ messages: - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) - role: user content: '{{input}}' -model: openai/gpt-4o +model: openai/gpt-5.2 modelParameters: max_tokens: 1500 testData: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 65ac1d06..20531514 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -93,7 +93,7 @@ jobs: ai_review_label: 'needs triage' prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' - model: 'openai/gpt-4o' + model: 'openai/gpt-5.2' max_tokens: 1500 # ------------------------------------------------------- # Phase control — toggle these two flags to switch phases: From da59794ea35beabc71a8ada8e1c51826088d81f5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 14:06:02 +0200 Subject: [PATCH 152/176] fix: switch model to gpt-4.1 (verified in GitHub Models catalog) gpt-5.2 does not exist in the catalog. gpt-4.1 is the best available general-purpose model with 1M token context and high rate limit tier. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 2 +- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index a4a134f1..db8e4dd9 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -63,7 +63,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-5.2 +model: openai/gpt-4.1 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 5c63611e..a998493b 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -63,7 +63,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-5.2 +model: openai/gpt-4.1 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 212a7f69..5f403fe8 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -76,7 +76,7 @@ messages: - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) - role: user content: '{{input}}' -model: openai/gpt-5.2 +model: openai/gpt-4.1 modelParameters: max_tokens: 1500 testData: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 20531514..b837a907 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -93,7 +93,7 @@ jobs: ai_review_label: 'needs triage' prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' - model: 'openai/gpt-5.2' + model: 'openai/gpt-4.1' max_tokens: 1500 # ------------------------------------------------------- # Phase control — toggle these two flags to switch phases: From a74b9ee5e07c3f5abe20826e4ef842707e6007f5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 14:14:41 +0200 Subject: [PATCH 153/176] fix: upgrade to gpt-5 and add accurate CLI flag documentation - Switch model from openai/gpt-4.1 to openai/gpt-5 for better reasoning - Add correct --output_format flag info (json/text, not --output) - Add instruction to never invent CLI flags or features Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 3 ++- .github/prompts/feature-triage.prompt.yml | 3 ++- .github/prompts/question-triage.prompt.yml | 4 +++- .github/workflows/ai-issue-triage.yml | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index db8e4dd9..8b97e81c 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -44,6 +44,7 @@ messages: - If details are missing, list exactly what is needed — nothing more. - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - Do not speculate about internal implementation details. + - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Re-triage @@ -63,7 +64,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-4.1 +model: openai/gpt-5 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index a998493b..a5b33b05 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -44,6 +44,7 @@ messages: - If marking as "Help Wanted", give a concrete starting point (directory, similar command, relevant API). - If marking as "Out of Scope", state why directly and suggest an alternative. - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli + - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Re-triage @@ -63,7 +64,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-4.1 +model: openai/gpt-5 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 5f403fe8..376732fc 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -18,6 +18,7 @@ messages: - Managed identity: `fab auth login --managed-identity` - Access token: `FAB_ACCESS_TOKEN` env var - Common commands: `ls`, `get`, `set`, `rm`, `cd`, `import`, `export`, `open`, `auth login/logout/status` + - Global flag: `--output_format` with values `json` or `text` (default: `text`). There is NO `--output`, `-o`, `--format` flag. - Path examples: - List workspace contents: `fab ls /MyWorkspace.Workspace/` - Get an item: `fab get /MyWorkspace.Workspace/MyNotebook.Notebook` @@ -57,6 +58,7 @@ messages: - Fabric REST API: https://learn.microsoft.com/en-us/rest/api/fabric/ - Community Forum: https://community.fabric.microsoft.com/t5/Developer/bd-p/Developer - If redirecting, state where and why in one sentence. + - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Re-triage @@ -76,7 +78,7 @@ messages: - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) - role: user content: '{{input}}' -model: openai/gpt-4.1 +model: openai/gpt-5 modelParameters: max_tokens: 1500 testData: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index b837a907..739ffd50 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -93,7 +93,7 @@ jobs: ai_review_label: 'needs triage' prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' - model: 'openai/gpt-4.1' + model: 'openai/gpt-5' max_tokens: 1500 # ------------------------------------------------------- # Phase control — toggle these two flags to switch phases: From d6960111461ce9162c0c52b64c735fbe2bb47c10 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 14:16:36 +0200 Subject: [PATCH 154/176] fix: switch model to openai/o3 (gpt-5 not accessible) gpt-5 returns 'unexpected error' on custom rate tier. o3 is OpenAI's dedicated reasoning model for better accuracy. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 2 +- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 8b97e81c..4a37894a 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -64,7 +64,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-5 +model: openai/o3 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index a5b33b05..17226b86 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -64,7 +64,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/gpt-5 +model: openai/o3 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 376732fc..4e19d107 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -78,7 +78,7 @@ messages: - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) - role: user content: '{{input}}' -model: openai/gpt-5 +model: openai/o3 modelParameters: max_tokens: 1500 testData: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 739ffd50..cc25c56b 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -93,7 +93,7 @@ jobs: ai_review_label: 'needs triage' prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' - model: 'openai/gpt-5' + model: 'openai/o3' max_tokens: 1500 # ------------------------------------------------------- # Phase control — toggle these two flags to switch phases: From 46f35d25c5cab36b9a831e403caf74b0dc4b33ca Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 14:18:56 +0200 Subject: [PATCH 155/176] fix: revert to gpt-4.1 (custom-tier models inaccessible) o3 and gpt-5 both fail on custom rate tier. gpt-4.1 is the best available model on the high rate tier. Accuracy improvements from prompt fixes (correct flags, anti-hallucination) remain in place. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 2 +- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 4a37894a..4b485a20 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -64,7 +64,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/o3 +model: openai/gpt-4.1 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 17226b86..3d7affda 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -64,7 +64,7 @@ messages: - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) - role: user content: '{{input}}' -model: openai/o3 +model: openai/gpt-4.1 modelParameters: max_tokens: 1000 testData: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 4e19d107..19b52367 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -78,7 +78,7 @@ messages: - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) - role: user content: '{{input}}' -model: openai/o3 +model: openai/gpt-4.1 modelParameters: max_tokens: 1500 testData: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index cc25c56b..b837a907 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -93,7 +93,7 @@ jobs: ai_review_label: 'needs triage' prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' - model: 'openai/o3' + model: 'openai/gpt-4.1' max_tokens: 1500 # ------------------------------------------------------- # Phase control — toggle these two flags to switch phases: From 259fc711fdb51068a25dd7d7481cce72a2252f38 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 14:31:33 +0200 Subject: [PATCH 156/176] fix: improve label logic for author feedback and redundant ai labels - Detect 'needs author feedback' from response text (awaiting author) in addition to assessment label (missing details) - Remove redundant ai:* assessment labels when ai:needs team attention is added, keeping only the consolidated label Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index b837a907..62605519 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -140,7 +140,7 @@ jobs: } // Check if more information is needed from the issue author - if (label.includes('missing details')) { + if (label.includes('missing details') || response.toLowerCase().includes('awaiting author')) { needsAuthorFeedback = true; } @@ -215,6 +215,24 @@ jobs: issue_number: issueNumber, labels: ['ai:needs team attention'] }); + + // Remove the action's detailed ai: assessment labels — only keep the consolidated one + const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ + owner, repo, issue_number: issueNumber, + }); + for (const lbl of currentLabels) { + if (lbl.name.startsWith('ai:') && lbl.name !== 'ai:needs team attention') { + try { + await github.rest.issues.removeLabel({ + owner, repo, issue_number: issueNumber, name: lbl.name, + }); + core.info(`Removed redundant label "${lbl.name}".`); + } catch (e) { + core.info(`Could not remove label "${lbl.name}": ${e.message}`); + } + } + } + // Notify team via comment on escalated issues await github.rest.issues.createComment({ owner, From bd23bc3bf5d34fa265ba0c8d66ead67b9cbf6686 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 14:34:03 +0200 Subject: [PATCH 157/176] fix: don't escalate to team when awaiting author feedback When AI asks for author info, skip team notification. Team is only notified after author responds and re-triage still can't resolve. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 62605519..44b678a2 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -153,6 +153,12 @@ jobs: core.info(`Prompt: ${assessment.prompt}, Label: ${assessment.assessmentLabel}`); } + // If the AI is asking the author for more info, don't escalate to the team yet — + // wait for the author to respond first; re-triage will escalate if still needed. + if (needsAuthorFeedback) { + needsHumanReview = false; + } + // Skip label changes in summary-only mode (Phase 3) if (suppressLabels) { core.info('Labels suppressed (summary-only mode) — skipping post-process label changes.'); From 412642e46ea735c49c02e36a9688f1a281fbb6bf Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 15:27:57 +0200 Subject: [PATCH 158/176] fix: always remove action's ai: assessment labels Move ai:* label cleanup before the if/else branch so it runs unconditionally. Prevents stale labels like ai:question-triage:needs maintainer input from remaining on issues. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 35 ++++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 44b678a2..9808a9e1 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -187,6 +187,24 @@ jobs: core.info('Added "help wanted" label based on AI assessment.'); } + // Always remove the action's detailed ai: assessment labels (e.g., ai:question-triage:needs maintainer input) + // We use only ai:needs team attention as the consolidated escalation label + const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ + owner, repo, issue_number: issueNumber, + }); + for (const lbl of currentLabels) { + if (lbl.name.startsWith('ai:') && lbl.name !== 'ai:needs team attention') { + try { + await github.rest.issues.removeLabel({ + owner, repo, issue_number: issueNumber, name: lbl.name, + }); + core.info(`Removed action label "${lbl.name}".`); + } catch (e) { + core.info(`Could not remove label "${lbl.name}": ${e.message}`); + } + } + } + // If AI fully handled the issue, remove 'needs triage' so the team isn't notified if (!needsHumanReview) { try { @@ -222,23 +240,6 @@ jobs: labels: ['ai:needs team attention'] }); - // Remove the action's detailed ai: assessment labels — only keep the consolidated one - const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ - owner, repo, issue_number: issueNumber, - }); - for (const lbl of currentLabels) { - if (lbl.name.startsWith('ai:') && lbl.name !== 'ai:needs team attention') { - try { - await github.rest.issues.removeLabel({ - owner, repo, issue_number: issueNumber, name: lbl.name, - }); - core.info(`Removed redundant label "${lbl.name}".`); - } catch (e) { - core.info(`Could not remove label "${lbl.name}": ${e.message}`); - } - } - } - // Notify team via comment on escalated issues await github.rest.issues.createComment({ owner, From b97e95e840fbda1ff7f43bf082437693a3e945be Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 15:47:44 +0200 Subject: [PATCH 159/176] feat: standardize Needs Author Feedback category across all prompts - Add 'Needs Author Feedback' assessment category to all 3 prompts - Rename 'Missing Details' to 'Needs Author Feedback' in bug-triage - Add new category to question-triage and feature-triage - Remove redundant response text fallback and needsHumanReview override - Update workflow label detection to match new category name Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 1 + .github/prompts/question-triage.prompt.yml | 1 + .github/workflows/ai-issue-triage.yml | 9 +-------- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 4b485a20..2d38d580 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -30,7 +30,7 @@ messages: Use exactly one of these in your assessment header: - **Potential Bug** — The report describes behavior that appears to deviate from expected CLI behavior or documented Fabric API behavior. Recommend to the team for further investigation and confirmation. - **Likely Misconfiguration** — The described behavior is consistent with incorrect usage, wrong auth setup, or path syntax errors. Provide guidance on the correct approach. - - **Missing Details** — The report lacks critical information needed to evaluate. Specify exactly what is missing. + - **Needs Author Feedback** — The report is unclear, incomplete, or lacks enough context to evaluate. Specify exactly what is needed. - **Needs Team Review** — The issue is complex, ambiguous, or touches sensitive areas (auth, security, data integrity) and requires human review. Important: You must never confirm that something is definitively a bug. Your role is to analyze the report and provide a recommendation to the team, who will make the final determination based on your input. diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 3d7affda..b8a3633c 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -32,6 +32,7 @@ messages: Use exactly one of these in your assessment header: - **Valuable Enhancement** — The feature provides clear value, aligns with CLI design, and should be prioritized by the team. - **Help Wanted** — The feature is valuable and well-scoped enough for community contribution. Provide implementation guidance. + - **Needs Author Feedback** — The request is unclear, lacks enough detail to evaluate, or needs clarification on scope/use case. Specify exactly what is needed. - **Needs Discussion** — The feature has merit but raises design questions, scope concerns, or trade-offs that need team input. - **Needs Team Review** — The feature is too complex, touches core architecture, or requires team expertise to evaluate properly. Escalate to the team. - **Out of Scope** — The feature doesn't align with the CLI's purpose, duplicates existing functionality, or is better served by other tools (Fabric portal, REST API directly, PowerShell). diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 19b52367..07c8d171 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -44,6 +44,7 @@ messages: Use exactly one of these in your assessment header: - **Answered** — You were able to provide a complete, accurate answer to the question. + - **Needs Author Feedback** — The question is unclear, incomplete, or lacks enough context to provide a useful answer. Specify exactly what is needed. - **Needs Maintainer Input** — The question requires internal knowledge, involves undocumented behavior, or touches on roadmap/design decisions that only the team can answer. - **Redirect to Docs** — The question is better answered by existing documentation or is about general Fabric (not CLI-specific). Provide the relevant links. diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 9808a9e1..cd2172d3 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -127,7 +127,6 @@ jobs: for (const assessment of assessments) { const label = (assessment.assessmentLabel || '').toLowerCase(); - const response = assessment.response || ''; // Check if the assessment requires human review if (label.includes('needs team review') || label.includes('needs maintainer input') || label.includes('potential bug')) { @@ -140,7 +139,7 @@ jobs: } // Check if more information is needed from the issue author - if (label.includes('missing details') || response.toLowerCase().includes('awaiting author')) { + if (label.includes('needs author feedback')) { needsAuthorFeedback = true; } @@ -153,12 +152,6 @@ jobs: core.info(`Prompt: ${assessment.prompt}, Label: ${assessment.assessmentLabel}`); } - // If the AI is asking the author for more info, don't escalate to the team yet — - // wait for the author to respond first; re-triage will escalate if still needed. - if (needsAuthorFeedback) { - needsHumanReview = false; - } - // Skip label changes in summary-only mode (Phase 3) if (suppressLabels) { core.info('Labels suppressed (summary-only mode) — skipping post-process label changes.'); From 5a8d121629933f0370db28ce497d19dc4e2d73a7 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 16:02:31 +0200 Subject: [PATCH 160/176] refactor: streamline prompt categories and label handling - Merge Needs Maintainer Input and Needs Team Review into single Needs Team Review category in question-triage prompt - Remove duplicate needs author feedback label from post-processing (action's ai:* label is sufficient) - Remove ai:* label cleanup (keep action's assessment labels) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 29 ---------------------- 2 files changed, 1 insertion(+), 30 deletions(-) diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 07c8d171..1feeb080 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -45,7 +45,7 @@ messages: Use exactly one of these in your assessment header: - **Answered** — You were able to provide a complete, accurate answer to the question. - **Needs Author Feedback** — The question is unclear, incomplete, or lacks enough context to provide a useful answer. Specify exactly what is needed. - - **Needs Maintainer Input** — The question requires internal knowledge, involves undocumented behavior, or touches on roadmap/design decisions that only the team can answer. + - **Needs Team Review** — The question requires internal knowledge, involves undocumented behavior, touches sensitive areas (auth, security, data integrity), or involves roadmap/design decisions that only the team can answer. Escalate to the team. - **Redirect to Docs** — The question is better answered by existing documentation or is about general Fabric (not CLI-specific). Provide the relevant links. ## Response Guidelines diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index cd2172d3..09a99078 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -158,17 +158,6 @@ jobs: return; } - // Add 'needs author feedback' label if AI determined details are missing - if (needsAuthorFeedback) { - await github.rest.issues.addLabels({ - owner, - repo, - issue_number: issueNumber, - labels: ['needs author feedback'] - }); - core.info('Added "needs author feedback" label based on AI assessment.'); - } - // Add 'help wanted' label if AI recommended community contribution if (addHelpWanted) { await github.rest.issues.addLabels({ @@ -180,24 +169,6 @@ jobs: core.info('Added "help wanted" label based on AI assessment.'); } - // Always remove the action's detailed ai: assessment labels (e.g., ai:question-triage:needs maintainer input) - // We use only ai:needs team attention as the consolidated escalation label - const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ - owner, repo, issue_number: issueNumber, - }); - for (const lbl of currentLabels) { - if (lbl.name.startsWith('ai:') && lbl.name !== 'ai:needs team attention') { - try { - await github.rest.issues.removeLabel({ - owner, repo, issue_number: issueNumber, name: lbl.name, - }); - core.info(`Removed action label "${lbl.name}".`); - } catch (e) { - core.info(`Could not remove label "${lbl.name}": ${e.message}`); - } - } - } - // If AI fully handled the issue, remove 'needs triage' so the team isn't notified if (!needsHumanReview) { try { From b6f0a8d35e7e75542ea0b73ffdc94ff4217f71bc Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 19 Feb 2026 16:33:33 +0200 Subject: [PATCH 161/176] refactor: rename question triage category to Requires Additional Details Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 1feeb080..2d170aa2 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -44,7 +44,7 @@ messages: Use exactly one of these in your assessment header: - **Answered** — You were able to provide a complete, accurate answer to the question. - - **Needs Author Feedback** — The question is unclear, incomplete, or lacks enough context to provide a useful answer. Specify exactly what is needed. + - **Requires Additional Details** — The question is unclear, incomplete, or lacks enough context to provide a useful answer. Specify exactly what is needed. - **Needs Team Review** — The question requires internal knowledge, involves undocumented behavior, touches sensitive areas (auth, security, data integrity), or involves roadmap/design decisions that only the team can answer. Escalate to the team. - **Redirect to Docs** — The question is better answered by existing documentation or is about general Fabric (not CLI-specific). Provide the relevant links. diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 09a99078..3fa696c1 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -139,7 +139,7 @@ jobs: } // Check if more information is needed from the issue author - if (label.includes('needs author feedback')) { + if (label.includes('needs author feedback') || label.includes('requires additional details')) { needsAuthorFeedback = true; } From 07a8439b36bc953856d385b8feeb1459228df967 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 09:16:55 +0200 Subject: [PATCH 162/176] feat: inject codebase context into AI system prompt Extract CLI commands, flags, item types, auth methods, and error codes from actual source files. Inject into system prompt (not issue body) so AI backs up answers with real codebase data. Comments and issue body stay clean. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 1 + .github/prompts/question-triage.prompt.yml | 1 + .github/workflows/ai-issue-triage.yml | 124 ++++++++++++++++++++- 4 files changed, 126 insertions(+), 2 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 2d38d580..86347e93 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -45,8 +45,8 @@ messages: - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - Do not speculate about internal implementation details. - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. + - The system prompt includes a **"Codebase Reference"** section auto-extracted from the source code. Always use it as the authoritative source for commands, flags, item types, and auth methods. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. - ## Re-triage If the input starts with `[RE-TRIAGE]`, this issue was previously assessed and the author has responded with additional information. Focus your assessment on the new information provided. Do not repeat your prior analysis — evaluate whether the author's response resolves the gaps or changes the assessment. diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index b8a3633c..4b654966 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -46,6 +46,7 @@ messages: - If marking as "Out of Scope", state why directly and suggest an alternative. - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. + - The system prompt includes a **"Codebase Reference"** section auto-extracted from the source code. Always use it as the authoritative source for commands, flags, item types, and auth methods. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Re-triage diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 2d170aa2..bf52cf45 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -60,6 +60,7 @@ messages: - Community Forum: https://community.fabric.microsoft.com/t5/Developer/bd-p/Developer - If redirecting, state where and why in one sentence. - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. + - The system prompt includes a **"Codebase Reference"** section auto-extracted from the source code. Always use it as the authoritative source for commands, flags, item types, and auth methods. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Re-triage diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 3fa696c1..696ada6c 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -27,6 +27,128 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Build codebase context + id: codebase + shell: bash + run: | + # Extract key CLI facts from the actual codebase for AI context. + # This ensures the AI answers based on real code, not guesses. + CONTEXT="## Codebase Reference (auto-extracted from source)\n\n" + CONTEXT+="**Important:** Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here.\n\n" + + # ── Commands & Flags (from parsers) ── + CONTEXT+="### Filesystem Commands (fab_fs_parser.py)\n" + CONTEXT+="| Command | Aliases | Key Flags |\n|---|---|---|\n" + CONTEXT+="| ls | dir | \`path\` (opt), \`-l/--long\`, \`-a/--all\`, \`-q/--query\` |\n" + CONTEXT+="| mkdir | create | \`path\` (req), \`-P/--params\` (key=value) |\n" + CONTEXT+="| cd | — | \`path\` (req) |\n" + CONTEXT+="| rm | del | \`path\` (req), \`-f/--force\` |\n" + CONTEXT+="| mv | move | \`from_path\`, \`to_path\` (req), \`-f/--force\`, \`-r/--recursive\` |\n" + CONTEXT+="| cp | copy | \`from_path\`, \`to_path\` (req), \`-f/--force\`, \`-r/--recursive\` |\n" + CONTEXT+="| exists | — | \`path\` (req) |\n" + CONTEXT+="| pwd | — | — |\n" + CONTEXT+="| open | — | \`path\` (req) |\n" + CONTEXT+="| export | — | \`path\` (req), \`-o/--output\` (req, output dir), \`-a/--all\`, \`--format\`, \`-f/--force\` |\n" + CONTEXT+="| get | — | \`path\` (req), \`-q/--query\`, \`-o/--output\` (output file), \`-v/--verbose\`, \`-f/--force\` |\n" + CONTEXT+="| import | — | \`path\` (req), \`-i/--input\` (req, input dir), \`--format\`, \`-f/--force\` |\n" + CONTEXT+="| set | — | \`path\` (req), \`-q/--query\` (req), \`-i/--input\` (req), \`-f/--force\` |\n" + CONTEXT+="| clear | cls | — |\n" + CONTEXT+="| ln | mklink | \`path\` (req), \`--type\` (req: adlsGen2/amazonS3/dataverse/googleCloudStorage/oneLake/s3Compatible), \`--target\`, \`-i/--input\`, \`-f/--force\` |\n" + CONTEXT+="| start | — | \`path\` (req), \`-f/--force\` |\n" + CONTEXT+="| stop | — | \`path\` (req), \`-f/--force\` |\n" + CONTEXT+="| assign | — | \`path\` (req), \`-W/--workspace\` (req), \`-f/--force\` |\n" + CONTEXT+="| unassign | — | \`path\` (req), \`-W/--workspace\` (req), \`-f/--force\` |\n\n" + + CONTEXT+="### Auth Commands (fab auth ...)\n" + CONTEXT+="| Command | Flags |\n|---|---|\n" + CONTEXT+="| login | \`-u/--username\` (client ID), \`-p/--password\` (client secret), \`-t/--tenant\`, \`-I/--identity\` (managed identity), \`--certificate\` (PEM cert path), \`--federated-token\` |\n" + CONTEXT+="| logout | — |\n" + CONTEXT+="| status | — |\n\n" + + CONTEXT+="### Config Commands (fab config ...)\n" + CONTEXT+="set \`key\` \`value\`, get \`key\`, ls, clear-cache\n\n" + + CONTEXT+="### Job Commands (fab jobs ...)\n" + CONTEXT+="| Command | Key Flags |\n|---|---|\n" + CONTEXT+="| start | \`path\`, \`-P/--params\`, \`-C/--config\`, \`-i/--input\` |\n" + CONTEXT+="| run | \`path\`, \`-P/--params\`, \`--timeout\`, \`--polling_interval\` |\n" + CONTEXT+="| run-list | \`path\`, \`--schedule\` |\n" + CONTEXT+="| run-cancel | \`path\`, \`--id\` (req) |\n" + CONTEXT+="| run-sch | \`path\`, \`--type\` (cron/daily/weekly), \`--interval\`, \`--start\`, \`--end\`, \`--days\` |\n" + CONTEXT+="| run-status | \`path\`, \`--id\` (req) |\n\n" + + CONTEXT+="### ACL Commands (fab acl ...)\n" + CONTEXT+="ls \`path\`, get \`path\`, set \`path\` \`-I/--identity\` \`-R/--role\` (Admin/Member/Contributor/Viewer/Owner), rm \`path\` \`-I/--identity\`\n\n" + + CONTEXT+="### API Command\n" + CONTEXT+="fab api \`endpoint\` \`-X/--method\` (get/post/delete/put/patch) \`-A/--audience\` (fabric/storage/azure/powerbi) \`-i/--input\` \`-P/--params\` \`-H/--headers\`\n\n" + + CONTEXT+="### Table Commands (fab table ...)\n" + CONTEXT+="schema \`path\`, load \`path\` \`--file\` \`--mode\` (append/overwrite), vacuum \`path\` \`--retain_n_hours\`, optimize \`path\` \`--vorder\` \`--zorder\`\n\n" + + # ── Global Flags ── + CONTEXT+="### Global Flags\n" + CONTEXT+="\`--output_format\`: choices are \`json\` or \`text\` (default: \`text\`). There is NO \`--output\`, \`-o\`, or \`--format\` global flag.\n" + CONTEXT+="Note: \`-o/--output\` on export/get is for output directory/file path, NOT output format.\n" + CONTEXT+="\`-help\`: show help\n\n" + + # ── Item Types (dynamically extracted) ── + CONTEXT+="### Supported Item Types\n" + ITEMS=$(grep -E '^\s+\w+ = "' src/fabric_cli/core/fab_types.py | sed 's/.*= "//;s/"//' | sort | tr '\n' ', ' | sed 's/,$//') + CONTEXT+="$ITEMS\n\n" + + # ── Hidden Entities ── + CONTEXT+="### Hidden Entities (tenant-level, via \`-a\` flag or dot-prefix)\n" + CONTEXT+=".capacities, .connections, .gateways, .domains\n\n" + CONTEXT+="### Hidden Entities (workspace-level)\n" + CONTEXT+=".sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares\n\n" + + # ── Auth Methods & Env Vars ── + CONTEXT+="### Authentication Methods\n" + CONTEXT+="1. **Interactive browser**: \`fab auth login\` (default)\n" + CONTEXT+="2. **Service principal (secret)**: \`fab auth login -u -p -t \`\n" + CONTEXT+=" Or env vars: \`FAB_SPN_CLIENT_ID\` + \`FAB_SPN_CLIENT_SECRET\` + \`FAB_TENANT_ID\`\n" + CONTEXT+="3. **Service principal (certificate)**: \`fab auth login -u --certificate -t \`\n" + CONTEXT+=" Or env vars: \`FAB_SPN_CLIENT_ID\` + \`FAB_SPN_CERT_PATH\` (+ opt \`FAB_SPN_CERT_PASSWORD\`) + \`FAB_TENANT_ID\`\n" + CONTEXT+="4. **Service principal (federated)**: \`fab auth login -u --federated-token -t \`\n" + CONTEXT+=" Or env var: \`FAB_SPN_FEDERATED_TOKEN\`\n" + CONTEXT+="5. **Managed identity (system)**: \`fab auth login -I\`\n" + CONTEXT+="6. **Managed identity (user-assigned)**: \`fab auth login -I -u \`\n" + CONTEXT+="7. **Direct access token**: \`FAB_TOKEN\` env var (no login needed)\n\n" + + # ── Error Codes (dynamically extracted) ── + CONTEXT+="### Error Codes\n" + ERRORS=$(grep -E '^ERROR_' src/fabric_cli/core/fab_constant.py | sed 's/ = "/: /;s/"$//' | tr '\n' ', ' | sed 's/,$//') + CONTEXT+="$ERRORS\n\n" + + # ── Runnable & OneLake ── + CONTEXT+="### Runnable Item Types (fab start / fab jobs run)\n" + CONTEXT+="SparkJobDefinition (sparkjob), Notebook (RunNotebook), DataPipeline (Pipeline), Lakehouse (TableMaintenance)\n\n" + + CONTEXT+="### OneLake Item Types\n" + CONTEXT+="Folder, File, Table, Shortcut\n\n" + + # ── Shortcut Types (fab ln) ── + CONTEXT+="### Shortcut Types (fab ln --type)\n" + CONTEXT+="adlsGen2, amazonS3, dataverse, googleCloudStorage, oneLake, s3Compatible\n" + + echo -e "$CONTEXT" > /tmp/codebase-context.txt + + # Inject codebase context into prompt files as part of the system message. + # This way the AI sees the context privately, not in the issue body or comment. + mkdir -p /tmp/prompts + python3 << 'PYEOF' + import os, glob + context = open('/tmp/codebase-context.txt').read() + for prompt in glob.glob('.github/prompts/*.prompt.yml'): + content = open(prompt).read() + marker = '## Your Task' + if marker in content: + content = content.replace(marker, context + '\n ' + marker) + out = '/tmp/prompts/' + os.path.basename(prompt) + open(out, 'w').write(content) + PYEOF + - name: Resolve issue details id: issue uses: actions/github-script@v7 @@ -91,7 +213,7 @@ jobs: repo_name: ${{ github.event.repository.name || github.repository }} owner: ${{ github.repository_owner }} ai_review_label: 'needs triage' - prompts_directory: '.github/prompts' + prompts_directory: '/tmp/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' model: 'openai/gpt-4.1' max_tokens: 1500 From e99f8861b559a953b32f818217831167bbfc1396 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 09:17:47 +0200 Subject: [PATCH 163/176] feat: add footer to AI comments for team escalation All AI triage comments now end with a footer instructing users to tag @microsoft/fabric-cli-dev if the issue needs team attention but wasn't escalated by the AI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 4 ++++ .github/prompts/feature-triage.prompt.yml | 4 ++++ .github/prompts/question-triage.prompt.yml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 86347e93..32da92ca 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -62,6 +62,10 @@ messages: - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing) - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) + + After the Next Steps section, always append this footer on a new line: + `---` + `> 💡 If this issue requires the team's attention and was not escalated, you can tag @microsoft/fabric-cli-dev to notify the team.` - role: user content: '{{input}}' model: openai/gpt-4.1 diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 4b654966..bde4b6af 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -64,6 +64,10 @@ messages: - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing) - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) + + After the Next Steps section, always append this footer on a new line: + `---` + `> 💡 If this issue requires the team's attention and was not escalated, you can tag @microsoft/fabric-cli-dev to notify the team.` - role: user content: '{{input}}' model: openai/gpt-4.1 diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index bf52cf45..c8b16d1e 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -78,6 +78,10 @@ messages: - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing or question needs clarification) - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) + + After the Next Steps section, always append this footer on a new line: + `---` + `> 💡 If this issue requires the team's attention and was not escalated, you can tag @microsoft/fabric-cli-dev to notify the team.` - role: user content: '{{input}}' model: openai/gpt-4.1 From 92d1a7903ea29086c5f34d6ef6a1be60231d892d Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 15:15:10 +0200 Subject: [PATCH 164/176] Add dual A/B triage comparison with code-aware agent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Approach A (Action): github/ai-assessment-comment-labeler with codebase context injection - Approach B (Code Agent): Custom scripts/ai_triage.py that greps source code and injects into prompt - Both trigger on 'needs triage' label and post tagged comments (đŸ…°ī¸/đŸ…ąī¸) - Both include collapsible label decision tables in comments - Labels suppressed on both for fair testing - Added CLI doc page URLs to all 3 prompt files Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 27 +- .github/prompts/feature-triage.prompt.yml | 26 +- .github/prompts/question-triage.prompt.yml | 40 ++- .github/workflows/ai-issue-triage-agent.yml | 302 +++++++++++++++++++ .github/workflows/ai-issue-triage.yml | 82 ++++- scripts/ai_triage.py | 313 ++++++++++++++++++++ 6 files changed, 761 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/ai-issue-triage-agent.yml create mode 100644 scripts/ai_triage.py diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 32da92ca..f55cff54 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -10,13 +10,36 @@ messages: `/Workspace1.Workspace/FolderA.Folder/SemanticModel1.SemanticModel` - Supports nested folders (up to ~10 levels), hidden entities (`.capacities`, `.gateways`, `.sparkpools`). - Two modes: **interactive** (REPL) and **command-line** (single process). - - Authentication: interactive browser, service principal (secret/cert/federated credential), managed identity, access token env var. - - Commands: `ls`, `get`, `set`, `rm`, `cd`, `import`, `export`, `open`, `auth login/logout/status`, etc. + - Config stored in `~/.config/fab/` (config.json, auth.json, cache.bin) - Official CLI docs: https://microsoft.github.io/fabric-cli - Fabric REST API docs: https://learn.microsoft.com/en-us/rest/api/fabric/ - Power BI REST API docs: https://learn.microsoft.com/en-us/rest/api/power-bi/ - Fabric Capacity Azure REST API docs: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + ## CLI Documentation Pages (use for citations) + + - Hierarchy & concepts: https://microsoft.github.io/fabric-cli/essentials/hierarchy/ + - Resource types: https://microsoft.github.io/fabric-cli/essentials/resource_types/ + - Parameters: https://microsoft.github.io/fabric-cli/essentials/parameters/ + - Output format: https://microsoft.github.io/fabric-cli/essentials/output_format/ + - Modes: https://microsoft.github.io/fabric-cli/essentials/modes/ + - Environment variables: https://microsoft.github.io/fabric-cli/essentials/env_vars/ + - Troubleshooting: https://microsoft.github.io/fabric-cli/troubleshooting/ + - Commands reference: https://microsoft.github.io/fabric-cli/commands/ + - Auth: https://microsoft.github.io/fabric-cli/commands/auth/ + - Import: https://microsoft.github.io/fabric-cli/commands/fs/import/ + - Export: https://microsoft.github.io/fabric-cli/commands/fs/export/ + - ls: https://microsoft.github.io/fabric-cli/commands/fs/ls/ + - get: https://microsoft.github.io/fabric-cli/commands/fs/get/ + - set: https://microsoft.github.io/fabric-cli/commands/fs/set/ + - Jobs: https://microsoft.github.io/fabric-cli/commands/jobs/ + - ACL: https://microsoft.github.io/fabric-cli/commands/acls/ + - API: https://microsoft.github.io/fabric-cli/commands/api/ + - Tables: https://microsoft.github.io/fabric-cli/commands/tables/ + - Shortcuts (ln): https://microsoft.github.io/fabric-cli/commands/fs/ln/ + - Auth examples: https://microsoft.github.io/fabric-cli/examples/auth_examples/ + - Item examples: https://microsoft.github.io/fabric-cli/examples/item_examples/ + ## Your Task Analyze the bug report and determine: diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index bde4b6af..96be42d6 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -10,12 +10,36 @@ messages: `/Workspace1.Workspace/FolderA.Folder/SemanticModel1.SemanticModel` - Key design principles: path-first UX, stable verbs (`ls`, `get`, `set`, `rm`), consistent flags across item types, backward compatibility. - Supports nested folders, hidden entities (`.capacities`, `.gateways`), interactive and command-line modes. - - Authentication: interactive browser, service principal (secret/cert/federated credential), managed identity. + - Config stored in `~/.config/fab/` (config.json, auth.json, cache.bin) - Official CLI docs: https://microsoft.github.io/fabric-cli - Fabric REST API docs: https://learn.microsoft.com/en-us/rest/api/fabric/ - Power BI REST API docs: https://learn.microsoft.com/en-us/rest/api/power-bi/ - Fabric Capacity Azure REST API docs: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + ## CLI Documentation Pages (use for citations) + + - Hierarchy & concepts: https://microsoft.github.io/fabric-cli/essentials/hierarchy/ + - Resource types: https://microsoft.github.io/fabric-cli/essentials/resource_types/ + - Parameters: https://microsoft.github.io/fabric-cli/essentials/parameters/ + - Output format: https://microsoft.github.io/fabric-cli/essentials/output_format/ + - Modes: https://microsoft.github.io/fabric-cli/essentials/modes/ + - Environment variables: https://microsoft.github.io/fabric-cli/essentials/env_vars/ + - Troubleshooting: https://microsoft.github.io/fabric-cli/troubleshooting/ + - Commands reference: https://microsoft.github.io/fabric-cli/commands/ + - Auth: https://microsoft.github.io/fabric-cli/commands/auth/ + - Import: https://microsoft.github.io/fabric-cli/commands/fs/import/ + - Export: https://microsoft.github.io/fabric-cli/commands/fs/export/ + - ls: https://microsoft.github.io/fabric-cli/commands/fs/ls/ + - get: https://microsoft.github.io/fabric-cli/commands/fs/get/ + - set: https://microsoft.github.io/fabric-cli/commands/fs/set/ + - Jobs: https://microsoft.github.io/fabric-cli/commands/jobs/ + - ACL: https://microsoft.github.io/fabric-cli/commands/acls/ + - API: https://microsoft.github.io/fabric-cli/commands/api/ + - Tables: https://microsoft.github.io/fabric-cli/commands/tables/ + - Shortcuts (ln): https://microsoft.github.io/fabric-cli/commands/fs/ln/ + - Auth examples: https://microsoft.github.io/fabric-cli/examples/auth_examples/ + - Item examples: https://microsoft.github.io/fabric-cli/examples/item_examples/ + ## Your Task Evaluate the feature request across these dimensions: diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index c8b16d1e..9388e303 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -8,28 +8,38 @@ messages: - Python 3.10-3.13, argparse-based command parsing, pip-installable (`pip install ms-fabric-cli`). - Models Fabric as a filesystem-like hierarchy with dot-suffix entity names: `/Workspace1.Workspace/FolderA.Folder/Item1.SemanticModel` - - Supports nested folders (up to ~10 levels), hidden entities accessed via `-a` flag or dot-prefix (`.capacities`, `.gateways`, `.sparkpools`, `.domains`, `.connections`). + - Supports nested folders (up to ~10 levels), hidden entities (`.capacities`, `.gateways`, `.sparkpools`). - Two modes: **interactive** (REPL-like, no `fab` prefix needed) and **command-line** (single process, `fab `). - - Authentication methods: - - Interactive browser login: `fab auth login` - - Service principal with secret: env vars `FAB_SPN_ID`, `FAB_SPN_SECRET`, `FAB_TENANT_ID` - - Service principal with certificate: env vars with cert path - - Service principal with federated credential: `FAB_SPN_FEDERATED_TOKEN` - - Managed identity: `fab auth login --managed-identity` - - Access token: `FAB_ACCESS_TOKEN` env var - - Common commands: `ls`, `get`, `set`, `rm`, `cd`, `import`, `export`, `open`, `auth login/logout/status` - - Global flag: `--output_format` with values `json` or `text` (default: `text`). There is NO `--output`, `-o`, `--format` flag. - - Path examples: - - List workspace contents: `fab ls /MyWorkspace.Workspace/` - - Get an item: `fab get /MyWorkspace.Workspace/MyNotebook.Notebook` - - Navigate folders: `fab ls /MyWorkspace.Workspace/FolderA.Folder/` - - Hidden entities: `fab ls -a .capacities` - Config stored in `~/.config/fab/` (config.json, auth.json, cache.bin) - Official CLI docs: https://microsoft.github.io/fabric-cli - Fabric REST API docs: https://learn.microsoft.com/en-us/rest/api/fabric/ - Power BI REST API docs: https://learn.microsoft.com/en-us/rest/api/power-bi/ - Fabric Capacity Azure REST API docs: https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities + ## CLI Documentation Pages (use for citations) + + - Hierarchy & concepts: https://microsoft.github.io/fabric-cli/essentials/hierarchy/ + - Resource types: https://microsoft.github.io/fabric-cli/essentials/resource_types/ + - Parameters: https://microsoft.github.io/fabric-cli/essentials/parameters/ + - Output format: https://microsoft.github.io/fabric-cli/essentials/output_format/ + - Modes: https://microsoft.github.io/fabric-cli/essentials/modes/ + - Environment variables: https://microsoft.github.io/fabric-cli/essentials/env_vars/ + - Troubleshooting: https://microsoft.github.io/fabric-cli/troubleshooting/ + - Commands reference: https://microsoft.github.io/fabric-cli/commands/ + - Auth: https://microsoft.github.io/fabric-cli/commands/auth/ + - Import: https://microsoft.github.io/fabric-cli/commands/fs/import/ + - Export: https://microsoft.github.io/fabric-cli/commands/fs/export/ + - ls: https://microsoft.github.io/fabric-cli/commands/fs/ls/ + - get: https://microsoft.github.io/fabric-cli/commands/fs/get/ + - set: https://microsoft.github.io/fabric-cli/commands/fs/set/ + - Jobs: https://microsoft.github.io/fabric-cli/commands/jobs/ + - ACL: https://microsoft.github.io/fabric-cli/commands/acls/ + - API: https://microsoft.github.io/fabric-cli/commands/api/ + - Tables: https://microsoft.github.io/fabric-cli/commands/tables/ + - Shortcuts (ln): https://microsoft.github.io/fabric-cli/commands/fs/ln/ + - Auth examples: https://microsoft.github.io/fabric-cli/examples/auth_examples/ + - Item examples: https://microsoft.github.io/fabric-cli/examples/item_examples/ + ## Your Task Answer the user's question as thoroughly and accurately as possible: diff --git a/.github/workflows/ai-issue-triage-agent.yml b/.github/workflows/ai-issue-triage-agent.yml new file mode 100644 index 00000000..45127111 --- /dev/null +++ b/.github/workflows/ai-issue-triage-agent.yml @@ -0,0 +1,302 @@ +name: "AI Issue Triage (B: Code Agent)" + +on: + issues: + types: [labeled] + workflow_dispatch: + inputs: + issue_number: + description: 'Issue number to triage' + required: true + type: number + +jobs: + ai-triage-agent: + if: github.event_name == 'workflow_dispatch' || github.event.label.name == 'needs triage' + runs-on: ubuntu-latest + permissions: + issues: write + models: read + contents: read + + env: + SUPPRESS_LABELS: 'true' + SUPPRESS_COMMENTS: 'false' + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Resolve issue details + id: issue + uses: actions/github-script@v7 + with: + script: | + const issueNumber = context.payload.issue?.number || ${{ inputs.issue_number || 0 }}; + const owner = context.repo.owner; + const repo = context.repo.repo; + + const { data: issue } = await github.rest.issues.get({ + owner, repo, issue_number: issueNumber, + }); + + const hasAiLabels = issue.labels.some(l => l.name.startsWith('ai:')); + const { data: comments } = await github.rest.issues.listComments({ + owner, repo, issue_number: issueNumber, per_page: 100, + }); + const hasAiComment = comments.some(c => + c.body && c.body.includes('### AI Assessment:') + ); + + const isRetriage = hasAiLabels || hasAiComment; + let issueBody = issue.body || ''; + + if (isRetriage) { + const lastAiIdx = comments.reduce((acc, c, i) => + c.body && c.body.includes('### AI Assessment:') ? i : acc, -1); + + const authorReplies = comments + .slice(lastAiIdx + 1) + .filter(c => c.user.login === issue.user.login) + .map(c => c.body) + .join('\n\n---\n\n'); + + if (authorReplies) { + issueBody = `[RE-TRIAGE] The author has provided additional information in response to a prior AI assessment.\n\n` + + `## Original Issue Summary\n${issue.title}\n\n` + + `## Author's Follow-up Response\n${authorReplies}\n\n` + + `Focus your assessment on the new information provided above. Reference the original issue only if needed for context.`; + } + } + + core.setOutput('number', issue.number); + core.setOutput('body', issueBody); + core.setOutput('title', issue.title); + core.setOutput('html_url', issue.html_url); + core.setOutput('labels', issue.labels.map(l => l.name).join(',')); + core.setOutput('author', issue.user.login); + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install triage dependencies + run: pip install requests pyyaml + + - name: Run AI triage agent + id: ai-assessment + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + ISSUE_TITLE: ${{ steps.issue.outputs.title }} + ISSUE_BODY: ${{ steps.issue.outputs.body }} + ISSUE_LABELS: ${{ steps.issue.outputs.labels }} + ISSUE_AUTHOR: ${{ steps.issue.outputs.author }} + AI_TRIAGE_MODEL: 'openai/gpt-4.1' + AI_TRIAGE_MAX_TOKENS: '1500' + run: python scripts/ai_triage.py + + - name: Apply AI label + if: steps.ai-assessment.outputs.assessment != '' && env.SUPPRESS_LABELS != 'true' + uses: actions/github-script@v7 + env: + ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} + PROMPT_NAME: ${{ steps.ai-assessment.outputs.prompt_name }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const issueNumber = parseInt(process.env.ISSUE_NUMBER); + const owner = context.repo.owner; + const repo = context.repo.repo; + const promptName = process.env.PROMPT_NAME; + const assessment = process.env.ASSESSMENT; + const labelName = `ai:${promptName}:${assessment.toLowerCase().replace(/\s+/g, ' ')}`; + + const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ + owner, repo, issue_number: issueNumber, + }); + for (const l of currentLabels) { + if (l.name.startsWith(`ai:${promptName}:`)) { + try { + await github.rest.issues.removeLabel({ + owner, repo, issue_number: issueNumber, name: l.name, + }); + } catch (_) {} + } + } + + await github.rest.issues.addLabels({ + owner, repo, issue_number: issueNumber, labels: [labelName], + }); + + - name: Post-process triage results + if: steps.ai-assessment.outputs.assessment != '' + uses: actions/github-script@v7 + env: + ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} + SUPPRESS_LABELS: ${{ env.SUPPRESS_LABELS }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const assessment = (process.env.ASSESSMENT || '').toLowerCase(); + const issueNumber = parseInt(process.env.ISSUE_NUMBER); + const owner = context.repo.owner; + const repo = context.repo.repo; + const suppressLabels = process.env.SUPPRESS_LABELS === 'true'; + + const needsHumanReview = assessment.includes('needs team review') + || assessment.includes('needs maintainer input') + || assessment.includes('potential bug'); + const addHelpWanted = assessment.includes('help wanted'); + const needsAuthorFeedback = assessment.includes('needs author feedback') + || assessment.includes('requires additional details'); + const canAutoClose = assessment.includes('answered') + || assessment.includes('likely misconfiguration') + || assessment.includes('redirect to docs'); + + core.info(`Assessment: ${process.env.ASSESSMENT}, needsHumanReview=${needsHumanReview}`); + + if (suppressLabels) { + core.info('Labels suppressed — logging decisions only.'); + core.exportVariable('LABEL_DECISIONS', JSON.stringify({ + needsHumanReview, addHelpWanted, needsAuthorFeedback, canAutoClose, + assessmentLabel: process.env.ASSESSMENT, + })); + return; + } + + if (addHelpWanted) { + await github.rest.issues.addLabels({ + owner, repo, issue_number: issueNumber, labels: ['help wanted'], + }); + } + + if (!needsHumanReview) { + try { + await github.rest.issues.removeLabel({ + owner, repo, issue_number: issueNumber, name: 'needs triage', + }); + } catch (e) { + core.info(`Could not remove "needs triage": ${e.message}`); + } + + if (canAutoClose && !needsAuthorFeedback && !addHelpWanted) { + await github.rest.issues.update({ + owner, repo, issue_number: issueNumber, + state: 'closed', state_reason: 'completed', + }); + } + } else { + await github.rest.issues.addLabels({ + owner, repo, issue_number: issueNumber, labels: ['ai:needs team attention'], + }); + await github.rest.issues.createComment({ + owner, repo, issue_number: issueNumber, + body: '🔔 @microsoft/fabric-cli-dev — This issue has been flagged by AI triage as requiring team attention.', + }); + } + + - name: Post tagged comment + if: steps.ai-assessment.outputs.response != '' + uses: actions/github-script@v7 + env: + RESPONSE: ${{ steps.ai-assessment.outputs.response }} + ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const response = process.env.RESPONSE; + const assessment = process.env.ASSESSMENT; + const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; + + let body = '> đŸ…ąī¸ **Approach B (Code Agent)** — code-aware triage agent that reads the actual source code\n\n'; + body += response + '\n\n'; + + body += `---\n`; + body += `
đŸˇī¸ Label Decisions (testing mode — not applied)\n\n`; + body += `| Decision | Value |\n|----------|-------|\n`; + if (ld) { + body += `| AI assessment | \`${ld.assessmentLabel}\` |\n`; + body += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅' : '❌'} |\n`; + body += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅' : '❌'} |\n`; + body += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅' : '❌'} |\n`; + body += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅' : '❌'} |\n`; + body += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅' : '❌'} |\n`; + body += `| Would notify team | ${ld.needsHumanReview ? '✅' : '❌'} |\n`; + } else { + body += `| AI assessment | \`${assessment}\` |\n`; + } + body += `\n
\n`; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: parseInt(process.env.ISSUE_NUMBER), + body, + }); + + - name: Generate triage summary + if: always() && steps.ai-assessment.outputs.assessment != '' + uses: actions/github-script@v7 + env: + ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} + PROMPT_NAME: ${{ steps.ai-assessment.outputs.prompt_name }} + RESPONSE: ${{ steps.ai-assessment.outputs.response }} + LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + ISSUE_TITLE: ${{ steps.issue.outputs.title }} + ISSUE_URL: ${{ steps.issue.outputs.html_url }} + with: + script: | + const issueNumber = process.env.ISSUE_NUMBER; + const issueTitle = process.env.ISSUE_TITLE; + const issueUrl = process.env.ISSUE_URL; + const promptName = process.env.PROMPT_NAME; + const assessment = process.env.ASSESSMENT; + const response = process.env.RESPONSE; + + let summary = `## 🤖 AI Triage Report (Approach B: Code Agent)\n\n`; + summary += `**Issue:** [#${issueNumber} — ${issueTitle}](${issueUrl})\n\n`; + summary += `### Prompt: \`${promptName}\`\n`; + summary += `**Assessment:** \`${assessment}\`\n\n`; + summary += `
Full AI Response\n\n`; + summary += `${response}\n\n`; + summary += `
\n\n`; + + const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; + if (ld) { + summary += `### đŸˇī¸ Label Decisions (not applied — testing mode)\n\n`; + summary += `| Decision | Value |\n|----------|-------|\n`; + summary += `| AI assessment label | \`${ld.assessmentLabel}\` |\n`; + summary += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would notify team | ${ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n\n`; + } + + summary += `---\n\n`; + + core.summary.addRaw(summary); + await core.summary.write(); + + const fs = require('fs'); + fs.mkdirSync('triage-reports', { recursive: true }); + fs.writeFileSync( + `triage-reports/issue-${issueNumber}-triage-agent.md`, + summary + ); + + - name: Upload triage report + if: always() && steps.ai-assessment.outputs.assessment != '' + uses: actions/upload-artifact@v4 + with: + name: triage-report-agent-issue-${{ steps.issue.outputs.number }} + path: triage-reports/ + retention-days: 30 diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 696ada6c..6e5a54f6 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -1,4 +1,4 @@ -name: AI Issue Triage +name: "AI Issue Triage (A: Action)" on: issues: @@ -20,8 +20,8 @@ jobs: contents: read env: - SUPPRESS_LABELS: 'false' - SUPPRESS_COMMENTS: 'false' + SUPPRESS_LABELS: 'true' + SUPPRESS_COMMENTS: 'true' steps: - name: Checkout @@ -276,7 +276,11 @@ jobs: // Skip label changes in summary-only mode (Phase 3) if (suppressLabels) { - core.info('Labels suppressed (summary-only mode) — skipping post-process label changes.'); + core.info('Labels suppressed — logging decisions only.'); + core.exportVariable('LABEL_DECISIONS', JSON.stringify({ + needsHumanReview, addHelpWanted, needsAuthorFeedback, canAutoClose, + assessmentLabels: assessments.map(a => a.assessmentLabel), + })); return; } @@ -336,11 +340,53 @@ jobs: core.info('Keeping "needs triage" and notified team.'); } + - name: Post tagged comment + if: steps.ai-assessment.outputs.ai_assessments != '' + uses: actions/github-script@v7 + env: + ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} + LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const assessments = JSON.parse(process.env.ASSESSMENT_OUTPUT); + const issueNumber = parseInt(process.env.ISSUE_NUMBER); + const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; + + let body = `> đŸ…°ī¸ **Approach A (Action)** — prompt-only, no codebase access\n\n`; + + for (const a of assessments) { + body += a.response + '\n\n'; + } + + if (ld) { + body += `---\n`; + body += `
đŸˇī¸ Label Decisions (testing mode — not applied)\n\n`; + body += `| Decision | Value |\n|----------|-------|\n`; + body += `| AI assessment | ${(ld.assessmentLabels || []).map(l => '`' + l + '`').join(', ')} |\n`; + body += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅' : '❌'} |\n`; + body += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅' : '❌'} |\n`; + body += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅' : '❌'} |\n`; + body += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅' : '❌'} |\n`; + body += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅' : '❌'} |\n`; + body += `| Would notify team | ${ld.needsHumanReview ? '✅' : '❌'} |\n\n`; + body += `
\n`; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + body, + }); + - name: Generate triage summary if: always() && steps.ai-assessment.outputs.ai_assessments != '' uses: actions/github-script@v7 env: ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} + LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} ISSUE_NUMBER: ${{ steps.issue.outputs.number }} ISSUE_TITLE: ${{ steps.issue.outputs.title }} ISSUE_URL: ${{ steps.issue.outputs.html_url }} @@ -351,26 +397,40 @@ jobs: const issueTitle = process.env.ISSUE_TITLE; const issueUrl = process.env.ISSUE_URL; - let summary = `## 🤖 AI Triage Report\n\n`; + let summary = `## 🤖 AI Triage Report (Approach A: Action)\n\n`; summary += `**Issue:** [#${issueNumber} — ${issueTitle}](${issueUrl})\n\n`; for (const assessment of assessments) { summary += `### Prompt: \`${assessment.prompt}\`\n`; - summary += `**Assessment Label:** \`${assessment.assessmentLabel}\`\n\n`; + summary += `**Assessment:** \`${assessment.assessmentLabel}\`\n\n`; summary += `
Full AI Response\n\n`; summary += `${assessment.response}\n\n`; - summary += `
\n\n---\n\n`; + summary += `\n\n`; } - // Write to job summary + // Show label decisions + const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; + if (ld) { + summary += `### đŸˇī¸ Label Decisions (not applied — testing mode)\n\n`; + summary += `| Decision | Value |\n|----------|-------|\n`; + summary += `| AI assessment labels | ${(ld.assessmentLabels || []).map(l => '`' + l + '`').join(', ')} |\n`; + summary += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅ Yes' : '❌ No'} |\n`; + summary += `| Would notify team | ${ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n\n`; + } + + summary += `---\n\n`; + core.summary.addRaw(summary); await core.summary.write(); - // Also write to file for artifact upload const fs = require('fs'); fs.mkdirSync('triage-reports', { recursive: true }); fs.writeFileSync( - `triage-reports/issue-${issueNumber}-triage.md`, + `triage-reports/issue-${issueNumber}-triage-action.md`, summary ); @@ -378,6 +438,6 @@ jobs: if: always() && steps.ai-assessment.outputs.ai_assessments != '' uses: actions/upload-artifact@v4 with: - name: triage-report-issue-${{ steps.issue.outputs.number }} + name: triage-report-action-issue-${{ steps.issue.outputs.number }} path: triage-reports/ retention-days: 30 diff --git a/scripts/ai_triage.py b/scripts/ai_triage.py new file mode 100644 index 00000000..8d5e225e --- /dev/null +++ b/scripts/ai_triage.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +"""AI Issue Triage Agent for Microsoft Fabric CLI. + +Reads issue details, discovers relevant source code, and produces +a high-quality triage assessment backed by codebase evidence, +official docs, and industry standards (RFCs, PEPs). +""" + +import json +import os +import re +import subprocess +import sys +from pathlib import Path + +import requests +import yaml + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- +MODEL = os.environ.get("AI_TRIAGE_MODEL", "openai/gpt-4.1") +MAX_TOKENS = int(os.environ.get("AI_TRIAGE_MAX_TOKENS", "1500")) +API_URL = "https://models.inference.ai.azure.com/chat/completions" + +# Files always included — they define the CLI's public surface +CORE_FILES = [ + "src/fabric_cli/parsers/fab_global_params.py", + "src/fabric_cli/parsers/fab_fs_parser.py", + "src/fabric_cli/parsers/fab_auth_parser.py", + "src/fabric_cli/core/fab_types.py", + "src/fabric_cli/core/fab_constant.py", +] + +MAX_FILE_CHARS = 8000 # per file +MAX_TOTAL_CODE_CHARS = 80000 # total budget +MAX_DISCOVERED_FILES = 12 + +# --------------------------------------------------------------------------- +# Issue helpers +# --------------------------------------------------------------------------- + +def get_issue_details() -> dict: + return { + "number": os.environ.get("ISSUE_NUMBER", ""), + "title": os.environ.get("ISSUE_TITLE", ""), + "body": os.environ.get("ISSUE_BODY", ""), + "labels": os.environ.get("ISSUE_LABELS", ""), + "author": os.environ.get("ISSUE_AUTHOR", ""), + } + + +def determine_prompt_name(labels: str) -> str: + low = labels.lower() + if "bug" in low: + return "bug-triage" + if "enhancement" in low: + return "feature-triage" + return "question-triage" + + +# --------------------------------------------------------------------------- +# Code discovery +# --------------------------------------------------------------------------- + +# Noise words that match too many files +_STOP_WORDS = frozenset({ + "the", "and", "for", "that", "this", "with", "from", "not", "but", + "are", "was", "were", "have", "has", "been", "will", "can", "should", + "using", "use", "when", "how", "what", "which", "where", "who", + "does", "issue", "bug", "error", "feature", "request", "please", + "expected", "actual", "behavior", "version", "python", "windows", + "linux", "macos", "darwin", "cli", "fab", "fabric", "microsoft", + "steps", "reproduce", "description", "additional", "context", + "possible", "solution", "mode", "interactive", "command", "line", +}) + + +def extract_keywords(text: str) -> list[str]: + """Extract meaningful keywords from issue text for code search.""" + text = re.sub(r"```.*?```", "", text, flags=re.DOTALL) + text = re.sub(r"https?://\S+", "", text) + text = re.sub(r"[#*`\[\](){}]", " ", text) + + words: set[str] = set() + for raw in text.split(): + w = raw.strip(".,;:!?\"'").lower() + if len(w) < 3 or w in _STOP_WORDS: + continue + # Keep identifiers, flags, CLI-related terms + if ( + "_" in w + or w.startswith("-") + or any(c.isupper() for c in raw[1:]) + or w in { + "import", "export", "auth", "login", "logout", "environment", + "notebook", "lakehouse", "warehouse", "pipeline", "workspace", + "capacity", "gateway", "domain", "connection", "shortcut", + "semantic", "model", "table", "onelake", "acl", "config", + "spark", "compute", "certificate", "federated", "token", + "folder", "item", "cache", "schedule", "jobs", "start", + "stop", "assign", "unassign", "label", "query", + } + ): + words.add(w.lstrip("-")) + + return list(words)[:20] + + +def find_relevant_files(keywords: list[str], repo_root: str) -> list[str]: + """Grep the source tree for files matching issue keywords.""" + src_dir = os.path.join(repo_root, "src/fabric_cli") + if not os.path.isdir(src_dir): + return [] + + hits: dict[str, int] = {} # filepath → hit count + for kw in keywords: + if len(kw) < 3: + continue + try: + result = subprocess.run( + ["grep", "-rli", "--include=*.py", kw, src_dir], + capture_output=True, text=True, timeout=5, + ) + for f in result.stdout.strip().split("\n"): + if f: + rel = os.path.relpath(f, repo_root) + hits[rel] = hits.get(rel, 0) + 1 + except Exception: + continue + + # Sort by relevance (most keyword hits first) + ranked = sorted(hits.items(), key=lambda x: -x[1]) + return [f for f, _ in ranked[:MAX_DISCOVERED_FILES]] + + +def read_code_files(file_paths: list[str], repo_root: str) -> dict[str, str]: + """Read source files, respecting per-file and total size limits.""" + contents: dict[str, str] = {} + total = 0 + for f in file_paths: + full = os.path.join(repo_root, f) + try: + text = Path(full).read_text(encoding="utf-8") + except Exception: + continue + if len(text) > MAX_FILE_CHARS: + text = text[:MAX_FILE_CHARS] + "\n# ... (truncated)" + if total + len(text) > MAX_TOTAL_CODE_CHARS: + break + contents[f] = text + total += len(text) + return contents + + +def format_code_context(code_files: dict[str, str]) -> str: + if not code_files: + return "" + parts = [] + for fp, content in code_files.items(): + parts.append(f"### {fp}\n```python\n{content}\n```") + return "\n\n".join(parts) + + +# --------------------------------------------------------------------------- +# Prompt construction +# --------------------------------------------------------------------------- + +CODE_CONTEXT_PREAMBLE = ( + "## Codebase Reference (source code)\n\n" + "The following is the **actual source code** of the CLI. " + "Use it as the authoritative reference for commands, flags, item types, " + "parsers, constants, and internal logic. " + "Base your analysis on this real implementation — do not guess.\n\n" +) + +STANDARDS_INSTRUCTION = ( + "\n## Standards & best practices\n\n" + "When relevant, reference established standards and best practices:\n" + "- **Python**: PEP 8 (style), PEP 257 (docstrings), PEP 484 (type hints)\n" + "- **CLI conventions**: POSIX Utility Conventions (IEEE Std 1003.1), " + "GNU Argument Syntax, 12-Factor CLI\n" + "- **HTTP/REST**: RFC 7231 (HTTP semantics), RFC 7807 (Problem Details), " + "Microsoft REST API Guidelines\n" + "- **Auth**: OAuth 2.0 (RFC 6749), MSAL best practices\n" + "- **General**: semver (for version questions), YAML 1.2 spec\n" +) + + +def load_prompt(prompt_name: str, repo_root: str) -> dict: + path = os.path.join(repo_root, f".github/prompts/{prompt_name}.prompt.yml") + with open(path) as f: + return yaml.safe_load(f) + + +def build_messages( + prompt_data: dict, + issue: dict, + code_context: str, +) -> list[dict]: + """Build the chat messages, injecting code context into the system prompt.""" + messages = [] + for msg in prompt_data.get("messages", []): + content = msg["content"] + + if msg["role"] == "system": + # Inject code context + standards before "## Your Task" + injection = "" + if code_context: + injection += CODE_CONTEXT_PREAMBLE + code_context + "\n\n" + injection += STANDARDS_INSTRUCTION + + marker = "## Your Task" + if marker in content: + content = content.replace(marker, injection + marker) + else: + content += "\n\n" + injection + + if msg["role"] == "user": + issue_text = f"**Title:** {issue['title']}\n\n{issue['body']}" + content = content.replace("{{input}}", issue_text) + + messages.append({"role": msg["role"], "content": content}) + + return messages + + +# --------------------------------------------------------------------------- +# Model call +# --------------------------------------------------------------------------- + +def call_model(messages: list[dict], token: str) -> str: + resp = requests.post( + API_URL, + headers={ + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", + }, + json={ + "model": MODEL, + "messages": messages, + "max_tokens": MAX_TOKENS, + }, + timeout=90, + ) + resp.raise_for_status() + return resp.json()["choices"][0]["message"]["content"] + + +# --------------------------------------------------------------------------- +# Response parsing +# --------------------------------------------------------------------------- + +def parse_assessment(text: str) -> str: + """Extract assessment category from '### AI Assessment: '.""" + m = re.search(r"###\s*AI Assessment:\s*(.+)", text) + return m.group(1).strip() if m else "Needs Team Review" + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +def main() -> None: + repo_root = os.environ.get("GITHUB_WORKSPACE", os.getcwd()) + token = os.environ.get("GITHUB_TOKEN", "") + if not token: + print("ERROR: GITHUB_TOKEN not set", file=sys.stderr) + sys.exit(1) + + issue = get_issue_details() + prompt_name = determine_prompt_name(issue["labels"]) + print(f"Triaging #{issue['number']}: {issue['title']}") + print(f"Prompt: {prompt_name}") + + # Discover relevant code + keywords = extract_keywords(f"{issue['title']} {issue['body']}") + print(f"Keywords ({len(keywords)}): {keywords[:10]}...") + discovered = find_relevant_files(keywords, repo_root) + + # Merge core + discovered, deduplicate + all_files = list(dict.fromkeys(CORE_FILES + discovered)) + code_files = read_code_files(all_files, repo_root) + print(f"Code context: {len(code_files)} files, ~{sum(len(v) for v in code_files.values())} chars") + + code_context = format_code_context(code_files) + + # Build prompt & call model + prompt_data = load_prompt(prompt_name, repo_root) + messages = build_messages(prompt_data, issue, code_context) + print("Calling model...") + response_text = call_model(messages, token) + + assessment = parse_assessment(response_text) + print(f"Assessment: {assessment}") + + # Write outputs for workflow consumption + output_file = os.environ.get("GITHUB_OUTPUT", "") + if output_file: + with open(output_file, "a") as f: + f.write(f"assessment={assessment}\n") + f.write(f"prompt_name={prompt_name}\n") + delim = "EOF_RESPONSE_BODY" + f.write(f"response<<{delim}\n{response_text}\n{delim}\n") + else: + print(f"\n{'='*60}") + print(f"Assessment: {assessment}") + print(f"{'='*60}") + print(response_text) + + +if __name__ == "__main__": + main() From dc64bae97d20f5eb8c0431b8e6ecbb7c8363122a Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 15:25:13 +0200 Subject: [PATCH 165/176] Fix A/B triage failures: YAML escaping and context size - A: Use yaml.safe_load/dump to avoid YAML alias errors from markdown **bold** - A: Remove bold markdown from injected context text - B: Reduce code context limits (30K total, 4K/file, 8 files max) - B: Add API error details to stderr for debugging Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ai-issue-triage.yml | 15 +++++++++------ scripts/ai_triage.py | 10 ++++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 6e5a54f6..393ca328 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -34,7 +34,7 @@ jobs: # Extract key CLI facts from the actual codebase for AI context. # This ensures the AI answers based on real code, not guesses. CONTEXT="## Codebase Reference (auto-extracted from source)\n\n" - CONTEXT+="**Important:** Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here.\n\n" + CONTEXT+="Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here.\n\n" # ── Commands & Flags (from parsers) ── CONTEXT+="### Filesystem Commands (fab_fs_parser.py)\n" @@ -138,15 +138,18 @@ jobs: # This way the AI sees the context privately, not in the issue body or comment. mkdir -p /tmp/prompts python3 << 'PYEOF' - import os, glob + import os, glob, yaml context = open('/tmp/codebase-context.txt').read() for prompt in glob.glob('.github/prompts/*.prompt.yml'): - content = open(prompt).read() + data = yaml.safe_load(open(prompt)) + sys_msg = data['messages'][0]['content'] marker = '## Your Task' - if marker in content: - content = content.replace(marker, context + '\n ' + marker) + if marker in sys_msg: + sys_msg = sys_msg.replace(marker, context + '\n' + marker) + data['messages'][0]['content'] = sys_msg out = '/tmp/prompts/' + os.path.basename(prompt) - open(out, 'w').write(content) + with open(out, 'w') as f: + yaml.dump(data, f, default_flow_style=False, allow_unicode=True, width=10000) PYEOF - name: Resolve issue details diff --git a/scripts/ai_triage.py b/scripts/ai_triage.py index 8d5e225e..923e14ac 100644 --- a/scripts/ai_triage.py +++ b/scripts/ai_triage.py @@ -32,9 +32,9 @@ "src/fabric_cli/core/fab_constant.py", ] -MAX_FILE_CHARS = 8000 # per file -MAX_TOTAL_CODE_CHARS = 80000 # total budget -MAX_DISCOVERED_FILES = 12 +MAX_FILE_CHARS = 4000 # per file +MAX_TOTAL_CODE_CHARS = 30000 # total budget +MAX_DISCOVERED_FILES = 8 # --------------------------------------------------------------------------- # Issue helpers @@ -243,7 +243,9 @@ def call_model(messages: list[dict], token: str) -> str: }, timeout=90, ) - resp.raise_for_status() + if resp.status_code != 200: + print(f"API error {resp.status_code}: {resp.text[:500]}", file=sys.stderr) + resp.raise_for_status() return resp.json()["choices"][0]["message"]["content"] From 0d6f8fa7bb9b8dd215896f719388cecf0cb6d9be Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 15:30:58 +0200 Subject: [PATCH 166/176] Fix Approach B API URL to use GitHub Models endpoint Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- scripts/ai_triage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/ai_triage.py b/scripts/ai_triage.py index 923e14ac..cd97952d 100644 --- a/scripts/ai_triage.py +++ b/scripts/ai_triage.py @@ -21,7 +21,7 @@ # --------------------------------------------------------------------------- MODEL = os.environ.get("AI_TRIAGE_MODEL", "openai/gpt-4.1") MAX_TOKENS = int(os.environ.get("AI_TRIAGE_MAX_TOKENS", "1500")) -API_URL = "https://models.inference.ai.azure.com/chat/completions" +API_URL = "https://models.github.ai/inference/chat/completions" # Files always included — they define the CLI's public surface CORE_FILES = [ @@ -244,8 +244,8 @@ def call_model(messages: list[dict], token: str) -> str: timeout=90, ) if resp.status_code != 200: - print(f"API error {resp.status_code}: {resp.text[:500]}", file=sys.stderr) - resp.raise_for_status() + print(f"API error {resp.status_code}: {resp.text[:1000]}", file=sys.stderr) + sys.exit(1) return resp.json()["choices"][0]["message"]["content"] From 839c2e3ad61b2ff96a72de7aab4cf99d8840cf40 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 15:45:11 +0200 Subject: [PATCH 167/176] Fix next-steps mapping: Potential Bug must escalate to team MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bug: Potential Bug and Needs Team Review → Escalated to team - Question: Tied each category explicitly to its footer - Feature: Tied each category explicitly to its footer - Removed stale Codebase Reference instruction from feature prompt Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 6 +++--- .github/prompts/feature-triage.prompt.yml | 9 ++++----- .github/prompts/question-triage.prompt.yml | 6 +++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index f55cff54..6dd0b4de 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -82,9 +82,9 @@ messages: Then provide your analysis in clearly structured sections. End every response with a **Next Steps** section using exactly one of these: - - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing) - - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) - - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when category is "Needs Author Feedback") + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when category is "Potential Bug", "Needs Team Review", or any issue that requires human investigation) + - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (only when category is "Likely Misconfiguration" and you provided a complete resolution) After the Next Steps section, always append this footer on a new line: `---` diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 96be42d6..0d6c2d5e 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -69,8 +69,7 @@ messages: - If marking as "Help Wanted", give a concrete starting point (directory, similar command, relevant API). - If marking as "Out of Scope", state why directly and suggest an alternative. - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. - - The system prompt includes a **"Codebase Reference"** section auto-extracted from the source code. Always use it as the authoritative source for commands, flags, item types, and auth methods. + - Do not invent CLI flags, commands, or features that are not listed in the "CLI Command Reference" section above. If unsure, direct the user to the official docs. - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. ## Re-triage @@ -85,9 +84,9 @@ messages: Then provide your analysis in clearly structured sections. End every response with a **Next Steps** section using exactly one of these: - - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing) - - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) - - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when fully handled) + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when category is "Needs Author Feedback" or "Needs Discussion") + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when category is "Needs Team Review", "Needs Discussion", or "Valuable Enhancement") + - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when category is "Help Wanted" or "Out of Scope") After the Next Steps section, always append this footer on a new line: `---` diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 9388e303..abcf330e 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -85,9 +85,9 @@ messages: Then provide your answer in clearly structured sections. End every response with a **Next Steps** section using exactly one of these: - - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when details are missing or question needs clarification) - - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when escalating) - - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when fully answered) + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when category is "Requires Additional Details") + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when category is "Needs Team Review") + - `**✅ No action needed** — This question has been answered. If you need further help, feel free to follow up.` (when category is "Answered" or "Redirect to Docs") After the Next Steps section, always append this footer on a new line: `---` From fccfa28b4dd4c1e77f9f03f021792647d0d5fc2f Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 15:51:34 +0200 Subject: [PATCH 168/176] =?UTF-8?q?chore:=20make=20triage=20comments=20con?= =?UTF-8?q?cise=20=E2=80=94=20only=20surface=20what=20matters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove numbered dimension checklists from all 3 prompts - Instruct model to skip adequate aspects, highlight only missing/wrong/notable - Reduce target length from 3-5 to 2-4 paragraphs - Trim verbose preamble in ai_triage.py code context header Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 24 ++++++++---------- .github/prompts/feature-triage.prompt.yml | 26 ++++++++----------- .github/prompts/question-triage.prompt.yml | 29 ++++++++-------------- scripts/ai_triage.py | 5 ++-- 4 files changed, 35 insertions(+), 49 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 6dd0b4de..07625d1f 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -42,11 +42,10 @@ messages: ## Your Task - Analyze the bug report and determine: - - 1. **Completeness**: Does the report include reproduction steps, CLI version, Python version, OS, CLI mode, auth method, expected vs actual behavior? Identify any missing elements. - 2. **Plausibility**: Based on the CLI architecture and Fabric REST APIs, is this likely a genuine bug, a user misconfiguration, or a documentation gap? - 3. **Severity**: Could this be a data-loss, security, or authentication issue requiring urgent attention? + Analyze the bug report and determine its plausibility and severity. Focus on what matters: + - Only mention missing information if it is critical for evaluation (e.g., no repro steps, no error message). Do not list every missing field. + - Only comment on severity if it is elevated (data-loss, security, auth). + - Skip dimensions that are adequate — do not confirm things are fine. ## Assessment Categories @@ -60,16 +59,15 @@ messages: ## Response Guidelines - - Be concise, crisp, and professional. You represent the Fabric CLI project. - - Write like an expert — short sentences, no filler, no pleasantries beyond a brief acknowledgment. + - Be concise and professional. You represent the Fabric CLI project. + - Write like an expert — short sentences, no filler, no pleasantries. + - Only highlight what is wrong, missing, or requires action. Do not comment on aspects that are adequate or expected. - Do not repeat information from the issue back to the reporter. - - If the issue seems like a misconfiguration, state the correct approach directly with a CLI example. - - If details are missing, list exactly what is needed — nothing more. + - If it's a misconfiguration, state the correct approach directly with a CLI example. - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - - Do not speculate about internal implementation details. - - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. - - The system prompt includes a **"Codebase Reference"** section auto-extracted from the source code. Always use it as the authoritative source for commands, flags, item types, and auth methods. - - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. + - Do not invent CLI flags, commands, or features not listed above. If unsure, direct to official docs. + - The system prompt may include a "Codebase Reference" section — use it as authoritative source. + - Keep the response to **2–4 short paragraphs**. No bullet-heavy walls of text. ## Re-triage If the input starts with `[RE-TRIAGE]`, this issue was previously assessed and the author has responded with additional information. Focus your assessment on the new information provided. Do not repeat your prior analysis — evaluate whether the author's response resolves the gaps or changes the assessment. diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 0d6c2d5e..6834cc77 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -42,14 +42,10 @@ messages: ## Your Task - Evaluate the feature request across these dimensions: - - 1. **Value Proposition**: Does this solve a real, recurring need? How many users would benefit? Does it reduce friction in common workflows? - 2. **Alignment**: Does it fit the CLI's design principles (path-first UX, stable verbs, dot-suffix entities, filesystem-like hierarchy)? Is it consistent with existing command patterns? - 3. **Backward Compatibility**: Can this be added without breaking existing commands, flags, or output formats? - 4. **Long-Term Viability**: Is this a durable addition that will remain useful as Fabric evolves, or is it a short-term workaround? Think mid-to-long term. - 5. **Feasibility**: Is there a supporting Fabric REST API? Is the implementation scope reasonable? - 6. **Community Implementability**: Is the feature well-scoped with clear API boundaries, making it suitable for a community contributor? If yes, suggest where in the codebase to start (e.g., commands directory, utils). + Evaluate the feature request. Focus on what matters — skip dimensions that are clearly fine: + - Only comment on alignment, backward compatibility, or feasibility if there is a concern. + - Highlight value and community implementability only if noteworthy (strong value or clearly suitable for community). + - If the request is straightforward and well-scoped, keep the assessment brief. ## Assessment Categories @@ -63,14 +59,14 @@ messages: ## Response Guidelines - - Be concise, crisp, and professional. You represent the Fabric CLI project. - - Write like an expert — short sentences, no filler, no pleasantries beyond a brief acknowledgment. + - Be concise and professional. You represent the Fabric CLI project. + - Write like an expert — short sentences, no filler, no pleasantries. + - Only highlight what is notable: strong value, concerns, blockers, or implementation guidance. Skip dimensions that are clearly fine. - Do not repeat the feature description back to the requester. - - If marking as "Help Wanted", give a concrete starting point (directory, similar command, relevant API). - - If marking as "Out of Scope", state why directly and suggest an alternative. - - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - - Do not invent CLI flags, commands, or features that are not listed in the "CLI Command Reference" section above. If unsure, direct the user to the official docs. - - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. + - If "Help Wanted", give a concrete starting point (directory, similar command, relevant API). + - If "Out of Scope", state why and suggest an alternative — nothing more. + - Do not invent CLI flags, commands, or features not listed above. If unsure, direct to official docs. + - Keep the response to **2–4 short paragraphs**. No bullet-heavy walls of text. ## Re-triage diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index abcf330e..4697c5ca 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -42,13 +42,10 @@ messages: ## Your Task - Answer the user's question as thoroughly and accurately as possible: - - 1. If the question is about **CLI usage**, provide clear instructions with command examples using the dot-suffix path syntax. - 2. If the question is about **Fabric concepts** (workspaces, lakehouses, semantic models, etc.), explain in the context of how the CLI interacts with them. - 3. If the question is about **authentication**, provide the relevant method and configuration steps. - 4. If the question is about **general Microsoft Fabric** (not CLI-specific), kindly redirect to the appropriate channel. - 5. If you are **uncertain** about the answer or the question requires internal knowledge, escalate to the team. + Answer the user's question accurately and concisely. Focus on what matters: + - Provide a direct answer. Do not pad with context the user already knows. + - Only include CLI examples if they directly answer the question. + - If redirecting, state where and why in one sentence — nothing more. ## Assessment Categories @@ -60,18 +57,14 @@ messages: ## Response Guidelines - - Be concise, crisp, and professional. You represent the Fabric CLI project. - - Write like an expert — short sentences, no filler, no pleasantries beyond a brief acknowledgment. + - Be concise and professional. You represent the Fabric CLI project. + - Write like an expert — short sentences, no filler, no pleasantries. + - Only highlight what is relevant to the question. Do not add tangential context. - Do not repeat the question back to the user. - - Provide concrete CLI examples using dot-suffix path syntax when applicable. - - Link to docs only when directly relevant: - - CLI: https://microsoft.github.io/fabric-cli - - Fabric REST API: https://learn.microsoft.com/en-us/rest/api/fabric/ - - Community Forum: https://community.fabric.microsoft.com/t5/Developer/bd-p/Developer - - If redirecting, state where and why in one sentence. - - Do not invent CLI flags, commands, or features that are not listed in the "About the CLI" section above. If unsure, direct the user to the official docs. - - The system prompt includes a **"Codebase Reference"** section auto-extracted from the source code. Always use it as the authoritative source for commands, flags, item types, and auth methods. - - Aim for **3–5 short paragraphs maximum**. Avoid bullet-heavy walls of text. + - Link to docs only when directly relevant. + - Do not invent CLI flags, commands, or features not listed above. If unsure, direct to official docs. + - The system prompt may include a "Codebase Reference" section — use it as authoritative source. + - Keep the response to **2–4 short paragraphs**. No bullet-heavy walls of text. ## Re-triage diff --git a/scripts/ai_triage.py b/scripts/ai_triage.py index cd97952d..538fbba8 100644 --- a/scripts/ai_triage.py +++ b/scripts/ai_triage.py @@ -168,9 +168,8 @@ def format_code_context(code_files: dict[str, str]) -> str: CODE_CONTEXT_PREAMBLE = ( "## Codebase Reference (source code)\n\n" - "The following is the **actual source code** of the CLI. " - "Use it as the authoritative reference for commands, flags, item types, " - "parsers, constants, and internal logic. " + "The following is the actual source code of the CLI. " + "Use it as the authoritative reference. " "Base your analysis on this real implementation — do not guess.\n\n" ) From a6805a2a4e28b8d1c412173488d900de4ee18fe3 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 16:02:55 +0200 Subject: [PATCH 169/176] fix: align feature triage footers and escalation logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Valuable Enhancement → 📋 Backlog candidate (no escalation) - Help Wanted → 🤝 Community contribution welcome - Out of Scope → ✅ No action needed - Add 'needs discussion' to needsHumanReview in both workflows Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/feature-triage.prompt.yml | 8 +++++--- .github/workflows/ai-issue-triage-agent.yml | 3 ++- .github/workflows/ai-issue-triage.yml | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 6834cc77..58b58b3e 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -80,9 +80,11 @@ messages: Then provide your analysis in clearly structured sections. End every response with a **Next Steps** section using exactly one of these: - - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when category is "Needs Author Feedback" or "Needs Discussion") - - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when category is "Needs Team Review", "Needs Discussion", or "Valuable Enhancement") - - `**✅ No action needed** — This issue has been triaged. The team will prioritize accordingly.` (when category is "Help Wanted" or "Out of Scope") + - `**âŗ Awaiting author feedback** — @{issue_author}, please provide the details listed above.` (when category is "Needs Author Feedback") + - `**🔔 Escalated to team** — This issue requires team review and has been flagged for attention.` (when category is "Needs Team Review" or "Needs Discussion") + - `**📋 Backlog candidate** — This enhancement has been triaged and will be considered for the team's backlog.` (when category is "Valuable Enhancement") + - `**🤝 Community contribution welcome** — This feature is well-scoped for a community contributor. See implementation guidance above.` (when category is "Help Wanted") + - `**✅ No action needed** — This request falls outside the CLI's scope.` (when category is "Out of Scope") After the Next Steps section, always append this footer on a new line: `---` diff --git a/.github/workflows/ai-issue-triage-agent.yml b/.github/workflows/ai-issue-triage-agent.yml index 45127111..86ddc2c6 100644 --- a/.github/workflows/ai-issue-triage-agent.yml +++ b/.github/workflows/ai-issue-triage-agent.yml @@ -149,7 +149,8 @@ jobs: const needsHumanReview = assessment.includes('needs team review') || assessment.includes('needs maintainer input') - || assessment.includes('potential bug'); + || assessment.includes('potential bug') + || assessment.includes('needs discussion'); const addHelpWanted = assessment.includes('help wanted'); const needsAuthorFeedback = assessment.includes('needs author feedback') || assessment.includes('requires additional details'); diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 393ca328..edd54def 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -254,7 +254,7 @@ jobs: const label = (assessment.assessmentLabel || '').toLowerCase(); // Check if the assessment requires human review - if (label.includes('needs team review') || label.includes('needs maintainer input') || label.includes('potential bug')) { + if (label.includes('needs team review') || label.includes('needs maintainer input') || label.includes('potential bug') || label.includes('needs discussion')) { needsHumanReview = true; } From c827abfb0e6f7ac0da5f32eefd821b34599defc3 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 16:46:50 +0200 Subject: [PATCH 170/176] feat: add standards & best practices to triage prompts Add tailored PEP/RFC/convention references to each prompt: - Bug: packaging, CLI conventions, HTTP/REST, auth, file I/O, runtime - Question: packaging, CLI conventions, HTTP/REST, auth, data formats - Feature: CLI conventions, packaging, HTTP/REST, backward compat, auth Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 11 +++++++++++ .github/prompts/feature-triage.prompt.yml | 10 ++++++++++ .github/prompts/question-triage.prompt.yml | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 07625d1f..f1f58eb3 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -40,6 +40,17 @@ messages: - Auth examples: https://microsoft.github.io/fabric-cli/examples/auth_examples/ - Item examples: https://microsoft.github.io/fabric-cli/examples/item_examples/ + ## Standards & Best Practices (use when relevant) + + - **Python packaging**: PEP 440 (versioning), PEP 508 (dependency specifiers), PEP 517/518 (build system). Use these to evaluate install, version, or dependency issues. + - **CLI conventions**: POSIX Utility Conventions (IEEE Std 1003.1), GNU Argument Syntax. Use these to evaluate flag/argument behavior and exit codes. + - **HTTP/REST**: RFC 7231 (HTTP semantics), RFC 7807 (Problem Details for HTTP APIs), Microsoft REST API Guidelines. Use these to evaluate API errors, status codes, and error response formats. + - **Auth**: OAuth 2.0 (RFC 6749), OpenID Connect, MSAL best practices. Use these to evaluate auth flows, token handling, and credential issues. + - **File I/O**: POSIX path semantics, PEP 428 (pathlib). Use these to evaluate path handling, file operations, and cross-platform behavior. + - **Python runtime**: PEP 8 (style), PEP 484 (type hints), PEP 3149 (ABI tags). Use these to evaluate runtime errors, compatibility, and import issues. + + When citing a standard, mention it briefly (e.g., "per RFC 7231, a 404 indicates...") — do not explain the standard itself. + ## Your Task Analyze the bug report and determine its plausibility and severity. Focus on what matters: diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 58b58b3e..730800e3 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -40,6 +40,16 @@ messages: - Auth examples: https://microsoft.github.io/fabric-cli/examples/auth_examples/ - Item examples: https://microsoft.github.io/fabric-cli/examples/item_examples/ + ## Standards & Best Practices (use when evaluating feasibility and design) + + - **CLI conventions**: POSIX Utility Conventions (IEEE Std 1003.1), GNU Argument Syntax, 12-Factor CLI. Use to evaluate whether a proposed command/flag design follows established patterns. + - **Python packaging**: PEP 440 (versioning), PEP 517/518 (build system), semver. Use to evaluate version or distribution-related requests. + - **HTTP/REST**: RFC 7231 (HTTP semantics), Microsoft REST API Guidelines. Use to evaluate whether a Fabric API supports the proposed feature. + - **Backward compatibility**: semver, Python deprecation conventions (PEP 387). Use to evaluate breaking change risk. + - **Auth**: OAuth 2.0 (RFC 6749), MSAL best practices. Use to evaluate auth-related feature requests. + + When citing a standard, mention it briefly (e.g., "this aligns with POSIX conventions for...") — do not explain the standard itself. + ## Your Task Evaluate the feature request. Focus on what matters — skip dimensions that are clearly fine: diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 4697c5ca..427ee464 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -40,6 +40,16 @@ messages: - Auth examples: https://microsoft.github.io/fabric-cli/examples/auth_examples/ - Item examples: https://microsoft.github.io/fabric-cli/examples/item_examples/ + ## Standards & Best Practices (use when relevant) + + - **Python packaging**: PEP 440 (versioning), PEP 508 (dependency specifiers). Reference when answering install or version questions. + - **CLI conventions**: POSIX Utility Conventions, GNU Argument Syntax. Reference when explaining flag behavior, exit codes, or argument patterns. + - **HTTP/REST**: RFC 7231 (HTTP semantics), Microsoft REST API Guidelines. Reference when explaining API responses or error codes. + - **Auth**: OAuth 2.0 (RFC 6749), OpenID Connect, MSAL best practices. Reference when explaining auth flows or token issues. + - **Data formats**: RFC 8259 (JSON), YAML 1.2 spec. Reference when explaining config or output format questions. + + When citing a standard, mention it briefly (e.g., "per POSIX conventions, exit code 0 means...") — do not explain the standard itself. + ## Your Task Answer the user's question accurately and concisely. Focus on what matters: From fe24a7332de454f554d8bf7531c1991f2b1c66e5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 17:14:16 +0200 Subject: [PATCH 171/176] refactor: consolidate AI triage to Approach A with self-contained prompts - Remove Approach B (agent workflow + ai_triage.py), archived on branch - Move codebase reference from pipeline build step into prompt files - Prompts now self-contained: commands, flags, item types, auth, hidden entities - Remove /tmp/prompts indirection, use .github/prompts directly - Clean up A/B testing artifacts (tagged comments, approach labels) - Restore phase control flags (SUPPRESS_LABELS + SUPPRESS_COMMENTS) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 91 +++++- .github/prompts/feature-triage.prompt.yml | 88 ++++++ .github/prompts/question-triage.prompt.yml | 91 +++++- .github/workflows/ai-issue-triage-agent.yml | 303 ------------------- .github/workflows/ai-issue-triage.yml | 187 +----------- scripts/ai_triage.py | 314 -------------------- 6 files changed, 276 insertions(+), 798 deletions(-) delete mode 100644 .github/workflows/ai-issue-triage-agent.yml delete mode 100644 scripts/ai_triage.py diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index f1f58eb3..bba9c69f 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -51,6 +51,94 @@ messages: When citing a standard, mention it briefly (e.g., "per RFC 7231, a 404 indicates...") — do not explain the standard itself. + ## Codebase Reference + + Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here. + + ### Filesystem Commands + | Command | Aliases | Key Flags | + |---|---|---| + | ls | dir | `path` (opt), `-l/--long`, `-a/--all`, `-q/--query` | + | mkdir | create | `path` (req), `-P/--params` (key=value) | + | cd | - | `path` (req) | + | rm | del | `path` (req), `-f/--force` | + | mv | move | `from_path`, `to_path` (req), `-f/--force`, `-r/--recursive` | + | cp | copy | `from_path`, `to_path` (req), `-f/--force`, `-r/--recursive` | + | exists | - | `path` (req) | + | pwd | - | - | + | open | - | `path` (req) | + | export | - | `path` (req), `-o/--output` (req, output dir), `-a/--all`, `--format`, `-f/--force` | + | get | - | `path` (req), `-q/--query`, `-o/--output` (output file), `-v/--verbose`, `-f/--force` | + | import | - | `path` (req), `-i/--input` (req, input dir), `--format`, `-f/--force` | + | set | - | `path` (req), `-q/--query` (req), `-i/--input` (req), `-f/--force` | + | clear | cls | - | + | ln | mklink | `path` (req), `--type` (req: adlsGen2/amazonS3/dataverse/googleCloudStorage/oneLake/s3Compatible), `--target`, `-i/--input`, `-f/--force` | + | start | - | `path` (req), `-f/--force` | + | stop | - | `path` (req), `-f/--force` | + | assign | - | `path` (req), `-W/--workspace` (req), `-f/--force` | + | unassign | - | `path` (req), `-W/--workspace` (req), `-f/--force` | + + ### Auth Commands (fab auth ...) + | Command | Flags | + |---|---| + | login | `-u/--username` (client ID), `-p/--password` (client secret), `-t/--tenant`, `-I/--identity` (managed identity), `--certificate` (PEM cert path), `--federated-token` | + | logout | - | + | status | - | + + ### Config Commands (fab config ...) + set `key` `value`, get `key`, ls, clear-cache + + ### Job Commands (fab jobs ...) + | Command | Key Flags | + |---|---| + | start | `path`, `-P/--params`, `-C/--config`, `-i/--input` | + | run | `path`, `-P/--params`, `--timeout`, `--polling_interval` | + | run-list | `path`, `--schedule` | + | run-cancel | `path`, `--id` (req) | + | run-sch | `path`, `--type` (cron/daily/weekly), `--interval`, `--start`, `--end`, `--days` | + | run-status | `path`, `--id` (req) | + + ### ACL Commands (fab acl ...) + ls `path`, get `path`, set `path` `-I/--identity` `-R/--role` (Admin/Member/Contributor/Viewer/Owner), rm `path` `-I/--identity` + + ### API Command + fab api `endpoint` `-X/--method` (get/post/delete/put/patch) `-A/--audience` (fabric/storage/azure/powerbi) `-i/--input` `-P/--params` `-H/--headers` + + ### Table Commands (fab table ...) + schema `path`, load `path` `--file` `--mode` (append/overwrite), vacuum `path` `--retain_n_hours`, optimize `path` `--vorder` `--zorder` + + ### Global Flags + `--output_format`: choices are `json` or `text` (default: `text`). There is NO `--output`, `-o`, or `--format` global flag. + Note: `-o/--output` on export/get is for output directory/file path, NOT output format. + `-help`: show help + + ### Supported Item Types + AISkill, ApacheAirflowJob, Code, CopyJob, CosmosDBDatabase, Dashboard, DataPipeline, Dataflow, Datamart, DigitalTwinBuilder, Environment, Eventhouse, Eventstream, GraphQLApi, KQLDashboard, KQLDatabase, KQLQueryset, Lakehouse, MLExperiment, MLModel, MetricSet, MirroredDatabase, MirroredWarehouse, MountedDataFactory, Notebook, PaginatedReport, Reflex, Report, RetailDataManager, SQLDatabase, SQLEndpoint, SemanticModel, SparkJobDefinition, SustainabilityDataSolution, UserDataFunction, VariableLibrary, Warehouse, Workspace + + ### Hidden Entities (tenant-level, via `-a` flag or dot-prefix) + .capacities, .connections, .gateways, .domains + + ### Hidden Entities (workspace-level) + .sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares + + ### Authentication Methods + 1. Interactive browser: `fab auth login` (default) + 2. Service principal (secret): `fab auth login -u -p -t ` or env vars: `FAB_SPN_CLIENT_ID` + `FAB_SPN_CLIENT_SECRET` + `FAB_TENANT_ID` + 3. Service principal (certificate): `fab auth login -u --certificate -t ` or env vars: `FAB_SPN_CLIENT_ID` + `FAB_SPN_CERT_PATH` (+ opt `FAB_SPN_CERT_PASSWORD`) + `FAB_TENANT_ID` + 4. Service principal (federated): `fab auth login -u --federated-token -t ` or env var: `FAB_SPN_FEDERATED_TOKEN` + 5. Managed identity (system): `fab auth login -I` + 6. Managed identity (user-assigned): `fab auth login -I -u ` + 7. Direct access token: `FAB_TOKEN` env var (no login needed) + + ### Runnable Item Types (fab start / fab jobs run) + SparkJobDefinition (sparkjob), Notebook (RunNotebook), DataPipeline (Pipeline), Lakehouse (TableMaintenance) + + ### OneLake Item Types + Folder, File, Table, Shortcut + + ### Shortcut Types (fab ln --type) + adlsGen2, amazonS3, dataverse, googleCloudStorage, oneLake, s3Compatible + ## Your Task Analyze the bug report and determine its plausibility and severity. Focus on what matters: @@ -76,8 +164,7 @@ messages: - Do not repeat information from the issue back to the reporter. - If it's a misconfiguration, state the correct approach directly with a CLI example. - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - - Do not invent CLI flags, commands, or features not listed above. If unsure, direct to official docs. - - The system prompt may include a "Codebase Reference" section — use it as authoritative source. + - Do not invent CLI flags, commands, or features not listed in the Codebase Reference above. If unsure, direct to official docs. - Keep the response to **2–4 short paragraphs**. No bullet-heavy walls of text. ## Re-triage diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index 730800e3..bd6d049f 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -50,6 +50,94 @@ messages: When citing a standard, mention it briefly (e.g., "this aligns with POSIX conventions for...") — do not explain the standard itself. + ## Codebase Reference + + Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here. + + ### Filesystem Commands + | Command | Aliases | Key Flags | + |---|---|---| + | ls | dir | `path` (opt), `-l/--long`, `-a/--all`, `-q/--query` | + | mkdir | create | `path` (req), `-P/--params` (key=value) | + | cd | - | `path` (req) | + | rm | del | `path` (req), `-f/--force` | + | mv | move | `from_path`, `to_path` (req), `-f/--force`, `-r/--recursive` | + | cp | copy | `from_path`, `to_path` (req), `-f/--force`, `-r/--recursive` | + | exists | - | `path` (req) | + | pwd | - | - | + | open | - | `path` (req) | + | export | - | `path` (req), `-o/--output` (req, output dir), `-a/--all`, `--format`, `-f/--force` | + | get | - | `path` (req), `-q/--query`, `-o/--output` (output file), `-v/--verbose`, `-f/--force` | + | import | - | `path` (req), `-i/--input` (req, input dir), `--format`, `-f/--force` | + | set | - | `path` (req), `-q/--query` (req), `-i/--input` (req), `-f/--force` | + | clear | cls | - | + | ln | mklink | `path` (req), `--type` (req: adlsGen2/amazonS3/dataverse/googleCloudStorage/oneLake/s3Compatible), `--target`, `-i/--input`, `-f/--force` | + | start | - | `path` (req), `-f/--force` | + | stop | - | `path` (req), `-f/--force` | + | assign | - | `path` (req), `-W/--workspace` (req), `-f/--force` | + | unassign | - | `path` (req), `-W/--workspace` (req), `-f/--force` | + + ### Auth Commands (fab auth ...) + | Command | Flags | + |---|---| + | login | `-u/--username` (client ID), `-p/--password` (client secret), `-t/--tenant`, `-I/--identity` (managed identity), `--certificate` (PEM cert path), `--federated-token` | + | logout | - | + | status | - | + + ### Config Commands (fab config ...) + set `key` `value`, get `key`, ls, clear-cache + + ### Job Commands (fab jobs ...) + | Command | Key Flags | + |---|---| + | start | `path`, `-P/--params`, `-C/--config`, `-i/--input` | + | run | `path`, `-P/--params`, `--timeout`, `--polling_interval` | + | run-list | `path`, `--schedule` | + | run-cancel | `path`, `--id` (req) | + | run-sch | `path`, `--type` (cron/daily/weekly), `--interval`, `--start`, `--end`, `--days` | + | run-status | `path`, `--id` (req) | + + ### ACL Commands (fab acl ...) + ls `path`, get `path`, set `path` `-I/--identity` `-R/--role` (Admin/Member/Contributor/Viewer/Owner), rm `path` `-I/--identity` + + ### API Command + fab api `endpoint` `-X/--method` (get/post/delete/put/patch) `-A/--audience` (fabric/storage/azure/powerbi) `-i/--input` `-P/--params` `-H/--headers` + + ### Table Commands (fab table ...) + schema `path`, load `path` `--file` `--mode` (append/overwrite), vacuum `path` `--retain_n_hours`, optimize `path` `--vorder` `--zorder` + + ### Global Flags + `--output_format`: choices are `json` or `text` (default: `text`). There is NO `--output`, `-o`, or `--format` global flag. + Note: `-o/--output` on export/get is for output directory/file path, NOT output format. + `-help`: show help + + ### Supported Item Types + AISkill, ApacheAirflowJob, Code, CopyJob, CosmosDBDatabase, Dashboard, DataPipeline, Dataflow, Datamart, DigitalTwinBuilder, Environment, Eventhouse, Eventstream, GraphQLApi, KQLDashboard, KQLDatabase, KQLQueryset, Lakehouse, MLExperiment, MLModel, MetricSet, MirroredDatabase, MirroredWarehouse, MountedDataFactory, Notebook, PaginatedReport, Reflex, Report, RetailDataManager, SQLDatabase, SQLEndpoint, SemanticModel, SparkJobDefinition, SustainabilityDataSolution, UserDataFunction, VariableLibrary, Warehouse, Workspace + + ### Hidden Entities (tenant-level, via `-a` flag or dot-prefix) + .capacities, .connections, .gateways, .domains + + ### Hidden Entities (workspace-level) + .sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares + + ### Authentication Methods + 1. Interactive browser: `fab auth login` (default) + 2. Service principal (secret): `fab auth login -u -p -t ` or env vars: `FAB_SPN_CLIENT_ID` + `FAB_SPN_CLIENT_SECRET` + `FAB_TENANT_ID` + 3. Service principal (certificate): `fab auth login -u --certificate -t ` or env vars: `FAB_SPN_CLIENT_ID` + `FAB_SPN_CERT_PATH` (+ opt `FAB_SPN_CERT_PASSWORD`) + `FAB_TENANT_ID` + 4. Service principal (federated): `fab auth login -u --federated-token -t ` or env var: `FAB_SPN_FEDERATED_TOKEN` + 5. Managed identity (system): `fab auth login -I` + 6. Managed identity (user-assigned): `fab auth login -I -u ` + 7. Direct access token: `FAB_TOKEN` env var (no login needed) + + ### Runnable Item Types (fab start / fab jobs run) + SparkJobDefinition (sparkjob), Notebook (RunNotebook), DataPipeline (Pipeline), Lakehouse (TableMaintenance) + + ### OneLake Item Types + Folder, File, Table, Shortcut + + ### Shortcut Types (fab ln --type) + adlsGen2, amazonS3, dataverse, googleCloudStorage, oneLake, s3Compatible + ## Your Task Evaluate the feature request. Focus on what matters — skip dimensions that are clearly fine: diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index 427ee464..d8902237 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -50,6 +50,94 @@ messages: When citing a standard, mention it briefly (e.g., "per POSIX conventions, exit code 0 means...") — do not explain the standard itself. + ## Codebase Reference + + Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here. + + ### Filesystem Commands + | Command | Aliases | Key Flags | + |---|---|---| + | ls | dir | `path` (opt), `-l/--long`, `-a/--all`, `-q/--query` | + | mkdir | create | `path` (req), `-P/--params` (key=value) | + | cd | - | `path` (req) | + | rm | del | `path` (req), `-f/--force` | + | mv | move | `from_path`, `to_path` (req), `-f/--force`, `-r/--recursive` | + | cp | copy | `from_path`, `to_path` (req), `-f/--force`, `-r/--recursive` | + | exists | - | `path` (req) | + | pwd | - | - | + | open | - | `path` (req) | + | export | - | `path` (req), `-o/--output` (req, output dir), `-a/--all`, `--format`, `-f/--force` | + | get | - | `path` (req), `-q/--query`, `-o/--output` (output file), `-v/--verbose`, `-f/--force` | + | import | - | `path` (req), `-i/--input` (req, input dir), `--format`, `-f/--force` | + | set | - | `path` (req), `-q/--query` (req), `-i/--input` (req), `-f/--force` | + | clear | cls | - | + | ln | mklink | `path` (req), `--type` (req: adlsGen2/amazonS3/dataverse/googleCloudStorage/oneLake/s3Compatible), `--target`, `-i/--input`, `-f/--force` | + | start | - | `path` (req), `-f/--force` | + | stop | - | `path` (req), `-f/--force` | + | assign | - | `path` (req), `-W/--workspace` (req), `-f/--force` | + | unassign | - | `path` (req), `-W/--workspace` (req), `-f/--force` | + + ### Auth Commands (fab auth ...) + | Command | Flags | + |---|---| + | login | `-u/--username` (client ID), `-p/--password` (client secret), `-t/--tenant`, `-I/--identity` (managed identity), `--certificate` (PEM cert path), `--federated-token` | + | logout | - | + | status | - | + + ### Config Commands (fab config ...) + set `key` `value`, get `key`, ls, clear-cache + + ### Job Commands (fab jobs ...) + | Command | Key Flags | + |---|---| + | start | `path`, `-P/--params`, `-C/--config`, `-i/--input` | + | run | `path`, `-P/--params`, `--timeout`, `--polling_interval` | + | run-list | `path`, `--schedule` | + | run-cancel | `path`, `--id` (req) | + | run-sch | `path`, `--type` (cron/daily/weekly), `--interval`, `--start`, `--end`, `--days` | + | run-status | `path`, `--id` (req) | + + ### ACL Commands (fab acl ...) + ls `path`, get `path`, set `path` `-I/--identity` `-R/--role` (Admin/Member/Contributor/Viewer/Owner), rm `path` `-I/--identity` + + ### API Command + fab api `endpoint` `-X/--method` (get/post/delete/put/patch) `-A/--audience` (fabric/storage/azure/powerbi) `-i/--input` `-P/--params` `-H/--headers` + + ### Table Commands (fab table ...) + schema `path`, load `path` `--file` `--mode` (append/overwrite), vacuum `path` `--retain_n_hours`, optimize `path` `--vorder` `--zorder` + + ### Global Flags + `--output_format`: choices are `json` or `text` (default: `text`). There is NO `--output`, `-o`, or `--format` global flag. + Note: `-o/--output` on export/get is for output directory/file path, NOT output format. + `-help`: show help + + ### Supported Item Types + AISkill, ApacheAirflowJob, Code, CopyJob, CosmosDBDatabase, Dashboard, DataPipeline, Dataflow, Datamart, DigitalTwinBuilder, Environment, Eventhouse, Eventstream, GraphQLApi, KQLDashboard, KQLDatabase, KQLQueryset, Lakehouse, MLExperiment, MLModel, MetricSet, MirroredDatabase, MirroredWarehouse, MountedDataFactory, Notebook, PaginatedReport, Reflex, Report, RetailDataManager, SQLDatabase, SQLEndpoint, SemanticModel, SparkJobDefinition, SustainabilityDataSolution, UserDataFunction, VariableLibrary, Warehouse, Workspace + + ### Hidden Entities (tenant-level, via `-a` flag or dot-prefix) + .capacities, .connections, .gateways, .domains + + ### Hidden Entities (workspace-level) + .sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares + + ### Authentication Methods + 1. Interactive browser: `fab auth login` (default) + 2. Service principal (secret): `fab auth login -u -p -t ` or env vars: `FAB_SPN_CLIENT_ID` + `FAB_SPN_CLIENT_SECRET` + `FAB_TENANT_ID` + 3. Service principal (certificate): `fab auth login -u --certificate -t ` or env vars: `FAB_SPN_CLIENT_ID` + `FAB_SPN_CERT_PATH` (+ opt `FAB_SPN_CERT_PASSWORD`) + `FAB_TENANT_ID` + 4. Service principal (federated): `fab auth login -u --federated-token -t ` or env var: `FAB_SPN_FEDERATED_TOKEN` + 5. Managed identity (system): `fab auth login -I` + 6. Managed identity (user-assigned): `fab auth login -I -u ` + 7. Direct access token: `FAB_TOKEN` env var (no login needed) + + ### Runnable Item Types (fab start / fab jobs run) + SparkJobDefinition (sparkjob), Notebook (RunNotebook), DataPipeline (Pipeline), Lakehouse (TableMaintenance) + + ### OneLake Item Types + Folder, File, Table, Shortcut + + ### Shortcut Types (fab ln --type) + adlsGen2, amazonS3, dataverse, googleCloudStorage, oneLake, s3Compatible + ## Your Task Answer the user's question accurately and concisely. Focus on what matters: @@ -72,8 +160,7 @@ messages: - Only highlight what is relevant to the question. Do not add tangential context. - Do not repeat the question back to the user. - Link to docs only when directly relevant. - - Do not invent CLI flags, commands, or features not listed above. If unsure, direct to official docs. - - The system prompt may include a "Codebase Reference" section — use it as authoritative source. + - Do not invent CLI flags, commands, or features not listed in the Codebase Reference above. If unsure, direct to official docs. - Keep the response to **2–4 short paragraphs**. No bullet-heavy walls of text. ## Re-triage diff --git a/.github/workflows/ai-issue-triage-agent.yml b/.github/workflows/ai-issue-triage-agent.yml deleted file mode 100644 index 86ddc2c6..00000000 --- a/.github/workflows/ai-issue-triage-agent.yml +++ /dev/null @@ -1,303 +0,0 @@ -name: "AI Issue Triage (B: Code Agent)" - -on: - issues: - types: [labeled] - workflow_dispatch: - inputs: - issue_number: - description: 'Issue number to triage' - required: true - type: number - -jobs: - ai-triage-agent: - if: github.event_name == 'workflow_dispatch' || github.event.label.name == 'needs triage' - runs-on: ubuntu-latest - permissions: - issues: write - models: read - contents: read - - env: - SUPPRESS_LABELS: 'true' - SUPPRESS_COMMENTS: 'false' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Resolve issue details - id: issue - uses: actions/github-script@v7 - with: - script: | - const issueNumber = context.payload.issue?.number || ${{ inputs.issue_number || 0 }}; - const owner = context.repo.owner; - const repo = context.repo.repo; - - const { data: issue } = await github.rest.issues.get({ - owner, repo, issue_number: issueNumber, - }); - - const hasAiLabels = issue.labels.some(l => l.name.startsWith('ai:')); - const { data: comments } = await github.rest.issues.listComments({ - owner, repo, issue_number: issueNumber, per_page: 100, - }); - const hasAiComment = comments.some(c => - c.body && c.body.includes('### AI Assessment:') - ); - - const isRetriage = hasAiLabels || hasAiComment; - let issueBody = issue.body || ''; - - if (isRetriage) { - const lastAiIdx = comments.reduce((acc, c, i) => - c.body && c.body.includes('### AI Assessment:') ? i : acc, -1); - - const authorReplies = comments - .slice(lastAiIdx + 1) - .filter(c => c.user.login === issue.user.login) - .map(c => c.body) - .join('\n\n---\n\n'); - - if (authorReplies) { - issueBody = `[RE-TRIAGE] The author has provided additional information in response to a prior AI assessment.\n\n` - + `## Original Issue Summary\n${issue.title}\n\n` - + `## Author's Follow-up Response\n${authorReplies}\n\n` - + `Focus your assessment on the new information provided above. Reference the original issue only if needed for context.`; - } - } - - core.setOutput('number', issue.number); - core.setOutput('body', issueBody); - core.setOutput('title', issue.title); - core.setOutput('html_url', issue.html_url); - core.setOutput('labels', issue.labels.map(l => l.name).join(',')); - core.setOutput('author', issue.user.login); - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - - name: Install triage dependencies - run: pip install requests pyyaml - - - name: Run AI triage agent - id: ai-assessment - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - ISSUE_NUMBER: ${{ steps.issue.outputs.number }} - ISSUE_TITLE: ${{ steps.issue.outputs.title }} - ISSUE_BODY: ${{ steps.issue.outputs.body }} - ISSUE_LABELS: ${{ steps.issue.outputs.labels }} - ISSUE_AUTHOR: ${{ steps.issue.outputs.author }} - AI_TRIAGE_MODEL: 'openai/gpt-4.1' - AI_TRIAGE_MAX_TOKENS: '1500' - run: python scripts/ai_triage.py - - - name: Apply AI label - if: steps.ai-assessment.outputs.assessment != '' && env.SUPPRESS_LABELS != 'true' - uses: actions/github-script@v7 - env: - ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} - PROMPT_NAME: ${{ steps.ai-assessment.outputs.prompt_name }} - ISSUE_NUMBER: ${{ steps.issue.outputs.number }} - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const issueNumber = parseInt(process.env.ISSUE_NUMBER); - const owner = context.repo.owner; - const repo = context.repo.repo; - const promptName = process.env.PROMPT_NAME; - const assessment = process.env.ASSESSMENT; - const labelName = `ai:${promptName}:${assessment.toLowerCase().replace(/\s+/g, ' ')}`; - - const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ - owner, repo, issue_number: issueNumber, - }); - for (const l of currentLabels) { - if (l.name.startsWith(`ai:${promptName}:`)) { - try { - await github.rest.issues.removeLabel({ - owner, repo, issue_number: issueNumber, name: l.name, - }); - } catch (_) {} - } - } - - await github.rest.issues.addLabels({ - owner, repo, issue_number: issueNumber, labels: [labelName], - }); - - - name: Post-process triage results - if: steps.ai-assessment.outputs.assessment != '' - uses: actions/github-script@v7 - env: - ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} - SUPPRESS_LABELS: ${{ env.SUPPRESS_LABELS }} - ISSUE_NUMBER: ${{ steps.issue.outputs.number }} - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const assessment = (process.env.ASSESSMENT || '').toLowerCase(); - const issueNumber = parseInt(process.env.ISSUE_NUMBER); - const owner = context.repo.owner; - const repo = context.repo.repo; - const suppressLabels = process.env.SUPPRESS_LABELS === 'true'; - - const needsHumanReview = assessment.includes('needs team review') - || assessment.includes('needs maintainer input') - || assessment.includes('potential bug') - || assessment.includes('needs discussion'); - const addHelpWanted = assessment.includes('help wanted'); - const needsAuthorFeedback = assessment.includes('needs author feedback') - || assessment.includes('requires additional details'); - const canAutoClose = assessment.includes('answered') - || assessment.includes('likely misconfiguration') - || assessment.includes('redirect to docs'); - - core.info(`Assessment: ${process.env.ASSESSMENT}, needsHumanReview=${needsHumanReview}`); - - if (suppressLabels) { - core.info('Labels suppressed — logging decisions only.'); - core.exportVariable('LABEL_DECISIONS', JSON.stringify({ - needsHumanReview, addHelpWanted, needsAuthorFeedback, canAutoClose, - assessmentLabel: process.env.ASSESSMENT, - })); - return; - } - - if (addHelpWanted) { - await github.rest.issues.addLabels({ - owner, repo, issue_number: issueNumber, labels: ['help wanted'], - }); - } - - if (!needsHumanReview) { - try { - await github.rest.issues.removeLabel({ - owner, repo, issue_number: issueNumber, name: 'needs triage', - }); - } catch (e) { - core.info(`Could not remove "needs triage": ${e.message}`); - } - - if (canAutoClose && !needsAuthorFeedback && !addHelpWanted) { - await github.rest.issues.update({ - owner, repo, issue_number: issueNumber, - state: 'closed', state_reason: 'completed', - }); - } - } else { - await github.rest.issues.addLabels({ - owner, repo, issue_number: issueNumber, labels: ['ai:needs team attention'], - }); - await github.rest.issues.createComment({ - owner, repo, issue_number: issueNumber, - body: '🔔 @microsoft/fabric-cli-dev — This issue has been flagged by AI triage as requiring team attention.', - }); - } - - - name: Post tagged comment - if: steps.ai-assessment.outputs.response != '' - uses: actions/github-script@v7 - env: - RESPONSE: ${{ steps.ai-assessment.outputs.response }} - ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} - ISSUE_NUMBER: ${{ steps.issue.outputs.number }} - LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const response = process.env.RESPONSE; - const assessment = process.env.ASSESSMENT; - const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; - - let body = '> đŸ…ąī¸ **Approach B (Code Agent)** — code-aware triage agent that reads the actual source code\n\n'; - body += response + '\n\n'; - - body += `---\n`; - body += `
đŸˇī¸ Label Decisions (testing mode — not applied)\n\n`; - body += `| Decision | Value |\n|----------|-------|\n`; - if (ld) { - body += `| AI assessment | \`${ld.assessmentLabel}\` |\n`; - body += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅' : '❌'} |\n`; - body += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅' : '❌'} |\n`; - body += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅' : '❌'} |\n`; - body += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅' : '❌'} |\n`; - body += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅' : '❌'} |\n`; - body += `| Would notify team | ${ld.needsHumanReview ? '✅' : '❌'} |\n`; - } else { - body += `| AI assessment | \`${assessment}\` |\n`; - } - body += `\n
\n`; - - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: parseInt(process.env.ISSUE_NUMBER), - body, - }); - - - name: Generate triage summary - if: always() && steps.ai-assessment.outputs.assessment != '' - uses: actions/github-script@v7 - env: - ASSESSMENT: ${{ steps.ai-assessment.outputs.assessment }} - PROMPT_NAME: ${{ steps.ai-assessment.outputs.prompt_name }} - RESPONSE: ${{ steps.ai-assessment.outputs.response }} - LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} - ISSUE_NUMBER: ${{ steps.issue.outputs.number }} - ISSUE_TITLE: ${{ steps.issue.outputs.title }} - ISSUE_URL: ${{ steps.issue.outputs.html_url }} - with: - script: | - const issueNumber = process.env.ISSUE_NUMBER; - const issueTitle = process.env.ISSUE_TITLE; - const issueUrl = process.env.ISSUE_URL; - const promptName = process.env.PROMPT_NAME; - const assessment = process.env.ASSESSMENT; - const response = process.env.RESPONSE; - - let summary = `## 🤖 AI Triage Report (Approach B: Code Agent)\n\n`; - summary += `**Issue:** [#${issueNumber} — ${issueTitle}](${issueUrl})\n\n`; - summary += `### Prompt: \`${promptName}\`\n`; - summary += `**Assessment:** \`${assessment}\`\n\n`; - summary += `
Full AI Response\n\n`; - summary += `${response}\n\n`; - summary += `
\n\n`; - - const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; - if (ld) { - summary += `### đŸˇī¸ Label Decisions (not applied — testing mode)\n\n`; - summary += `| Decision | Value |\n|----------|-------|\n`; - summary += `| AI assessment label | \`${ld.assessmentLabel}\` |\n`; - summary += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅ Yes' : '❌ No'} |\n`; - summary += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n`; - summary += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅ Yes' : '❌ No'} |\n`; - summary += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n`; - summary += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅ Yes' : '❌ No'} |\n`; - summary += `| Would notify team | ${ld.needsHumanReview ? '✅ Yes' : '❌ No'} |\n\n`; - } - - summary += `---\n\n`; - - core.summary.addRaw(summary); - await core.summary.write(); - - const fs = require('fs'); - fs.mkdirSync('triage-reports', { recursive: true }); - fs.writeFileSync( - `triage-reports/issue-${issueNumber}-triage-agent.md`, - summary - ); - - - name: Upload triage report - if: always() && steps.ai-assessment.outputs.assessment != '' - uses: actions/upload-artifact@v4 - with: - name: triage-report-agent-issue-${{ steps.issue.outputs.number }} - path: triage-reports/ - retention-days: 30 diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index edd54def..446bee21 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -1,4 +1,4 @@ -name: "AI Issue Triage (A: Action)" +name: "AI Issue Triage" on: issues: @@ -20,6 +20,11 @@ jobs: contents: read env: + # ------------------------------------------------------- + # Phase control — toggle these two flags to switch phases: + # Testing (fork): suppress both → true / true + # Production: enable both → false / false + # ------------------------------------------------------- SUPPRESS_LABELS: 'true' SUPPRESS_COMMENTS: 'true' @@ -27,131 +32,6 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Build codebase context - id: codebase - shell: bash - run: | - # Extract key CLI facts from the actual codebase for AI context. - # This ensures the AI answers based on real code, not guesses. - CONTEXT="## Codebase Reference (auto-extracted from source)\n\n" - CONTEXT+="Only reference commands, flags, and features listed below. Do not invent or assume any CLI capability not documented here.\n\n" - - # ── Commands & Flags (from parsers) ── - CONTEXT+="### Filesystem Commands (fab_fs_parser.py)\n" - CONTEXT+="| Command | Aliases | Key Flags |\n|---|---|---|\n" - CONTEXT+="| ls | dir | \`path\` (opt), \`-l/--long\`, \`-a/--all\`, \`-q/--query\` |\n" - CONTEXT+="| mkdir | create | \`path\` (req), \`-P/--params\` (key=value) |\n" - CONTEXT+="| cd | — | \`path\` (req) |\n" - CONTEXT+="| rm | del | \`path\` (req), \`-f/--force\` |\n" - CONTEXT+="| mv | move | \`from_path\`, \`to_path\` (req), \`-f/--force\`, \`-r/--recursive\` |\n" - CONTEXT+="| cp | copy | \`from_path\`, \`to_path\` (req), \`-f/--force\`, \`-r/--recursive\` |\n" - CONTEXT+="| exists | — | \`path\` (req) |\n" - CONTEXT+="| pwd | — | — |\n" - CONTEXT+="| open | — | \`path\` (req) |\n" - CONTEXT+="| export | — | \`path\` (req), \`-o/--output\` (req, output dir), \`-a/--all\`, \`--format\`, \`-f/--force\` |\n" - CONTEXT+="| get | — | \`path\` (req), \`-q/--query\`, \`-o/--output\` (output file), \`-v/--verbose\`, \`-f/--force\` |\n" - CONTEXT+="| import | — | \`path\` (req), \`-i/--input\` (req, input dir), \`--format\`, \`-f/--force\` |\n" - CONTEXT+="| set | — | \`path\` (req), \`-q/--query\` (req), \`-i/--input\` (req), \`-f/--force\` |\n" - CONTEXT+="| clear | cls | — |\n" - CONTEXT+="| ln | mklink | \`path\` (req), \`--type\` (req: adlsGen2/amazonS3/dataverse/googleCloudStorage/oneLake/s3Compatible), \`--target\`, \`-i/--input\`, \`-f/--force\` |\n" - CONTEXT+="| start | — | \`path\` (req), \`-f/--force\` |\n" - CONTEXT+="| stop | — | \`path\` (req), \`-f/--force\` |\n" - CONTEXT+="| assign | — | \`path\` (req), \`-W/--workspace\` (req), \`-f/--force\` |\n" - CONTEXT+="| unassign | — | \`path\` (req), \`-W/--workspace\` (req), \`-f/--force\` |\n\n" - - CONTEXT+="### Auth Commands (fab auth ...)\n" - CONTEXT+="| Command | Flags |\n|---|---|\n" - CONTEXT+="| login | \`-u/--username\` (client ID), \`-p/--password\` (client secret), \`-t/--tenant\`, \`-I/--identity\` (managed identity), \`--certificate\` (PEM cert path), \`--federated-token\` |\n" - CONTEXT+="| logout | — |\n" - CONTEXT+="| status | — |\n\n" - - CONTEXT+="### Config Commands (fab config ...)\n" - CONTEXT+="set \`key\` \`value\`, get \`key\`, ls, clear-cache\n\n" - - CONTEXT+="### Job Commands (fab jobs ...)\n" - CONTEXT+="| Command | Key Flags |\n|---|---|\n" - CONTEXT+="| start | \`path\`, \`-P/--params\`, \`-C/--config\`, \`-i/--input\` |\n" - CONTEXT+="| run | \`path\`, \`-P/--params\`, \`--timeout\`, \`--polling_interval\` |\n" - CONTEXT+="| run-list | \`path\`, \`--schedule\` |\n" - CONTEXT+="| run-cancel | \`path\`, \`--id\` (req) |\n" - CONTEXT+="| run-sch | \`path\`, \`--type\` (cron/daily/weekly), \`--interval\`, \`--start\`, \`--end\`, \`--days\` |\n" - CONTEXT+="| run-status | \`path\`, \`--id\` (req) |\n\n" - - CONTEXT+="### ACL Commands (fab acl ...)\n" - CONTEXT+="ls \`path\`, get \`path\`, set \`path\` \`-I/--identity\` \`-R/--role\` (Admin/Member/Contributor/Viewer/Owner), rm \`path\` \`-I/--identity\`\n\n" - - CONTEXT+="### API Command\n" - CONTEXT+="fab api \`endpoint\` \`-X/--method\` (get/post/delete/put/patch) \`-A/--audience\` (fabric/storage/azure/powerbi) \`-i/--input\` \`-P/--params\` \`-H/--headers\`\n\n" - - CONTEXT+="### Table Commands (fab table ...)\n" - CONTEXT+="schema \`path\`, load \`path\` \`--file\` \`--mode\` (append/overwrite), vacuum \`path\` \`--retain_n_hours\`, optimize \`path\` \`--vorder\` \`--zorder\`\n\n" - - # ── Global Flags ── - CONTEXT+="### Global Flags\n" - CONTEXT+="\`--output_format\`: choices are \`json\` or \`text\` (default: \`text\`). There is NO \`--output\`, \`-o\`, or \`--format\` global flag.\n" - CONTEXT+="Note: \`-o/--output\` on export/get is for output directory/file path, NOT output format.\n" - CONTEXT+="\`-help\`: show help\n\n" - - # ── Item Types (dynamically extracted) ── - CONTEXT+="### Supported Item Types\n" - ITEMS=$(grep -E '^\s+\w+ = "' src/fabric_cli/core/fab_types.py | sed 's/.*= "//;s/"//' | sort | tr '\n' ', ' | sed 's/,$//') - CONTEXT+="$ITEMS\n\n" - - # ── Hidden Entities ── - CONTEXT+="### Hidden Entities (tenant-level, via \`-a\` flag or dot-prefix)\n" - CONTEXT+=".capacities, .connections, .gateways, .domains\n\n" - CONTEXT+="### Hidden Entities (workspace-level)\n" - CONTEXT+=".sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares\n\n" - - # ── Auth Methods & Env Vars ── - CONTEXT+="### Authentication Methods\n" - CONTEXT+="1. **Interactive browser**: \`fab auth login\` (default)\n" - CONTEXT+="2. **Service principal (secret)**: \`fab auth login -u -p -t \`\n" - CONTEXT+=" Or env vars: \`FAB_SPN_CLIENT_ID\` + \`FAB_SPN_CLIENT_SECRET\` + \`FAB_TENANT_ID\`\n" - CONTEXT+="3. **Service principal (certificate)**: \`fab auth login -u --certificate -t \`\n" - CONTEXT+=" Or env vars: \`FAB_SPN_CLIENT_ID\` + \`FAB_SPN_CERT_PATH\` (+ opt \`FAB_SPN_CERT_PASSWORD\`) + \`FAB_TENANT_ID\`\n" - CONTEXT+="4. **Service principal (federated)**: \`fab auth login -u --federated-token -t \`\n" - CONTEXT+=" Or env var: \`FAB_SPN_FEDERATED_TOKEN\`\n" - CONTEXT+="5. **Managed identity (system)**: \`fab auth login -I\`\n" - CONTEXT+="6. **Managed identity (user-assigned)**: \`fab auth login -I -u \`\n" - CONTEXT+="7. **Direct access token**: \`FAB_TOKEN\` env var (no login needed)\n\n" - - # ── Error Codes (dynamically extracted) ── - CONTEXT+="### Error Codes\n" - ERRORS=$(grep -E '^ERROR_' src/fabric_cli/core/fab_constant.py | sed 's/ = "/: /;s/"$//' | tr '\n' ', ' | sed 's/,$//') - CONTEXT+="$ERRORS\n\n" - - # ── Runnable & OneLake ── - CONTEXT+="### Runnable Item Types (fab start / fab jobs run)\n" - CONTEXT+="SparkJobDefinition (sparkjob), Notebook (RunNotebook), DataPipeline (Pipeline), Lakehouse (TableMaintenance)\n\n" - - CONTEXT+="### OneLake Item Types\n" - CONTEXT+="Folder, File, Table, Shortcut\n\n" - - # ── Shortcut Types (fab ln) ── - CONTEXT+="### Shortcut Types (fab ln --type)\n" - CONTEXT+="adlsGen2, amazonS3, dataverse, googleCloudStorage, oneLake, s3Compatible\n" - - echo -e "$CONTEXT" > /tmp/codebase-context.txt - - # Inject codebase context into prompt files as part of the system message. - # This way the AI sees the context privately, not in the issue body or comment. - mkdir -p /tmp/prompts - python3 << 'PYEOF' - import os, glob, yaml - context = open('/tmp/codebase-context.txt').read() - for prompt in glob.glob('.github/prompts/*.prompt.yml'): - data = yaml.safe_load(open(prompt)) - sys_msg = data['messages'][0]['content'] - marker = '## Your Task' - if marker in sys_msg: - sys_msg = sys_msg.replace(marker, context + '\n' + marker) - data['messages'][0]['content'] = sys_msg - out = '/tmp/prompts/' + os.path.basename(prompt) - with open(out, 'w') as f: - yaml.dump(data, f, default_flow_style=False, allow_unicode=True, width=10000) - PYEOF - - name: Resolve issue details id: issue uses: actions/github-script@v7 @@ -216,16 +96,10 @@ jobs: repo_name: ${{ github.event.repository.name || github.repository }} owner: ${{ github.repository_owner }} ai_review_label: 'needs triage' - prompts_directory: '/tmp/prompts' + prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' model: 'openai/gpt-4.1' max_tokens: 1500 - # ------------------------------------------------------- - # Phase control — toggle these two flags to switch phases: - # Phase 1 & 2 (fork): false / false - # Phase 3 (main): true / true - # Phase 4 (main): false / false - # ------------------------------------------------------- suppress_comments: ${{ env.SUPPRESS_COMMENTS }} suppress_labels: ${{ env.SUPPRESS_LABELS }} @@ -343,47 +217,6 @@ jobs: core.info('Keeping "needs triage" and notified team.'); } - - name: Post tagged comment - if: steps.ai-assessment.outputs.ai_assessments != '' - uses: actions/github-script@v7 - env: - ASSESSMENT_OUTPUT: ${{ steps.ai-assessment.outputs.ai_assessments }} - LABEL_DECISIONS: ${{ env.LABEL_DECISIONS }} - ISSUE_NUMBER: ${{ steps.issue.outputs.number }} - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const assessments = JSON.parse(process.env.ASSESSMENT_OUTPUT); - const issueNumber = parseInt(process.env.ISSUE_NUMBER); - const ld = process.env.LABEL_DECISIONS ? JSON.parse(process.env.LABEL_DECISIONS) : null; - - let body = `> đŸ…°ī¸ **Approach A (Action)** — prompt-only, no codebase access\n\n`; - - for (const a of assessments) { - body += a.response + '\n\n'; - } - - if (ld) { - body += `---\n`; - body += `
đŸˇī¸ Label Decisions (testing mode — not applied)\n\n`; - body += `| Decision | Value |\n|----------|-------|\n`; - body += `| AI assessment | ${(ld.assessmentLabels || []).map(l => '`' + l + '`').join(', ')} |\n`; - body += `| Would add \`help wanted\` | ${ld.addHelpWanted ? '✅' : '❌'} |\n`; - body += `| Would add \`ai:needs team attention\` | ${ld.needsHumanReview ? '✅' : '❌'} |\n`; - body += `| Would request author feedback | ${ld.needsAuthorFeedback ? '✅' : '❌'} |\n`; - body += `| Would remove \`needs triage\` | ${!ld.needsHumanReview ? '✅' : '❌'} |\n`; - body += `| Would auto-close | ${ld.canAutoClose && !ld.needsAuthorFeedback && !ld.addHelpWanted ? '✅' : '❌'} |\n`; - body += `| Would notify team | ${ld.needsHumanReview ? '✅' : '❌'} |\n\n`; - body += `
\n`; - } - - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issueNumber, - body, - }); - - name: Generate triage summary if: always() && steps.ai-assessment.outputs.ai_assessments != '' uses: actions/github-script@v7 @@ -400,7 +233,7 @@ jobs: const issueTitle = process.env.ISSUE_TITLE; const issueUrl = process.env.ISSUE_URL; - let summary = `## 🤖 AI Triage Report (Approach A: Action)\n\n`; + let summary = `## 🤖 AI Triage Report\n\n`; summary += `**Issue:** [#${issueNumber} — ${issueTitle}](${issueUrl})\n\n`; for (const assessment of assessments) { @@ -433,7 +266,7 @@ jobs: const fs = require('fs'); fs.mkdirSync('triage-reports', { recursive: true }); fs.writeFileSync( - `triage-reports/issue-${issueNumber}-triage-action.md`, + `triage-reports/issue-${issueNumber}-triage.md`, summary ); @@ -441,6 +274,6 @@ jobs: if: always() && steps.ai-assessment.outputs.ai_assessments != '' uses: actions/upload-artifact@v4 with: - name: triage-report-action-issue-${{ steps.issue.outputs.number }} + name: triage-report-issue-${{ steps.issue.outputs.number }} path: triage-reports/ retention-days: 30 diff --git a/scripts/ai_triage.py b/scripts/ai_triage.py deleted file mode 100644 index 538fbba8..00000000 --- a/scripts/ai_triage.py +++ /dev/null @@ -1,314 +0,0 @@ -#!/usr/bin/env python3 -"""AI Issue Triage Agent for Microsoft Fabric CLI. - -Reads issue details, discovers relevant source code, and produces -a high-quality triage assessment backed by codebase evidence, -official docs, and industry standards (RFCs, PEPs). -""" - -import json -import os -import re -import subprocess -import sys -from pathlib import Path - -import requests -import yaml - -# --------------------------------------------------------------------------- -# Configuration -# --------------------------------------------------------------------------- -MODEL = os.environ.get("AI_TRIAGE_MODEL", "openai/gpt-4.1") -MAX_TOKENS = int(os.environ.get("AI_TRIAGE_MAX_TOKENS", "1500")) -API_URL = "https://models.github.ai/inference/chat/completions" - -# Files always included — they define the CLI's public surface -CORE_FILES = [ - "src/fabric_cli/parsers/fab_global_params.py", - "src/fabric_cli/parsers/fab_fs_parser.py", - "src/fabric_cli/parsers/fab_auth_parser.py", - "src/fabric_cli/core/fab_types.py", - "src/fabric_cli/core/fab_constant.py", -] - -MAX_FILE_CHARS = 4000 # per file -MAX_TOTAL_CODE_CHARS = 30000 # total budget -MAX_DISCOVERED_FILES = 8 - -# --------------------------------------------------------------------------- -# Issue helpers -# --------------------------------------------------------------------------- - -def get_issue_details() -> dict: - return { - "number": os.environ.get("ISSUE_NUMBER", ""), - "title": os.environ.get("ISSUE_TITLE", ""), - "body": os.environ.get("ISSUE_BODY", ""), - "labels": os.environ.get("ISSUE_LABELS", ""), - "author": os.environ.get("ISSUE_AUTHOR", ""), - } - - -def determine_prompt_name(labels: str) -> str: - low = labels.lower() - if "bug" in low: - return "bug-triage" - if "enhancement" in low: - return "feature-triage" - return "question-triage" - - -# --------------------------------------------------------------------------- -# Code discovery -# --------------------------------------------------------------------------- - -# Noise words that match too many files -_STOP_WORDS = frozenset({ - "the", "and", "for", "that", "this", "with", "from", "not", "but", - "are", "was", "were", "have", "has", "been", "will", "can", "should", - "using", "use", "when", "how", "what", "which", "where", "who", - "does", "issue", "bug", "error", "feature", "request", "please", - "expected", "actual", "behavior", "version", "python", "windows", - "linux", "macos", "darwin", "cli", "fab", "fabric", "microsoft", - "steps", "reproduce", "description", "additional", "context", - "possible", "solution", "mode", "interactive", "command", "line", -}) - - -def extract_keywords(text: str) -> list[str]: - """Extract meaningful keywords from issue text for code search.""" - text = re.sub(r"```.*?```", "", text, flags=re.DOTALL) - text = re.sub(r"https?://\S+", "", text) - text = re.sub(r"[#*`\[\](){}]", " ", text) - - words: set[str] = set() - for raw in text.split(): - w = raw.strip(".,;:!?\"'").lower() - if len(w) < 3 or w in _STOP_WORDS: - continue - # Keep identifiers, flags, CLI-related terms - if ( - "_" in w - or w.startswith("-") - or any(c.isupper() for c in raw[1:]) - or w in { - "import", "export", "auth", "login", "logout", "environment", - "notebook", "lakehouse", "warehouse", "pipeline", "workspace", - "capacity", "gateway", "domain", "connection", "shortcut", - "semantic", "model", "table", "onelake", "acl", "config", - "spark", "compute", "certificate", "federated", "token", - "folder", "item", "cache", "schedule", "jobs", "start", - "stop", "assign", "unassign", "label", "query", - } - ): - words.add(w.lstrip("-")) - - return list(words)[:20] - - -def find_relevant_files(keywords: list[str], repo_root: str) -> list[str]: - """Grep the source tree for files matching issue keywords.""" - src_dir = os.path.join(repo_root, "src/fabric_cli") - if not os.path.isdir(src_dir): - return [] - - hits: dict[str, int] = {} # filepath → hit count - for kw in keywords: - if len(kw) < 3: - continue - try: - result = subprocess.run( - ["grep", "-rli", "--include=*.py", kw, src_dir], - capture_output=True, text=True, timeout=5, - ) - for f in result.stdout.strip().split("\n"): - if f: - rel = os.path.relpath(f, repo_root) - hits[rel] = hits.get(rel, 0) + 1 - except Exception: - continue - - # Sort by relevance (most keyword hits first) - ranked = sorted(hits.items(), key=lambda x: -x[1]) - return [f for f, _ in ranked[:MAX_DISCOVERED_FILES]] - - -def read_code_files(file_paths: list[str], repo_root: str) -> dict[str, str]: - """Read source files, respecting per-file and total size limits.""" - contents: dict[str, str] = {} - total = 0 - for f in file_paths: - full = os.path.join(repo_root, f) - try: - text = Path(full).read_text(encoding="utf-8") - except Exception: - continue - if len(text) > MAX_FILE_CHARS: - text = text[:MAX_FILE_CHARS] + "\n# ... (truncated)" - if total + len(text) > MAX_TOTAL_CODE_CHARS: - break - contents[f] = text - total += len(text) - return contents - - -def format_code_context(code_files: dict[str, str]) -> str: - if not code_files: - return "" - parts = [] - for fp, content in code_files.items(): - parts.append(f"### {fp}\n```python\n{content}\n```") - return "\n\n".join(parts) - - -# --------------------------------------------------------------------------- -# Prompt construction -# --------------------------------------------------------------------------- - -CODE_CONTEXT_PREAMBLE = ( - "## Codebase Reference (source code)\n\n" - "The following is the actual source code of the CLI. " - "Use it as the authoritative reference. " - "Base your analysis on this real implementation — do not guess.\n\n" -) - -STANDARDS_INSTRUCTION = ( - "\n## Standards & best practices\n\n" - "When relevant, reference established standards and best practices:\n" - "- **Python**: PEP 8 (style), PEP 257 (docstrings), PEP 484 (type hints)\n" - "- **CLI conventions**: POSIX Utility Conventions (IEEE Std 1003.1), " - "GNU Argument Syntax, 12-Factor CLI\n" - "- **HTTP/REST**: RFC 7231 (HTTP semantics), RFC 7807 (Problem Details), " - "Microsoft REST API Guidelines\n" - "- **Auth**: OAuth 2.0 (RFC 6749), MSAL best practices\n" - "- **General**: semver (for version questions), YAML 1.2 spec\n" -) - - -def load_prompt(prompt_name: str, repo_root: str) -> dict: - path = os.path.join(repo_root, f".github/prompts/{prompt_name}.prompt.yml") - with open(path) as f: - return yaml.safe_load(f) - - -def build_messages( - prompt_data: dict, - issue: dict, - code_context: str, -) -> list[dict]: - """Build the chat messages, injecting code context into the system prompt.""" - messages = [] - for msg in prompt_data.get("messages", []): - content = msg["content"] - - if msg["role"] == "system": - # Inject code context + standards before "## Your Task" - injection = "" - if code_context: - injection += CODE_CONTEXT_PREAMBLE + code_context + "\n\n" - injection += STANDARDS_INSTRUCTION - - marker = "## Your Task" - if marker in content: - content = content.replace(marker, injection + marker) - else: - content += "\n\n" + injection - - if msg["role"] == "user": - issue_text = f"**Title:** {issue['title']}\n\n{issue['body']}" - content = content.replace("{{input}}", issue_text) - - messages.append({"role": msg["role"], "content": content}) - - return messages - - -# --------------------------------------------------------------------------- -# Model call -# --------------------------------------------------------------------------- - -def call_model(messages: list[dict], token: str) -> str: - resp = requests.post( - API_URL, - headers={ - "Authorization": f"Bearer {token}", - "Content-Type": "application/json", - }, - json={ - "model": MODEL, - "messages": messages, - "max_tokens": MAX_TOKENS, - }, - timeout=90, - ) - if resp.status_code != 200: - print(f"API error {resp.status_code}: {resp.text[:1000]}", file=sys.stderr) - sys.exit(1) - return resp.json()["choices"][0]["message"]["content"] - - -# --------------------------------------------------------------------------- -# Response parsing -# --------------------------------------------------------------------------- - -def parse_assessment(text: str) -> str: - """Extract assessment category from '### AI Assessment: '.""" - m = re.search(r"###\s*AI Assessment:\s*(.+)", text) - return m.group(1).strip() if m else "Needs Team Review" - - -# --------------------------------------------------------------------------- -# Main -# --------------------------------------------------------------------------- - -def main() -> None: - repo_root = os.environ.get("GITHUB_WORKSPACE", os.getcwd()) - token = os.environ.get("GITHUB_TOKEN", "") - if not token: - print("ERROR: GITHUB_TOKEN not set", file=sys.stderr) - sys.exit(1) - - issue = get_issue_details() - prompt_name = determine_prompt_name(issue["labels"]) - print(f"Triaging #{issue['number']}: {issue['title']}") - print(f"Prompt: {prompt_name}") - - # Discover relevant code - keywords = extract_keywords(f"{issue['title']} {issue['body']}") - print(f"Keywords ({len(keywords)}): {keywords[:10]}...") - discovered = find_relevant_files(keywords, repo_root) - - # Merge core + discovered, deduplicate - all_files = list(dict.fromkeys(CORE_FILES + discovered)) - code_files = read_code_files(all_files, repo_root) - print(f"Code context: {len(code_files)} files, ~{sum(len(v) for v in code_files.values())} chars") - - code_context = format_code_context(code_files) - - # Build prompt & call model - prompt_data = load_prompt(prompt_name, repo_root) - messages = build_messages(prompt_data, issue, code_context) - print("Calling model...") - response_text = call_model(messages, token) - - assessment = parse_assessment(response_text) - print(f"Assessment: {assessment}") - - # Write outputs for workflow consumption - output_file = os.environ.get("GITHUB_OUTPUT", "") - if output_file: - with open(output_file, "a") as f: - f.write(f"assessment={assessment}\n") - f.write(f"prompt_name={prompt_name}\n") - delim = "EOF_RESPONSE_BODY" - f.write(f"response<<{delim}\n{response_text}\n{delim}\n") - else: - print(f"\n{'='*60}") - print(f"Assessment: {assessment}") - print(f"{'='*60}") - print(response_text) - - -if __name__ == "__main__": - main() From 44ded5cca56f34685dbb087994512e33d837ca98 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 15:52:16 +0000 Subject: [PATCH 172/176] Un suppress --- .github/workflows/ai-issue-triage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 446bee21..69103a49 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -25,8 +25,8 @@ jobs: # Testing (fork): suppress both → true / true # Production: enable both → false / false # ------------------------------------------------------- - SUPPRESS_LABELS: 'true' - SUPPRESS_COMMENTS: 'true' + SUPPRESS_LABELS: 'false' + SUPPRESS_COMMENTS: 'false' steps: - name: Checkout From d35948eb313368f59dfd568403a7b9a19fed4021 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 18:03:24 +0200 Subject: [PATCH 173/176] refactor: replace hardcoded item types and hidden entities with doc links Reference https://microsoft.github.io/fabric-cli/essentials/resource_types/ instead of static lists, keeping prompts always up to date. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/prompts/bug-triage.prompt.yml | 10 ++++------ .github/prompts/feature-triage.prompt.yml | 9 +++------ .github/prompts/question-triage.prompt.yml | 9 +++------ 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index bba9c69f..8901f9c4 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -113,13 +113,10 @@ messages: `-help`: show help ### Supported Item Types - AISkill, ApacheAirflowJob, Code, CopyJob, CosmosDBDatabase, Dashboard, DataPipeline, Dataflow, Datamart, DigitalTwinBuilder, Environment, Eventhouse, Eventstream, GraphQLApi, KQLDashboard, KQLDatabase, KQLQueryset, Lakehouse, MLExperiment, MLModel, MetricSet, MirroredDatabase, MirroredWarehouse, MountedDataFactory, Notebook, PaginatedReport, Reflex, Report, RetailDataManager, SQLDatabase, SQLEndpoint, SemanticModel, SparkJobDefinition, SustainabilityDataSolution, UserDataFunction, VariableLibrary, Warehouse, Workspace + See https://microsoft.github.io/fabric-cli/essentials/resource_types/ for the full list of supported resource types. - ### Hidden Entities (tenant-level, via `-a` flag or dot-prefix) - .capacities, .connections, .gateways, .domains - - ### Hidden Entities (workspace-level) - .sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares + ### Hidden Entities + See https://microsoft.github.io/fabric-cli/essentials/resource_types/ for the full list of hidden entities (tenant-level and workspace-level, accessed via `-a` flag or dot-prefix). ### Authentication Methods 1. Interactive browser: `fab auth login` (default) @@ -166,6 +163,7 @@ messages: - Reference docs only when directly relevant: https://microsoft.github.io/fabric-cli - Do not invent CLI flags, commands, or features not listed in the Codebase Reference above. If unsure, direct to official docs. - Keep the response to **2–4 short paragraphs**. No bullet-heavy walls of text. + ## Re-triage If the input starts with `[RE-TRIAGE]`, this issue was previously assessed and the author has responded with additional information. Focus your assessment on the new information provided. Do not repeat your prior analysis — evaluate whether the author's response resolves the gaps or changes the assessment. diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index bd6d049f..d37afb24 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -112,13 +112,10 @@ messages: `-help`: show help ### Supported Item Types - AISkill, ApacheAirflowJob, Code, CopyJob, CosmosDBDatabase, Dashboard, DataPipeline, Dataflow, Datamart, DigitalTwinBuilder, Environment, Eventhouse, Eventstream, GraphQLApi, KQLDashboard, KQLDatabase, KQLQueryset, Lakehouse, MLExperiment, MLModel, MetricSet, MirroredDatabase, MirroredWarehouse, MountedDataFactory, Notebook, PaginatedReport, Reflex, Report, RetailDataManager, SQLDatabase, SQLEndpoint, SemanticModel, SparkJobDefinition, SustainabilityDataSolution, UserDataFunction, VariableLibrary, Warehouse, Workspace + See https://microsoft.github.io/fabric-cli/essentials/resource_types/ for the full list of supported resource types. - ### Hidden Entities (tenant-level, via `-a` flag or dot-prefix) - .capacities, .connections, .gateways, .domains - - ### Hidden Entities (workspace-level) - .sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares + ### Hidden Entities + See https://microsoft.github.io/fabric-cli/essentials/resource_types/ for the full list of hidden entities (tenant-level and workspace-level, accessed via `-a` flag or dot-prefix). ### Authentication Methods 1. Interactive browser: `fab auth login` (default) diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index d8902237..c9243ed9 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -112,13 +112,10 @@ messages: `-help`: show help ### Supported Item Types - AISkill, ApacheAirflowJob, Code, CopyJob, CosmosDBDatabase, Dashboard, DataPipeline, Dataflow, Datamart, DigitalTwinBuilder, Environment, Eventhouse, Eventstream, GraphQLApi, KQLDashboard, KQLDatabase, KQLQueryset, Lakehouse, MLExperiment, MLModel, MetricSet, MirroredDatabase, MirroredWarehouse, MountedDataFactory, Notebook, PaginatedReport, Reflex, Report, RetailDataManager, SQLDatabase, SQLEndpoint, SemanticModel, SparkJobDefinition, SustainabilityDataSolution, UserDataFunction, VariableLibrary, Warehouse, Workspace + See https://microsoft.github.io/fabric-cli/essentials/resource_types/ for the full list of supported resource types. - ### Hidden Entities (tenant-level, via `-a` flag or dot-prefix) - .capacities, .connections, .gateways, .domains - - ### Hidden Entities (workspace-level) - .sparkpools, .managedidentities, .managedprivateendpoints, .externaldatashares + ### Hidden Entities + See https://microsoft.github.io/fabric-cli/essentials/resource_types/ for the full list of hidden entities (tenant-level and workspace-level, accessed via `-a` flag or dot-prefix). ### Authentication Methods 1. Interactive browser: `fab auth login` (default) From 7afc12941e7c0ecafa7230d3cd9df66caa9edf00 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 22 Feb 2026 16:13:11 +0000 Subject: [PATCH 174/176] Update prompts --- .github/prompts/bug-triage.prompt.yml | 2 +- .github/prompts/feature-triage.prompt.yml | 2 +- .github/prompts/question-triage.prompt.yml | 2 +- .github/workflows/ai-issue-triage.yml | 2 +- docs/essentials/resource_types.md | 18 ++++++++++++++++++ 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/prompts/bug-triage.prompt.yml b/.github/prompts/bug-triage.prompt.yml index 8901f9c4..06fe7760 100644 --- a/.github/prompts/bug-triage.prompt.yml +++ b/.github/prompts/bug-triage.prompt.yml @@ -187,6 +187,6 @@ messages: content: '{{input}}' model: openai/gpt-4.1 modelParameters: - max_tokens: 1000 + max_tokens: 2000 testData: [] evaluators: [] diff --git a/.github/prompts/feature-triage.prompt.yml b/.github/prompts/feature-triage.prompt.yml index d37afb24..95d6e827 100644 --- a/.github/prompts/feature-triage.prompt.yml +++ b/.github/prompts/feature-triage.prompt.yml @@ -188,6 +188,6 @@ messages: content: '{{input}}' model: openai/gpt-4.1 modelParameters: - max_tokens: 1000 + max_tokens: 2000 testData: [] evaluators: [] diff --git a/.github/prompts/question-triage.prompt.yml b/.github/prompts/question-triage.prompt.yml index c9243ed9..2786ac4c 100644 --- a/.github/prompts/question-triage.prompt.yml +++ b/.github/prompts/question-triage.prompt.yml @@ -183,6 +183,6 @@ messages: content: '{{input}}' model: openai/gpt-4.1 modelParameters: - max_tokens: 1500 + max_tokens: 2000 testData: [] evaluators: [] diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index 69103a49..e3d9cd7f 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -99,7 +99,7 @@ jobs: prompts_directory: '.github/prompts' labels_to_prompts_mapping: 'bug,bug-triage.prompt.yml|enhancement,feature-triage.prompt.yml|question,question-triage.prompt.yml' model: 'openai/gpt-4.1' - max_tokens: 1500 + max_tokens: 2000 suppress_comments: ${{ env.SUPPRESS_COMMENTS }} suppress_labels: ${{ env.SUPPRESS_LABELS }} diff --git a/docs/essentials/resource_types.md b/docs/essentials/resource_types.md index f4ef2767..aa8497bf 100644 --- a/docs/essentials/resource_types.md +++ b/docs/essentials/resource_types.md @@ -38,6 +38,11 @@ Item types are the primary content resources within Fabric workspaces. Each type | `.VariableLibrary` | Variable libraries | | `.GraphQLApi` | GraphQL API endpoints | | `.Dataflow` | Dataflow API endpoints | +| `.ApacheAirflowJob` | Apache Airflow job definitions | +| `.CosmosDBDatabase` | Cosmos DB databases | +| `.DigitalTwinBuilder` | Digital twin builder resources | +| `.GraphQuerySet` | Graph query collections | +| `.UserDataFunction` | User data functions | --- @@ -68,5 +73,18 @@ Tenant virtual item types are infrastructure or system resources that exist at t --- +## OneLake Item Types + +OneLake item types represent storage objects within data items such as Lakehouses and Warehouses. They are accessed via OneLake paths. + +| Extension | Description | +|------------------------|------------------------------------| +| `.File` | OneLake files | +| `.Table` | OneLake tables | +| `.Shortcut` | OneLake shortcuts | +| `.Folder` | OneLake folders | + +--- + See how to describe types using [Describe (desc) command](../examples/desc_examples.md). From 9da916e92b7d85fb2d5ff54e20b70f0000ebaf6e Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Mon, 23 Feb 2026 07:29:33 +0000 Subject: [PATCH 175/176] Update label removal --- .github/workflows/ai-issue-triage.yml | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ai-issue-triage.yml b/.github/workflows/ai-issue-triage.yml index e3d9cd7f..b42198f9 100644 --- a/.github/workflows/ai-issue-triage.yml +++ b/.github/workflows/ai-issue-triage.yml @@ -172,21 +172,8 @@ jobs: core.info('Added "help wanted" label based on AI assessment.'); } - // If AI fully handled the issue, remove 'needs triage' so the team isn't notified + // If AI fully handled the issue without needing team review if (!needsHumanReview) { - try { - await github.rest.issues.removeLabel({ - owner, - repo, - issue_number: issueNumber, - name: 'needs triage' - }); - core.info('Removed "needs triage" — AI handled this issue.'); - } catch (e) { - // Label may have already been removed by the action - core.info(`Could not remove "needs triage" label: ${e.message}`); - } - // Auto-close if AI fully resolved (answered, misconfiguration, redirected) if (canAutoClose && !needsAuthorFeedback && !addHelpWanted) { await github.rest.issues.update({ @@ -214,7 +201,20 @@ jobs: issue_number: issueNumber, body: '🔔 @microsoft/fabric-cli-dev — This issue has been flagged by AI triage as requiring team attention. Please review the assessment above.' }); - core.info('Keeping "needs triage" and notified team.'); + core.info('Escalated to team.'); + } + + // Always remove 'needs triage' — triage is complete regardless of outcome + try { + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: issueNumber, + name: 'needs triage' + }); + core.info('Removed "needs triage" — triage complete.'); + } catch (e) { + core.info(`Could not remove "needs triage" label: ${e.message}`); } - name: Generate triage summary From b115c3f50553700baedf68e79f24bead871e8bcf Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Mon, 23 Feb 2026 07:48:57 +0000 Subject: [PATCH 176/176] Remove --- docs/essentials/resource_types.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/docs/essentials/resource_types.md b/docs/essentials/resource_types.md index aa8497bf..77b3adaa 100644 --- a/docs/essentials/resource_types.md +++ b/docs/essentials/resource_types.md @@ -73,18 +73,5 @@ Tenant virtual item types are infrastructure or system resources that exist at t --- -## OneLake Item Types - -OneLake item types represent storage objects within data items such as Lakehouses and Warehouses. They are accessed via OneLake paths. - -| Extension | Description | -|------------------------|------------------------------------| -| `.File` | OneLake files | -| `.Table` | OneLake tables | -| `.Shortcut` | OneLake shortcuts | -| `.Folder` | OneLake folders | - ---- - See how to describe types using [Describe (desc) command](../examples/desc_examples.md).