Frontmatter
| id | 8456 |
| title | Automate Release Workflow with Git Squash & Local-First Strategy |
| state | Closed |
| labels | enhancementaibuild |
| assignees | tobiu |
| createdAt | Jan 9, 2026, 11:09 AM |
| updatedAt | Jan 9, 2026, 11:17 AM |
| githubUrl | https://github.com/neomjs/neo/issues/8456 |
| author | tobiu |
| commentsCount | 2 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Jan 9, 2026, 11:17 AM |
Automate Release Workflow with Git Squash & Local-First Strategy

tobiu
Jan 9, 2026, 11:12 AM
Input from Gemini 3 Pro:
✦ Refinement: After running
buildScripts/prepareRelease.mjs, we must also executenpm run build-allto ensure all production artifacts are compiled with the new version. This step should be added to the 'Prepare (Dev)' phase.
tobiu assigned to @tobiu on Jan 9, 2026, 11:16 AM

tobiu
Jan 9, 2026, 11:16 AM
Input from Gemini 3 Pro:
✦ Implemented the
buildScripts/publishRelease.mjsscript to automate the local-first release workflow.Key Changes:
- Exposed
GH_SyncService: Modifiedai/services.mjsto export the sync service, enabling the release script to trigger ticket archiving programmatically.- Created Release Script:
buildScripts/publishRelease.mjsnow handles:
- Pre-flight Checks: Verifies branch (
dev), auth, and release notes.- Preparation: Runs
prepareRelease.mjsandnpm run build-all.- Atomic History: Squashes
devchanges intomainfor a clean release history.- Release Creation: Uses
gh release createwith local artifacts.- Post-Release Sync: Automatically archives closed tickets to
resources/content/issue-archive/vX.Y.Z/and commits the changes.The workflow is now fully automated and ensures
releases.jsonand ticket archives are synchronized with the published package.
tobiu closed this issue on Jan 9, 2026, 11:17 AM
To streamline the release process, ensure
releases.jsonis accurate, and automate the "Squash to Main" pattern, we will create a comprehensive release script.Context:
devbranch.mainbranch is used solely for an atomic squash commit of the release cycle.releases.jsonmust be up-to-date in the published package.1. Expose Sync Service Modify
ai/services.mjsto exportGH_SyncService(mapping toai/mcp/server/github-workflow/services/SyncService.mjs) to enable scriptable syncs.2. Create
buildScripts/publishRelease.mjsThis script will automate the following workflow:Pre-flight Checks:
dev.ghCLI is authenticated.resources/content/release-notes/vX.Y.Z.mdexists.Prepare (Dev):
buildScripts/prepareRelease.mjs(updates version, SEO,releases.json).dev(Message: "Release vX.Y.Z").dev.Squash to Main (Atomic History):
main.git merge --squash dev.devversion).main.main.Finalize Notes (Dev):
dev.maincommit hash to the local release notes (e.g., "Atomic Changelog: [Hash]").dev.Release (GitHub):
gh release create vX.Y.Z --target dev --title "vX.Y.Z" --notes-file resources/content/release-notes/vX.Y.Z.md.npm-publishAction (fromdev).Post-Release Cleanup:
GH_SyncService.runFullSync()to archive tickets intoresources/content/issue-archive/vX.Y.Z/.dev.