Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ pluginManagement {
}

plugins {
id("tools.forma.android") version "0.1.3"
id("tools.forma.android") version "0.2.0"
}

// Configure shared aspects of your android Project
Expand Down
4 changes: 2 additions & 2 deletions TICKETS.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ Promoted from daily next-actions / historical GH. Workers pick top `todo` in ord
| F-091 | done | BuildFeatures under Forma | GH **#88** — `FormaBuildFeatures` project-global (defaults **off**); central apply on library+binary; type-owned viewBinding/composeWidget + minimal `impl`/`compose` attrs; docs CALL-SITE + PROJECT-CONFIGURATION. |
| F-092 | done | versionCode / versionName on binary (and app) | GH **#82** — **done:** required `versionCode`/`versionName` on `androidBinary` only (wired to AGP `defaultConfig`); **not** on `AndroidProjectSettings` / `androidProjectConfiguration`; `androidApp` stays library shell (no version attrs — Gradle app-module limit). Sample + examples already use call-site API; docs/KDoc locked. |
| F-093 | done | Remove legacy `.kapt` once unused | **KSP-only:** hard-removed `String.kapt` / `kapt()` / `object Kapt` / `kotlin-kapt` auto-apply / `kaptConfigurationFeature`. Zero in-repo consumers after F-086; no external-compat shim. |
| F-094 | blocked | Gradle Plugin Portal Forma org/user | GH **#133** — human/admin: create shared Portal user/org and credentials for team publish. Worker cannot finish without Stepan Portal access. Track only; see `docs/PLUGIN-PUBLISH.md`. |
| F-094 | done | Gradle Plugin Portal 0.2.0 | Published **2026-09-07** (`tools.forma.android` + facades + `kmp` + `jvm`). GH **#133** org transfer still open / separate. |
| F-095 | done | Progressive example: Metro DI framework | `examples/android/11-metro-di` — Path A Metro on impl/app + `metroImpl`/`metroApp` DSLs + mini `@DependencyGraph`; docs ladder; assembleDebug green. |

## P10 — Promoted backlog (2026-07-24 Stepan)
Expand Down Expand Up @@ -197,7 +197,7 @@ Keep for reference; do not start unless higher tickets done or user prioritizes:
- ~~GH #97 Excluded from dependency validation~~ → **F-090**
- ~~GH #88 BuildFeatures support~~ → **F-091**
- ~~GH #82 Version code/name in binary~~ → **F-092**
- ~~GH #133 Portal Forma user~~ → **F-094** (blocked on human admin)
- ~~GH #133 Portal Forma user~~ → **F-094** (0.2.0 published 2026-09-07; org transfer still #133)
- ~~F-019 AndroidX ceiling~~ → **F-087**
- ~~Legacy `.kapt` removal~~ → **F-093**
- ~~F-084 Gradle-task follow-ups~~ → **F-088**
Expand Down
4 changes: 2 additions & 2 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ that compose via `includeBuild`:

## 2. `plugins/` module graph

Group/version (root `plugins/build.gradle.kts`): **`tools.forma` / `0.1.3`**.
Group/version (root `plugins/build.gradle.kts`): **`tools.forma` / `0.2.0`**.

