Roadmap
Overview
Section titled “Overview”| Version | Theme | Definition of done |
|---|---|---|
| v0.1 | DSL + checks + konsist { } | Can express a large project, and checks pass |
| v0.2 | Gradle plugin + documentation generation + templates + baseline (+ IDE plugin, experimental) | ./gradlew katachiDocs produces documentation. With existing violations tolerated by a baseline, the test fails only on new violations and on entries still in the baseline file after they were fixed |
| v0.3 and beyond | declarations { } / report output / vocabulary-size measurement | Easier to adopt in an existing project. Most of the konsist { } written in v0.1 can be replaced with declarations { } |
v0.3 and beyond — Adoption in existing projects and declarations { }
Section titled “v0.3 and beyond — Adoption in existing projects and declarations { }”Making katachi easier to adopt in existing projects is the theme of v0.3 and beyond. Only baseline, which tolerates the existing violations for now and fails only on new ones, has already landed in v0.2 as an experimental feature.
| Feature | What it enables |
|---|---|
dependsOnlyOn |
Writes what may be depended on as an allow list. A deny-list approach passes omissions without complaint. Moved here from the v0.2 plan |
| Report output | Outputs JSON / SARIF, surfaced as annotations on GitHub PRs |
pairedWith |
Checks coverage, such as “every Screen has a corresponding Preview” |
| Vocabulary-size measurement | Reports the number of Roles and the file count per Role as numbers |
| Module resolution based on Gradle’s model | Follows modules whose projectDir was changed, and where source sets actually are |
The specification for this stage is largely undecided. Even the version numbering is grouped together as “v0.3 and beyond” for now.
declarations { } — a promotion out of konsist { }
Section titled “declarations { } — a promotion out of konsist { }”v0.1’s konsist { } is, frankly, an escape hatch. Something almost every Role wants to say — like “only a *UseCase interface and a Default*UseCase class go here” — ends up being spelled out as a Konsist expression every time.
"only the interface and its Default implementation are placed".konsist { files.must { file -> val decls = file.declarations(includeNested = false, includeLocal = false) decls.size == 2 && decls.any { it is KoInterfaceDeclaration && it.name.endsWith("UseCase") } && decls.any { it is KoClassDeclaration && it.name.startsWith("Default") } }}The same rule should be writable in a form like the one below. The plan is to realize that in v0.3 and beyond.
"UseCase" { declarations { `interface`("*UseCase") `class`("Default*UseCase") }}Top-level declarations that aren’t enumerated may not appear. The block is the allow list for contents, in the same way layout { } is the allow list for placement.
The API is still at the design stage, but it will very likely be implemented in v0.3 and beyond.