Skip to content

Releases: DisplaceTech/ext-template

v0.1.0 — the scaffold, extracted

12 Jun 17:03
f973198

Choose a tag to compare

The shared scaffold for Displace PHP extensions (Rust + ext-php-rs), extracted from ext-infer and ext-whisper after hand-mirroring it one time too many. All three shipping extensions (ext-infer, ext-turbovec, ext-whisper) descend from this template as of v0.1.0.

Two trees, two lifecycles

  • template/managed/ — Makefile, build.rs, about.toml/hbs, rust-toolchain.toml, and the CI / binary-release / docs workflows. Owned by the template; re-rendered into extensions by bin/sync. Never hand-edited downstream.
  • template/seed/ — Cargo.toml, composer.json, .cargo/, src + docs skeletons, PLAN/RELEASE. Rendered once by bin/render, then owned by the extension. A freshly rendered skeleton compiles, loads into PHP, and passes its PHPT immediately.

Per-repo variance is config, not forks: each extension's .ext-template.conf carries its name, namespace, docs host, apt/brew deps, and any codegen flags shipped binaries must keep (ext-turbovec's -C target-cpu=x86-64-v3).

Version bumps cascade

template/versions.conf is the single source of truth for the Rust channel (1.89 — the floor set by turbovec's AVX-512BW target_feature), the declared MSRV, and the crate pins every extension shares (ext-php-rs, thiserror). Bump once, bin/sync each extension, review, push. CI includes a cascade test.

Already battle-tested

Before this tag the template propagated four real fixes: turbovec's run-tests.php auto-fetch became canon, the cargo-about license-manifest release job reached every repo, make test became hermetic against PIE-installed copies of the extension under test, and the 2026-06-12 setup-php/macos-14 breakage — diagnosed with this repo's macOS probe workflow — was pinned away across five repos with one template commit.

Mechanics

Two shellcheck-clean POSIX sh scripts and sed. Placeholders are uppercase {{LIKE_THIS}}, deliberately disjoint from GitHub Actions' ${{ ... }} expressions; rendering hard-fails if any placeholder survives. No cargo-generate, no cookiecutter, no runtime to install.

Deliberately out of scope: syncing seed files (extensions legitimately diverge — destroying that variance is how monorepos are born), template-engine dependencies, Windows.