```
┌────────────┐
Expand Down Expand Up @@ -319,7 +319,7 @@ keys) or full Portal publish via secrets; deeper Gradle remote cache.
| Kotlin | embeddedKotlin from Gradle 9.6.1 (**2.3.21**); KSP **2.3.10**; Compose UI **1.11.4** / compiler default **2.3.21** |
| Android SDK | sample min **23** / target **37** / compile **37** (F-087); host platforms 37+36+35 + build-tools 37/36/35 |
| AndroidX ceiling | core **1.19.0**, activity **1.13.0**, lifecycle **2.11.0**, room **2.8.4**, material **1.14.0** (paging **2.1.2** kept) |
| Forma version | 0.1.3 |
| Forma version | 0.2.0 |

Host bootstrap details: `docs/ENV.md`, `scripts/env-mac.sh` (F-001).

Expand Down
4 changes: 2 additions & 2 deletions docs/GETTING-STARTED.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ You can consume Forma from the **Gradle Plugin Portal** or via **composite
`includeBuild`** (as this monorepo does for development).

Published plugin id: `tools.forma.android` (badge version on the [README](../README.md);
sample monorepo develops **0.1.3** line). Companion settings plugin:
sample monorepo develops **0.2.0** line). Companion settings plugin:
`tools.forma.includer` (auto-`include` subprojects that contain `build.gradle.kts`).

### 4.1 `settings.gradle.kts`
Expand All @@ -117,7 +117,7 @@ pluginManagement {

plugins {
id("tools.forma.includer") version "0.2.0"
id("tools.forma.android") version "0.1.3"
id("tools.forma.android") version "0.2.0"
}

// Discover every build.gradle.kts under this root (skip nested settings.gradle*).
Expand Down
4 changes: 2 additions & 2 deletions docs/JVM-GETTING-STARTED.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ You can consume Forma from the **Gradle Plugin Portal** or via **composite
`includeBuild`** (as this monorepo does for development).

Published plugin id: `tools.forma.jvm` (badge version on the [README](../README.md);
sample monorepo develops **0.1.3** line). Companion settings plugin:
sample monorepo develops **0.2.0** line). Companion settings plugin:
`tools.forma.includer` (auto-`include` subprojects that contain `build.gradle.kts`).

### 4.1 `settings.gradle.kts`
Expand All @@ -115,7 +115,7 @@ pluginManagement {

plugins {
id("tools.forma.includer") version "0.2.0"
id("tools.forma.jvm") version "0.1.3"
id("tools.forma.jvm") version "0.2.0"
}

// Discover every build.gradle.kts under this root (skip nested settings.gradle*).
Expand Down
2 changes: 1 addition & 1 deletion docs/JVM-TARGETS.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ pluginManagement {
}
}
plugins {
id("tools.forma.jvm") version "0.1.3"
id("tools.forma.jvm") version "0.2.0"
// or includeBuild("../plugins") in a composite
}

Expand Down
33 changes: 17 additions & 16 deletions docs/PLUGIN-PUBLISH.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ expected ownership model and credential flow so workers do not invent secrets.
| `includer/` | `tools.forma.includer` | Separate build (own version) |
| `depgen/` | `tools.forma.depgen` | Separate build |

Current shared version for the `plugins/` multi-project: **`0.1.3`**
Current shared version for the `plugins/` multi-project: **`0.2.0`**
(see `formaPluginConfiguration` in `plugins/build.gradle.kts`).

Core and plugins share the version (overridable for local testing via `-PformaLocalVersion`).

`:android`’s `publishPlugins` task depends on sibling `publishPlugins` so a
single `:android:publishPlugins` publishes the whole set.
`:android`’s `publishPlugins` task depends on sibling `publishPlugins`
(`:target`, `:validation`, `:owners`, `:config`, `:deps`, `:kmp`, **`:jvm`**)
so a single `:android:publishPlugins` publishes the whole set.

## Coordinates (F-024)

Expand All @@ -37,38 +38,38 @@ Android consumers continue to use the unchanged plugin id `tools.forma.android`.

| Artifact | Coordinates | Type | Notes |
|----------|-------------|------|-------|
| forma-core | `tools.forma:core:0.1.3` (+ `-sources`) | Maven library | Single jar. Contains `tools.forma.core.target`, `.restriction`, `.validation`. |
| forma-core | `tools.forma:core:0.2.0` (+ `-sources`) | Maven library | Single jar. Contains `tools.forma.core.target`, `.restriction`, `.validation`. |
| Android | `tools.forma.android` (Plugin Portal) | Gradle plugin | Primary Android entrypoint. Depends on core (transitive). |
| JVM | `tools.forma.jvm` (Plugin Portal) | Gradle plugin | Pure JVM targets (F-030). Depends on core (transitive); **no AGP**. See [`JVM-TARGETS.md`](JVM-TARGETS.md). |
| Facades (compat) | `tools.forma.target`, `.validation`, `.deps`, `.config`, `.owners` | Gradle plugins (thin) | Remain published; delegate/re-export core. |

Group `tools.forma`, version `0.1.3` (shared source of truth in root `formaPluginConfiguration`).
Group `tools.forma`, version `0.2.0` (shared source of truth in root `formaPluginConfiguration`).

### Consumers

- **Normal Android apps** (recommended): use the plugin — no direct core dep needed.
```kotlin
plugins {
id("tools.forma.android") version "0.1.3"
id("tools.forma.android") version "0.2.0"
}
```
- **Pure JVM apps** (F-030): use the JVM plugin (no AGP):
```kotlin
plugins {
id("tools.forma.jvm") version "0.1.3"
id("tools.forma.jvm") version "0.2.0"
}
```
DSL lives in package `tools.forma.jvm` — see [`JVM-TARGETS.md`](JVM-TARGETS.md).
- **Pure engine / Bazel adapters**: depend directly on the library when writing
adapters that do not need a platform DSL:
`implementation("tools.forma:core:0.1.3")`.
`implementation("tools.forma:core:0.2.0")`.

### How plugin POMs declare the core dependency

- Build files declare `implementation(project(":core"))` (and sibling facades).
- During `maven-publish` (via `com.gradle.plugin-publish` for plugins):
matching GAV project dependencies are rewritten as external
`tools.forma:core:0.1.3` (and peer plugins) in the published POM.
`tools.forma:core:0.2.0` (and peer plugins) in the published POM.
- `publishAllToMavenLocal` explicitly depends on `:core:publishToMavenLocal`
first so local resolution succeeds for plugin POMs and markers.

Expand Down Expand Up @@ -112,7 +113,7 @@ replaced by two helpers from `plugins/buildSrc`:
// plugins/build.gradle.kts
formaPluginConfiguration {
group = "tools.forma"
version = "0.1.3"
version = "0.2.0"
website = "https://forma.tools/"
vcsUrl = "https://github.com/formatools/forma.git"
displayName = "Forma - Meta Build System with Gradle and Android support"
Expand Down Expand Up @@ -213,13 +214,13 @@ Use this when you want to consume Forma from **another** Gradle project **withou

```bash
# From repo root (recommended wrapper):
./scripts/publish-local.sh # version 0.1.3
./scripts/publish-local.sh 0.1.3-LOCAL # recommended for experiments
./scripts/publish-local.sh # version 0.2.0
./scripts/publish-local.sh 0.2.0-LOCAL # recommended for experiments

