diff --git a/.github/labeler.yml b/.github/labeler.yml index 1ca16e86995f..3672f2538534 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -44,7 +44,6 @@ "channel: feishu": - changed-files: - any-glob-to-any-file: - - "src/feishu/**" - "extensions/feishu/**" - "docs/channels/feishu.md" "channel: googlechat": @@ -306,7 +305,6 @@ - changed-files: - any-glob-to-any-file: - "Dockerfile" - - "Dockerfile.*" - "docker-compose.yml" - ".dockerignore" - "deploy/fly.private.toml" @@ -368,6 +366,10 @@ - changed-files: - any-glob-to-any-file: - "extensions/llama-cpp/**" +"extensions: active-memory": + - changed-files: + - any-glob-to-any-file: + - "extensions/active-memory/**" "extensions: memory-core": - changed-files: - any-glob-to-any-file: @@ -380,6 +382,10 @@ - changed-files: - any-glob-to-any-file: - "extensions/memory-wiki/**" +"extensions: media-understanding-core": + - changed-files: + - any-glob-to-any-file: + - "extensions/media-understanding-core/**" "extensions: oc-path": - changed-files: - any-glob-to-any-file: @@ -413,10 +419,20 @@ - changed-files: - any-glob-to-any-file: - "extensions/webhooks/**" +"extensions: web-readability": + - changed-files: + - any-glob-to-any-file: + - "extensions/web-readability/**" + - "docs/plugins/reference/web-readability.md" "extensions: device-pair": - changed-files: - any-glob-to-any-file: - "extensions/device-pair/**" +"extensions: document-extract": + - changed-files: + - any-glob-to-any-file: + - "extensions/document-extract/**" + - "docs/plugins/reference/document-extract.md" "extensions: duckduckgo": - changed-files: - any-glob-to-any-file: @@ -448,6 +464,12 @@ - any-glob-to-any-file: - "extensions/clawrouter/**" - "docs/providers/clawrouter.md" +"extensions: clickclack": + - changed-files: + - any-glob-to-any-file: + - "extensions/clickclack/**" + - "docs/plugins/reference/clickclack.md" + - "docs/channels/clickclack.md" "extensions: crabbox": - changed-files: - any-glob-to-any-file: @@ -456,6 +478,12 @@ - changed-files: - any-glob-to-any-file: - "extensions/deepseek/**" +"extensions: deepgram": + - changed-files: + - any-glob-to-any-file: + - "extensions/deepgram/**" + - "docs/providers/deepgram.md" + - "docs/plugins/reference/deepgram.md" "extensions: deepinfra": - changed-files: - any-glob-to-any-file: @@ -489,10 +517,18 @@ - changed-files: - any-glob-to-any-file: - "extensions/cloudflare-ai-gateway/**" -"extensions: minimax-portal-auth": +"extensions: cohere": - changed-files: - any-glob-to-any-file: - - "extensions/minimax-portal-auth/**" + - "extensions/cohere/**" + - "docs/providers/cohere.md" + - "docs/plugins/reference/cohere.md" +"extensions: comfy": + - changed-files: + - any-glob-to-any-file: + - "extensions/comfy/**" + - "docs/providers/comfy.md" + - "docs/plugins/reference/comfy.md" "extensions: huggingface": - changed-files: - any-glob-to-any-file: @@ -502,6 +538,10 @@ - any-glob-to-any-file: - "extensions/inworld/**" - "docs/providers/inworld.md" +"extensions: image-generation-core": + - changed-files: + - any-glob-to-any-file: + - "extensions/image-generation-core/**" "extensions: fish-audio": - changed-files: - any-glob-to-any-file: @@ -557,10 +597,6 @@ - changed-files: - any-glob-to-any-file: - "extensions/minimax/**" -"extensions: modelstudio": - - changed-files: - - any-glob-to-any-file: - - "extensions/modelstudio/**" "extensions: moonshot": - changed-files: - any-glob-to-any-file: @@ -574,14 +610,27 @@ - any-glob-to-any-file: - "extensions/novita/**" - "docs/providers/novita.md" -"extensions: phone-control": - - changed-files: - - any-glob-to-any-file: - - "extensions/phone-control/**" "extensions: qianfan": - changed-files: - any-glob-to-any-file: - "extensions/qianfan/**" +"extensions: qwen": + - changed-files: + - any-glob-to-any-file: + - "extensions/qwen/**" + - "docs/providers/qwen.md" + - "docs/plugins/reference/qwen.md" +"extensions: runway": + - changed-files: + - any-glob-to-any-file: + - "extensions/runway/**" + - "docs/providers/runway.md" + - "docs/plugins/reference/runway.md" +"extensions: searxng": + - changed-files: + - any-glob-to-any-file: + - "extensions/searxng/**" + - "docs/plugins/reference/searxng.md" "extensions: senseaudio": - changed-files: - any-glob-to-any-file: @@ -616,10 +665,25 @@ - changed-files: - any-glob-to-any-file: - "extensions/vercel-ai-gateway/**" +"extensions: video-generation-core": + - changed-files: + - any-glob-to-any-file: + - "extensions/video-generation-core/**" "extensions: volcengine": - changed-files: - any-glob-to-any-file: - "extensions/volcengine/**" +"extensions: voyage": + - changed-files: + - any-glob-to-any-file: + - "extensions/voyage/**" + - "docs/plugins/reference/voyage.md" +"extensions: vydra": + - changed-files: + - any-glob-to-any-file: + - "extensions/vydra/**" + - "docs/providers/vydra.md" + - "docs/plugins/reference/vydra.md" "extensions: xiaomi": - changed-files: - any-glob-to-any-file: @@ -632,10 +696,27 @@ - changed-files: - any-glob-to-any-file: - "extensions/gradium/**" +"extensions: groq": + - changed-files: + - any-glob-to-any-file: + - "extensions/groq/**" + - "docs/providers/groq.md" + - "docs/plugins/reference/groq.md" +"extensions: alibaba": + - changed-files: + - any-glob-to-any-file: + - "extensions/alibaba/**" + - "docs/providers/alibaba.md" + - "docs/plugins/reference/alibaba.md" "extensions: amazon-bedrock": - changed-files: - any-glob-to-any-file: - "extensions/amazon-bedrock/**" +"extensions: amazon-bedrock-mantle": + - changed-files: + - any-glob-to-any-file: + - "extensions/amazon-bedrock-mantle/**" + - "docs/plugins/reference/amazon-bedrock-mantle.md" "extensions: anthropic-vertex": - changed-files: - any-glob-to-any-file: @@ -644,6 +725,16 @@ - changed-files: - any-glob-to-any-file: - "extensions/brave/**" +"extensions: browser": + - changed-files: + - any-glob-to-any-file: + - "extensions/browser/**" + - "docs/plugins/reference/browser.md" +"extensions: canvas": + - changed-files: + - any-glob-to-any-file: + - "extensions/canvas/**" + - "docs/plugins/reference/canvas.md" "extensions: chutes": - changed-files: - any-glob-to-any-file: @@ -657,10 +748,21 @@ - changed-files: - any-glob-to-any-file: - "extensions/elevenlabs/**" +"extensions: exa": + - changed-files: + - any-glob-to-any-file: + - "extensions/exa/**" + - "docs/plugins/reference/exa.md" "extensions: firecrawl": - changed-files: - any-glob-to-any-file: - "extensions/firecrawl/**" +"extensions: fireworks": + - changed-files: + - any-glob-to-any-file: + - "extensions/fireworks/**" + - "docs/providers/fireworks.md" + - "docs/plugins/reference/fireworks.md" "extensions: github-copilot": - changed-files: - any-glob-to-any-file: @@ -673,6 +775,11 @@ - changed-files: - any-glob-to-any-file: - "extensions/microsoft/**" +"extensions: microsoft-foundry": + - changed-files: + - any-glob-to-any-file: + - "extensions/microsoft-foundry/**" + - "docs/plugins/reference/microsoft-foundry.md" "extensions: mistral": - changed-files: - any-glob-to-any-file: @@ -709,6 +816,10 @@ - changed-files: - any-glob-to-any-file: - "extensions/sglang/**" +"extensions: test-support": + - changed-files: + - any-glob-to-any-file: + - "extensions/test-support/**" "extensions: vllm": - changed-files: - any-glob-to-any-file: diff --git a/apps/ios/ActivityWidget/Assets.xcassets/Contents.json b/apps/ios/ActivityWidget/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596a7fc..000000000000 --- a/apps/ios/ActivityWidget/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/swabble/.github/workflows/ci.yml b/apps/swabble/.github/workflows/ci.yml deleted file mode 100644 index e6c12ccbe137..000000000000 --- a/apps/swabble/.github/workflows/ci.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: CI - -on: - push: - branches: [main] - pull_request: - -jobs: - build-and-test: - runs-on: macos-15 - defaults: - run: - shell: bash - working-directory: swabble - steps: - - name: Checkout swabble - uses: actions/checkout@v4 - with: - path: swabble - - - name: Select Xcode 26.1 (prefer 26.1.1) - run: | - set -euo pipefail - # pick the newest installed 26.1.x, fallback to newest 26.x - CANDIDATE="$(ls -d /Applications/Xcode_26.1*.app 2>/dev/null | sort -V | tail -1 || true)" - if [[ -z "$CANDIDATE" ]]; then - CANDIDATE="$(ls -d /Applications/Xcode_26*.app 2>/dev/null | sort -V | tail -1 || true)" - fi - if [[ -z "$CANDIDATE" ]]; then - echo "No Xcode 26.x found on runner" >&2 - exit 1 - fi - echo "Selecting $CANDIDATE" - sudo xcode-select -s "$CANDIDATE" - xcodebuild -version - - - name: Show Swift version - run: swift --version - - - name: Install tooling - run: | - brew update - brew install swiftlint swiftformat - - - name: Format check - run: | - ./scripts/format.sh - git diff --exit-code - - - name: Lint - run: ./scripts/lint.sh - - - name: Test - run: swift test --parallel diff --git a/test/scripts/labeler-extension-coverage.test.ts b/test/scripts/labeler-extension-coverage.test.ts new file mode 100644 index 000000000000..ba6f1141e716 --- /dev/null +++ b/test/scripts/labeler-extension-coverage.test.ts @@ -0,0 +1,38 @@ +import { readdirSync, readFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { describe, expect, it } from "vitest"; +import { parse } from "yaml"; + +type LabelerRule = Array<{ + "changed-files"?: Array<{ + "any-glob-to-any-file"?: string[]; + }>; +}>; + +const repoRoot = path.resolve(fileURLToPath(new URL("../..", import.meta.url))); +const extensionsRoot = path.join(repoRoot, "extensions"); +const labelerPath = path.join(repoRoot, ".github/labeler.yml"); + +const extensionDirectories = readdirSync(extensionsRoot, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .sort(); +const extensionDirectorySet = new Set(extensionDirectories); +const labeler = parse(readFileSync(labelerPath, "utf8")) as Record; +const extensionGlobDirectories = Object.values(labeler) + .flatMap((rules) => rules) + .flatMap((rule) => rule["changed-files"] ?? []) + .flatMap((changedFiles) => changedFiles["any-glob-to-any-file"] ?? []) + .flatMap((glob) => glob.match(/^extensions\/([^/]+)\//)?.[1] ?? []); +const coveredExtensionDirectories = new Set(extensionGlobDirectories); + +describe("labeler extension coverage", () => { + it("covers every extension directory", () => { + expect(extensionDirectories.filter((dir) => !coveredExtensionDirectories.has(dir))).toEqual([]); + }); + + it("references only existing extension directories", () => { + expect(extensionGlobDirectories.filter((dir) => !extensionDirectorySet.has(dir))).toEqual([]); + }); +});