Quality Stack
Scan a project's build configuration across JVM, Android, Node.js, and Python ecosystems, cross-reference against curated research documents, and assist with tool setup.
Pre-flight
- Run the orchestrator — it auto-detects ecosystems:
python3 <skill-path>/scripts/scan_project.py <project-root>
- If
"error": "no_ecosystem_detected", check nearby_project_files for subproject paths.
- Monorepo? — use
--recursive or --ecosystem to force a specific scanner:python3 <skill-path>/scripts/scan_project.py --recursive <project-root>
python3 <skill-path>/scripts/scan_project.py --ecosystem node <project-root>
- Legacy (JVM only) —
scan_tooling.py still works as a backwards-compatible wrapper.
Two-Phase Workflow
Phase 1: Recommend
Run the scanner on the project root (see Pre-flight above).
Fetch research documents via WebFetch — only for detected ecosystems:
Android (when ecosystems contains "android"):
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/android-ecosystem-tooling.md
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/android-testing-ecosystem.md
JVM (when ecosystems contains "jvm"):
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/jvm-quality-tools-evaluation.md
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/kotlin-spring-boot-testing-ecosystem.md
Node.js (when ecosystems contains "node"):
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/node-quality-tools-evaluation.md
Python (when ecosystems contains "python"):
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/python-quality-tools-evaluation.md
Cross-cutting (always):
https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/cross-cutting-devtools-evaluation.md
If WebFetch fails, warn the user and proceed using scanner results + LLM knowledge only.
Cross-reference scanner output against research recommendations per ecosystem:
- Identify tools recommended but missing from the project
- Check
status field: disabled or config-only tools need attention
- Flag outdated or superseded tools
- Apply ecosystem-specific SKIP rules (see WORKFLOW.md)
- Review
tool_config for threshold values and settings
Generate the recommendation report using the format in WORKFLOW.md.
Phase 2: Setup
After presenting the report, present tools for selection using the multi-round
protocol in WORKFLOW.md. Group by ecosystem and priority tier.
Include effort estimates. After user completes selection across all rounds:
- Read the relevant research doc section for setup instructions
- Apply Setup Guards — resolve versions, check compatibility
- For each selected tool, apply changes per ecosystem:
- JVM: Add Gradle/Maven plugin, test deps, config files
- Node.js:
pnpm add -D, tsconfig edits, config file creation
- Python:
uv add --dev, pyproject.toml edits, config file creation
- Cross-cutting: CI/CD workflow steps, Lefthook config, EditorConfig
- Verify each tool after configuration — run the tool's check command,
verify filter patterns against actual codebase paths, and check for config
inheritance conflicts. See WORKFLOW.md Post-Setup Verification.
- Re-run the scanner to confirm all tools detected
Priority Classification
| Priority |
Criteria |
| NOW |
Essential missing tools, zero-dependency additions |
| SOON |
High-value additions requiring minor setup |
| LATER |
Nice-to-have with prerequisites |
| SKIP |
Not applicable (wrong ecosystem, incompatible version, deprecated) |
Ecosystem-aware rules — see WORKFLOW.md for full classification tables per ecosystem.
Key rules:
- Android Compose project: NOW Compose UI testing, SOON Roborazzi; SKIP Espresso
- Android KMP project: NOW commonTest setup, NOW Turbine; SOON Ktor MockEngine
- Android no lint config: NOW Android Lint baseline; SOON custom lint rules
- Android Kotlin 2.4+: NOW remove
StrongSkipping/IntrinsicRemember flags (compiler errors)
- Android KMP module on
com.android.library: NOW migrate to com.android.kotlin.multiplatform.library
- Android Compose-only app on Navigation 2.x: SOON Navigation 3 (
androidx.navigation3)
- Superseded coordinates (flag, don't just bump):
android-junit5 → de.mannodermaus.android-junit;
mockwebserver → mockwebserver3; Detekt 2.x → dev.detekt; Room 3 → androidx.room3
- JVM Pure Kotlin: SKIP Error Prone, SpotBugs; JVM Pure Java: SKIP Detekt, ktlint, MockK
- JVM Kotlin/KMP coverage: prefer Kover over JaCoCo; JaCoCo for mixed Java/Kotlin or Maven
- JVM Kotlin mutation testing:
pitest-kotlin is archived — maintained filter is paid (Arcmutate)
- JVM Spring Boot 4+: SKIP REST Assured, NOW MockMvcTester
- Node.js no linter: NOW ESLint; no formatter + no Biome: NOW Prettier
- Node.js TypeScript not strict: NOW enable strict
- Python no linter: NOW Ruff; no type checker + has type annotations: NOW mypy
Cross-Cutting Tools
| Tool |
When to Recommend |
Priority |
| Lefthook |
No git hook manager + has linters |
SOON |
| commitlint |
No commit conventions + has team |
LATER |
| EditorConfig |
Missing .editorconfig |
NOW |
| Renovate/Dependabot |
No dependency automation |
SOON |
| Trivy/gitleaks |
No security scanning |
SOON |
Research Documents
Fetch via WebFetch at runtime — only for detected ecosystems:
- Android Ecosystem Tooling:
android-ecosystem-tooling.md
- Android Testing Ecosystem:
android-testing-ecosystem.md
- JVM Quality Tools:
jvm-quality-tools-evaluation.md
- JVM Testing Ecosystem:
kotlin-spring-boot-testing-ecosystem.md
- Node.js Quality Tools:
node-quality-tools-evaluation.md
- Python Quality Tools:
python-quality-tools-evaluation.md
- Cross-Cutting Tools:
cross-cutting-devtools-evaluation.md
Scanner Architecture
scripts/
scan_project.py # Orchestrator — auto-detects + merges
scan_jvm.py # JVM scanner (Gradle/Maven)
scan_android.py # Android scanner (AGP/Compose/KMP)
scan_node.py # Node.js/TypeScript scanner
scan_python.py # Python scanner
scan_cross_cutting.py # Cross-cutting tools (CI, hooks, security)
shared.py # Shared utilities
scan_tooling.py # Legacy wrapper → scan_jvm.py
References
- Workflow: See WORKFLOW.md for classification rules and report format
- Examples: See EXAMPLES.md for realistic audit scenarios
- Troubleshooting: See TROUBLESHOOTING.md for scanner issues
1---2name: quality-stack3description: Scan a project to detect configured quality and testing tools across JVM (Gradle/Maven), Android (AGP/Compose/KMP), Node.js/TypeScript, and Python ecosystems. Cross-reference against research-backed recommendations and assist with setup. Auto-detects project type(s) including monorepos with mixed ecosystems. Use when user asks to "audit tooling", "recommend tools", "quality stack", "what tools am I missing", "setup eslint", "setup detekt", "add coverage", "add ruff", "configure CI quality pipeline", "scan project tools", "tooling audit", "android tooling", "android quality", "compose testing", "kmp testing", or "screenshot testing".4---56# Quality Stack78Scan a project's build configuration across JVM, Android, Node.js, and Python ecosystems, cross-reference against curated research documents, and assist with tool setup.910## Pre-flight11121. **Run the orchestrator** — it auto-detects ecosystems:13 ```bash14 python3 <skill-path>/scripts/scan_project.py <project-root>15 ```162. If `"error": "no_ecosystem_detected"`, check `nearby_project_files` for subproject paths.173. **Monorepo?** — use `--recursive` or `--ecosystem` to force a specific scanner:18 ```bash19 python3 <skill-path>/scripts/scan_project.py --recursive <project-root>20 python3 <skill-path>/scripts/scan_project.py --ecosystem node <project-root>21 ```224. **Legacy (JVM only)** — `scan_tooling.py` still works as a backwards-compatible wrapper.2324## Two-Phase Workflow2526### Phase 1: Recommend27281. **Run the scanner** on the project root (see Pre-flight above).29302. **Fetch research documents** via WebFetch — only for detected ecosystems:3132 **Android** (when `ecosystems` contains `"android"`):33 ```34 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/android-ecosystem-tooling.md35 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/android-testing-ecosystem.md36 ```3738 **JVM** (when `ecosystems` contains `"jvm"`):39 ```40 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/jvm-quality-tools-evaluation.md41 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/kotlin-spring-boot-testing-ecosystem.md42 ```4344 **Node.js** (when `ecosystems` contains `"node"`):45 ```46 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/node-quality-tools-evaluation.md47 ```4849 **Python** (when `ecosystems` contains `"python"`):50 ```51 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/python-quality-tools-evaluation.md52 ```5354 **Cross-cutting** (always):55 ```56 https://raw.githubusercontent.com/joaquimscosta/arkhe-claude-plugins/main/docs/research/cross-cutting-devtools-evaluation.md57 ```5859 If WebFetch fails, warn the user and proceed using scanner results + LLM knowledge only.60613. **Cross-reference** scanner output against research recommendations per ecosystem:62 - Identify tools recommended but missing from the project63 - Check `status` field: `disabled` or `config-only` tools need attention64 - Flag outdated or superseded tools65 - Apply ecosystem-specific SKIP rules (see [WORKFLOW.md](WORKFLOW.md))66 - Review `tool_config` for threshold values and settings67684. **Generate the recommendation report** using the format in [WORKFLOW.md](WORKFLOW.md).6970### Phase 2: Setup7172After presenting the report, present tools for selection using the multi-round73protocol in [WORKFLOW.md](WORKFLOW.md). Group by ecosystem and priority tier.74Include effort estimates. After user completes selection across all rounds:75761. Read the relevant research doc section for setup instructions772. Apply [Setup Guards](WORKFLOW.md) — resolve versions, check compatibility783. For each selected tool, apply changes per ecosystem:79 - **JVM**: Add Gradle/Maven plugin, test deps, config files80 - **Node.js**: `pnpm add -D`, tsconfig edits, config file creation81 - **Python**: `uv add --dev`, pyproject.toml edits, config file creation82 - **Cross-cutting**: CI/CD workflow steps, Lefthook config, EditorConfig834. **Verify each tool** after configuration — run the tool's check command,84 verify filter patterns against actual codebase paths, and check for config85 inheritance conflicts. See [WORKFLOW.md](WORKFLOW.md) Post-Setup Verification.865. Re-run the scanner to confirm all tools detected8788## Priority Classification8990| Priority | Criteria |91|----------|----------|92| **NOW** | Essential missing tools, zero-dependency additions |93| **SOON** | High-value additions requiring minor setup |94| **LATER** | Nice-to-have with prerequisites |95| **SKIP** | Not applicable (wrong ecosystem, incompatible version, deprecated) |9697**Ecosystem-aware rules** — see [WORKFLOW.md](WORKFLOW.md) for full classification tables per ecosystem.9899**Key rules:**100- Android Compose project: NOW Compose UI testing, SOON Roborazzi; SKIP Espresso101- Android KMP project: NOW commonTest setup, NOW Turbine; SOON Ktor MockEngine102- Android no lint config: NOW Android Lint baseline; SOON custom lint rules103- Android Kotlin 2.4+: NOW remove `StrongSkipping`/`IntrinsicRemember` flags (compiler errors)104- Android KMP module on `com.android.library`: NOW migrate to `com.android.kotlin.multiplatform.library`105- Android Compose-only app on Navigation 2.x: SOON Navigation 3 (`androidx.navigation3`)106- Superseded coordinates (flag, don't just bump): `android-junit5` → `de.mannodermaus.android-junit`;107 `mockwebserver` → `mockwebserver3`; Detekt 2.x → `dev.detekt`; Room 3 → `androidx.room3`108- JVM Pure Kotlin: SKIP Error Prone, SpotBugs; JVM Pure Java: SKIP Detekt, ktlint, MockK109- JVM Kotlin/KMP coverage: prefer Kover over JaCoCo; JaCoCo for mixed Java/Kotlin or Maven110- JVM Kotlin mutation testing: `pitest-kotlin` is archived — maintained filter is paid (Arcmutate)111- JVM Spring Boot 4+: SKIP REST Assured, NOW MockMvcTester112- Node.js no linter: NOW ESLint; no formatter + no Biome: NOW Prettier113- Node.js TypeScript not strict: NOW enable strict114- Python no linter: NOW Ruff; no type checker + has type annotations: NOW mypy115116### Cross-Cutting Tools117118| Tool | When to Recommend | Priority |119|------|------------------|----------|120| Lefthook | No git hook manager + has linters | SOON |121| commitlint | No commit conventions + has team | LATER |122| EditorConfig | Missing `.editorconfig` | NOW |123| Renovate/Dependabot | No dependency automation | SOON |124| Trivy/gitleaks | No security scanning | SOON |125126## Research Documents127128Fetch via WebFetch at runtime — only for detected ecosystems:129130- **Android Ecosystem Tooling**: `android-ecosystem-tooling.md`131- **Android Testing Ecosystem**: `android-testing-ecosystem.md`132- **JVM Quality Tools**: `jvm-quality-tools-evaluation.md`133- **JVM Testing Ecosystem**: `kotlin-spring-boot-testing-ecosystem.md`134- **Node.js Quality Tools**: `node-quality-tools-evaluation.md`135- **Python Quality Tools**: `python-quality-tools-evaluation.md`136- **Cross-Cutting Tools**: `cross-cutting-devtools-evaluation.md`137138## Scanner Architecture139140```141scripts/142 scan_project.py # Orchestrator — auto-detects + merges143 scan_jvm.py # JVM scanner (Gradle/Maven)144 scan_android.py # Android scanner (AGP/Compose/KMP)145 scan_node.py # Node.js/TypeScript scanner146 scan_python.py # Python scanner147 scan_cross_cutting.py # Cross-cutting tools (CI, hooks, security)148 shared.py # Shared utilities149 scan_tooling.py # Legacy wrapper → scan_jvm.py150```151152## References153154- **Workflow**: See [WORKFLOW.md](WORKFLOW.md) for classification rules and report format155- **Examples**: See [EXAMPLES.md](EXAMPLES.md) for realistic audit scenarios156- **Troubleshooting**: See [TROUBLESHOOTING.md](TROUBLESHOOTING.md) for scanner issues