# Or:
cd plugins
./gradlew publishAllToMavenLocal
./gradlew publishAllToMavenLocal -PformaLocalVersion=0.1.3-LOCAL
./gradlew publishAllToMavenLocal -PformaLocalVersion=0.2.0-LOCAL
```

What gets installed under `~/.m2/repository/tools/forma/`:
Expand All @@ -233,7 +234,7 @@ What gets installed under `~/.m2/repository/tools/forma/`:
`tools.forma:core` from mavenLocal.

**Do not** pass `-PformaLocalVersion` for real Portal releases — keep Portal
on the plain `0.1.3` (or next release) version string.
on the plain `0.2.0` (or next release) version string.

### Consume from a test project

Expand All @@ -250,7 +251,7 @@ pluginManagement {

// build.gradle.kts or settings plugins {}
plugins {
id("tools.forma.android") version "0.1.3-LOCAL"
id("tools.forma.android") version "0.2.0-LOCAL"
}
```

Expand All @@ -271,7 +272,7 @@ Unchanged for apps:

```kotlin
plugins {
id("tools.forma.android") version "0.1.3"
id("tools.forma.android") version "0.2.0"
}
```

Expand Down
18 changes: 18 additions & 0 deletions docs/PROGRESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@

Newest entries first.

## 2026-09-07 — F-094: Plugin Portal 0.2.0

