Good first issues¶
tandha is built so most contributions are single-file. The original v1/v2 backlog (JSON spec, resolver, bindings, XCUITest accessors, codegen + plugin, export, lint) is already implemented — these are the next opportunities.
Add an export format (single file)¶
Add one type conforming to Exporter in Sources/TandhaExport/, register it in
Exporters.all, and add a test in Tests/TandhaExportTests/.
- [ ] Java
.properties—login.username_field=login.username_fieldlines. - [ ] Python page object — Appium
AppiumBy.accessibility_id(...)class. - [ ] XML / Katalon object repository stub.
- [ ] TypeScript/WebdriverIO locator map.
Add a lint rule (single file)¶
Add one type conforming to LintRule in Sources/TandhaLint/Rules/, register it
in Linter.all, and add a test in Tests/TandhaLintTests/.
- [ ] Empty-group — a namespace with no leaves.
- [ ] Max-depth — warn when nesting exceeds a configurable depth.
- [ ] Reserved-word leaf — flag keys that need back-tick escaping in codegen.
- [ ] Screen-prefix — enforce that each identifier starts with its top-level namespace.
Bindings & DX¶
- [ ] SwiftUI: an
automationID(_:)overload taking a generatedKeyPath. - [ ] UIKit: convenience on
UIBarButtonItem/UIAccessibilityIdentification. - [ ] A
tandha initcommand that scaffolds a starterautomation-ids.json.
v3 — reach (larger)¶
- [ ] Android parity — Espresso/UIAutomator via
resource-id/contentDescription. Enforce API parity with the iOS surfaces (seeCONTRIBUTING.md). - [ ] Richer metadata-driven QA docs (HTML/Markdown catalog export).
Ground rules¶
Every new format/rule needs a unit test; keep output deterministic (sorted by key); never claim direct Selenium/Katalon native-iOS control — the bridge is always Appium's XCUITest driver. See CONTRIBUTING.md.