{"owner":"VREMSoftwareDevelopment","repo":"WiFiAnalyzer","hasSkills":true,"totalSkillsCount":1,"totalTokensCount":2233,"categories":["root-instruction"],"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz, 6 GHz and Wi-Fi 7 (320 MHz) bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso, AssertJ, Hamcrest |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\nThe build uses the Gradle Kotlin DSL (`*.gradle.kts`) with a **version catalog**. Every dependency, plugin,\nand tool version lives in `gradle/libs.versions.toml` — the build scripts only reference it via\n`libs.*` accessors and `alias(libs.plugins.*)`, so they contain no version literals.\n\n- All library, plugin, and tool versions (Kotlin, AGP, ktlint, Robolectric, ...): `gradle/libs.versions.toml`\n- Gradle wrapper: `gradle/wrapper/gradle-wrapper.properties` (check `distributionUrl`)\n- JDK used in CI: `.github/actions/common-setup/action.yml` and `.github/workflows/*` (search for `java-version` or `setup-java` usage)\n- compileSdk, minSdk, targetSdk, Java source/target compatibility: `app/build.gradle.kts`\n- Version numbers, release signing, and JaCoCo tasks: `app/build.gradle.kts` (version values in `app/build.properties`)\n- Android lint rules: `app/lint.xml`; formatting rules: `.editorconfig`\n\nDo not use apply(from = ...). Prefer precompiled (convention) plugins or a `build-logic` module; this repository does not use Gradle `extra` properties.\n\nTo extract these values quickly from a bash shell you can run (from the repository root):\n\n```bash\n# All versions at a glance\ncat gradle/libs.versions.toml\n\n# A specific version (Kotlin, AGP, ktlint, Robolectric, ...)\ngrep -nE \"^(agp|kotlin|ktlint|robolectric) = \" gradle/libs.versions.toml\n\n# Which plugins are applied, and where\ngrep -nE \"alias\\(libs\\.plugins\" build.gradle.kts app/build.gradle.kts\n\n# Gradle wrapper distribution\ngrep -n \"distributionUrl\" gradle/wrapper/gradle-wrapper.properties\n\n# JDK in CI workflows\ngrep -Rn \"java-version\" .github\n\n# compileSdk / minSdk / targetSdk / Java compatibility\ngrep -nE \"compileSdk|minSdk|targetSdk|JavaVersion\" app/build.gradle.kts\n```\n\n## Project Structure\n\n```\napp/build.gradle.kts         # Module build script (including versioning, signing, and JaCoCo)\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll tracked `*.java`, `*.kt`, `*.kts`, `*.xml`, and `*.svg` files must include the GPLv3 license header (enforced by `scripts/check-license-headers.sh` and CI):\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n\nRepository-specific ktlint note:\n- Plugin applied in `app/build.gradle.kts` as `alias(libs.plugins.ktlint)`; the version is the `ktlint` entry in `gradle/libs.versions.toml`.\n- Formatting rules: project `.editorconfig`. There is no ktlint baseline file — the codebase is expected to be clean.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.mainActivity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check license headers | `./scripts/check-license-headers.sh` |\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: license-header, ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`, which currently runs API levels 31, 33, 35 and 37.0.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n"},"files":{"AGENTS.md":"# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz, 6 GHz and Wi-Fi 7 (320 MHz) bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso, AssertJ, Hamcrest |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\nThe build uses the Gradle Kotlin DSL (`*.gradle.kts`) with a **version catalog**. Every dependency, plugin,\nand tool version lives in `gradle/libs.versions.toml` — the build scripts only reference it via\n`libs.*` accessors and `alias(libs.plugins.*)`, so they contain no version literals.\n\n- All library, plugin, and tool versions (Kotlin, AGP, ktlint, Robolectric, ...): `gradle/libs.versions.toml`\n- Gradle wrapper: `gradle/wrapper/gradle-wrapper.properties` (check `distributionUrl`)\n- JDK used in CI: `.github/actions/common-setup/action.yml` and `.github/workflows/*` (search for `java-version` or `setup-java` usage)\n- compileSdk, minSdk, targetSdk, Java source/target compatibility: `app/build.gradle.kts`\n- Version numbers, release signing, and JaCoCo tasks: `app/build.gradle.kts` (version values in `app/build.properties`)\n- Android lint rules: `app/lint.xml`; formatting rules: `.editorconfig`\n\nDo not use apply(from = ...). Prefer precompiled (convention) plugins or a `build-logic` module; this repository does not use Gradle `extra` properties.\n\nTo extract these values quickly from a bash shell you can run (from the repository root):\n\n```bash\n# All versions at a glance\ncat gradle/libs.versions.toml\n\n# A specific version (Kotlin, AGP, ktlint, Robolectric, ...)\ngrep -nE \"^(agp|kotlin|ktlint|robolectric) = \" gradle/libs.versions.toml\n\n# Which plugins are applied, and where\ngrep -nE \"alias\\(libs\\.plugins\" build.gradle.kts app/build.gradle.kts\n\n# Gradle wrapper distribution\ngrep -n \"distributionUrl\" gradle/wrapper/gradle-wrapper.properties\n\n# JDK in CI workflows\ngrep -Rn \"java-version\" .github\n\n# compileSdk / minSdk / targetSdk / Java compatibility\ngrep -nE \"compileSdk|minSdk|targetSdk|JavaVersion\" app/build.gradle.kts\n```\n\n## Project Structure\n\n```\napp/build.gradle.kts         # Module build script (including versioning, signing, and JaCoCo)\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll tracked `*.java`, `*.kt`, `*.kts`, `*.xml`, and `*.svg` files must include the GPLv3 license header (enforced by `scripts/check-license-headers.sh` and CI):\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n\nRepository-specific ktlint note:\n- Plugin applied in `app/build.gradle.kts` as `alias(libs.plugins.ktlint)`; the version is the `ktlint` entry in `gradle/libs.versions.toml`.\n- Formatting rules: project `.editorconfig`. There is no ktlint baseline file — the codebase is expected to be clean.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.mainActivity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check license headers | `./scripts/check-license-headers.sh` |\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: license-header, ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`, which currently runs API levels 31, 33, 35 and 37.0.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz, 6 GHz and Wi-Fi 7 (320 MHz) bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso, AssertJ, Hamcrest |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\nThe build uses the Gradle Kotlin DSL (`*.gradle.kts`) with a **version catalog**. Every dependency, plugin,\nand tool version lives in `gradle/libs.versions.toml` — the build scripts only reference it via\n`libs.*` accessors and `alias(libs.plugins.*)`, so they contain no version literals.\n\n- All library, plugin, and tool versions (Kotlin, AGP, ktlint, Robolectric, ...): `gradle/libs.versions.toml`\n- Gradle wrapper: `gradle/wrapper/gradle-wrapper.properties` (check `distributionUrl`)\n- JDK used in CI: `.github/actions/common-setup/action.yml` and `.github/workflows/*` (search for `java-version` or `setup-java` usage)\n- compileSdk, minSdk, targetSdk, Java source/target compatibility: `app/build.gradle.kts`\n- Version numbers, release signing, and JaCoCo tasks: `app/build.gradle.kts` (version values in `app/build.properties`)\n- Android lint rules: `app/lint.xml`; formatting rules: `.editorconfig`\n\nDo not use apply(from = ...). Prefer precompiled (convention) plugins or a `build-logic` module; this repository does not use Gradle `extra` properties.\n\nTo extract these values quickly from a bash shell you can run (from the repository root):\n\n```bash\n# All versions at a glance\ncat gradle/libs.versions.toml\n\n# A specific version (Kotlin, AGP, ktlint, Robolectric, ...)\ngrep -nE \"^(agp|kotlin|ktlint|robolectric) = \" gradle/libs.versions.toml\n\n# Which plugins are applied, and where\ngrep -nE \"alias\\(libs\\.plugins\" build.gradle.kts app/build.gradle.kts\n\n# Gradle wrapper distribution\ngrep -n \"distributionUrl\" gradle/wrapper/gradle-wrapper.properties\n\n# JDK in CI workflows\ngrep -Rn \"java-version\" .github\n\n# compileSdk / minSdk / targetSdk / Java compatibility\ngrep -nE \"compileSdk|minSdk|targetSdk|JavaVersion\" app/build.gradle.kts\n```\n\n## Project Structure\n\n```\napp/build.gradle.kts         # Module build script (including versioning, signing, and JaCoCo)\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll tracked `*.java`, `*.kt`, `*.kts`, `*.xml`, and `*.svg` files must include the GPLv3 license header (enforced by `scripts/check-license-headers.sh` and CI):\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n\nRepository-specific ktlint note:\n- Plugin applied in `app/build.gradle.kts` as `alias(libs.plugins.ktlint)`; the version is the `ktlint` entry in `gradle/libs.versions.toml`.\n- Formatting rules: project `.editorconfig`. There is no ktlint baseline file — the codebase is expected to be clean.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.mainActivity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check license headers | `./scripts/check-license-headers.sh` |\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: license-header, ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`, which currently runs API levels 31, 33, 35 and 37.0.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n","isInternal":false,"tokens":2233,"sizeBytes":9244}],"systemPromptSnippet":"<yakaai_skills repo=\"VREMSoftwareDevelopment/WiFiAnalyzer\">\n<!-- File: AGENTS.md (Tokens: ~2233 | Category: root-instruction) -->\n# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz, 6 GHz and Wi-Fi 7 (320 MHz) bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso, AssertJ, Hamcrest |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\nThe build uses the Gradle Kotlin DSL (`*.gradle.kts`) with a **version catalog**. Every dependency, plugin,\nand tool version lives in `gradle/libs.versions.toml` — the build scripts only reference it via\n`libs.*` accessors and `alias(libs.plugins.*)`, so they contain no version literals.\n\n- All library, plugin, and tool versions (Kotlin, AGP, ktlint, Robolectric, ...): `gradle/libs.versions.toml`\n- Gradle wrapper: `gradle/wrapper/gradle-wrapper.properties` (check `distributionUrl`)\n- JDK used in CI: `.github/actions/common-setup/action.yml` and `.github/workflows/*` (search for `java-version` or `setup-java` usage)\n- compileSdk, minSdk, targetSdk, Java source/target compatibility: `app/build.gradle.kts`\n- Version numbers, release signing, and JaCoCo tasks: `app/build.gradle.kts` (version values in `app/build.properties`)\n- Android lint rules: `app/lint.xml`; formatting rules: `.editorconfig`\n\nDo not use apply(from = ...). Prefer precompiled (convention) plugins or a `build-logic` module; this repository does not use Gradle `extra` properties.\n\nTo extract these values quickly from a bash shell you can run (from the repository root):\n\n```bash\n# All versions at a glance\ncat gradle/libs.versions.toml\n\n# A specific version (Kotlin, AGP, ktlint, Robolectric, ...)\ngrep -nE \"^(agp|kotlin|ktlint|robolectric) = \" gradle/libs.versions.toml\n\n# Which plugins are applied, and where\ngrep -nE \"alias\\(libs\\.plugins\" build.gradle.kts app/build.gradle.kts\n\n# Gradle wrapper distribution\ngrep -n \"distributionUrl\" gradle/wrapper/gradle-wrapper.properties\n\n# JDK in CI workflows\ngrep -Rn \"java-version\" .github\n\n# compileSdk / minSdk / targetSdk / Java compatibility\ngrep -nE \"compileSdk|minSdk|targetSdk|JavaVersion\" app/build.gradle.kts\n```\n\n## Project Structure\n\n```\napp/build.gradle.kts         # Module build script (including versioning, signing, and JaCoCo)\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll tracked `*.java`, `*.kt`, `*.kts`, `*.xml`, and `*.svg` files must include the GPLv3 license header (enforced by `scripts/check-license-headers.sh` and CI):\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n\nRepository-specific ktlint note:\n- Plugin applied in `app/build.gradle.kts` as `alias(libs.plugins.ktlint)`; the version is the `ktlint` entry in `gradle/libs.versions.toml`.\n- Formatting rules: project `.editorconfig`. There is no ktlint baseline file — the codebase is expected to be clean.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.mainActivity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check license headers | `./scripts/check-license-headers.sh` |\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: license-header, ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`, which currently runs API levels 31, 33, 35 and 37.0.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n</yakaai_skills>"}