- **Ticket:** F-094 → `done` (Portal upload). GH **#133** org/user transfer still OPEN (separate).
- **Branch:** `forma/F-094-portal-0.2.0` (from `origin/v2`)
- **Why not 0.1.3:** Portal rejected re-upload — `tools.forma.config` / `android` **0.1.3** already exist (2023-07-16). Versions immutable. Stepan picked **0.2.0**.
- **Actions:**
- Bumped shared `formaPluginConfiguration` version `0.1.3` → **`0.2.0`**
- Current-pin docs: README, GETTING-STARTED, JVM-*, PLUGIN-PUBLISH, ARCHITECTURE, `scripts/publish-local.sh`
- `:android:publishPlugins` → **BUILD SUCCESSFUL** (config/deps/kmp/owners/target/validation/android)
- `:jvm` was missing from the android publish chain — uploaded separately; chained `:jvm:publishPlugins` for next cuts
- **Verify (live Portal HTTP 200 on `/plugin/<id>/0.2.0`):**
- [tools.forma.android](https://plugins.gradle.org/plugin/tools.forma.android/0.2.0)
- [tools.forma.jvm](https://plugins.gradle.org/plugin/tools.forma.jvm/0.2.0)
- [tools.forma.kmp](https://plugins.gradle.org/plugin/tools.forma.kmp/0.2.0)
- facades: `config`, `target`, `validation`, `deps`, `owners`
- **Not in slice:** includer/depgen (own version cadence); GH #133 org transfer; `v2`→`master`
- **Next:** merge this PR to `v2`; #133 remains human if we want a shared Forma Portal org

## 2026-08-06 — F-116: sample domain use cases; kill GlobalScope

- **Ticket:** F-116 → `done` (GH #48)
Expand Down
1 change: 1 addition & 0 deletions plugins/android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,6 @@ tasks.named<Task>("publishPlugins") {
":config:publishPlugins",
":deps:publishPlugins",
":kmp:publishPlugins",
":jvm:publishPlugins",
)
}
6 changes: 3 additions & 3 deletions plugins/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ plugins {

// Shared Plugin Portal metadata for all subprojects (F-016 / GH #132).
// Subprojects call formaPublishedPlugin(name = …) instead of copying gradlePlugin blocks.
// Local testing: -PformaLocalVersion=0.1.3-LOCAL (mavenLocal only; never use for Portal)
// Local testing: -PformaLocalVersion=0.2.0-LOCAL (mavenLocal only; never use for Portal)
val publishedVersion =
(findProperty("formaLocalVersion") as String?)?.takeIf { it.isNotBlank() } ?: "0.1.3"
(findProperty("formaLocalVersion") as String?)?.takeIf { it.isNotBlank() } ?: "0.2.0"

formaPluginConfiguration {
group = "tools.forma"
Expand All @@ -32,7 +32,7 @@ registerFormaAggregateCoverageReport()
* without includeBuild / Plugin Portal credentials.
*
* ./gradlew publishAllToMavenLocal
* ./gradlew publishAllToMavenLocal -PformaLocalVersion=0.1.3-LOCAL
* ./gradlew publishAllToMavenLocal -PformaLocalVersion=0.2.0-LOCAL
*/
tasks.register("publishAllToMavenLocal") {
group = "publishing"
Expand Down
6 changes: 3 additions & 3 deletions scripts/publish-local.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
#
# Usage:
# ./scripts/publish-local.sh
# ./scripts/publish-local.sh 0.1.3-LOCAL # version override (recommended for experiments)
# ./scripts/publish-local.sh 0.2.0-LOCAL # version override (recommended for experiments)
#
# Then consume from another project WITHOUT includeBuild:
# pluginManagement {
# repositories { mavenLocal(); google(); mavenCentral(); gradlePluginPortal() }
# }
# plugins { id("tools.forma.android") version "0.1.3-LOCAL" }
# plugins { id("tools.forma.android") version "0.2.0-LOCAL" }
#
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
Expand All @@ -27,7 +27,7 @@ echo "=== publishAllToMavenLocal ${VERSION_ARG:+(version $VERSION_ARG)} ==="
./gradlew publishAllToMavenLocal "${EXTRA[@]}" --console=plain

# Resolve version used
VER="${VERSION_ARG:-0.1.3}"
VER="${VERSION_ARG:-0.2.0}"
echo
echo "=== installed under ~/.m2 (tools/forma) ==="
find "${HOME}/.m2/repository/tools/forma" -maxdepth 3 -type d 2>/dev/null | head -40 || true
Expand Down
Loading