This document outlines the standard operating procedure for cutting and deploying a new release (or Release Candidate) of the Anahata ASI platform.
The release process is a hybrid "Tiki-Taka" flow: preparation is executed locally within the IDE or container, while the heavy lifting of compilation, signing, and distribution is handled autonomously by GitHub Actions.
To maintain a fast development cadence on cutting-edge features while providing absolute stability for enterprise users, Anahata uses a parallel branch layout:
-
main(Bleeding Edge):- This is our primary integration branch.
- All forward-looking features and capability expansions are developed and merged here.
- The moment an official release or Release Candidate is cut,
mainPOM versions must be immediately bumped to the next minor snapshot (e.g.,<version>1.1.0-SNAPSHOT</version>).
-
support-X.Y(Long-Term Support Branches):- When an official release is tagged (e.g.,
v1.0.0-rc1orv1.0.0), a dedicated, permanent support branch is spawned from that tag:git checkout -b support-1.0 v1.0.0 git push origin support-1.0
- Hotfix protocol: Any critical bug fixes, security patches, or platform-compatibility adjustments (e.g., producing
1.0.1) are committed directly tosupport-1.0. - Regression Prevention: Once a hotfix is deployed, it must be surgically ported back to
mainusinggit cherry-pick <commit-hash>to ensure the cutting-edge version inherits the stability patch.
- When an official release is tagged (e.g.,
Anahata strictly follows Semantic Versioning 2.0.0 (SemVer) and the custom sorting rules of Maven's ComparableVersion analyzer:
-
The Gold Standard Qualifier:
- Pre-release versions must use lowercase qualifiers and a single-hyphen separator:
1.0.0-rc1(Release Candidate 1). - Do not use uppercase
RC-1or dotless shorthand1.0.0rc1. Standardizing on1.0.0-rc1guarantees that Maven, Sonatype, and external package managers parse, sort, and compare versions with 100% mathematical precision.
- Pre-release versions must use lowercase qualifiers and a single-hyphen separator:
-
Snapshot vs. Stable Isolation:
- Local development must always use snapshots (e.g.,
1.0.0-SNAPSHOT). - Never deploy raw SNAPSHOT versions to Sonatype Central. Keep snapshot builds strictly confined to local Maven repositories (
~/.m2/repository) during hot-testing.
- Local development must always use snapshots (e.g.,
All local release preparation—pre-flight compilation checks, symmetrical SemVer bumping, tagging, and post-release snapshot transitions—is fully automated via the root release.sh script.
For normal releases, execute the script from the root folder without arguments:
./release.sh- Step-by-Step Flow:
- Prudence Check: Verifies that your git status is 100% clean.
- Version Capture: Prompts you interactively for the
TARGET RELEASEversion (e.g.,1.0.0) and theNEXT DEVELOPMENTsnapshot version (e.g.,1.1.0-SNAPSHOT). - Local Pre-flight: Runs
mvn clean installlocally to guarantee zero compiler alerts before pushing. - Symmetrical Promotion: Uses the versions plugin to set all 13 modules to the release version.
- Git Tagging: Automatically commits the release and cuts the annotated tag (e.g.,
v1.0.0). - Post-Release Transition: Bumps the parent and submodules to the development snapshot, commits, and exits.
If you are on a support branch (e.g., support-1.0) and need to cut a hotfix (e.g., 1.0.1) and advance the branch's development cycle to the next maintenance snapshot (e.g., 1.0.2-SNAPSHOT), the script supports direct command-line arguments, completely bypassing the interactive prompts:
./release.sh 1.0.1 1.0.2-SNAPSHOTThis enables headless, programmatic releases across any support branch or automated runner!
To complete the transaction and unleash the automated cloud pipelines, execute:
git push origin main --tags(On support branches, push your support branch instead, e.g., git push origin support-1.0 --tags)
The moment your push hits GitHub, the automation runner triggers hands-free orchestration:
-
Artifact Deployment (
deploy-artifacts.yml):- Kicks off automatically on the tag pattern
v*. - Provisions an Ubuntu cloud runner with JDK 25 and dependencies.
- Compiles the multi-module project and runs all test suites.
- Digitally signs the compiled JARs, POMs, and NetBeans
.nbmfiles using your configured GPG keys. - Deploys the signed artifacts directly to Sonatype Central Portal using the
central-publishing-maven-plugin.
- Kicks off automatically on the tag pattern
-
Standalone App Bundles (
standalone-release.yml):- Triggered in parallel by the tag push.
- Deploys on multi-platform runners (Ubuntu, macOS, Windows) and utilizes
jpackageto package the standalone ASI Desktop application into native installers (.zipand.tar.gz). - Uploads the native binaries and the NetBeans
.nbmfile directly to a beautifully formatted, centralized release page corresponding to your tag.
-
Dynamic Portal Documentation (
deploy-website.yml):- Aggregates Javadocs across all active modules.
- Syncs documentation to
https://asi.anahata.uno/apidocs/\${project.version}/apidocs/index.html. - Dynamically triggers search engine crawl updates by updating the
sitemap.xml.
The Apache NetBeans Plugin Portal administers updates via a developer-triggered synchronization process. It does not blindly auto-publish versions from Maven Central.
- Maven Central Publishing: Compile and deploy the version to Maven Central first.
- Sync Manifest: Log into the NetBeans Plugin Portal, navigate to My Plugins -> Anahata ASI, and click the 🔄 "Sync with source manifest" button. This programmatically pulls the latest coordinate metadata (e.g.,
1.0.0-rc1or1.0.0) from the Central repository.
Warning
PRESERVE VOLUNTEER SANITY Because NetBeans requires manual human verification for each validated release, we gate our verification requests strictly by milestone:
- For Release Candidates (
-rc*): We manually trigger "Sync with source manifest" so the RC is registered and accessible for power-users, but we do NOT request verification. This keeps the RC visible but leaves the volunteers' queue untouched. - For Stable GA (
1.0.0): Once the stable version is synced, we click "Request Verification" to get the green "NB 30 - Verified" badge. - Prune Minor Iterations: Accumulate minor bug fixes locally; never request verification for transient micro-versions.
To cleanly migrate the existing 3,200 active V1 users (anahata-netbeans-ai) to the V2 platform:
- Ensure the V2 (
anahata-asi-nb) framework is fully published, synced, and approved in the NetBeans Plugin Portal. - Build a final, minor update for the V1 plugin and mark it as compatible with NetBeans 30.
- This V1 patch will serve a prominent, high-salience notice inside the IDE components, highlighting V2's incredible capabilities (the CwGC, AST refiners, native side-by-side Diffs, and stand-alone desktop runtime) and direct them to download the V2 client at
https://asi.anahata.uno.
-
Prune Stale Snapshots (via GitHub CLI): Ensure your release pages remain uncluttered. Use the official GitHub CLI (
gh) over SSH to remove obsolete artifacts:gh release delete-asset -R anahata-os/anahata-asi latest-snapshot <stale-filename> -y
-
Wait for Sonatype Indexing: Allow 5 to 10 minutes for Sonatype Central to index and distribute the artifacts.
-
Verify the Website: Check
https://asi.anahata.uno/desktop.htmlto confirm that the navigation and dynamic javascript is successfully fetching and rewriting the direct download URLs to point to your new release candidate!
During the V2 launch on May 30, 2026, we encountered a series of directory layout collisions regarding the multi-version Javadocs. Here is the official chronological log and final architectural alignment:
- The Problem: We had two independent, parallel workflows (
deploy-artifacts.ymlandstandalone-release.yml) both triggering on pushes tomainand release tags, and both uploading files to the samelatest-snapshotrelease on GitHub. - The Concurrency Collision: Because both workflows ran in parallel and executed full, non-targeted release purges before uploading their files, whichever runner finished last completely wiped out and overwrote the binaries uploaded by the other!
- The Unified Atomic Solution: We completely merged
standalone-release.ymlintodeploy-artifacts.yml, organizing them into three clean, sequential jobs:build-nbm(JDK compilation and Maven Central snapshot/release deployment),build-desktop(three parallel cross-platform matrix builders for native desktop packages), andrelease(which waits for both compilation jobs to finish, runs exactly one global purge of old snapshots, and uploads all 4 binaries together in a single, safe, atomic transaction). - Result: 50% fewer workflow files to maintain, absolute immunity to parallel pipeline race conditions, and a beautifully stable, rolling release page serving the latest snapshots with 100% accuracy.
- Attempt 1 (Local Clean-up): Wiped the remote
gh-pagesroot and generated flat1.0.0and1.1.0-SNAPSHOTJavadocs. - Attempt 2 (Cloud Overwrite): The user committed and pushed
mainbranch. This triggered the parallelDeploy Website & Javadoccloud build. Because the runner checked out the oldgh-pagesstate before our cleanup push had registered, and because its YAML script lacked flattening logic, it over-wrote the remote branch, resulting in a nested1.0.0/apidocs/path and 404s. - Attempt 3 (The Trailing Slash cp-r Flood): We added flattening logic in Step 3 of
deploy-website.yml, but left the trailing slash wildcard (temp-gh-pages/apidocs/*/) in Step 2. GNUcpinterpreted this trailing slash as a command to copy the contents of1.0.0directly into the root, overwriting the beautiful version selectorindex.htmland corrupting the styles. - Attempt 4 (The Maven Javadoc aggregate Constraint): We attempted to output Javadocs flatly to
docs/apidocs/${project.version}using<destDir>${project.version}</destDir>. However, we discovered thatjavadoc:aggregatecompletely ignores the<destDir>parameter by design. It always outputs directly to<outputDirectory>(natively appending/apidocs), which resulted inapidocs/apidocsnesting in the cloud.
- The Paradigm Shift: Instead of fighting the native, un-overridable behavior of the Maven Javadoc plugin using complex, dirty bash loops and directory-flattening hacks inside
deploy-website.yml, we aligned our landing page links to match Maven's out-of-the-box output. - The Path Alignment: Configured
<outputDirectory>docs/apidocs/${project.version}</outputDirectory>insidepom.xml. The Javadoc plugin naturally outputs versioned docs todocs/apidocs/${project.version}/apidocs/index.html. - The Link Alignment: Updated the Python generator script and
apidocs/index.htmlto natively link to{v}/apidocs/index.htmlinstead of{v}/index.html. - Result: 100% standard, clean, zero-friction, and permanently immune to nesting or formatting bugs across both stable and snapshot releases.