From 1aadb967aa62fbafa8bccbe6a585f14d6050e1c3 Mon Sep 17 00:00:00 2001 From: Richie Caputo Date: Thu, 2 Apr 2026 10:38:08 -0400 Subject: [PATCH 1/3] chore(release): sweep version references to 0.1.0 Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/plans/snazzy-kindling-sparrow.md | 177 ++++++++++++++++ README.md | 4 +- example-scalajs/build.mill | 2 +- example-scalajs/mill | 199 ++++++++++++++++++ example-typescript/build.mill | 2 +- examples/build.mill | 2 +- .../resources/scalajs-bundle/build.mill | 2 +- .../resources/scalajs-bunfig/build.mill | 2 +- .../resources/scalajs-simple/build.mill | 2 +- .../resources/scalajs-test/build.mill | 2 +- .../resources/scalajs-transitive/build.mill | 2 +- .../resources/typescript-browser/build.mill | 2 +- .../resources/typescript-bundle/build.mill | 2 +- .../resources/typescript-bunfig/build.mill | 2 +- .../resources/typescript-compile/build.mill | 2 +- .../resources/typescript-env/build.mill | 2 +- .../resources/typescript-simple/build.mill | 2 +- .../resources/typescript-test-deps/build.mill | 2 +- .../resources/typescript-tests/build.mill | 2 +- .../resources/typescript-tsx/build.mill | 2 +- .../resources/typescript-workers/build.mill | 2 +- 21 files changed, 396 insertions(+), 20 deletions(-) create mode 100644 .claude/plans/snazzy-kindling-sparrow.md create mode 100755 example-scalajs/mill diff --git a/.claude/plans/snazzy-kindling-sparrow.md b/.claude/plans/snazzy-kindling-sparrow.md new file mode 100644 index 0000000..16b4bb8 --- /dev/null +++ b/.claude/plans/snazzy-kindling-sparrow.md @@ -0,0 +1,177 @@ +# mill-bun-plugin: Production-Ready Plan + +## Context + +The mill-bun-plugin is a scaffold that adds Bun-backed workflows (install, run, bundle, test) to Mill's Scala.js and TypeScript modules. It compiles but has never been verified end-to-end. The goal is to make it production-ready: fix bugs, add tests, set up CI, and prepare for publishing under `com.tjclp`. + +All Mill 1.1.5 APIs have been verified compatible with the current source. + +--- + +## Phase 1: Build Infrastructure + +### 1a. Create `.mill-version` +- New file containing `1.1.5` + +### 1b. Update `build.mill` +- `millVersion` → `"1.1.5"` +- `organization` → `"com.tjclp"` +- `url` → `"https://github.com/tjc-lp/mill-bun-plugin"` +- `versionControl` → `VersionControl.github("tjc-lp", "mill-bun-plugin")` +- `developers` → TJC-LP placeholder +- Try removing explicit `upickle:4.3.2` dep (ujson comes transitively from `mill-libs`) +- Add integration test module (see Phase 4) + +### 1c. Update example headers +- Both `example-scalajs/build.mill` and `example-typescript/build.mill`: `mill-version: 1.1.0` → `1.1.5`, artifact coordinates → `com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT` + +### 1d. Verify compilation +- Run `./mill millbun.compile` + +**Files**: `.mill-version` (new), `build.mill`, `example-scalajs/build.mill`, `example-typescript/build.mill` + +--- + +## Phase 2: Code Correctness + +### 2a. Extract shared code into `BunToolchainModule` + +Move duplicated members from both `BunScalaJSModule` and `BunTypeScriptModule` into `BunToolchainModule`: +- `splitDep` → companion `object BunToolchainModule` (makes it unit-testable) +- `bunLockfiles` task +- `bunFrozenLockfile` task +- `bunLinker` task +- `bunInstallArgs` task + +### 2b. Fix `runBun` return type +- Change from `Unit` to `os.CommandResult` (remove trailing `()`) + +### 2c. Fix `BunTypeScriptTests.npmInstall` +Current code installs into `outer.npmInstall().path` which overwrites the outer module's install. Fix: install into `Task.dest` so the test module gets its own isolated install directory. + +### 2d. Remove redundant `ensureLinkedWorkspace` calls +`bunBundle`, `bunBundleFast`, and `bunCompileExecutable` all call `ensureLinkedWorkspace` after `fullLinkJS()`/`fastLinkJS()` which already calls it. Remove the redundant calls. + +### 2e. Fix `shallowMerge` in BunTypeScriptModule +`shallowMerge` is only used once; inline it since we're already simplifying. + +**Files**: `src/mill/bun/BunToolchainModule.scala`, `src/mill/scalajslib/bun/BunScalaJSModule.scala`, `src/mill/javascriptlib/bun/BunTypeScriptModule.scala` + +--- + +## Phase 3: Repository Setup + +### 3a. Initialize git repo +```sh +git init +``` + +### 3b. Create `.gitignore` +``` +out/ +.bsp/ +.idea/ +.metals/ +.vscode/ +.bloop/ +node_modules/ +.DS_Store +``` + +### 3c. Create `LICENSE` (MIT) + +### 3d. Initial commit + +**Files**: `.gitignore` (new), `LICENSE` (new) + +--- + +## Phase 4: Integration Tests + +### 4a. Restructure `build.mill` test modules + +Replace the existing `object test` with: + +```scala +object test extends ScalaTests with TestModule.Utest { + // Unit tests for pure logic (splitDep, etc.) +} + +object integration extends ScalaTests with TestModule.Utest { + // IntegrationTester-based end-to-end tests + // Env: MILL_EXECUTABLE_PATH, MILL_TEST_RESOURCE_DIR +} +``` + +### 4b. Create test fixture projects + +Minimal Mill projects under `millbun/integration/resources/`: + +| Fixture | What it tests | +|---------|--------------| +| `scalajs-simple/` | `fastLinkJS`, `run` via Bun | +| `scalajs-bundle/` | `bunInstall` + `bunBundle` with npm dep | +| `typescript-simple/` | `compile` + `run` via Bun | +| `typescript-bundle/` | `bundle` via `bun build` | + +Each fixture has a `build.mill` + minimal source file. + +### 4c. Write integration tests + +- `BunScalaJSIntegrationTests.scala` — tests `fastLinkJS`, `bunInstall`, `bunBundle` +- `BunTypeScriptIntegrationTests.scala` — tests `compile`, `run`, `bundle` + +### 4d. Write unit tests + +- `SplitDepTests.scala` — tests `BunToolchainModule.splitDep` for simple deps, scoped deps, no-version, latest tag + +**New files**: +- `millbun/test/src/mill/bun/SplitDepTests.scala` +- `millbun/integration/src/mill/bun/BunScalaJSIntegrationTests.scala` +- `millbun/integration/src/mill/bun/BunTypeScriptIntegrationTests.scala` +- `millbun/integration/resources/scalajs-simple/{build.mill, src/Main.scala}` +- `millbun/integration/resources/scalajs-bundle/{build.mill, src/Main.scala}` +- `millbun/integration/resources/typescript-simple/{build.mill, src/main.ts}` +- `millbun/integration/resources/typescript-bundle/{build.mill, src/main.ts}` + +--- + +## Phase 5: CI + +### 5a. Create `.github/workflows/ci.yml` + +- Triggers: push to main, PRs +- Matrix: ubuntu-latest + macos-latest +- Steps: checkout, setup-java (temurin 11), setup-bun, compile, unit test, integration test + +**New file**: `.github/workflows/ci.yml` + +--- + +## Phase 6: Documentation + +### 6a. Rewrite `README.md` +- Remove "MVP/scaffold/not production-ready" language +- Add: quick start, configuration reference table, requirements (Mill 1.1.5+, Bun 1.2+, JDK 11+) +- Link to examples + +**File**: `README.md` + +--- + +## Phase 7: Verification + +1. `./mill millbun.compile` — plugin compiles +2. `./mill millbun.test` — unit tests pass +3. `./mill millbun.integration` — integration tests pass (requires Bun on PATH) +4. Manually run example projects to validate end-to-end + +--- + +## Key Architectural Decisions + +- **Mill 1.1.5** target (latest stable 1.x) +- **IntegrationTester** for tests — spawns real Mill processes against fixture projects +- **`splitDep` on companion object** — enables unit testing without Mill machinery +- **Shared defaults in `BunToolchainModule`** — eliminates duplication, single override point +- **`BunTypeScriptTests` gets its own install dir** — prevents contaminating outer module's cached install diff --git a/README.md b/README.md index 58840dc..e3120f9 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Keeps Mill's task graph, module structure, caching, Scala.js linker integration, //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build @@ -47,7 +47,7 @@ object app extends BunScalaJSModule { //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/example-scalajs/build.mill b/example-scalajs/build.mill index aadaeff..fdd3f23 100644 --- a/example-scalajs/build.mill +++ b/example-scalajs/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/example-scalajs/mill b/example-scalajs/mill new file mode 100755 index 0000000..155baa7 --- /dev/null +++ b/example-scalajs/mill @@ -0,0 +1,199 @@ +#!/usr/bin/env sh + +set -e + +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.5"; fi + +if [ -z "${GITHUB_RELEASE_CDN}" ] ; then GITHUB_RELEASE_CDN=""; fi + +if [ -z "$MILL_MAIN_CLI" ] ; then MILL_MAIN_CLI="${0}"; fi + +MILL_REPO_URL="https://github.com/com-lihaoyi/mill" + +MILL_BUILD_SCRIPT="" + +if [ -f "build.mill" ] ; then + MILL_BUILD_SCRIPT="build.mill" +elif [ -f "build.mill.scala" ] ; then + MILL_BUILD_SCRIPT="build.mill.scala" +elif [ -f "build.sc" ] ; then + MILL_BUILD_SCRIPT="build.sc" +fi + +# `s/.*://`: +# This is a greedy match that removes everything from the beginning of the line up to (and including) the last +# colon (:). This effectively isolates the value part of the declaration. +# +# `s/#.*//`: +# This removes any comments at the end of the line. +# +# `s/['\"]//g`: +# This removes all single and double quotes from the string, wherever they appear (g is for "global"). +# +# `s/^[[:space:]]*//; s/[[:space:]]*$//`: +# These two expressions trim any leading or trailing whitespace ([[:space:]] matches spaces and tabs). +TRIM_VALUE_SED="s/.*://; s/#.*//; s/['\"]//g; s/^[[:space:]]*//; s/[[:space:]]*$//" + +if [ -z "${MILL_VERSION}" ] ; then + if [ -f ".mill-version" ] ; then + MILL_VERSION="$(tr '\r' '\n' < .mill-version | head -n 1 2> /dev/null)" + elif [ -f ".config/mill-version" ] ; then + MILL_VERSION="$(tr '\r' '\n' < .config/mill-version | head -n 1 2> /dev/null)" + elif [ -f "build.mill.yaml" ] ; then + MILL_VERSION="$(grep -E "mill-version:" "build.mill.yaml" | sed -E "$TRIM_VALUE_SED")" + elif [ -n "${MILL_BUILD_SCRIPT}" ] ; then + MILL_VERSION="$(grep -E "//\|.*mill-version" "${MILL_BUILD_SCRIPT}" | sed -E "$TRIM_VALUE_SED")" + fi +fi + +if [ -z "${MILL_VERSION}" ] ; then MILL_VERSION="${DEFAULT_MILL_VERSION}"; fi + +MILL_USER_CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/mill" + +if [ -z "${MILL_FINAL_DOWNLOAD_FOLDER}" ] ; then MILL_FINAL_DOWNLOAD_FOLDER="${MILL_USER_CACHE_DIR}/download"; fi + +MILL_NATIVE_SUFFIX="-native" +MILL_JVM_SUFFIX="-jvm" +ARTIFACT_SUFFIX="" + +# Check if GLIBC version is at least the required version +# Returns 0 (true) if GLIBC >= required version, 1 (false) otherwise +check_glibc_version() { + required_version="2.39" + required_major=$(echo "$required_version" | cut -d. -f1) + required_minor=$(echo "$required_version" | cut -d. -f2) + # Get GLIBC version from ldd --version (first line contains version like "ldd (GNU libc) 2.31") + glibc_version=$(ldd --version 2>/dev/null | head -n 1 | grep -oE '[0-9]+\.[0-9]+$' || echo "") + if [ -z "$glibc_version" ]; then + # If we can't determine GLIBC version, assume it's too old + return 1 + fi + glibc_major=$(echo "$glibc_version" | cut -d. -f1) + glibc_minor=$(echo "$glibc_version" | cut -d. -f2) + if [ "$glibc_major" -gt "$required_major" ]; then + return 0 + elif [ "$glibc_major" -eq "$required_major" ] && [ "$glibc_minor" -ge "$required_minor" ]; then + return 0 + else + return 1 + fi +} + +set_artifact_suffix() { + if [ "$(uname -s 2>/dev/null | cut -c 1-5)" = "Linux" ]; then + # Native binaries require new enough GLIBC; fall back to JVM launcher if older + if ! check_glibc_version; then + return + fi + if [ "$(uname -m)" = "aarch64" ]; then ARTIFACT_SUFFIX="-native-linux-aarch64" + else ARTIFACT_SUFFIX="-native-linux-amd64"; fi + elif [ "$(uname)" = "Darwin" ]; then + if [ "$(uname -m)" = "arm64" ]; then ARTIFACT_SUFFIX="-native-mac-aarch64" + else ARTIFACT_SUFFIX="-native-mac-amd64"; fi + else + echo "This native mill launcher supports only Linux and macOS." 1>&2 + exit 1 + fi +} + +case "$MILL_VERSION" in + *"$MILL_NATIVE_SUFFIX") + MILL_VERSION=${MILL_VERSION%"$MILL_NATIVE_SUFFIX"} + set_artifact_suffix + ;; + + *"$MILL_JVM_SUFFIX") + MILL_VERSION=${MILL_VERSION%"$MILL_JVM_SUFFIX"} + ;; + + *) + case "$MILL_VERSION" in + 0.1.* | 0.2.* | 0.3.* | 0.4.* | 0.5.* | 0.6.* | 0.7.* | 0.8.* | 0.9.* | 0.10.* | 0.11.* | 0.12.*) + ;; + *) + set_artifact_suffix + ;; + esac + ;; +esac + +MILL="${MILL_FINAL_DOWNLOAD_FOLDER}/$MILL_VERSION$ARTIFACT_SUFFIX" + +# If not already downloaded, download it +if [ ! -s "${MILL}" ] || [ "$MILL_TEST_DRY_RUN_LAUNCHER_SCRIPT" = "1" ] ; then + case $MILL_VERSION in + 0.0.* | 0.1.* | 0.2.* | 0.3.* | 0.4.*) + MILL_DOWNLOAD_SUFFIX="" + MILL_DOWNLOAD_FROM_MAVEN=0 + ;; + 0.5.* | 0.6.* | 0.7.* | 0.8.* | 0.9.* | 0.10.* | 0.11.0-M*) + MILL_DOWNLOAD_SUFFIX="-assembly" + MILL_DOWNLOAD_FROM_MAVEN=0 + ;; + *) + MILL_DOWNLOAD_SUFFIX="-assembly" + MILL_DOWNLOAD_FROM_MAVEN=1 + ;; + esac + case $MILL_VERSION in + 0.12.0 | 0.12.1 | 0.12.2 | 0.12.3 | 0.12.4 | 0.12.5 | 0.12.6 | 0.12.7 | 0.12.8 | 0.12.9 | 0.12.10 | 0.12.11) + MILL_DOWNLOAD_EXT="jar" + ;; + 0.12.*) + MILL_DOWNLOAD_EXT="exe" + ;; + 0.*) + MILL_DOWNLOAD_EXT="jar" + ;; + *) + MILL_DOWNLOAD_EXT="exe" + ;; + esac + + MILL_TEMP_DOWNLOAD_FILE="${MILL_OUTPUT_DIR:-out}/mill-temp-download" + mkdir -p "$(dirname "${MILL_TEMP_DOWNLOAD_FILE}")" + + if [ "$MILL_DOWNLOAD_FROM_MAVEN" = "1" ] ; then + MILL_DOWNLOAD_URL="https://repo1.maven.org/maven2/com/lihaoyi/mill-dist${ARTIFACT_SUFFIX}/${MILL_VERSION}/mill-dist${ARTIFACT_SUFFIX}-${MILL_VERSION}.${MILL_DOWNLOAD_EXT}" + else + MILL_VERSION_TAG=$(echo "$MILL_VERSION" | sed -E 's/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/') + MILL_DOWNLOAD_URL="${GITHUB_RELEASE_CDN}${MILL_REPO_URL}/releases/download/${MILL_VERSION_TAG}/${MILL_VERSION}${MILL_DOWNLOAD_SUFFIX}" + unset MILL_VERSION_TAG + fi + + + if [ "$MILL_TEST_DRY_RUN_LAUNCHER_SCRIPT" = "1" ] ; then + echo "$MILL_DOWNLOAD_URL" + echo "$MILL" + exit 0 + fi + + echo "Downloading mill ${MILL_VERSION} from ${MILL_DOWNLOAD_URL} ..." 1>&2 + curl -f -L -o "${MILL_TEMP_DOWNLOAD_FILE}" "${MILL_DOWNLOAD_URL}" + + chmod +x "${MILL_TEMP_DOWNLOAD_FILE}" + + mkdir -p "${MILL_FINAL_DOWNLOAD_FOLDER}" + mv "${MILL_TEMP_DOWNLOAD_FILE}" "${MILL}" + + unset MILL_TEMP_DOWNLOAD_FILE + unset MILL_DOWNLOAD_SUFFIX +fi + +MILL_FIRST_ARG="" +if [ "$1" = "--bsp" ] || [ "${1#"-i"}" != "$1" ] || [ "$1" = "--interactive" ] || [ "$1" = "--no-server" ] || [ "$1" = "--no-daemon" ] || [ "$1" = "--help" ] ; then + # Need to preserve the first position of those listed options + MILL_FIRST_ARG=$1 + shift +fi + +unset MILL_FINAL_DOWNLOAD_FOLDER +unset MILL_OLD_DOWNLOAD_PATH +unset OLD_MILL +unset MILL_VERSION +unset MILL_REPO_URL + +# -D mill.main.cli is for compatibility with Mill 0.10.9 - 0.13.0-M2 +# We don't quote MILL_FIRST_ARG on purpose, so we can expand the empty value without quotes +# shellcheck disable=SC2086 +exec "${MILL}" $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@" diff --git a/example-typescript/build.mill b/example-typescript/build.mill index 95c5803..2d3d205 100644 --- a/example-typescript/build.mill +++ b/example-typescript/build.mill @@ -1,6 +1,6 @@ //| mill-version: 1.1.5 //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/examples/build.mill b/examples/build.mill index fbb3ce0..168bc43 100644 --- a/examples/build.mill +++ b/examples/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/scalajs-bundle/build.mill b/millbun/integration/resources/scalajs-bundle/build.mill index ecf1f23..f995ac0 100644 --- a/millbun/integration/resources/scalajs-bundle/build.mill +++ b/millbun/integration/resources/scalajs-bundle/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/scalajs-bunfig/build.mill b/millbun/integration/resources/scalajs-bunfig/build.mill index 0084ae5..b068acf 100644 --- a/millbun/integration/resources/scalajs-bunfig/build.mill +++ b/millbun/integration/resources/scalajs-bunfig/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/scalajs-simple/build.mill b/millbun/integration/resources/scalajs-simple/build.mill index bf26863..d8c04e5 100644 --- a/millbun/integration/resources/scalajs-simple/build.mill +++ b/millbun/integration/resources/scalajs-simple/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/scalajs-test/build.mill b/millbun/integration/resources/scalajs-test/build.mill index 83dd9ea..57a167b 100644 --- a/millbun/integration/resources/scalajs-test/build.mill +++ b/millbun/integration/resources/scalajs-test/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/scalajs-transitive/build.mill b/millbun/integration/resources/scalajs-transitive/build.mill index 650f39e..dc2e30f 100644 --- a/millbun/integration/resources/scalajs-transitive/build.mill +++ b/millbun/integration/resources/scalajs-transitive/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-browser/build.mill b/millbun/integration/resources/typescript-browser/build.mill index 60e41ab..3c65aae 100644 --- a/millbun/integration/resources/typescript-browser/build.mill +++ b/millbun/integration/resources/typescript-browser/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-bundle/build.mill b/millbun/integration/resources/typescript-bundle/build.mill index 2695240..9f83023 100644 --- a/millbun/integration/resources/typescript-bundle/build.mill +++ b/millbun/integration/resources/typescript-bundle/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-bunfig/build.mill b/millbun/integration/resources/typescript-bunfig/build.mill index 5f29a6e..76243e2 100644 --- a/millbun/integration/resources/typescript-bunfig/build.mill +++ b/millbun/integration/resources/typescript-bunfig/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-compile/build.mill b/millbun/integration/resources/typescript-compile/build.mill index a85f403..abec642 100644 --- a/millbun/integration/resources/typescript-compile/build.mill +++ b/millbun/integration/resources/typescript-compile/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-env/build.mill b/millbun/integration/resources/typescript-env/build.mill index 4623df5..5bb8a6c 100644 --- a/millbun/integration/resources/typescript-env/build.mill +++ b/millbun/integration/resources/typescript-env/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-simple/build.mill b/millbun/integration/resources/typescript-simple/build.mill index 16c4dfc..36c209a 100644 --- a/millbun/integration/resources/typescript-simple/build.mill +++ b/millbun/integration/resources/typescript-simple/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-test-deps/build.mill b/millbun/integration/resources/typescript-test-deps/build.mill index f4d234e..51249ec 100644 --- a/millbun/integration/resources/typescript-test-deps/build.mill +++ b/millbun/integration/resources/typescript-test-deps/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-tests/build.mill b/millbun/integration/resources/typescript-tests/build.mill index 6ba4542..fb84433 100644 --- a/millbun/integration/resources/typescript-tests/build.mill +++ b/millbun/integration/resources/typescript-tests/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-tsx/build.mill b/millbun/integration/resources/typescript-tsx/build.mill index 4dd7555..a424720 100644 --- a/millbun/integration/resources/typescript-tsx/build.mill +++ b/millbun/integration/resources/typescript-tsx/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build diff --git a/millbun/integration/resources/typescript-workers/build.mill b/millbun/integration/resources/typescript-workers/build.mill index a2fb45a..4bba01b 100644 --- a/millbun/integration/resources/typescript-workers/build.mill +++ b/millbun/integration/resources/typescript-workers/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT +//| - com.tjclp::mill-bun_mill1:0.1.0 package build From cda45be9545ff2de4ecec34dae62d05b42c32748 Mon Sep 17 00:00:00 2001 From: Richie Caputo Date: Thu, 2 Apr 2026 10:39:08 -0400 Subject: [PATCH 2/3] Remove accidentally committed plan file Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/plans/snazzy-kindling-sparrow.md | 177 ----------------------- .gitignore | 1 + 2 files changed, 1 insertion(+), 177 deletions(-) delete mode 100644 .claude/plans/snazzy-kindling-sparrow.md diff --git a/.claude/plans/snazzy-kindling-sparrow.md b/.claude/plans/snazzy-kindling-sparrow.md deleted file mode 100644 index 16b4bb8..0000000 --- a/.claude/plans/snazzy-kindling-sparrow.md +++ /dev/null @@ -1,177 +0,0 @@ -# mill-bun-plugin: Production-Ready Plan - -## Context - -The mill-bun-plugin is a scaffold that adds Bun-backed workflows (install, run, bundle, test) to Mill's Scala.js and TypeScript modules. It compiles but has never been verified end-to-end. The goal is to make it production-ready: fix bugs, add tests, set up CI, and prepare for publishing under `com.tjclp`. - -All Mill 1.1.5 APIs have been verified compatible with the current source. - ---- - -## Phase 1: Build Infrastructure - -### 1a. Create `.mill-version` -- New file containing `1.1.5` - -### 1b. Update `build.mill` -- `millVersion` → `"1.1.5"` -- `organization` → `"com.tjclp"` -- `url` → `"https://github.com/tjc-lp/mill-bun-plugin"` -- `versionControl` → `VersionControl.github("tjc-lp", "mill-bun-plugin")` -- `developers` → TJC-LP placeholder -- Try removing explicit `upickle:4.3.2` dep (ujson comes transitively from `mill-libs`) -- Add integration test module (see Phase 4) - -### 1c. Update example headers -- Both `example-scalajs/build.mill` and `example-typescript/build.mill`: `mill-version: 1.1.0` → `1.1.5`, artifact coordinates → `com.tjclp::mill-bun_mill1:0.1.0-SNAPSHOT` - -### 1d. Verify compilation -- Run `./mill millbun.compile` - -**Files**: `.mill-version` (new), `build.mill`, `example-scalajs/build.mill`, `example-typescript/build.mill` - ---- - -## Phase 2: Code Correctness - -### 2a. Extract shared code into `BunToolchainModule` - -Move duplicated members from both `BunScalaJSModule` and `BunTypeScriptModule` into `BunToolchainModule`: -- `splitDep` → companion `object BunToolchainModule` (makes it unit-testable) -- `bunLockfiles` task -- `bunFrozenLockfile` task -- `bunLinker` task -- `bunInstallArgs` task - -### 2b. Fix `runBun` return type -- Change from `Unit` to `os.CommandResult` (remove trailing `()`) - -### 2c. Fix `BunTypeScriptTests.npmInstall` -Current code installs into `outer.npmInstall().path` which overwrites the outer module's install. Fix: install into `Task.dest` so the test module gets its own isolated install directory. - -### 2d. Remove redundant `ensureLinkedWorkspace` calls -`bunBundle`, `bunBundleFast`, and `bunCompileExecutable` all call `ensureLinkedWorkspace` after `fullLinkJS()`/`fastLinkJS()` which already calls it. Remove the redundant calls. - -### 2e. Fix `shallowMerge` in BunTypeScriptModule -`shallowMerge` is only used once; inline it since we're already simplifying. - -**Files**: `src/mill/bun/BunToolchainModule.scala`, `src/mill/scalajslib/bun/BunScalaJSModule.scala`, `src/mill/javascriptlib/bun/BunTypeScriptModule.scala` - ---- - -## Phase 3: Repository Setup - -### 3a. Initialize git repo -```sh -git init -``` - -### 3b. Create `.gitignore` -``` -out/ -.bsp/ -.idea/ -.metals/ -.vscode/ -.bloop/ -node_modules/ -.DS_Store -``` - -### 3c. Create `LICENSE` (MIT) - -### 3d. Initial commit - -**Files**: `.gitignore` (new), `LICENSE` (new) - ---- - -## Phase 4: Integration Tests - -### 4a. Restructure `build.mill` test modules - -Replace the existing `object test` with: - -```scala -object test extends ScalaTests with TestModule.Utest { - // Unit tests for pure logic (splitDep, etc.) -} - -object integration extends ScalaTests with TestModule.Utest { - // IntegrationTester-based end-to-end tests - // Env: MILL_EXECUTABLE_PATH, MILL_TEST_RESOURCE_DIR -} -``` - -### 4b. Create test fixture projects - -Minimal Mill projects under `millbun/integration/resources/`: - -| Fixture | What it tests | -|---------|--------------| -| `scalajs-simple/` | `fastLinkJS`, `run` via Bun | -| `scalajs-bundle/` | `bunInstall` + `bunBundle` with npm dep | -| `typescript-simple/` | `compile` + `run` via Bun | -| `typescript-bundle/` | `bundle` via `bun build` | - -Each fixture has a `build.mill` + minimal source file. - -### 4c. Write integration tests - -- `BunScalaJSIntegrationTests.scala` — tests `fastLinkJS`, `bunInstall`, `bunBundle` -- `BunTypeScriptIntegrationTests.scala` — tests `compile`, `run`, `bundle` - -### 4d. Write unit tests - -- `SplitDepTests.scala` — tests `BunToolchainModule.splitDep` for simple deps, scoped deps, no-version, latest tag - -**New files**: -- `millbun/test/src/mill/bun/SplitDepTests.scala` -- `millbun/integration/src/mill/bun/BunScalaJSIntegrationTests.scala` -- `millbun/integration/src/mill/bun/BunTypeScriptIntegrationTests.scala` -- `millbun/integration/resources/scalajs-simple/{build.mill, src/Main.scala}` -- `millbun/integration/resources/scalajs-bundle/{build.mill, src/Main.scala}` -- `millbun/integration/resources/typescript-simple/{build.mill, src/main.ts}` -- `millbun/integration/resources/typescript-bundle/{build.mill, src/main.ts}` - ---- - -## Phase 5: CI - -### 5a. Create `.github/workflows/ci.yml` - -- Triggers: push to main, PRs -- Matrix: ubuntu-latest + macos-latest -- Steps: checkout, setup-java (temurin 11), setup-bun, compile, unit test, integration test - -**New file**: `.github/workflows/ci.yml` - ---- - -## Phase 6: Documentation - -### 6a. Rewrite `README.md` -- Remove "MVP/scaffold/not production-ready" language -- Add: quick start, configuration reference table, requirements (Mill 1.1.5+, Bun 1.2+, JDK 11+) -- Link to examples - -**File**: `README.md` - ---- - -## Phase 7: Verification - -1. `./mill millbun.compile` — plugin compiles -2. `./mill millbun.test` — unit tests pass -3. `./mill millbun.integration` — integration tests pass (requires Bun on PATH) -4. Manually run example projects to validate end-to-end - ---- - -## Key Architectural Decisions - -- **Mill 1.1.5** target (latest stable 1.x) -- **IntegrationTester** for tests — spawns real Mill processes against fixture projects -- **`splitDep` on companion object** — enables unit testing without Mill machinery -- **Shared defaults in `BunToolchainModule`** — eliminates duplication, single override point -- **`BunTypeScriptTests` gets its own install dir** — prevents contaminating outer module's cached install diff --git a/.gitignore b/.gitignore index 3a41212..4c94026 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ out/ node_modules/ .DS_Store .mill-jvm-version +.claude/plans/ From adbb6683eeaeec6f8c890863edd82462997528bb Mon Sep 17 00:00:00 2001 From: Richie Caputo Date: Thu, 2 Apr 2026 10:46:56 -0400 Subject: [PATCH 3/3] Use 0.0.0-NIGHTLY for local/CI builds, decouple from release versions Integration test resources now use a fixed 0.0.0-NIGHTLY version that resolves against publishLocalTestRepo. Release versions are injected only via PUBLISH_VERSION env var during tag-triggered releases. Co-Authored-By: Claude Opus 4.6 (1M context) --- build.mill | 2 +- docs/RELEASING.md | 4 ++-- millbun/integration/resources/scalajs-bundle/build.mill | 2 +- millbun/integration/resources/scalajs-bunfig/build.mill | 2 +- millbun/integration/resources/scalajs-simple/build.mill | 2 +- millbun/integration/resources/scalajs-test/build.mill | 2 +- millbun/integration/resources/scalajs-transitive/build.mill | 2 +- millbun/integration/resources/typescript-browser/build.mill | 2 +- millbun/integration/resources/typescript-bundle/build.mill | 2 +- millbun/integration/resources/typescript-bunfig/build.mill | 2 +- millbun/integration/resources/typescript-compile/build.mill | 2 +- millbun/integration/resources/typescript-env/build.mill | 2 +- millbun/integration/resources/typescript-simple/build.mill | 2 +- millbun/integration/resources/typescript-test-deps/build.mill | 2 +- millbun/integration/resources/typescript-tests/build.mill | 2 +- millbun/integration/resources/typescript-tsx/build.mill | 2 +- millbun/integration/resources/typescript-workers/build.mill | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/build.mill b/build.mill index 5696ff0..ddef9a2 100644 --- a/build.mill +++ b/build.mill @@ -51,7 +51,7 @@ object millbun extends ScalaModule, PublishModule { // CI injects release versions via PUBLISH_VERSION; local builds stay on SNAPSHOT. def publishVersion: T[String] = Task { - Task.env.getOrElse("PUBLISH_VERSION", "0.1.0-SNAPSHOT") + Task.env.getOrElse("PUBLISH_VERSION", "0.0.0-NIGHTLY") } def pomSettings = PomSettings( description = "Bun-backed Mill plugin for Scala.js and TypeScript workflows", diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 29e4c57..dcb5a5c 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -39,12 +39,12 @@ Before tagging a release: Update these locations before cutting the release tag: -- `build.mill` - `README.md` - `example-typescript/build.mill` - `example-scalajs/build.mill` - `examples/build.mill` -- `millbun/integration/resources/**/build.mill` + +Do **not** sweep `millbun/integration/resources/**/build.mill` — those use a fixed `0.0.0-NIGHTLY` version that resolves against the locally published artifact (via `publishLocalTestRepo`), not Maven Central. After the release is published, bump `main` to the next snapshot version when new development starts. diff --git a/millbun/integration/resources/scalajs-bundle/build.mill b/millbun/integration/resources/scalajs-bundle/build.mill index f995ac0..a8f5e59 100644 --- a/millbun/integration/resources/scalajs-bundle/build.mill +++ b/millbun/integration/resources/scalajs-bundle/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/scalajs-bunfig/build.mill b/millbun/integration/resources/scalajs-bunfig/build.mill index b068acf..eef2273 100644 --- a/millbun/integration/resources/scalajs-bunfig/build.mill +++ b/millbun/integration/resources/scalajs-bunfig/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/scalajs-simple/build.mill b/millbun/integration/resources/scalajs-simple/build.mill index d8c04e5..c494138 100644 --- a/millbun/integration/resources/scalajs-simple/build.mill +++ b/millbun/integration/resources/scalajs-simple/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/scalajs-test/build.mill b/millbun/integration/resources/scalajs-test/build.mill index 57a167b..bf40d38 100644 --- a/millbun/integration/resources/scalajs-test/build.mill +++ b/millbun/integration/resources/scalajs-test/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/scalajs-transitive/build.mill b/millbun/integration/resources/scalajs-transitive/build.mill index dc2e30f..a64a9a4 100644 --- a/millbun/integration/resources/scalajs-transitive/build.mill +++ b/millbun/integration/resources/scalajs-transitive/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-browser/build.mill b/millbun/integration/resources/typescript-browser/build.mill index 3c65aae..b14146b 100644 --- a/millbun/integration/resources/typescript-browser/build.mill +++ b/millbun/integration/resources/typescript-browser/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-bundle/build.mill b/millbun/integration/resources/typescript-bundle/build.mill index 9f83023..02c1ede 100644 --- a/millbun/integration/resources/typescript-bundle/build.mill +++ b/millbun/integration/resources/typescript-bundle/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-bunfig/build.mill b/millbun/integration/resources/typescript-bunfig/build.mill index 76243e2..3edc3c7 100644 --- a/millbun/integration/resources/typescript-bunfig/build.mill +++ b/millbun/integration/resources/typescript-bunfig/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-compile/build.mill b/millbun/integration/resources/typescript-compile/build.mill index abec642..8fa780e 100644 --- a/millbun/integration/resources/typescript-compile/build.mill +++ b/millbun/integration/resources/typescript-compile/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-env/build.mill b/millbun/integration/resources/typescript-env/build.mill index 5bb8a6c..b1d1228 100644 --- a/millbun/integration/resources/typescript-env/build.mill +++ b/millbun/integration/resources/typescript-env/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-simple/build.mill b/millbun/integration/resources/typescript-simple/build.mill index 36c209a..e714a76 100644 --- a/millbun/integration/resources/typescript-simple/build.mill +++ b/millbun/integration/resources/typescript-simple/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-test-deps/build.mill b/millbun/integration/resources/typescript-test-deps/build.mill index 51249ec..cd619a0 100644 --- a/millbun/integration/resources/typescript-test-deps/build.mill +++ b/millbun/integration/resources/typescript-test-deps/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-tests/build.mill b/millbun/integration/resources/typescript-tests/build.mill index fb84433..3504a2a 100644 --- a/millbun/integration/resources/typescript-tests/build.mill +++ b/millbun/integration/resources/typescript-tests/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-tsx/build.mill b/millbun/integration/resources/typescript-tsx/build.mill index a424720..c9710be 100644 --- a/millbun/integration/resources/typescript-tsx/build.mill +++ b/millbun/integration/resources/typescript-tsx/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build diff --git a/millbun/integration/resources/typescript-workers/build.mill b/millbun/integration/resources/typescript-workers/build.mill index 4bba01b..50724d0 100644 --- a/millbun/integration/resources/typescript-workers/build.mill +++ b/millbun/integration/resources/typescript-workers/build.mill @@ -1,7 +1,7 @@ //| mill-version: 1.1.5 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.1.0 +//| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY package build