[Rust] 0.20.0
Added
- Changeset-style fragment format with frontmatter for specifying version bump type
- New
get-bump-type.mjsscript to automatically determine version bump from fragments - Automatic version bumping on merge to main based on changelog fragments
- Detailed documentation for the changelog fragment system in
changelog.d/README.md
Changed
- Updated
collect-changelog.mjsto strip frontmatter when collecting fragments - Updated
version-and-commit.mjsto handle frontmatter in fragments - Enhanced release workflow to automatically determine bump type from changesets
Changed
- Add
detect-changesjob with cross-platformdetect-code-changes.mjsscript - Make lint job independent of changelog check (runs based on file changes only)
- Allow docs-only PRs without changelog fragment requirement
- Handle changelog check 'skipped' state in dependent jobs
- Exclude
changelog.d/,docs/,experiments/,examples/folders and markdown files from code changes detection
Fixed
- Fixed README.md to correctly reference Node.js scripts (
.mjs) instead of Python scripts (.py) - Updated project structure in README.md to match actual script files in
scripts/directory - Fixed example code in README.md that had invalid Rust with two
mainfunctions
Added
- Added crates.io publishing support to CI/CD workflow
- Added
release_modeinput with "instant" and "changelog-pr" options for manual releases - Added
--tag-prefixand--crates-io-urloptions to create-github-release.mjs script - Added comprehensive case study documentation for Issue #11 in docs/case-studies/issue-11/
Changed
- Changed changelog fragment check from warning to error (exit 1) to enforce changelog requirements
- Updated job conditions with
always() && !cancelled()to fix workflow_dispatch job skipping issue - Renamed manual-release job to "Instant Release" for clarity
Fixed
- Fixed deprecated
::set-outputGitHub Actions command in version-and-commit.mjs - Fixed workflow_dispatch triggering issues where lint/build/release jobs were incorrectly skipped
Fixed
- Fixed changelog fragment check to validate that a fragment is added in the PR diff rather than just checking if any fragments exist in the directory. This prevents the check from incorrectly passing when there are leftover fragments from previous PRs that haven't been released yet.
Changed
- Converted shell scripts in
release.ymlto cross-platform.mjsscripts for improved portability and performance:check-changelog-fragment.mjs- validates changelog fragment is added in PR diffgit-config.mjs- configures git user for CI/CDcheck-release-needed.mjs- checks if release is neededpublish-crate.mjs- publishes package to crates.iocreate-changelog-fragment.mjs- creates changelog fragments for manual releasesget-version.mjs- gets current version from Cargo.toml
Added
- Added
check-version-modification.mjsscript to detect manual version changes in Cargo.toml - Added
version-checkjob to CI/CD workflow that runs on pull requests - Added skip logic for automated release branches (changelog-manual-release-, changeset-release/, release/, automated-release/)
Changed
- Version modifications in Cargo.toml are now blocked in pull requests to enforce automated release pipeline
Added
- Added support for
CARGO_REGISTRY_TOKENas alternative toCARGO_TOKENfor crates.io publishing - Added case study documentation for Issue #17 (yargs reserved word and dual token support)
Changed
- Updated workflow to use fallback logic:
${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} - Improved publish-crate.mjs to check both
CARGO_REGISTRY_TOKENandCARGO_TOKENenvironment variables - Added warning message when neither token is set
Added
- New
scripts/rust-paths.mjsutility for automatic Rust package root detection - Support for both single-language and multi-language repository structures in all CI/CD scripts
- Configuration options via
--rust-rootCLI argument andRUST_ROOTenvironment variable - Comprehensive case study documentation in
docs/case-studies/issue-19/
Changed
- Updated all release scripts to use the new path detection utility:
scripts/bump-version.mjsscripts/check-release-needed.mjsscripts/collect-changelog.mjsscripts/get-bump-type.mjsscripts/get-version.mjsscripts/publish-crate.mjsscripts/version-and-commit.mjs
Changed
- check-release-needed.mjs: Now checks crates.io API directly instead of git tags to determine if a version is already released. This prevents false positives where git tags exist but the package was never actually published to crates.io.
Added
-
CI/CD Troubleshooting Guide: New documentation at
docs/ci-cd/troubleshooting.mdcovering common issues like skipped jobs, false positive version checks, publishing failures, and secret configuration. -
Enhanced Error Handling in publish-crate.mjs: Added specific detection and helpful error messages for authentication failures, including guidance on secret configuration and workflow setup.
-
Case Study Documentation: Added comprehensive case study at
docs/case-studies/issue-21/analyzing CI/CD failures from browser-commander repository (issues #27, #29, #31, #33) with timeline, root causes, and lessons learned.
Fixed
- Prevent False Positive Version Checks: The release workflow now correctly identifies unpublished versions by checking crates.io instead of relying on git tags, which can exist without the package being published.
Changed
- Translated all CI/CD scripts from JavaScript (.mjs) to Rust (.rs) using rust-script
- Scripts now use native Rust with rust-script for execution in shell
- Removed Node.js dependency from CI/CD pipeline
- Updated GitHub Actions workflow to use rust-script instead of node
- Updated README and CONTRIBUTING documentation with new script references
Added
- Cache
restore-keysfor partial cache hits across all workflow jobs - Explicit
tokenparameter in checkout for release jobs - Code coverage job with
cargo-llvm-covand Codecov integration - Codecov badge in README.md
- Pre-release version support (e.g.,
0.1.0-beta.1) in version parsing --release-labelparameter for multi-language release disambiguationensure_version_exceeds_published()logic to prevent publishing duplicate versionsget_max_published_version()to query highest non-yanked version from crates.iomax_published_versionoutput from check-release-needed for downstream use- Version fallback logic in auto-release Create GitHub Release step
Changed
- Updated
actions/checkoutfrom v4 to v6 - Updated
actions/cachefrom v4 to v5 - Updated
peter-evans/create-pull-requestfrom v7 to v8 - Made
publish-crate.rsfail (exit 1) when version already exists on crates.io - Improved
create-github-release.rsto check combined stdout+stderr and detect "Validation Failed"
Fixed
- Fix publish steps overriding workflow-level CARGO_TOKEN fallback, breaking CARGO_REGISTRY_TOKEN-only configurations (#32)
- Fix non-fast-forward push failures in multi-workflow repos by adding fetch/rebase and push retry logic (#31)
- Add mono-repo path support to check-changelog-fragment.rs, check-version-modification.rs, and create-changelog-fragment.rs
- Add
!cancelled()guard to test job condition to respect workflow cancellation
Fixed
- Fixed
version-and-commit.rsto check crates.io instead of git tags for determining if a version is already released - This prevents the release pipeline from getting stuck when git tags exist without corresponding crates.io publication
Added
- Added
--tag-prefixsupport toversion-and-commit.rsfor multi-language repository compatibility - Added crates.io and docs.rs badges to README.md
- Added automatic crates.io and docs.rs badge injection in GitHub release notes
- Added documentation deployment job to CI/CD pipeline (deploys to GitHub Pages after release)
- Added case study documentation for issue #25
Fixed
- Fixed unsupported look-ahead regex in
create-github-release.rsthat caused a panic when parsing CHANGELOG.md. Replaced with a two-step approach using only features supported by Rust'sregexcrate.
Changed
- Restructured example application as a simple CLI sum calculator using
lino-arguments - Renamed default package to
example-sum-package-namewith Unlicense license - Reorganized test structure:
tests/unit/sum.rs,tests/integration/sum.rs,tests/unit/ci-cd/ - Converted experiment scripts into proper unit tests in
tests/unit/ci-cd/changelog_parsing.rs - Added CI/CD skip logic for template default package name
example-sum-package-name - Updated README.md badges and documentation
Fixed
- Change detection script now uses per-commit diff instead of full PR diff, so commits touching only non-code files correctly skip CI jobs even when earlier commits in the same PR changed code files
Fixed
- Make release scripts resolve the publishable crate manifest when the repository root uses a Cargo workspace manifest.
Fixed
- Decoupled GitHub Pages documentation deployment from package release publication and fixed release-script warning failures under
RUSTFLAGS=-Dwarnings.
Changed
- Added explicit GitHub Actions job timeouts and documented Rust test timeout guidance.
Fixed
- Added a non-blocking warning threshold to the Rust file-size check so near-limit files are surfaced before concurrent PR merges can exceed the hard limit.
Fixed
- Made
create-github-release.rsbuild GitHub release titles as[Language] X.Y.Zinstead of reusing the tag prefix.
Added
- Added optional Docker Hub image publishing tied to Rust crate releases, including crates.io visibility waiting, version/latest image tags, and Docker Hub badges in GitHub release notes.
Changed
- Release completeness checks now self-heal when crates.io exists but configured Docker Hub or GitHub release artifacts are missing.
Fixed
- Switched documentation deployment to the official GitHub Pages artifact workflow so repositories using GitHub Actions as their Pages source do not get false-positive branch-push deploys.
Added
- Documented the one-time
Settings → Pages → Source = GitHub Actionsprerequisite for thedeploy-docsjob inREADME.mdand as a comment above thedeploy-docsjob inrelease.yml, so downstream template users hit a documented setup step instead of aGet Pages site failederror on the first deploy.
Added
- Tracking case study at
docs/case-studies/issue-52/registering thebrowser-commander+ Playwright preview-regeneration pattern fromkonard/vk-bot-desktop#52, with an activation checklist for when an example-app surface lands in this template. Documentation only — no workflow, script, or runtime code changes. Primary upstream tracking issue:link-foundation/js-ai-driven-development-pipeline-template#62.
Fixed
- Release automation now keeps the workspace package entry in
Cargo.locksynchronized whenscripts/version-and-commit.rsbumpsCargo.toml, preventing stale lock-file version diffs in later pull requests.
Fixed
scripts/publish-crate.rsnow treats crates.io HTTP 429 throttle responses ("You have published too many versions of this crate in the last 24 hours") as a deferredpublish_result=rate_limitedoutcome (it writes the output, prints an explanatory banner and exits successfully) instead of a hard CI failure reported as a genericfailed("Failed to publish for unknown reason"). Authentication, already-published and unknown failures still exit non-zero. Failed-publish classification is consolidated through a singleclassify_failurefunction andFailureKindenum (with anis_deferredpredicate), covered by unit tests runnable viarust-script --test scripts/publish-crate.rs.- The release workflow (
.github/workflows/release.yml) now gates crate-availability waiting, Docker Hub publishing and GitHub release creation on either an already-published crate orpublish_result=success, so a deferred (rate-limited) crate upload no longer produces partial downstream release artifacts and the same version is retried automatically on the next push tomain.
Fixed
- Fixed reversed
cancel-in-progressconcurrency condition inrelease.ymlthat cancelled in-flight releases onmainand never superseded older PR runs. The condition now uses!=somainreleases run to completion while newer PR pushes cancel stale runs.
Added
- Added a
scripts/check-crate-size.rsguard that builds the.cratearchive and fails the release before publishing when it exceeds the crates.io 10 MiB upload limit. The check runs in the build job and before publishing in both the auto-release and manual-release jobs.
Changed
- Added a narrow
includeallowlist toCargo.tomlso docs, case studies, generated CI artifacts, changelog fragments, scripts, and experiments no longer inflate the published release archive.
Fixed
- Prevented GitHub release creation from treating generic API validation failures as existing releases, and capped oversized release notes with a link to the full tagged changelog.
Added
- Added the initial
meta-languagelinks-network core with self-description roots,
verification, trivia attachment configuration, and a minimal CLI. - Added the default lossless
parseentry point, projection views, and a
tested parity roadmap for competitor features, grammar embedding, and language
coverage targets. - Added exact reconstruction, mixed-region detection, query matching,
substitution rules, concept reconstruction, object identity helpers,
many-valued truth values, and executable parity fixtures for every tracked
competitor target. - Added executable language fixtures and tests for every requested Markdown,
HTML, top-ten programming-language, and top-ten natural-language target.
Fixed
- Added a CI guard that rejects Rust test modules and test attributes under
src/, keeping tests in thetests/tree.
Minor Changes
- Add immutable and mutable network snapshots with provenance and forward
version commits for roadmap snapshot/versioning coverage.
Added
- Added
txtas a first-class markup/container target with a UTF-8 lossless
fixture and content-sniffing fallback regions.