diff --git a/.dockerignore b/.dockerignore index 1a15f7dc629..69c7252c1a9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -61,7 +61,7 @@ apps/ios/build apps/ assets/ Peekaboo/ -Swabble/ +apps/swabble/ Core/ Users/ vendor/ diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d11d82d5df4..11b1c091678 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -83,7 +83,7 @@ updates: # Swift Package Manager - Swabble - package-ecosystem: swift - directory: /Swabble + directory: /apps/swabble schedule: interval: daily cooldown: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34eb375d7d6..5f7e7b82ec1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1961,7 +1961,7 @@ jobs: uses: actions/cache@v5 with: path: apps/macos/.build - key: ${{ runner.os }}-swift-build-v2-${{ steps.swift-toolchain.outputs.key }}-${{ hashFiles('apps/macos/Package.swift', 'apps/macos/Package.resolved', 'apps/macos/Sources/**', 'apps/macos/Tests/**', 'apps/shared/OpenClawKit/Package.swift', 'apps/shared/OpenClawKit/Sources/**', 'Swabble/Package.swift', 'Swabble/Sources/**') }} + key: ${{ runner.os }}-swift-build-v2-${{ steps.swift-toolchain.outputs.key }}-${{ hashFiles('apps/macos/Package.swift', 'apps/macos/Package.resolved', 'apps/macos/Sources/**', 'apps/macos/Tests/**', 'apps/shared/OpenClawKit/Package.swift', 'apps/shared/OpenClawKit/Sources/**', 'apps/swabble/Package.swift', 'apps/swabble/Sources/**') }} restore-keys: | ${{ runner.os }}-swift-build-v2-${{ steps.swift-toolchain.outputs.key }}- @@ -1971,13 +1971,13 @@ jobs: set -euo pipefail # Exact source-hash cache hits already match these inputs; checkout # mtimes are the only reason SwiftPM rebuilds cached products. - find apps/macos/Sources apps/macos/Tests apps/shared/OpenClawKit/Sources Swabble/Sources apps/macos/.build/checkouts \ + find apps/macos/Sources apps/macos/Tests apps/shared/OpenClawKit/Sources apps/swabble/Sources apps/macos/.build/checkouts \ -type f -exec touch -t 200001010000 {} + touch -t 200001010000 \ apps/macos/Package.swift \ apps/macos/Package.resolved \ apps/shared/OpenClawKit/Package.swift \ - Swabble/Package.swift + apps/swabble/Package.swift - name: Show toolchain run: | diff --git a/.github/workflows/test-performance-agent.yml b/.github/workflows/test-performance-agent.yml index 22b49573a79..2311912dba2 100644 --- a/.github/workflows/test-performance-agent.yml +++ b/.github/workflows/test-performance-agent.yml @@ -162,7 +162,7 @@ jobs: bad_paths="$( git diff --name-only | while IFS= read -r path; do case "$path" in - apps/*|extensions/*|packages/*|scripts/*|src/*|Swabble/*|test/*|ui/*) ;; + apps/*|extensions/*|packages/*|scripts/*|src/*|test/*|ui/*) ;; *) printf '%s\n' "$path" ;; esac done @@ -240,7 +240,7 @@ jobs: git config user.name "openclaw-test-performance-agent[bot]" git config user.email "openclaw-test-performance-agent[bot]@users.noreply.github.com" - git add apps extensions packages scripts src Swabble test ui + git add apps extensions packages scripts src test ui git commit --no-verify -m "test: optimize slow tests" for attempt in 1 2 3 4 5; do diff --git a/.gitignore b/.gitignore index 727b1eb8981..1d1a75a9a1b 100644 --- a/.gitignore +++ b/.gitignore @@ -155,7 +155,7 @@ apps/ios/LocalSigning.xcconfig # Xcode build directories (xcodebuild output) apps/ios/build/ apps/shared/OpenClawKit/build/ -Swabble/build/ +apps/swabble/build/ *.xcresult *.trace *.profraw diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc index 37e26afc05f..5d99da66a5e 100644 --- a/.oxfmtrc.jsonc +++ b/.oxfmtrc.jsonc @@ -23,7 +23,7 @@ "src/canvas-host/a2ui/a2ui.bundle.js", "test/fixtures/agents/prompt-snapshots/codex-model-catalog/*.instructions.md", "test/fixtures/agents/prompt-snapshots/happy-path/*.md", - "Swabble/", + "apps/swabble/", "vendor/", ], } diff --git a/.oxlintrc.json b/.oxlintrc.json index 51ef3fbac41..53c50b9334b 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -123,7 +123,7 @@ "skills/", "src/auto-reply/reply/export-html/template.js", "src/canvas-host/a2ui/a2ui.bundle.js", - "Swabble/", + "apps/swabble/", "vendor/", "**/.cache/**", "**/build/**", diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3965eccc454..28f6017b4c8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,7 +41,7 @@ repos: hooks: - id: zizmor args: [--persona=regular, --min-severity=medium, --min-confidence=medium] - exclude: "^(vendor/|Swabble/)" + exclude: "^(vendor/|apps/swabble/)" # Python checks for skills scripts - repo: https://github.com/astral-sh/ruff-pre-commit diff --git a/.swiftformat b/.swiftformat index a5f551b9e35..aba5c0057dc 100644 --- a/.swiftformat +++ b/.swiftformat @@ -48,4 +48,4 @@ --allman false # Exclusions ---exclude .build,.swiftpm,DerivedData,node_modules,dist,coverage,xcuserdata,Peekaboo,Swabble,apps/android,apps/ios,apps/shared,apps/macos/Sources/OpenClawProtocol,apps/macos/Sources/OpenClaw/HostEnvSecurityPolicy.generated.swift +--exclude .build,.swiftpm,DerivedData,node_modules,dist,coverage,xcuserdata,Peekaboo,apps/swabble,apps/android,apps/ios,apps/shared,apps/macos/Sources/OpenClawProtocol,apps/macos/Sources/OpenClaw/HostEnvSecurityPolicy.generated.swift diff --git a/AGENTS.md b/AGENTS.md index dd25f393d1b..49df9770eb2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,7 +18,7 @@ Telegraph style. Root rules only. Read scoped `AGENTS.md` before subtree work. ## Map -- Core TS: `src/`, `ui/`, `packages/`; plugins: `extensions/`; SDK: `src/plugin-sdk/*`; channels: `src/channels/*`; loader: `src/plugins/*`; protocol: `src/gateway/protocol/*`; docs/apps: `docs/`, `apps/`, `Swabble/`. +- Core TS: `src/`, `ui/`, `packages/`; plugins: `extensions/`; SDK: `src/plugin-sdk/*`; channels: `src/channels/*`; loader: `src/plugins/*`; protocol: `src/gateway/protocol/*`; docs/apps: `docs/`, `apps/`. - Installers: sibling `../openclaw.ai`. - Scoped guides exist in: `extensions/`, `src/{plugin-sdk,channels,plugins,gateway,gateway/protocol,agents}/`, `test/helpers*/`, `docs/`, `ui/`, `scripts/`. diff --git a/apps/ios/SwiftSources.input.xcfilelist b/apps/ios/SwiftSources.input.xcfilelist index 8ec9dc1c767..a462704dfba 100644 --- a/apps/ios/SwiftSources.input.xcfilelist +++ b/apps/ios/SwiftSources.input.xcfilelist @@ -116,4 +116,4 @@ WatchExtension/Sources/WatchInboxView.swift ../shared/OpenClawKit/Sources/OpenClawKit/StoragePaths.swift ../shared/OpenClawKit/Sources/OpenClawKit/SystemCommands.swift ../shared/OpenClawKit/Sources/OpenClawKit/TalkDirective.swift -../../Swabble/Sources/SwabbleKit/WakeWordGate.swift +../swabble/Sources/SwabbleKit/WakeWordGate.swift diff --git a/apps/ios/project.yml b/apps/ios/project.yml index 036fe0868cf..6229d45a816 100644 --- a/apps/ios/project.yml +++ b/apps/ios/project.yml @@ -14,7 +14,7 @@ packages: OpenClawKit: path: ../shared/OpenClawKit Swabble: - path: ../../Swabble + path: ../swabble schemes: OpenClaw: @@ -71,7 +71,7 @@ targets: exit 1 fi swiftformat --lint --config "$SRCROOT/../../.swiftformat" \ - --unexclude "$SRCROOT/Sources,$SRCROOT/ShareExtension,$SRCROOT/ActivityWidget,$SRCROOT/WatchExtension,$SRCROOT/../shared/OpenClawKit,$SRCROOT/../../Swabble" \ + --unexclude "$SRCROOT/Sources,$SRCROOT/ShareExtension,$SRCROOT/ActivityWidget,$SRCROOT/WatchExtension,$SRCROOT/../shared/OpenClawKit,$SRCROOT/../swabble" \ --filelist "$SRCROOT/SwiftSources.input.xcfilelist" - name: SwiftLint basedOnDependencyAnalysis: false diff --git a/apps/macos/Package.swift b/apps/macos/Package.swift index 01500452c99..1a487e71456 100644 --- a/apps/macos/Package.swift +++ b/apps/macos/Package.swift @@ -21,7 +21,7 @@ let package = Package( .package(url: "https://github.com/sparkle-project/Sparkle", from: "2.9.0"), .package(url: "https://github.com/steipete/Peekaboo.git", exact: "3.0.0-beta4"), .package(path: "../shared/OpenClawKit"), - .package(path: "../../Swabble"), + .package(path: "../swabble"), ], targets: [ .target( diff --git a/Swabble/.github/workflows/ci.yml b/apps/swabble/.github/workflows/ci.yml similarity index 100% rename from Swabble/.github/workflows/ci.yml rename to apps/swabble/.github/workflows/ci.yml diff --git a/Swabble/.gitignore b/apps/swabble/.gitignore similarity index 100% rename from Swabble/.gitignore rename to apps/swabble/.gitignore diff --git a/Swabble/.swiftformat b/apps/swabble/.swiftformat similarity index 100% rename from Swabble/.swiftformat rename to apps/swabble/.swiftformat diff --git a/Swabble/.swiftlint.yml b/apps/swabble/.swiftlint.yml similarity index 100% rename from Swabble/.swiftlint.yml rename to apps/swabble/.swiftlint.yml diff --git a/Swabble/CHANGELOG.md b/apps/swabble/CHANGELOG.md similarity index 100% rename from Swabble/CHANGELOG.md rename to apps/swabble/CHANGELOG.md diff --git a/Swabble/LICENSE b/apps/swabble/LICENSE similarity index 100% rename from Swabble/LICENSE rename to apps/swabble/LICENSE diff --git a/Swabble/Package.resolved b/apps/swabble/Package.resolved similarity index 100% rename from Swabble/Package.resolved rename to apps/swabble/Package.resolved diff --git a/Swabble/Package.swift b/apps/swabble/Package.swift similarity index 100% rename from Swabble/Package.swift rename to apps/swabble/Package.swift diff --git a/Swabble/README.md b/apps/swabble/README.md similarity index 100% rename from Swabble/README.md rename to apps/swabble/README.md diff --git a/Swabble/Sources/SwabbleCore/Config/Config.swift b/apps/swabble/Sources/SwabbleCore/Config/Config.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Config/Config.swift rename to apps/swabble/Sources/SwabbleCore/Config/Config.swift diff --git a/Swabble/Sources/SwabbleCore/Hooks/HookExecutor.swift b/apps/swabble/Sources/SwabbleCore/Hooks/HookExecutor.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Hooks/HookExecutor.swift rename to apps/swabble/Sources/SwabbleCore/Hooks/HookExecutor.swift diff --git a/Swabble/Sources/SwabbleCore/Speech/BufferConverter.swift b/apps/swabble/Sources/SwabbleCore/Speech/BufferConverter.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Speech/BufferConverter.swift rename to apps/swabble/Sources/SwabbleCore/Speech/BufferConverter.swift diff --git a/Swabble/Sources/SwabbleCore/Speech/SpeechPipeline.swift b/apps/swabble/Sources/SwabbleCore/Speech/SpeechPipeline.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Speech/SpeechPipeline.swift rename to apps/swabble/Sources/SwabbleCore/Speech/SpeechPipeline.swift diff --git a/Swabble/Sources/SwabbleCore/Support/AttributedString+Sentences.swift b/apps/swabble/Sources/SwabbleCore/Support/AttributedString+Sentences.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Support/AttributedString+Sentences.swift rename to apps/swabble/Sources/SwabbleCore/Support/AttributedString+Sentences.swift diff --git a/Swabble/Sources/SwabbleCore/Support/Logging.swift b/apps/swabble/Sources/SwabbleCore/Support/Logging.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Support/Logging.swift rename to apps/swabble/Sources/SwabbleCore/Support/Logging.swift diff --git a/Swabble/Sources/SwabbleCore/Support/OutputFormat.swift b/apps/swabble/Sources/SwabbleCore/Support/OutputFormat.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Support/OutputFormat.swift rename to apps/swabble/Sources/SwabbleCore/Support/OutputFormat.swift diff --git a/Swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift b/apps/swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift similarity index 100% rename from Swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift rename to apps/swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift diff --git a/Swabble/Sources/SwabbleKit/WakeWordGate.swift b/apps/swabble/Sources/SwabbleKit/WakeWordGate.swift similarity index 100% rename from Swabble/Sources/SwabbleKit/WakeWordGate.swift rename to apps/swabble/Sources/SwabbleKit/WakeWordGate.swift diff --git a/Swabble/Sources/swabble/CLI/CLIRegistry.swift b/apps/swabble/Sources/swabble/CLI/CLIRegistry.swift similarity index 100% rename from Swabble/Sources/swabble/CLI/CLIRegistry.swift rename to apps/swabble/Sources/swabble/CLI/CLIRegistry.swift diff --git a/Swabble/Sources/swabble/Commands/DoctorCommand.swift b/apps/swabble/Sources/swabble/Commands/DoctorCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/DoctorCommand.swift rename to apps/swabble/Sources/swabble/Commands/DoctorCommand.swift diff --git a/Swabble/Sources/swabble/Commands/HealthCommand.swift b/apps/swabble/Sources/swabble/Commands/HealthCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/HealthCommand.swift rename to apps/swabble/Sources/swabble/Commands/HealthCommand.swift diff --git a/Swabble/Sources/swabble/Commands/MicCommands.swift b/apps/swabble/Sources/swabble/Commands/MicCommands.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/MicCommands.swift rename to apps/swabble/Sources/swabble/Commands/MicCommands.swift diff --git a/Swabble/Sources/swabble/Commands/ServeCommand.swift b/apps/swabble/Sources/swabble/Commands/ServeCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/ServeCommand.swift rename to apps/swabble/Sources/swabble/Commands/ServeCommand.swift diff --git a/Swabble/Sources/swabble/Commands/ServiceCommands.swift b/apps/swabble/Sources/swabble/Commands/ServiceCommands.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/ServiceCommands.swift rename to apps/swabble/Sources/swabble/Commands/ServiceCommands.swift diff --git a/Swabble/Sources/swabble/Commands/SetupCommand.swift b/apps/swabble/Sources/swabble/Commands/SetupCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/SetupCommand.swift rename to apps/swabble/Sources/swabble/Commands/SetupCommand.swift diff --git a/Swabble/Sources/swabble/Commands/StartStopCommands.swift b/apps/swabble/Sources/swabble/Commands/StartStopCommands.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/StartStopCommands.swift rename to apps/swabble/Sources/swabble/Commands/StartStopCommands.swift diff --git a/Swabble/Sources/swabble/Commands/StatusCommand.swift b/apps/swabble/Sources/swabble/Commands/StatusCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/StatusCommand.swift rename to apps/swabble/Sources/swabble/Commands/StatusCommand.swift diff --git a/Swabble/Sources/swabble/Commands/TailLogCommand.swift b/apps/swabble/Sources/swabble/Commands/TailLogCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/TailLogCommand.swift rename to apps/swabble/Sources/swabble/Commands/TailLogCommand.swift diff --git a/Swabble/Sources/swabble/Commands/TestHookCommand.swift b/apps/swabble/Sources/swabble/Commands/TestHookCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/TestHookCommand.swift rename to apps/swabble/Sources/swabble/Commands/TestHookCommand.swift diff --git a/Swabble/Sources/swabble/Commands/TranscribeCommand.swift b/apps/swabble/Sources/swabble/Commands/TranscribeCommand.swift similarity index 100% rename from Swabble/Sources/swabble/Commands/TranscribeCommand.swift rename to apps/swabble/Sources/swabble/Commands/TranscribeCommand.swift diff --git a/Swabble/Sources/swabble/main.swift b/apps/swabble/Sources/swabble/main.swift similarity index 100% rename from Swabble/Sources/swabble/main.swift rename to apps/swabble/Sources/swabble/main.swift diff --git a/Swabble/Tests/SwabbleKitTests/WakeWordGateTests.swift b/apps/swabble/Tests/SwabbleKitTests/WakeWordGateTests.swift similarity index 100% rename from Swabble/Tests/SwabbleKitTests/WakeWordGateTests.swift rename to apps/swabble/Tests/SwabbleKitTests/WakeWordGateTests.swift diff --git a/Swabble/Tests/swabbleTests/ConfigTests.swift b/apps/swabble/Tests/swabbleTests/ConfigTests.swift similarity index 100% rename from Swabble/Tests/swabbleTests/ConfigTests.swift rename to apps/swabble/Tests/swabbleTests/ConfigTests.swift diff --git a/Swabble/docs/spec.md b/apps/swabble/docs/spec.md similarity index 100% rename from Swabble/docs/spec.md rename to apps/swabble/docs/spec.md diff --git a/Swabble/scripts/format.sh b/apps/swabble/scripts/format.sh similarity index 100% rename from Swabble/scripts/format.sh rename to apps/swabble/scripts/format.sh diff --git a/Swabble/scripts/lint.sh b/apps/swabble/scripts/lint.sh similarity index 100% rename from Swabble/scripts/lint.sh rename to apps/swabble/scripts/lint.sh diff --git a/scripts/changed-lanes.mjs b/scripts/changed-lanes.mjs index 98f013adb48..15ab84fc9f1 100644 --- a/scripts/changed-lanes.mjs +++ b/scripts/changed-lanes.mjs @@ -9,7 +9,7 @@ const APP_PATH_RE = /^(?:apps\/|Swabble\/|appcast\.xml$)/u; const EXTENSION_PATH_RE = /^extensions\/[^/]+(?:\/|$)/u; const CORE_PATH_RE = /^(?:src\/|ui\/|packages\/)/u; const TOOLING_PATH_RE = - /^(?:scripts\/|test\/vitest\/|\.github\/|\.vscode\/|git-hooks\/|Dockerfile\.sandbox(?:-(?:browser|common))?$|vitest(?:\..+)?\.config\.ts$|tsconfig.*\.json$|\.gitignore$|\.oxlint.*|\.oxfmt.*)/u; + /^(?:scripts\/|test\/vitest\/|\.github\/|\.vscode\/|git-hooks\/|Dockerfile\.sandbox(?:-(?:browser|common))?$|vitest(?:\..+)?\.config\.ts$|tsconfig.*\.json$|\.dockerignore$|\.gitignore$|\.pre-commit-config\.yaml$|\.swiftformat$|\.oxlint.*|\.oxfmt.*)/u; const ROOT_GLOBAL_PATH_RE = /^(?:package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsdown\.config\.ts$|vitest\.config\.ts$)/u; const LIVE_DOCKER_TOOLING_PATH_RE = diff --git a/scripts/ci-changed-scope.mjs b/scripts/ci-changed-scope.mjs index 2ea75de63f1..aeb9a19a586 100644 --- a/scripts/ci-changed-scope.mjs +++ b/scripts/ci-changed-scope.mjs @@ -31,7 +31,7 @@ const INSTALL_SMOKE_WORKFLOW_SCOPE_RE = /^\.github\/workflows\/install-smoke\.ym const MACOS_PROTOCOL_GEN_RE = /^(apps\/macos\/Sources\/OpenClawProtocol\/|apps\/shared\/OpenClawKit\/Sources\/OpenClawProtocol\/)/; const MACOS_NATIVE_RE = - /^(apps\/macos\/|apps\/macos-mlx-tts\/|apps\/ios\/|apps\/shared\/|Swabble\/)/; + /^(apps\/macos\/|apps\/macos-mlx-tts\/|apps\/ios\/|apps\/shared\/|apps\/swabble\/|Swabble\/)/; const ANDROID_NATIVE_RE = /^(apps\/android\/|apps\/shared\/)/; const NODE_SCOPE_RE = /^(src\/|test\/|extensions\/|packages\/|scripts\/|ui\/|\.github\/|openclaw\.mjs$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsconfig.*\.json$|vitest.*\.ts$|tsdown\.config\.ts$|\.oxlintrc\.json$|\.oxfmtrc\.jsonc$)/; @@ -44,7 +44,7 @@ const TEST_ONLY_PATH_RE = const CONTROL_UI_I18N_SCOPE_RE = /^(ui\/src\/i18n\/|scripts\/control-ui-i18n\.ts$|\.github\/workflows\/control-ui-locale-refresh\.yml$)/; const NATIVE_ONLY_RE = - /^(apps\/android\/|apps\/ios\/|apps\/macos\/|apps\/macos-mlx-tts\/|apps\/shared\/|Swabble\/|appcast\.xml$)/; + /^(apps\/android\/|apps\/ios\/|apps\/macos\/|apps\/macos-mlx-tts\/|apps\/shared\/|apps\/swabble\/|Swabble\/|appcast\.xml$)/; const FAST_INSTALL_SMOKE_SCOPE_RE = /^(Dockerfile$|\.npmrc$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|scripts\/ci-changed-scope\.mjs$|scripts\/postinstall-bundled-plugins\.mjs$|scripts\/e2e\/(?:Dockerfile(?:\.qr-import)?|agents-delete-shared-workspace-docker\.sh|gateway-network-docker\.sh)$|extensions\/[^/]+\/(?:package\.json|openclaw\.plugin\.json)$|\.github\/workflows\/install-smoke\.yml$|\.github\/actions\/setup-node-env\/action\.yml$)/; const FULL_INSTALL_SMOKE_SCOPE_RE = diff --git a/src/scripts/ci-changed-scope.test.ts b/src/scripts/ci-changed-scope.test.ts index 0d9ef747d50..a4f7fd1847c 100644 --- a/src/scripts/ci-changed-scope.test.ts +++ b/src/scripts/ci-changed-scope.test.ts @@ -124,6 +124,24 @@ describe("detectChangedScope", () => { runChangedSmoke: false, runControlUiI18n: false, }); + expect(detectChangedScope(["apps/swabble/Sources/SwabbleKit/WakeWordGate.swift"])).toEqual({ + runNode: false, + runMacos: true, + runAndroid: false, + runWindows: false, + runSkillsPython: false, + runChangedSmoke: false, + runControlUiI18n: false, + }); + expect(detectChangedScope(["Swabble/Sources/SwabbleKit/WakeWordGate.swift"])).toEqual({ + runNode: false, + runMacos: true, + runAndroid: false, + runWindows: false, + runSkillsPython: false, + runChangedSmoke: false, + runControlUiI18n: false, + }); }); it("does not force macOS for generated protocol model-only changes", () => { diff --git a/test/scripts/changed-lanes.test.ts b/test/scripts/changed-lanes.test.ts index 4e7924aa06c..9b4a2f8cdb9 100644 --- a/test/scripts/changed-lanes.test.ts +++ b/test/scripts/changed-lanes.test.ts @@ -320,6 +320,19 @@ describe("scripts/changed-lanes", () => { expect(plan.commands.map((command) => command.args[0])).not.toContain("test"); }); + it("routes root hygiene config changes to tooling instead of all lanes", () => { + const result = detectChangedLanes([".dockerignore", ".pre-commit-config.yaml", ".swiftformat"]); + const plan = createChangedCheckPlan(result); + + expect(result.lanes).toMatchObject({ + tooling: true, + all: false, + }); + expect(plan.commands.map((command) => command.args[0])).toContain("lint:scripts"); + expect(plan.commands.map((command) => command.args[0])).not.toContain("tsgo:all"); + expect(plan.commands.map((command) => command.args[0])).not.toContain("test"); + }); + it("routes VS Code workspace settings to tooling instead of all lanes", () => { const result = detectChangedLanes([".vscode/settings.json", ".vscode/extensions.json"]); const plan = createChangedCheckPlan(result); @@ -757,6 +770,17 @@ describe("scripts/changed-lanes", () => { expect(plan.commands.map((command) => command.args[0])).not.toContain("test"); }); + it("routes legacy Swabble deletions as app surface during the app move", () => { + const result = detectChangedLanes(["Swabble/Sources/SwabbleKit/WakeWordGate.swift"]); + const plan = createChangedCheckPlan(result); + + expect(result.lanes).toMatchObject({ + apps: true, + all: false, + }); + expect(plan.commands.map((command) => command.args[0])).not.toContain("tsgo:all"); + }); + it("keeps shared Vitest wiring changes out of check test execution", () => { const result = detectChangedLanes(["test/vitest/vitest.shared.config.ts"]); const plan = createChangedCheckPlan(result);