chore(release): bump version to 0.15.0 and rebuild dist - #183
Conversation
First release since 0.14.0, carrying three additions that complete the natural-feature pipeline: the bfmatcher brute-force Hamming matcher with match_t (#133), the closed-form planar pose_estimator (#83), and orb.ic_angle, the keypoint orientation step (#96). Those three are also what makes this release necessary rather than routine. dist/ and types/ are only rebuilt at release time, so the artifacts committed on dev still carried the 0.14.0 build and contained none of them. Anything consuming jsfeatNext from a git ref - the pre-release testing route, and the CvBackend adapter now being written against this library - was silently getting the old bundle. Rebuilding here is what closes that gap. Also picks up the two dependabot bumps merged since: vite 8.2.2 (the build tool, so it produced these artifacts) and actions/upload-artifact v7. The lockfile was regenerated with npm 11 per AGENTS.md; an npm 10 install omits other-platform optional binaries and breaks npm ci in CI. Verified: 305 tests, typecheck, prettier and the license-header check all green, and the rebuilt bundle carries VERSION 0.15.0 plus all three new modules.
PR Summary by QodoRelease 0.15.0 with rebuilt bundles and type declarations
AI Description
Diagram
High-Level Assessment
Files changed (11)
|
Code Review by Qodo
1.
|
…ange Adding the module-scope u_max table in #182 inserted it between the orb class's JSDoc block and the class declaration, which orphaned the comment: TSDoc binds a block to the declaration immediately following it, and that was now u_max, which carries its own. The effect reached the published artifacts. The ORB description was absent from types/src/orb/orb.d.ts entirely, so editors showed nothing on hover and TypeDoc would have rendered the class undocumented - and 0.15.0 was about to ship that. Moving u_max above the class doc restores the binding. Swept every other exported class in types/ for the same pattern; orb was the only one affected. Also drops a {@link u_max} from the ic_angle docs. u_max is module-private and not exported, so the link had no resolvable target. Reported by the Qodo review on #183.
The section was generated before the docs commit landed, so CHANGELOG.md and the release notes the tag workflow generates would have disagreed. Both derive from the same conventional commits; regenerating keeps them in sync.
…the new types Three findings from the Qodo review on #183, all of which would otherwise ship in 0.15.0. bfmatcher silently corrupted matches on mismatched widths. match() and knnMatch() derived one stride from query.cols and used it to address BOTH matrices, so a train set of a different width was read at offsets computed from the query. The reads walk across train row boundaries and, past the end, an out-of-range Int32Array index yields undefined, which XOR coerces to 0. Nothing threw: the matcher returned a full set of confident, meaningless Hamming distances. The existing check only verified each width was a multiple of 4 and never compared the two. A new pairWords() validates the pair in one place for both methods. The new public types were unreachable. src/index.ts re-exports the data structures so consumers can annotate without deep paths, but match_t/IMatch_T and pose_t/IPose_T were never added, and the exports map only exposes the root and package.json - so deep imports cannot compensate. There was no way for a consumer to name those types at all. This is not hypothetical: the CvBackend adapter being written against this library needs both. pose_estimator allocated its B scratch every call. An estimator is built once and reused across frames, so at 30-60 fps that was a fresh array per frame; it is now an instance field. The review suggested the shared cache instead, which is the wrong tool here - that pool is for image-sized buffers, and balancing a get/put across the degenerate early return to save 72 bytes costs more in bookkeeping than it saves. Two further findings in the same review - that pose_estimator must extend core and must not require `new` - are rejected. It is a stateful class constructed with a K, so it belongs with matrix_t and keypoint_t rather than the stateless algorithm singletons, and its static intrinsics() factory depends on the class itself sitting on the namespace. AGENTS.md listed the constructor classes without mentioning it, which is what invited the misreading, so it now says so explicitly. Tests cover the new guard on both methods, that the message names both widths, and a reproduction of the wrong distances the old stride produced.
Merges dev and regenerates dist/ and types/, so the published artifacts carry
the correctness fixes rather than the build made before them:
- bfmatcher now rejects mismatched descriptor row widths instead of reading
train rows at a query-derived stride and returning silently wrong Hamming
distances
- match_t/IMatch_T and pose_t/IPose_T are reachable from the package root,
which they were not - with the exports map limited to the root, consumers
had no way to name the types of two of the modules this release exists to
publish
- pose_estimator no longer allocates its B scratch per frame
Also refreshes the 0.15.0 changelog section to cover those commits, keeping
CHANGELOG.md in agreement with the notes the tag workflow generates.
…ange Adding the module-scope u_max table in #182 inserted it between the orb class's JSDoc block and the class declaration, which orphaned the comment: TSDoc binds a block to the declaration immediately following it, and that was now u_max, which carries its own. The effect reached the published artifacts. The ORB description was absent from types/src/orb/orb.d.ts entirely, so editors showed nothing on hover and TypeDoc would have rendered the class undocumented - and 0.15.0 was about to ship that. Moving u_max above the class doc restores the binding. Swept every other exported class in types/ for the same pattern; orb was the only one affected. Also drops a {@link u_max} from the ic_angle docs. u_max is module-private and not exported, so the link had no resolvable target. Reported by the Qodo review on #183.
Phase A of the release runbook for 0.15.0 (MAINTAINERS.md). Version bump, regenerated lockfile, rebuilt
dist//types/, and the git-cliff changelog section.Why this release matters beyond the version number
dist/andtypes/are only rebuilt at release time, so the artifacts committed ondevwere still the 0.14.0 build. They contained none of the three modules merged since:distbfmatcher+match_tpose_estimatororb.ic_angleAnything consuming jsfeatNext from a git ref was therefore getting the old bundle with no warning — including the pre-release testing route, and the
CvBackendadapter now being written against this library over inwebarkit/webarkit. That adapter is blocked until these artifacts ship, which is what makes this release a prerequisite rather than routine housekeeping.Contents
Features since 0.14.0:
bfmatcher— brute-force Hamming matcher withmatch,knnMatchandratio_test(feat(bfmatcher): brute-force Hamming matcher and match_t #133), now used by the ORB samples in place of their inlinematch_patternpose_estimator— closed-form planar poseH → [R|t], SVD-free so the same routine can runno_stdin the PureCV port (Addpose_estimatormodule to complete the natural-feature AR pipeline #83)orb.ic_angle— the intensity-centroid orientation step, previously stranded in the example pages (Define a minimumCvBackendinterface (pluggable, stateless CV contract for a high-level WebAR layer) #96)Plus the two dependabot bumps merged since: vite 8.2.2 (the build tool, so it produced these artifacts) and actions/upload-artifact v7.
Notes
AGENTS.md. An npm 10 install omits other-platform optional native binaries and produces a lockfile that failsnpm ciin CI — which is exactly what happened locally while preparing this, and is worth knowing about.types/src/bfmatcher/andtypes/src/pose_estimator/are new directories: those modules had never been through a release build before.Verification
npm test— 305 passednpm run typecheck— cleannpm run format-check— cleannpm run license-check— 100 files OKVERSION0.15.0and all three new modulesAfter merge
Steps 6–7 of the runbook, which are not part of this PR: promote
devtomain, then tag0.15.0(bare, novprefix) to trigger the automated release and npm publish.