feat!: deterministic bindings via @juspay/rescript-bindgen + 1:1 versioning#74
Merged
Conversation
…ioning Replace the LLM-based binding generator (@juspay/neurolink + LiteLLM) with a direct, deterministic call to the @juspay/rescript-bindgen CLI. Same blend version now produces byte-identical bindings, with no secrets or network model calls. - scripts/generate.mjs: thin wrapper around the rescript-bindgen CLI (--pkg/--out/--project/--webapi/--report/--clean); formats output, writes src/_REPORT.md, fails if any component is broken. Removes generate-bindings.mjs, bindings-instructions.md, known-errors.md. - package.json: drop @juspay/neurolink, dotenv, undici, semantic-release + @semantic-release/* and the release block; add @juspay/rescript-bindgen; move @juspay/blend-design-system to a peer dependency; version -> 0.0.36 (1:1). - src/: regenerated wholesale against blend 0.0.36 (94/94 usable, 0 broken). - workflows: sync-bindings polls npm daily for new stable blend + manual dispatch, deterministic regen, 1:1 version, no LLM secrets; release publishes the package.json version (skip-if-published), no semantic-release; ci drops the dead .failed.res gate; delete release-mirror. - docs: README/CONTRIBUTING/PROJECT_UNDERSTANDING/GITHUB_WORKFLOWS/CHANGELOG and PR/issue templates updated for the deterministic flow + 1:1 versioning. BREAKING CHANGE: binding surface changes (record-props + shared *Types modules); version scheme switches to 1:1 with @juspay/blend-design-system. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5 tasks
Convenience/transparency escape hatch that shells the @juspay/rescript-bindgen CLI directly (binds the locally-pinned blend via --node-modules/--no-install, no network). Unlike `npm run generate` it skips formatting and the broken gate. Documented in CONTRIBUTING.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Addresses review of #74: - release.yml: gate each registry against its OWN published state (npm and GitHub Packages independently) so a failure on one no longer permanently skips the other on later runs. - release.yml: tag AFTER a successful npm publish and tolerate an existing tag, removing the idempotency trap where a pushed tag broke all re-runs. - release.yml: standardize actions to checkout@v6 / setup-node@v6 (match ci.yml). - generate.mjs: when the target version equals the installed blend, bind offline via --node-modules/--no-install (parity with generate:raw; no needless network). - sync-bindings.yml: drop redundant src/_REPORT.md from add-paths (covered by src/**). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jun 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replaces the LLM-based binding generator (
@juspay/neurolink+ LiteLLM,kimi-latest) with a direct, deterministic call to the@juspay/rescript-bindgenCLI. Same blend version → byte-identical bindings, no secrets, no network model calls. Also switches to 1:1 versioning with@juspay/blend-design-system.This is the one-time migration PR (regenerated
src/against blend0.0.36). New blend releases are picked up automatically afterwards.What changed
scripts/generate.mjs— thin wrapper that runs the bindgen CLI directly (--pkg/--out/--project/--webapi/--report/--clean), formats output, writessrc/_REPORT.md, and fails if any component is broken. Removesgenerate-bindings.mjs,bindings-instructions.md,known-errors.md.package.json— drops@juspay/neurolink,dotenv,undici,semantic-release+@semantic-release/*and thereleaseblock; adds@juspay/rescript-bindgen; moves@juspay/blend-design-systemto a peer dependency;version → 0.0.36(1:1).src/— regenerated wholesale: 153.resfiles, 94/94 usable, 0 broken (1 loose: DataTable's 3 generic props (ColumnDefinition<T>[],keyof T,(keyof T)[]) widened tostringwith inline// ⚪ loosemarkers).sync-bindings.yml: daily npm poll for new stable blend + manual dispatch, deterministic regen, 1:1 version, no LLM secrets.release.yml: publishes thepackage.jsonversion (skip-if-already-published), no semantic-release.ci.yml: drops the dead.failed.resgate. Deletesrelease-mirror.yml.Verified locally
npm run build✅ (280 modules) ·npm run format:check✅npm run generateruns produce byte-identicalsrc/npm packclean (158 files,.res+ config only)Version goes 1.0.2 → 0.0.36 (1:1 with blend). On publish, npm moves the
latestdist-tag down to0.0.36; existing consumers on a^1.0.0range stay on1.0.2and won't auto-upgrade. Considernpm deprecate-ing the1.xline after the first publish.Binding surface changes (record-props + shared
*Types/CommonTypes/HtmlAttrsmodules). A separate juspay-portal branch must update call sites; coordinate after merge.🤖 Generated with Claude Code