Skip to content

feat(coding): generate resolve-config-value bindings via fluessig#326

Draft
zmaril wants to merge 1 commit into
napi-fluessig/prompt-templatesfrom
napi-fluessig/resolve-config-value
Draft

feat(coding): generate resolve-config-value bindings via fluessig#326
zmaril wants to merge 1 commit into
napi-fluessig/prompt-templatesfrom
napi-fluessig/resolve-config-value

Conversation

@zmaril

@zmaril zmaril commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Before

Four exports of the resolve-config-value module were hand-written #[napi] wrappers in src/lib.rs:

  • getConfigValueEnvVarName (string → nullable string)
  • getConfigValueEnvVarNames (→ list string)
  • isCommandConfigValue (→ bool)
  • clearConfigValueCache (→ void)

After

The same four exports are now generated by fluessig instead of being hand-written. The generated JS surface is byte-identical to the previous build: each symbol's .d.ts signature/JSDoc block, its .js module.exports line, and its nativeBinding destructure membership match the pre-swap addon (4/4 identical). napi binds by name, so the shared destructure megaline reordering as symbols move into the generated cluster is benign.

The module's other exports (resolveConfigValue*, resolveHeaders*, env-JSON helpers) intentionally stay hand-written; the addon exports both sets.

How

  • Added the four ops to the Pidgin interface in schema/api.json (all-primitive query surface; catalog.json unchanged — no new DTOs).
  • Added core_impl delegations routing each op to the same pidgin_coding::core::resolve_config_value::* fn the hand-written export called.
  • Ran the regen chain (fluessig, pinned) to produce src/generated.rs, then deleted the hand-written #[napi] exports from src/lib.rs (kept pub mod generated;).

Stacked on napi-fluessig/prompt-templates (#324).


Generated by Claude Code

…ia fluessig

Swap four hand-written `#[napi]` exports from coding-agent
core/resolve-config-value.ts to the fluessig-generated path: author the ops in
schema/api.json, add the matching `core_impl` delegations, regenerate
src/generated.rs, and delete the hand-written exports from src/lib.rs.

The four ops are proven primitive shapes:
`getConfigValueEnvVarName(config) -> string | null` (nullable string),
`getConfigValueEnvVarNames(config) -> Array<string>` (list),
`isCommandConfigValue(config) -> boolean` (bool), and
`clearConfigValueCache() -> void` (void, no params). Each `core_impl` method
reaches the SAME `pidgin_coding::core::resolve_config_value` function the
hand-written export called, so JS-visible behavior is byte-for-byte unchanged.
The module's other exports (resolveConfigValue*, resolveHeaders*, the env-JSON
helpers) stay hand-written for now.

Verified: each swapped symbol's generated `.d.ts` JSDoc+signature block, its
`.js` `module.exports` line, and its nativeBinding destructure entry are
byte-identical to a pre-swap build of the base (only file position moves into the
generated cluster). cargo build/fmt/clippy clean; codespell 0; straitjacket 0
errors; the resolve-config-value oracle slice
(coding-agent/test/resolve-config-value.test.ts, 10 tests) passes 10/10 against
the locally-built generated addon.
@zmaril zmaril changed the title napi/fluessig: generate resolve-config-value query exports feat(coding): generate resolve-config-value bindings via fluessig Jul 21, 2026
@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