Skip to content

feat(tui): generate fuzzyMatch/fuzzyFilter via fluessig (f64/uint32 path)#334

Draft
zmaril wants to merge 1 commit into
napi-fluessig/fluessig-pin-e056bb9from
napi-fluessig/float-fuzzy
Draft

feat(tui): generate fuzzyMatch/fuzzyFilter via fluessig (f64/uint32 path)#334
zmaril wants to merge 1 commit into
napi-fluessig/fluessig-pin-e056bb9from
napi-fluessig/float-fuzzy

Conversation

@zmaril

@zmaril zmaril commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Stacked on napi-fluessig/fluessig-pin-e056bb9. First module swap to exercise the
fluessig #77 float/unsigned scalar arms now available at the bumped pin
(e056bb9): float64 → JS number, uint32 → JS number.

What

Swap the hand-written fuzzyMatch / fuzzyFilter napi exports
(packages/tui/src/fuzzy.ts) to fluessig-generated ops:

  • FuzzyMatchResult.score authored as float64 → lowers to Rust f64,
    crosses to JS number (.d.ts: score: number).
  • fuzzyFilter returns { list: uint32 } → Rust Vec<u32>, crosses to
    JS Array<number> — the ranked surviving indices.

Authored the two ops + the FuzzyMatchResult model in schema/api.json, added
core_impl delegations into pidgin_tui's fuzzy layer (the same logic the
hand-written exports called), regenerated src/generated.rs, and deleted the
hand-written #[napi] exports.

The key question: did float64/uint32 byte-match?

Yes. All three swapped symbols' generated .d.ts block + .js export +
nativeBinding entry are byte-identical to a pre-swap build of the base
(704801c):

  • FuzzyMatchResult interface — matches: boolean, score: number — identical.
  • fuzzyMatch(query, text): FuzzyMatchResult — identical (JSDoc + decl).
  • fuzzyFilter(texts, query): Array<number> — identical (JSDoc + decl).
  • module.exports.fuzzyMatch/fuzzyFilter + nativeBinding destructuring — identical.

Gates

  • Byte-diff vs pre-swap 704801c build: 3/3 symbols identical.
  • cargo build -p pidgin-napi, cargo fmt --all --check,
    cargo clippy -p pidgin-napi --all-targets -- -D warnings: clean. codespell: 0.
  • straitjacket 0.2.3 on git archive HEAD: 0 errors.
  • Oracle: pi's own packages/tui/test/fuzzy.test.ts (node --test) against the
    native shim backed by the locally-built addon: 14/14 pass
    (fuzzyMatch + fuzzyFilter suites), exercising the f64 score and uint32
    indices end-to-end.

🤖 Generated with Claude Code

https://claude.ai/code/session_017xL2W7dkhPsTSRuXQNCDeY


Generated by Claude Code

…ath)

Swap the hand-written `fuzzyMatch`/`fuzzyFilter` napi exports (packages/tui/
src/fuzzy.ts) to fluessig-generated ops, exercising the #77 float/unsigned
scalar arms now available at the bumped pin (e056bb9):

- `FuzzyMatchResult.score` is authored as `float64` -> lowers to Rust `f64`,
  crossing to JS `number` (byte-identical `score: number`).
- `fuzzyFilter` returns `{ list: uint32 }` -> Rust `Vec<u32>`, crossing to JS
  `Array<number>` (byte-identical), the ranked surviving indices.

Author the two ops + the `FuzzyMatchResult` model in schema/api.json, add the
`core_impl` delegations into `pidgin_tui`'s fuzzy layer (same logic the
hand-written exports called), regenerate src/generated.rs, and delete the
hand-written `#[napi]` exports. The generated `.d.ts`/`.js`/nativeBinding
entries for all three symbols are byte-identical to the pre-swap build; pi's
own test/fuzzy.test.ts oracle passes 14/14 against the locally-built addon.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xL2W7dkhPsTSRuXQNCDeY
@github-actions

Copy link
Copy Markdown

Conformance smoke: agent + ai + tui

  • pi_sha: 3da591ab74ab9ab407e72ed882600b2c851fae21
  • manifest_native_modules: 45

Headline is rust-backed: passing cases in files whose module-under-test is a native (Rust addon) module. Raw all-pass is shown secondary — it is inflated by unflipped TypeScript that passes without touching any Rust.

Package rust-backed Native modules raw pass (secondary) Failing Skipped
agent 55/180 (30.6%) 5 180/180 0 0
ai 74/1295 (5.7%) 8 553/1295 3 739
tui 375/678 (55.3%) 14 678/678 0 0
smoke total 504/2153 (23.4%) 27 1411/2153 3 739

agent: 55/180 (30.6%) · ai: 74/1295 (5.7%) · tui: 375/678 (55.3%)

rust-backed = passing / total tests run, per the manifest's per-native-row tests lists. The Native modules column counts modules served by the Rust addon. This is the agent+ai+tui smoke subset; the full baseline lives in committed conformance.json.

Attribution

A pi test file is rust-backed iff the module it primarily exercises — its module-under-test — is status=native in conformance/manifest.json. A package's rust-backed count is the passing cases in its rust-backed files. Transitive or infrastructure use does not count (e.g. ~30 ai files construct the native faux provider but test other things — only faux-provider.test.ts, whose subject is faux, counts). A file that substantially tests both a native and an original module is excluded rather than counted, so the number under-reports rather than over-claims.

Per-file decisions (from each native manifest row's tests list):

Native module Test file Decision
ai/api/anthropic-messages.ts test/anthropic-sse-parsing.test.ts counted
ai/providers/faux.ts test/faux-provider.test.ts counted
coding-agent/utils/ansi.ts test/ansi-utils.test.ts counted
coding-agent/utils/changelog.ts test/changelog.test.ts counted
coding-agent/utils/git.ts test/git-ssh-url.test.ts counted
coding-agent/core/tools/path-utils.ts test/path-utils.test.ts counted
tui/keys.ts test/keys.test.ts counted
tui/utils.ts test/truncate-to-width.test.ts, test/regression-regional-indicator-width.test.ts counted
coding-agent/utils/mime.ts test/image-process.test.ts mixed — excluded (2 of 3 cases test processImage/original)
coding-agent/utils/version-check.ts test/version-check.test.ts mixed — excluded (fetch cases mock the original; not separable per-file)
coding-agent/core/export-html/ansi-to-html.ts test/export-html-whitespace.test.ts mixed — excluded (asset-grep + tool-renderer/original dominate)
coding-agent/core/tools/truncate.ts no dedicated test (exercised via tools.test.ts, subject is the read/edit factory/original)
coding-agent/core/tools/edit-diff.ts no dedicated test (edit-tool tests' subject is the edit tool/original)

CLI conformance (black-box, against the pidgin binary)

  • CLI conformance: 15/15 pass against target/release/pidgin (pass delta ±0, fail delta ±0).
File Passing Failing Skipped
packages/coding-agent/test/session-file-invalid.test.ts 1 0 0
packages/coding-agent/test/session-id-readonly.test.ts 7 0 0
packages/coding-agent/test/startup-session-name.test.ts 2 0 0
packages/coding-agent/test/stdout-cleanliness.test.ts 5 0 0

The four repointed coding-agent CLI test files spawn the compiled pidgin binary via $PIDGIN_BIN instead of pi's own cli.ts. This is a separate signal from the module smoke table and is never folded into the per-package Native count.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants