diff --git a/README.md b/README.md index 23b1e336..51ab5880 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/TICKETS.md b/TICKETS.md index 1c7c1ac9..5eb47e13 100644 --- a/TICKETS.md +++ b/TICKETS.md @@ -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) @@ -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** diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 91af0dbc..591f6375 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -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`**. ``` ┌────────────┐ @@ -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). diff --git a/docs/GETTING-STARTED.md b/docs/GETTING-STARTED.md index b8a6c684..f1498512 100644 --- a/docs/GETTING-STARTED.md +++ b/docs/GETTING-STARTED.md @@ -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` @@ -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*). diff --git a/docs/JVM-GETTING-STARTED.md b/docs/JVM-GETTING-STARTED.md index cc235259..fc45921d 100644 --- a/docs/JVM-GETTING-STARTED.md +++ b/docs/JVM-GETTING-STARTED.md @@ -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` @@ -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*). diff --git a/docs/JVM-TARGETS.md b/docs/JVM-TARGETS.md index 151bc793..7c97f9ea 100644 --- a/docs/JVM-TARGETS.md +++ b/docs/JVM-TARGETS.md @@ -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 } diff --git a/docs/PLUGIN-PUBLISH.md b/docs/PLUGIN-PUBLISH.md index 5c8f7a12..153c413e 100644 --- a/docs/PLUGIN-PUBLISH.md +++ b/docs/PLUGIN-PUBLISH.md @@ -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) @@ -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. @@ -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" @@ -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/`: @@ -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 @@ -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" } ``` @@ -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" } ``` diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 2ef4f925..ebc84986 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -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//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) diff --git a/plugins/android/build.gradle.kts b/plugins/android/build.gradle.kts index 59ec9c9f..4134f604 100644 --- a/plugins/android/build.gradle.kts +++ b/plugins/android/build.gradle.kts @@ -46,5 +46,6 @@ tasks.named("publishPlugins") { ":config:publishPlugins", ":deps:publishPlugins", ":kmp:publishPlugins", + ":jvm:publishPlugins", ) } diff --git a/plugins/build.gradle.kts b/plugins/build.gradle.kts index 303b8d7c..8e0c550a 100644 --- a/plugins/build.gradle.kts +++ b/plugins/build.gradle.kts @@ -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" @@ -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" diff --git a/scripts/publish-local.sh b/scripts/publish-local.sh index 6b1e3c98..2449db28 100644 --- a/scripts/publish-local.sh +++ b/scripts/publish-local.sh @@ -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)" @@ -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