Skip to content

feat: add and publish TypeScript adapter contract - #203

Draft
AjayThorve wants to merge 13 commits into
NVIDIA:mainfrom
AjayThorve:feat/publish-typescript-package
Draft

feat: add and publish TypeScript adapter contract#203
AjayThorve wants to merge 13 commits into
NVIDIA:mainfrom
AjayThorve:feat/publish-typescript-package

Conversation

@AjayThorve

@AjayThorve AjayThorve commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Overview

Add and publish the dependency-free nemo-fabric-adapter-contract TypeScript projection of the Rust-generated v1alpha2 adapter schemas. Descriptor, configuration, runtime-context, request, and result types share the package root, matching the Python adapter-contract package's single model namespace. Invocation request/result types retain their documented preview status until the typed lifecycle transport is enforced, but that status does not create a TypeScript-only import boundary.

The package is intentionally unscoped, matching the public NeMo Relay npm naming pattern and avoiding a dependency on npm @nvidia organization administration. Publication uses GitHub OIDC through a protected npmjs environment, never receives a long-lived npm write token, and automatically produces provenance after the one-time package bootstrap.

The package has zero production dependencies. json-schema-to-typescript@15.0.4 is an exact-pinned build dependency selected to avoid hand-maintaining a parallel contract hierarchy. Its development-only transitive graph includes argparse@2.0.1 under Python-2.0; dependency approver acknowledgement is requested before merge.

This PR combines and supersedes #199. It does not add a TypeScript lifecycle host, Pi adapter, runtime validator, or adapter integration; those remain follow-up work for the 0.3 release line. This is a new package and introduces no breaking API change.

Details

  • Generate strict TypeScript declarations and byte-identical packaged schemas from the five canonical adapter-contract schemas.
  • Export all adapter-contract models from one package root, matching Python, with JSON-safe open maps, exact literal unions, contract-version constants, and a discriminated result union.
  • Keep the request/result transport caveat in documentation until the runtime enforces the typed invocation boundary rather than creating a TypeScript-only ./preview entry point.
  • Fail closed when the canonical schema inventory or projected result conditionals change unexpectedly.
  • Add strict positive/negative compile fixtures and a clean packed-consumer smoke test with an exact tarball manifest.
  • Align the descriptor schema with runtime enforcement for contract version, telemetry providers, nonblank identifiers, and agent configuration validation before adapter handoff.
  • Add Node 20.18.3 and Node 24 CI, release-version stamping, just recipes, documentation, and maintainer workflow parity.
  • Add tag-driven npm publication: stable releases use latest, beta and RC releases use next, and alpha releases remain unpublished.
  • Pack once, publish that exact tarball, and reconcile retries against the immutable version, registry integrity, and expected dist-tag without moving a release tag backward.
  • Document the one-time initial publish, multiple-maintainer ownership, trusted-publisher binding, protected environment, and post-release verification.

Trusted publishing reference: https://docs.npmjs.com/trusted-publishers/

Validation

  • just test-typescript
  • npm pack --dry-run --json
  • uv run pytest -q tests/scripts/test_publish_typescript_package.py tests/scripts/test_set_typescript_project_version.py (36 passed)
  • uv run pre-commit run --files <changed-files>
  • just docs
  • just --fmt --check
  • git diff --check
  • just test-rust, cargo fmt --all -- --check, just test-python, and uv run pre-commit run --all-files passed earlier in the branch; GitHub Actions repeats the repository matrix on the current head.

Registry bootstrap completed on 2026-08-11: nemo-fabric-adapter-contract@0.0.0 was published as an inert three-file placeholder by ajaythorve with npm 2FA. The live registry shasum (bc60b575e6e5242e21f0fa5d97b1025661c84570) and integrity matched the reviewed dry-run. next points to 0.0.0; npm also initialized the first package version as latest and rejected removing that only latest tag. This did not exercise trusted publishing: the first supported release remains pending the protected npmjs environment, acceptance of the npm maintainer invitations sent to anuradhakaruppiah and dagardner-nv, and the npm trusted-publisher binding after merge.

Where should the reviewer start?

  1. typescript/adapter-contract/package.json, src/index.ts, and test/execution.test.ts for the Python-parity single-root export boundary.
  2. typescript/adapter-contract/scripts/generate.mjs and scripts/projection-guards.mjs for schema projection and fail-closed assumptions.
  3. crates/fabric-core/src/schema.rs and the canonical schemas for the wire-contract and runtime invariants.
  4. .github/workflows/publish_typescript.yml, scripts/ci/publish_typescript_package.py, and its tests for the OIDC and immutable-registry boundary.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR adds a TypeScript adapter-contract package with generated bindings, canonical schemas, validation, build targets, version synchronization, CI, and npm trusted publication. It also updates Rust validation and repository contribution, maintenance, and release guidance.

Changes

Adapter contract delivery

Layer / File(s) Summary
Contract schemas and validation
crates/fabric-core/..., schemas/..., typescript/adapter-contract/schemas/...
Schemas now enforce contract versions, nonblank identifiers, supported telemetry providers, configuration shapes, runtime context, and run-result rules. Rust validation and tests cover these constraints.
TypeScript package and generated bindings
typescript/adapter-contract/...
Added stable and preview entry points, generated declarations, JSON types, schema projection guards, package validation, dependency checks, and compile-time tests.
Versioning, packaging, and npm publication
scripts/ci/..., .github/workflows/..., justfile, RELEASING.md, tests/scripts/...
Added TypeScript version synchronization, artifact reconciliation, dist-tag safeguards, publication verification, CI testing, and OIDC-based npm publishing.
Build, contribution, and release guidance
.agents/..., AGENTS.md, CONTRIBUTING.md, README.md, docs/..., skills/..., .pre-commit-config.yaml
Updated project commands, package usage guidance, API documentation requirements, validation rules, release procedures, and source-file copyright checks.

Estimated code review effort: 4 (Complex) | ~75 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ReleaseTag
  participant PublishWorkflow
  participant PublishScript
  participant NpmRegistry
  ReleaseTag->>PublishWorkflow: trigger stable, beta, or RC publication
  PublishWorkflow->>PublishScript: pass package version and dist-tag
  PublishScript->>NpmRegistry: inspect registry state
  PublishScript->>NpmRegistry: publish package artifact
  PublishScript->>NpmRegistry: verify version, integrity, and dist-tag
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed The description includes the required overview, reviewer guidance, related issues, validation details, and completed contribution checks.
Title check ✅ Passed The title uses a valid Conventional Commits type, imperative summary, lowercase formatting, and remains under 72 characters.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 19

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/skills/maintain-ci/SKILL.md:
- Around line 32-35: Update the permission guidance in maintain-ci so id-token:
write explicitly includes the protected npm publication job used by
publish_typescript.yml and publish_typescript_package.py, while keeping pages:
write restricted to Pages deployment jobs. Remove or revise the conflicting
limitation that scopes id-token: write only to Pages jobs.

In @.github/workflows/publish_typescript.yml:
- Around line 27-30: Add explanatory comments directly within the permissions
block of the workflow, documenting why contents: read and id-token: write are
required for publishing. Keep the existing permission scopes unchanged and make
each comment specific enough to guide future reviewers.

In @.pre-commit-config.yaml:
- Line 12: Update the file-matching regex in the copyright-header hook to
include the tsx extension alongside ts, ensuring both TypeScript and TSX files
are checked for SPDX headers while preserving all existing extensions and
matching behavior.

In `@crates/fabric-core/src/config.rs`:
- Around line 1191-1192: Add a compile-time exhaustiveness guard alongside
`TelemetryProvider::ALL` that matches every current `TelemetryProvider` variant
and becomes non-exhaustive when a new variant is added. Keep `ALL` as the source
for `adapter_telemetry_providers_schema`, ensuring contributors must update it
whenever extending the enum.

In `@justfile`:
- Around line 311-327: Extract the repeated adapter-contract dependency
installation into a shared just recipe, then make build-typescript,
generate-typescript-contract, pack-typescript, and test-typescript depend on it
instead of invoking npm ci themselves. Preserve each recipe’s existing command
sequence while ensuring chained targets install dependencies only once. Update
the publish_typescript.yml workflow to use the same test-typescript recipe or
otherwise remain behaviorally aligned with it.

In `@RELEASING.md`:
- Around line 153-155: Insert a blank line after list item 5 and before “Review
docs and snippets that mention explicit versions, including:” so the latter
renders as a separate paragraph rather than a continuation of the list item.

In `@scripts/ci/publish_typescript_package.py`:
- Around line 172-180: Update _state_matches in
scripts/ci/publish_typescript_package.py (lines 172-180) to handle a missing
dist.integrity separately from a present-but-different integrity, while
documenting or enforcing that equality requires a byte-identical repack and
reporting each case accurately. Update step 4 in RELEASING.md (lines 207-231) so
it no longer promises successful no-op reconciliation for manually published
tarballs, or pin bootstrap Node and npm versions to those used by
.github/workflows/publish_typescript.yml.
- Around line 244-262: Update the verification loop around _published_state and
_state_matches to fail immediately when a visible PublishedState conflicts with
the expected artifact, rather than retrying it; keep retries only when the state
is None. Ensure the conflict exception is not caught by the surrounding
PublicationError handler, and replace the fixed sleep(5) delay with exponential
backoff between remaining verification attempts.

In `@tests/scripts/test_publish_typescript_package.py`:
- Around line 152-176: Extend the tests around publish_package to cover invalid
dist_tag values, verification_attempts below one, packed-version mismatches,
unsafe or missing npm pack tarballs, and verification exhaustion after npm
publish fails. Assert each guard raises the expected error, and verify the final
exhaustion case includes both publish and verification failure details; use the
existing NpmRunner and helper symbols to model each response.
- Line 100: Remove the -> None return annotations from all affected test
functions in the test module, including
test_existing_exact_package_is_an_idempotent_success and the tests at the other
specified locations, while preserving their parameters and bodies.

In `@tests/scripts/test_set_typescript_project_version.py`:
- Line 98: Update the match expression in the pytest.raises call to use a raw
string literal for the regular expression, preserving the existing pattern and
exception assertion behavior.
- Around line 19-59: Convert _write_package_files into a pytest fixture using
`@pytest.fixture`(name="package_files") with a package_files_fixture function,
preserving its existing file-writing behavior and return values. Update each
affected test to accept package_files as an argument and use the fixture result
instead of calling the helper directly.

In `@typescript/adapter-contract/README.md`:
- Line 22: Update the README headings “Stable v1alpha2 contract” and “Preview
invocation types” to title case, preserving their existing wording and
structure.
- Around line 18-20: Update the documented TypeScript minimum in the README and
the corresponding version requirement in scripts/check-package.mjs to 5.3 or
later, keeping the existing Node.js and module-resolution guidance unchanged.

In `@typescript/adapter-contract/schemas/agent-config.schema.json`:
- Around line 170-179: Update the Rust fields AgentModelConfig.provider and
AgentModelConfig.model in crates/fabric-core/src/agent_config.rs to validate at
least one non-whitespace character using the existing regex validation
mechanism, while preserving their current non-empty string constraints.
Regenerate the canonical, TypeScript, and run-plan schema snapshots afterward.

In `@typescript/adapter-contract/schemas/agent-run-result.schema.json`:
- Around line 33-50: Update the Rust AgentArtifact::path schema attribute to
require at least one non-whitespace character, matching the existing name and
kind validation. Regenerate the canonical and mirrored agent-run-result schemas
so path retains its relative-path and traversal protections while rejecting
whitespace-only values.

In `@typescript/adapter-contract/scripts/check-package.mjs`:
- Around line 170-179: Update the dependency-field list in the package
validation loop to also check the npm-supported “bundleDependencies” spelling,
preserving the existing rejection behavior for any declared production
dependency field.

In `@typescript/adapter-contract/test/projection-guards.test.mjs`:
- Around line 28-36: Update the test’s conditional mutation to locate the target
conditional by its content rather than assuming it is at index 0; select the
entry whose then.required array is present, append "usage" to that array, and
preserve the existing assertRunResultConditionals failure assertion.

In `@typescript/adapter-contract/test/tsconfig.json`:
- Around line 1-13: Add the repository-required SPDX copyright and license
comments before the opening JSON object in both
typescript/adapter-contract/test/tsconfig.json (lines 1-13) and
typescript/adapter-contract/tsconfig.build.json (lines 1-16); no other
configuration changes are needed.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 85f3cd77-6523-4efb-a951-c13172bdcee1

📥 Commits

Reviewing files that changed from the base of the PR and between 4112bea and a1ff4ba.

⛔ Files ignored due to path filters (6)
  • typescript/adapter-contract/package-lock.json is excluded by !**/package-lock.json
  • typescript/adapter-contract/src/generated/adapter-descriptor.ts is excluded by !**/generated/**
  • typescript/adapter-contract/src/generated/agent-config.ts is excluded by !**/generated/**
  • typescript/adapter-contract/src/generated/agent-run-request.ts is excluded by !**/generated/**
  • typescript/adapter-contract/src/generated/agent-run-result.ts is excluded by !**/generated/**
  • typescript/adapter-contract/src/generated/runtime-context.ts is excluded by !**/generated/**
📒 Files selected for processing (46)
  • .agents/skills/contribute-api/SKILL.md
  • .agents/skills/maintain-ci/SKILL.md
  • .agents/skills/maintain-packaging/SKILL.md
  • .agents/skills/update-project-version/SKILL.md
  • .agents/skills/validate-change/SKILL.md
  • .github/workflows/ci_typescript.yml
  • .github/workflows/publish_typescript.yml
  • .pre-commit-config.yaml
  • AGENTS.md
  • CONTRIBUTING.md
  • README.md
  • RELEASING.md
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/schema.rs
  • docs/adapter-contract/README.md
  • justfile
  • schemas/SCHEMA.md
  • schemas/adapter-contract/adapter-descriptor.schema.json
  • schemas/run-plan.schema.json
  • scripts/ci/publish_typescript_package.py
  • scripts/ci/set_typescript_project_version.py
  • skills/nemo-fabric-build-adapter/SKILL.md
  • tests/scripts/test_publish_typescript_package.py
  • tests/scripts/test_set_typescript_project_version.py
  • typescript/adapter-contract/.gitignore
  • typescript/adapter-contract/LICENSE
  • typescript/adapter-contract/README.md
  • typescript/adapter-contract/package.json
  • typescript/adapter-contract/schemas/adapter-descriptor.schema.json
  • typescript/adapter-contract/schemas/agent-config.schema.json
  • typescript/adapter-contract/schemas/agent-run-request.schema.json
  • typescript/adapter-contract/schemas/agent-run-result.schema.json
  • typescript/adapter-contract/schemas/runtime-context.schema.json
  • typescript/adapter-contract/scripts/check-package.mjs
  • typescript/adapter-contract/scripts/clean.mjs
  • typescript/adapter-contract/scripts/generate.mjs
  • typescript/adapter-contract/scripts/projection-guards.mjs
  • typescript/adapter-contract/src/index.ts
  • typescript/adapter-contract/src/json.ts
  • typescript/adapter-contract/src/preview.ts
  • typescript/adapter-contract/src/version.ts
  • typescript/adapter-contract/test/preview.test.ts
  • typescript/adapter-contract/test/projection-guards.test.mjs
  • typescript/adapter-contract/test/stable.test.ts
  • typescript/adapter-contract/test/tsconfig.json
  • typescript/adapter-contract/tsconfig.build.json

Comment thread .agents/skills/maintain-ci/SKILL.md
Comment thread .github/workflows/publish_typescript.yml
Comment thread .pre-commit-config.yaml Outdated
Comment thread crates/fabric-core/src/config.rs
Comment thread justfile Outdated
Comment thread typescript/adapter-contract/schemas/agent-config.schema.json
Comment thread typescript/adapter-contract/schemas/agent-run-result.schema.json
Comment thread typescript/adapter-contract/scripts/check-package.mjs
Comment thread typescript/adapter-contract/test/projection-guards.test.mjs
Comment thread typescript/adapter-contract/test/tsconfig.json
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve
AjayThorve force-pushed the feat/publish-typescript-package branch from a1ff4ba to 416dc5c Compare August 11, 2026 16:20
@coderabbitai coderabbitai Bot mentioned this pull request Aug 11, 2026
2 tasks

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.agents/skills/update-project-version/SKILL.md (1)

23-24: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the documented conversion with the implementation.

just set-version passes one SemVer string to every helper. set_python_project_versions writes that string directly into Python metadata and dependency pins. Add PEP 440 conversion and cross-surface validation, with tests for prerelease and build-metadata versions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/update-project-version/SKILL.md around lines 23 - 24, Align
the versioning workflow documented around just set-version and
set_python_project_versions with the implementation: convert SemVer prerelease
and build metadata to valid PEP 440 before writing Python metadata or dependency
pins, while preserving the original SemVer for TypeScript metadata. Add
cross-surface validation and tests covering prerelease and build-metadata
versions.

Source: Learnings

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/publish_typescript.yml:
- Around line 69-99: After set_typescript_project_version.py updates the
manifests in the Prepare release metadata step, run git diff --exit-code to
require the tagged commit’s package.json and package-lock.json state to already
match the release version; fail the workflow with the resulting diff if they
differ, before writing release outputs.
- Around line 101-107: Update the release workflow’s TypeScript dependency setup
and test steps to reuse the `test-typescript` recipe, including its
`install-typescript` dependency, instead of duplicating `npm ci` with different
flags. If retaining `--no-audit --no-fund` is required, add them to
`install-typescript` so both paths remain identical.

In @.pre-commit-config.yaml:
- Line 12: Extend the pre-commit file matcher and the format handling in
check_copyright.py for .bash, .jsx, .css, and .scss, using # comments for .bash,
// comments for .jsx and .tsx, and block comments for .css and .scss. Keep the
existing .html support intact, and do not add JSON extensions until a valid
JSON-compatible SPDX strategy is defined.

In `@RELEASING.md`:
- Around line 203-219: Update the manual publish instructions in the release
workflow section to require Node 24 and npm 11.5.1 or newer before running npm
publish. Keep the existing bootstrap publish commands and ensure the documented
tool versions match the pins in publish_typescript.yml so the later repack
integrity check can reconcile.

In `@tests/scripts/test_publish_typescript_package.py`:
- Line 317: Update both match patterns in the relevant tests to use raw string
literals, preserving their existing regex text while preventing Ruff RUF043
warnings for unescaped period metacharacters.
- Around line 84-88: Convert _package_directory into a pytest fixture using the
required `@pytest.fixture`(name="package_directory") and package_directory_fixture
naming convention. Move the existing temporary package setup into that fixture,
then update every test using _package_directory to accept package_directory and
use the fixture directly instead of requesting tmp_path for this setup.

---

Outside diff comments:
In @.agents/skills/update-project-version/SKILL.md:
- Around line 23-24: Align the versioning workflow documented around just
set-version and set_python_project_versions with the implementation: convert
SemVer prerelease and build metadata to valid PEP 440 before writing Python
metadata or dependency pins, while preserving the original SemVer for TypeScript
metadata. Add cross-surface validation and tests covering prerelease and
build-metadata versions.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: fb9d0ebc-3ff7-4ed8-8c6e-79b79e16a500

📥 Commits

Reviewing files that changed from the base of the PR and between a1ff4ba and 416dc5c.

📒 Files selected for processing (30)
  • .agents/skills/contribute-api/SKILL.md
  • .agents/skills/maintain-ci/SKILL.md
  • .agents/skills/maintain-packaging/SKILL.md
  • .agents/skills/update-project-version/SKILL.md
  • .agents/skills/validate-change/SKILL.md
  • .github/workflows/publish_typescript.yml
  • .pre-commit-config.yaml
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/schema.rs
  • justfile
  • schemas/adapter-contract/agent-config.schema.json
  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/run-plan.schema.json
  • scripts/ci/publish_typescript_package.py
  • scripts/ci/set_typescript_project_version.py
  • tests/scripts/test_publish_typescript_package.py
  • tests/scripts/test_set_typescript_project_version.py
  • typescript/adapter-contract/README.md
  • typescript/adapter-contract/package.json
  • typescript/adapter-contract/schemas/agent-config.schema.json
  • typescript/adapter-contract/schemas/agent-run-result.schema.json
  • typescript/adapter-contract/scripts/check-dependencies.mjs
  • typescript/adapter-contract/scripts/check-package.mjs
  • typescript/adapter-contract/scripts/generate.mjs
  • typescript/adapter-contract/test/projection-guards.test.mjs
  • typescript/adapter-contract/test/tsconfig.json
  • typescript/adapter-contract/tsconfig.build.json
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (38)
**/*

📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)

**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.

**/*: Always spell NVIDIA in all caps; do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names with NVIDIA on first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...

Files:

  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/adapter-contract/agent-config.schema.json
  • typescript/adapter-contract/test/tsconfig.json
  • typescript/adapter-contract/schemas/agent-config.schema.json
  • typescript/adapter-contract/tsconfig.build.json
  • tests/scripts/test_set_typescript_project_version.py
  • typescript/adapter-contract/scripts/check-dependencies.mjs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • typescript/adapter-contract/test/projection-guards.test.mjs
  • typescript/adapter-contract/scripts/check-package.mjs
  • typescript/adapter-contract/schemas/agent-run-result.schema.json
  • justfile
  • typescript/adapter-contract/README.md
  • crates/fabric-core/src/config.rs
  • scripts/ci/set_typescript_project_version.py
  • RELEASING.md
  • typescript/adapter-contract/package.json
  • crates/fabric-core/src/agent_config.rs
  • scripts/ci/publish_typescript_package.py
  • typescript/adapter-contract/scripts/generate.mjs
  • tests/scripts/test_publish_typescript_package.py
  • schemas/run-plan.schema.json
schemas/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

When a schema or public contract changes, run the Rust, Python, and TypeScript suites and review generated schemas, adapter-contract representations, TypeScript sources, and API references.

Files:

  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/adapter-contract/agent-config.schema.json
  • schemas/run-plan.schema.json

⚙️ CodeRabbit configuration file

schemas/**/*: Schemas are generated public contract snapshots. Check that schema diffs correspond to intentional Rust type changes and are covered by core tests.

Files:

  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/adapter-contract/agent-config.schema.json
  • schemas/run-plan.schema.json
**/*.{json,json5,jsonc,js,jsx,ts,tsx,css,scss}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include the required SPDX license header, using the appropriate comment syntax for the file type.

Files:

  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/adapter-contract/agent-config.schema.json
  • typescript/adapter-contract/test/tsconfig.json
  • typescript/adapter-contract/schemas/agent-config.schema.json
  • typescript/adapter-contract/tsconfig.build.json
  • typescript/adapter-contract/schemas/agent-run-result.schema.json
  • typescript/adapter-contract/package.json
  • schemas/run-plan.schema.json
{adapter-contract,typescript/adapter-contract}/**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep the southbound adapter contract documentation current when the API changes.

Files:

  • typescript/adapter-contract/test/tsconfig.json
  • typescript/adapter-contract/schemas/agent-config.schema.json
  • typescript/adapter-contract/tsconfig.build.json
  • typescript/adapter-contract/scripts/check-dependencies.mjs
  • typescript/adapter-contract/test/projection-guards.test.mjs
  • typescript/adapter-contract/scripts/check-package.mjs
  • typescript/adapter-contract/schemas/agent-run-result.schema.json
  • typescript/adapter-contract/README.md
  • typescript/adapter-contract/package.json
  • typescript/adapter-contract/scripts/generate.mjs
**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For native binding changes, run cargo check -p fabric-python --locked.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • scripts/ci/set_typescript_project_version.py
  • crates/fabric-core/src/agent_config.rs
  • scripts/ci/publish_typescript_package.py
  • tests/scripts/test_publish_typescript_package.py
**/*.{md,mdx,yml,py,rs,sh}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • typescript/adapter-contract/README.md
  • crates/fabric-core/src/config.rs
  • scripts/ci/set_typescript_project_version.py
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • scripts/ci/publish_typescript_package.py
  • tests/scripts/test_publish_typescript_package.py
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use pytest to run Python tests.
Do not add @pytest.mark.asyncio to tests; async tests are automatically detected by the async runner.
Do not add -> None return type annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or AsyncMock, using the spec argument when necessary, rather than defining a new class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it once in conftest.py rather than repeating it.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a <fixture_name>_fixture function; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its returned value is unused or it returns no value.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as using results["data"] instead of results.get("data").
When adapter installation metadata changes, packaging metadata tests must directly assert that the root project depends unconditionally on the exact-version nemo-fabric-runtime distribution.
Packaging metadata tests must verify that each root harness extra delegates to the matching version of the leaf adapter's harness extra.
Packaging metadata tests must verify that bare leaf dependencies remain adapter-owned and that the root adapter-tests dependency group installs each leaf through its harness extra.
Packaging metadata tests must verify that every leaf provides full; only adapters importing NeMo Relay Python APIs provide relay, while adapters using an external Relay executable have full equal to harness.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • tests/scripts/test_publish_typescript_package.py
**/*.{py,pyi}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

When Python code or a Python-facing adapter changes, run just test-python.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • scripts/ci/set_typescript_project_version.py
  • scripts/ci/publish_typescript_package.py
  • tests/scripts/test_publish_typescript_package.py
**/*.{rs,py,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py,ts,tsx}: Use language-appropriate naming: snake_case for Rust and Python functions and variables; PascalCase for Rust, Python, and TypeScript types; preserve wire snake_case names for TypeScript contract properties.
Run tests for every affected language surface; changes to the Rust core or public adapter-contract schemas require Rust, Python, and TypeScript test suites.
When adding functionality, include tests in the corresponding Rust crate or relevant tests/ area.
Keep checked-in JSON Schema snapshots, Python representations, and generated TypeScript declarations synchronized when public contracts change.
Use the repository justfile test targets (just test-rust, just test-python, just test-typescript, or just test-all) rather than ad hoc test commands where applicable.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • scripts/ci/set_typescript_project_version.py
  • crates/fabric-core/src/agent_config.rs
  • scripts/ci/publish_typescript_package.py
  • tests/scripts/test_publish_typescript_package.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • scripts/ci/set_typescript_project_version.py
  • scripts/ci/publish_typescript_package.py
  • tests/scripts/test_publish_typescript_package.py
**/*.{rs,py,html,md,mdx,toml,yml,yaml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include the required SPDX copyright and Apache-2.0 license header in every source file, using the comment syntax appropriate to its file type.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • typescript/adapter-contract/README.md
  • crates/fabric-core/src/config.rs
  • scripts/ci/set_typescript_project_version.py
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • scripts/ci/publish_typescript_package.py
  • tests/scripts/test_publish_typescript_package.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/scripts/test_set_typescript_project_version.py
  • tests/scripts/test_publish_typescript_package.py
.pre-commit-config.yaml

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Regenerate attribution files with the named pre-commit hooks rather than editing generated output: attributions-rust and attributions-python.

Files:

  • .pre-commit-config.yaml
**/*.{rs,toml}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For any Rust change, run just test-rust and cargo fmt --all -- --check.

When Rust code changes, run cargo fmt --all -- --check and just test-rust.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
crates/fabric-core/**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes under crates/fabric-core must run both the Rust and Python test suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
crates/fabric-core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

For Rust API reference changes, update Rust documentation comments under crates/fabric-core/ instead of generated API reference files.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Implement new or changed public API behavior in the shared Rust core first.

**/*.rs: Format Rust code with cargo fmt --all and ensure cargo fmt --all -- --check passes.
Run cargo check --workspace --locked for changes affecting the Rust workspace, core runtime, CLI, or native Python extension.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
crates/fabric-core/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/fabric-core changes in a way exposed through Python, run both the Rust and Python test suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/agent_execution.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
.github/workflows/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

.github/workflows/*.{yml,yaml}: Define permissions: on each job that needs token access, avoid workflow-level permissions unless centralized inheritance is intentionally documented, and grant only the minimum required scopes.
Pin every third-party action to a full commit SHA and retain a readable version comment after the SHA.
Prefer action-native or ecosystem-native caching over generic actions/cache.
Tie cache invalidation to lockfiles, dependency manifests, or explicit tool versions.
Isolate deploy and publish permissions to only the jobs that require them.
When using workflow_call, inspect and account for both the caller and callee workflows.
Keep local commands aligned with equivalent justfile recipes.
Keep tag filters, prerelease normalization, and publication behavior aligned with RELEASING.md.
Use contents: read as the minimum permission for checkout-based build, test, documentation, and packaging jobs.
Grant pull-requests: read only when a job performs pull-request metadata lookup.
Limit pages: write to Pages deployment jobs and callers that invoke those jobs through reusable workflows.
Limit id-token: write to jobs exchanging GitHub OIDC tokens with protected deployment targets, including Pages deployment and protected npm publication jobs.
For reusable workflows, callers must grant every permission required by called jobs; callees cannot elevate permissions beyond the caller's grant.
For Python workflows, prefer astral-sh/setup-uv caching with cache-dependency-glob anchored to uv.lock.
For Rust workflows, prefer Swatinem/rust-cache with explicit shared-key and workspaces instead of ad hoc target-directory caching.
Avoid caching generated outputs that can hide stale behavior unless the repository deliberately relies on them.
Pass secrets only to the jobs that consume them.
Ensure concurrency, branch filters, and documentation publication guards reflect repository intent.
Before editing, inspect workflow uses, permissions, se...

Files:

  • .github/workflows/publish_typescript.yml
.github/workflows/publish_typescript.yml

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

Publish the TypeScript contract through the protected npmjs environment, grant id-token: write for npm trusted publishing, and do not provide an npm write token that could mask an OIDC configuration failure.

Use npm trusted publishing through the protected npmjs environment.

Files:

  • .github/workflows/publish_typescript.yml
.github/workflows/{ci_typescript.yml,publish_typescript.yml,ci_python.yml,ci_rust.yml}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Keep CI install commands and package names consistent with local workflows and current packaging metadata.

Files:

  • .github/workflows/publish_typescript.yml
.agents/skills/**

📄 CodeRabbit inference engine (.agents/skills/README.md)

.agents/skills/**: Maintainer skills must be discoverable from .agents/skills/; Claude Code exposes the same set through .claude/skills without mixing in consumer skills.
Keep consumer-facing integration guidance in the top-level skills/ directory and exclude it from the maintainer skill set.

Files:

  • .agents/skills/maintain-packaging/SKILL.md
  • .agents/skills/contribute-api/SKILL.md
  • .agents/skills/validate-change/SKILL.md
  • .agents/skills/update-project-version/SKILL.md
  • .agents/skills/maintain-ci/SKILL.md
.agents/skills/*/

📄 CodeRabbit inference engine (.agents/skills/README.md)

Use descriptive, task-based names for maintainer skill directories, such as contribute-api or validate-change.

Files:

  • .agents/skills/maintain-packaging/SKILL.md
  • .agents/skills/contribute-api/SKILL.md
  • .agents/skills/validate-change/SKILL.md
  • .agents/skills/update-project-version/SKILL.md
  • .agents/skills/maintain-ci/SKILL.md
.agents/skills/**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

Maintainer skills under .agents/skills/ may reference repository internals and contribution commands and are intended for contributing to NeMo Fabric itself.

Files:

  • .agents/skills/maintain-packaging/SKILL.md
  • .agents/skills/contribute-api/SKILL.md
  • .agents/skills/validate-change/SKILL.md
  • .agents/skills/update-project-version/SKILL.md
  • .agents/skills/maintain-ci/SKILL.md
.agents/skills/maintain-packaging/SKILL.md

📄 CodeRabbit inference engine (AGENTS.md)

Keep packaging implementation guidance in .agents/skills/maintain-packaging/SKILL.md.

Files:

  • .agents/skills/maintain-packaging/SKILL.md
justfile

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

Use just --fmt --check as the initial narrow validation check.

Keep build, test, clean, and documentation recipes consistent with current package names and commands.

The set-version recipe must run just lock-python after source metadata is updated.

Files:

  • justfile
**/*.{md,mdx,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values; use numerals for 10 or greater and commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.

**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
**/*.{md,rst,txt,adoc}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)

**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 12:30 to 1:00 p.m. for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on first use, typically in the title and H1; use NeMo Fabric thereafter. Use fabric alone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
Capitalize NVIDIA correctly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such as here, and use repository-relative .mdx paths for links within docs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Use after instead of once when expressing temporal sequence, and use can rather than may when describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead with Must fix, Should fix, and Nice to have categories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.

Update documentation and examples in the same branch as a public API addition or behavior change.

Update documentation in the same branch when public behavior, adapters, examples, or workspace structure changes.

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercase fabric CLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
RELEASING.md

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Reflect public packaging changes, release tags, registry publication, and release-facing commands in the release documentation.

Keep release policy and the end-to-end maintainer workflow in RELEASING.md; do not move release-history policy into user-facing documentation or add a duplicate CHANGELOG.md.

Files:

  • RELEASING.md
**/{Cargo.toml,Cargo.lock,pyproject.toml,package.json}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For new or updated dependencies, document the functional need, alternatives considered, and why the selected dependency is the narrowest fit.

Files:

  • typescript/adapter-contract/package.json
**/{Cargo.toml,pyproject.toml,package.json}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

**/{Cargo.toml,pyproject.toml,package.json}: Keep package names, import paths, and module names internally consistent.
For each new dependency, record the functional need, viable alternatives considered, why the selected dependency is the narrowest fit, and any unresolved licensing question.

Files:

  • typescript/adapter-contract/package.json
typescript/adapter-contract/{package.json,package-lock.json}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Keep the adapter-contract package's production dependency graph empty; build-only dependencies must have permissive, recorded license evidence. Its package version follows the workspace release version without changing its independent wire contract version.

Files:

  • typescript/adapter-contract/package.json
**/{Cargo.toml,pyproject.toml,package.json,Cargo.lock,uv.lock,package-lock.json}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Inspect resolved transitive dependencies, not only direct package licenses. Treat unknown, non-SPDX/custom, proprietary, source-available, copyleft, and network-copyleft terms as explicit review points and route unresolved questions to dependency approvers with distribution and linkage context.

Files:

  • typescript/adapter-contract/package.json
typescript/adapter-contract/package.json

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Keep the TypeScript adapter-contract package version aligned with the normalized Cargo SemVer release version.

Files:

  • typescript/adapter-contract/package.json
**/{package.json,npm-shrinkwrap.json,package-lock.json}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

When the TypeScript manifest or npm lockfile changes, inspect the complete npm dependency tree and license fields, confirm zero production dependencies, and run package and audit checks.

Files:

  • typescript/adapter-contract/package.json
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:06.921Z
Learning: For each public API addition or behavior change, determine whether the CLI, PyO3 binding, Python SDK, type stubs, schemas, and Python/TypeScript adapter-contract bindings must expose it.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:06.921Z
Learning: Keep every affected public API surface in parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:06.921Z
Learning: Clearly describe public behavior, cover every affected public surface, ensure the validation matrix matches the changed surfaces, and explain the user-facing change in PR notes.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:06.921Z
Learning: Use the `karpathy-guidelines` companion guidance during implementation or review; keep changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:17.232Z
Learning: When local lint passes but GitHub authorization is uncertain, inspect GitHub's permission model and the upstream action or reusable workflow source rather than assuming local success proves remote success.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: Use valid Cargo SemVer for prerelease or build-metadata releases and equivalent PEP 440 versions in explicit Python metadata; verify that built package versions are equivalent rather than copying incompatible syntax.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: When changing the helper code, keep `set_project_version` aligned so it calls the Cargo, Python, and TypeScript version helpers.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: `set_cargo_workspace_version` must update the workspace version and `nemo-fabric-core` dependency, then verify every `nemo-fabric-*` workspace package through Cargo metadata.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: `set_python_project_versions` must recursively update the root setuptools version, adapter manifests, and internal exact-version pins while rejecting a static version in `python/pyproject.toml`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: `set_typescript_project_version` must update the package manifest and both root npm lockfile version entries without changing dependency versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: Validate version changes with targeted searches, `cargo check --workspace --locked`, Python build/package validation, relevant tests and wheel builds, TypeScript packaging validation, and `git diff --check` as appropriate.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: Avoid blind repository-wide replacement of version-like strings; distinguish package-version surfaces from examples and unrelated dependency versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:37.296Z
Learning: Keep version changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: Keep integration skills under `skills/` separate from maintainer skills under `.agents/skills/`; do not mix external integration guidance with repository-internal contribution guidance.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: Update user-facing entry points when public behavior, the `nemo-fabric` package, examples, or supported bindings change, including the README, Fern docs, adapter and integration READMEs, and examples README.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: Run `just docs` after changing the documentation site.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: Use branch prefixes `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: Name branches after the work, never the Linear ticket; do not embed ticket IDs or slugs in branch names.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: Use signed-off commits for pull-request work with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: When creating a pull request from the current branch, target the upstream repository rather than a fork.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:21:58.571Z
Learning: PR descriptions must include what changed, why, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:22:07.121Z
Learning: All contributors must sign off every commit using `git commit -s`; unsigned commits will not be accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:22:07.121Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:22:07.121Z
Learning: Pull requests require at least one approving review, passing CI, and completion of requested review changes; do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:22:07.121Z
Learning: Use commit messages in the format `type: short description`, with an allowed type such as `feat`, `fix`, `docs`, `test`, `refactor`, `chore`, or `perf`; keep the first line under 72 characters.
📚 Learning: 2026-08-07T07:15:33.918Z
Learnt from: AnuradhaKaruppiah
Repo: NVIDIA/NeMo-Fabric PR: 186
File: schemas/adapter-contract/legacy/adapter-invocation.schema.json:176-176
Timestamp: 2026-08-07T07:15:33.918Z
Learning: For the NeMo Fabric v1alpha southbound adapter contract, treat the adapter descriptor's `contract_version` as the version of the complete contract, including `RuntimeContext`. Keep `RuntimeContext` strict by rejecting unknown properties, and require a negotiated contract-version change for additive shape changes.

Applied to files:

  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/adapter-contract/agent-config.schema.json
📚 Learning: 2026-08-07T07:15:35.305Z
Learnt from: AnuradhaKaruppiah
Repo: NVIDIA/NeMo-Fabric PR: 186
File: schemas/adapter-contract/agent-config.schema.json:374-381
Timestamp: 2026-08-07T07:15:35.305Z
Learning: For the NeMo Fabric southbound adapter contract schemas, treat `AdapterDescriptor.contract_version` as the single negotiated version for the entire contract, covering `AgentConfig`, `AgentRunRequest`, `AgentRunResult`, and `RuntimeContext` before adapter startup. Do not require individual version fields in these payloads; verify behavior against the maintained adapter-contract README.

Applied to files:

  • schemas/adapter-contract/agent-run-result.schema.json
  • schemas/adapter-contract/agent-config.schema.json
🪛 ast-grep (0.45.1)
tests/scripts/test_set_typescript_project_version.py

[info] 119-119: use jsonify instead of json.dumps for JSON output
Context: json.dumps(lock, indent=2)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)

scripts/ci/publish_typescript_package.py

[error] 49-55: Command coming from incoming request
Context: subprocess.run(
["npm", *arguments],
cwd=cwd,
check=False,
capture_output=True,
text=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

tests/scripts/test_publish_typescript_package.py

[info] 46-55: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
[
{
"name": PACKAGE,
"version": version,
"integrity": INTEGRITY,
"filename": filename,
}
]
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)

🪛 LanguageTool
.agents/skills/maintain-packaging/SKILL.md

[uncategorized] ~32-~32: The official name of this software platform is spelled with a capital “H”.
Context: ...mmands - npm trusted publishing through .github/workflows/publish_typescript.yml and ...

(GITHUB)

RELEASING.md

[uncategorized] ~381-~381: The official name of this software platform is spelled with a capital “H”.
Context: ...ml) | For RC, beta and release tags | | [.github/workflows/publish_typescript.yml](.git...

(GITHUB)

.agents/skills/maintain-ci/SKILL.md

[style] ~49-~49: To form a complete sentence, be sure to include a subject.
Context: ... metadata lookup jobs. - pages: write should be limited to Pages deployment jobs and...

(MISSING_IT_THERE)


[style] ~51-~51: To form a complete sentence, be sure to include a subject.
Context: ... reusable workflow. - id-token: write should be limited to jobs that exchange a GitH...

(MISSING_IT_THERE)

🪛 Ruff (0.16.1)
scripts/ci/publish_typescript_package.py

[error] 50-50: subprocess call: check for execution of untrusted input

(S603)


[error] 51-51: Starting a process with a partial executable path

(S607)


[warning] 77-77: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 84-84: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 117-117: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 120-120: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 122-124: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 126-126: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 128-128: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 143-145: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 223-223: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 225-225: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 245-247: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 274-277: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 278-278: Avoid specifying long messages outside the exception class

(TRY003)

tests/scripts/test_publish_typescript_package.py

[warning] 317-317: Pattern passed to match= contains metacharacters but is neither escaped nor raw

(RUF043)


[warning] 357-357: Pattern passed to match= contains metacharacters but is neither escaped nor raw

(RUF043)


[warning] 452-452: Boolean-typed positional argument in function definition

(FBT001)

🪛 zizmor (1.29.0)
.github/workflows/publish_typescript.yml

[warning] 32-32: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)

🔇 Additional comments (29)
.agents/skills/contribute-api/SKILL.md (1)

3-3: LGTM!

Also applies to: 23-24, 40-40

.agents/skills/maintain-ci/SKILL.md (1)

32-35: LGTM!

Also applies to: 49-53, 103-104

.agents/skills/maintain-packaging/SKILL.md (1)

3-3: LGTM!

Also applies to: 27-33, 66-69, 89-90, 109-113

.agents/skills/update-project-version/SKILL.md (1)

3-3: LGTM!

Also applies to: 40-41, 51-61, 70-80, 92-99, 108-108, 121-122

.agents/skills/validate-change/SKILL.md (1)

26-41: LGTM!

Also applies to: 63-65, 78-78, 95-99, 129-132

crates/fabric-core/src/config.rs (1)

1193-1199: LGTM!

crates/fabric-core/src/agent_execution.rs (1)

145-146: LGTM!

Also applies to: 177-209, 304-325

schemas/run-plan.schema.json (1)

108-175: LGTM!

Also applies to: 332-343, 611-621

schemas/adapter-contract/agent-config.schema.json (1)

170-180: LGTM!

schemas/adapter-contract/agent-run-result.schema.json (1)

33-50: LGTM!

typescript/adapter-contract/schemas/agent-config.schema.json (1)

170-180: LGTM!

typescript/adapter-contract/README.md (1)

12-32: LGTM!

Also applies to: 34-113

typescript/adapter-contract/package.json (1)

34-41: LGTM!

typescript/adapter-contract/schemas/agent-run-result.schema.json (1)

33-50: LGTM!

typescript/adapter-contract/scripts/generate.mjs (1)

95-97: LGTM!

typescript/adapter-contract/scripts/check-dependencies.mjs (1)

1-57: LGTM!

crates/fabric-core/src/agent_config.rs (1)

67-70: 🎯 Functional Correctness

Keep the current validation.

validate_config rejects blank provider and model values before AgentConfig projection. Runtime startup revalidates plan.config; the projected AgentConfig is serialized only.

			> Likely an incorrect or invalid review comment.
crates/fabric-core/src/schema.rs (1)

394-399: LGTM!

Also applies to: 429-429

typescript/adapter-contract/scripts/check-package.mjs (1)

175-175: LGTM!

typescript/adapter-contract/test/projection-guards.test.mjs (1)

30-34: LGTM!

scripts/ci/set_typescript_project_version.py (1)

13-19: LGTM!

tests/scripts/test_set_typescript_project_version.py (1)

19-21: LGTM!

Also applies to: 63-86, 89-123

scripts/ci/publish_typescript_package.py (2)

17-97: LGTM!

Also applies to: 100-181, 213-278


238-247: 🩺 Stability & Availability

No change needed. The release workflow accepts only stable, beta, and RC versions, and rejects unsupported prerelease labels before publication. The publisher can retain its fail-closed behavior for an unsupported registry dist-tag version.

tests/scripts/test_publish_typescript_package.py (1)

104-118: LGTM!

Also applies to: 161-186, 241-266, 369-438, 441-456

justfile (1)

311-325: LGTM!

Also applies to: 327-328, 401-406

.github/workflows/publish_typescript.yml (1)

6-14: LGTM!

Also applies to: 20-44, 46-67, 109-119

RELEASING.md (1)

34-34: LGTM!

Also applies to: 151-155, 229-247, 381-381, 394-411, 449-458

typescript/adapter-contract/test/tsconfig.json (1)

1-3: 🗄️ Data Integrity & Integration

Keep the SPDX headers in both tsconfig files. The repository invokes these files through tsc, not a strict JSON parser.

			> Likely an incorrect or invalid review comment.

Comment thread .github/workflows/publish_typescript.yml
Comment thread .github/workflows/publish_typescript.yml Outdated
Comment thread .pre-commit-config.yaml Outdated
Comment thread RELEASING.md Outdated
Comment thread tests/scripts/test_publish_typescript_package.py Outdated
Comment thread tests/scripts/test_publish_typescript_package.py Outdated
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve
AjayThorve force-pushed the feat/publish-typescript-package branch from 416dc5c to d6ac027 Compare August 11, 2026 16:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
typescript/adapter-contract/README.md (1)

92-98: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Should fix: Use a complete lead-in sentence.

Line 92 uses the fragment “From this directory:”. Introduce the command block with a complete sentence.

Proposed fix
-From this directory:
+Run the following commands from this directory:

As per coding guidelines, “Introduce every code block with a complete sentence.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@typescript/adapter-contract/README.md` around lines 92 - 98, Update the prose
introducing the command block near the setup instructions to use a complete
lead-in sentence instead of the fragment “From this directory:”. Preserve the
existing npm commands and their order.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@RELEASING.md`:
- Around line 451-457: Update the TypeScript contract package verification step
in RELEASING.md to include commands that install the exact release version from
a clean directory, then run npm audit signatures. Keep the existing npm view
checks for version and dist-tags, and make the added commands executable for
validating registry signatures and provenance attestations.

In `@tests/scripts/test_publish_typescript_package.py`:
- Around line 160-183: Parameterize test_absent_package_publishes_and_verifies
to cover both latest and next tags, updating expected version and dist-tag
lookups plus the npm publish command from the selected tag. Preserve the
existing publish-and-verify assertions and ensure the next case verifies
dist-tags.next and publishes with --tag next.
- Around line 429-444: Update test_version_order to remove the boolean
positional parameter from its signature; parameterize each case as a single
typed value containing candidate, current, and expected ordering, then unpack it
inside the test before asserting _version_key results.

---

Outside diff comments:
In `@typescript/adapter-contract/README.md`:
- Around line 92-98: Update the prose introducing the command block near the
setup instructions to use a complete lead-in sentence instead of the fragment
“From this directory:”. Preserve the existing npm commands and their order.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 778b0d38-b696-420f-9bab-7ff2b2a491f0

📥 Commits

Reviewing files that changed from the base of the PR and between 416dc5c and d6ac027.

📒 Files selected for processing (12)
  • .agents/skills/update-project-version/SKILL.md
  • .github/workflows/publish_typescript.yml
  • .pre-commit-config.yaml
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • scripts/lint/check_copyright.py
  • tests/scripts/test_publish_typescript_package.py
  • typescript/adapter-contract/README.md
  • typescript/adapter-contract/scripts/check-dependencies.mjs
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
  • GitHub Check: Preview docs
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (29)
**/*

📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)

**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.

**/*: Always spell NVIDIA in all caps; do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names with NVIDIA on first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...

Files:

  • scripts/lint/check_copyright.py
  • typescript/adapter-contract/README.md
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • typescript/adapter-contract/scripts/check-dependencies.mjs
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • tests/scripts/test_publish_typescript_package.py
  • crates/fabric-core/src/schema.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For native binding changes, run cargo check -p fabric-python --locked.

Files:

  • scripts/lint/check_copyright.py
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • tests/scripts/test_publish_typescript_package.py
  • crates/fabric-core/src/schema.rs
**/*.{md,mdx,yml,py,rs,sh}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.

Files:

  • scripts/lint/check_copyright.py
  • typescript/adapter-contract/README.md
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • tests/scripts/test_publish_typescript_package.py
  • crates/fabric-core/src/schema.rs
**/*.{py,pyi}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*.{py,pyi}: When Python code or a Python-facing adapter changes, run just test-python.
For Python SDK or PyO3 binding changes, use python-tests, run focused pytest tests first, then just test-python; rebuild with just build-python when native code or packaging changes.

Files:

  • scripts/lint/check_copyright.py
  • tests/scripts/test_publish_typescript_package.py
**/*.{rs,py,pyi,toml}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • scripts/lint/check_copyright.py
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • tests/scripts/test_publish_typescript_package.py
  • crates/fabric-core/src/schema.rs
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.py: Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.
Python files must use the specified two-line SPDX header with Python comments.

Files:

  • scripts/lint/check_copyright.py
  • tests/scripts/test_publish_typescript_package.py
**/*.{rs,py,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py,ts,tsx}: Use snake_case for Rust and Python functions and variables, and PascalCase for Rust, Python, and TypeScript types.
Run tests for every language surface affected by a change; changes to the Rust core or public adapter-contract schemas require Rust, Python, and TypeScript test suites.
When adding functionality, include tests in the corresponding Rust crate or relevant tests/ area.
Public contract changes must keep checked-in JSON Schema snapshots, Python representations, and generated TypeScript declarations synchronized.

Files:

  • scripts/lint/check_copyright.py
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • tests/scripts/test_publish_typescript_package.py
  • crates/fabric-core/src/schema.rs
**/*.{rs,py,js,ts,tsx,html,md,mdx,toml,yaml,yml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include the project SPDX copyright and Apache-2.0 license header using the comment syntax appropriate to the file type.

Files:

  • scripts/lint/check_copyright.py
  • typescript/adapter-contract/README.md
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • RELEASING.md
  • crates/fabric-core/src/agent_config.rs
  • tests/scripts/test_publish_typescript_package.py
  • crates/fabric-core/src/schema.rs
**/*.{md,mdx,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values; use numerals for 10 or greater and commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.

**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
**/*.{md,rst,txt,adoc}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)

**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 12:30 to 1:00 p.m. for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on first use, typically in the title and H1; use NeMo Fabric thereafter. Use fabric alone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
Capitalize NVIDIA correctly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such as here, and use repository-relative .mdx paths for links within docs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Use after instead of once when expressing temporal sequence, and use can rather than may when describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead with Must fix, Should fix, and Nice to have categories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.

Update documentation and examples in the same branch as the public API change.

Update SDK/API references, embedded examples, integration documentation, and adapter-support notes when public behavior or related surfaces change.

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
typescript/adapter-contract/**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep the TypeScript southbound adapter contract current when the API changes.

Files:

  • typescript/adapter-contract/README.md
  • typescript/adapter-contract/scripts/check-dependencies.mjs
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update the relevant README when changes affect the public workspace, supported adapters, adapter surfaces, or examples.

Files:

  • typescript/adapter-contract/README.md
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

HTML and Markdown files must use the specified SPDX header comment.

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercase fabric CLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.

Files:

  • typescript/adapter-contract/README.md
  • RELEASING.md
.github/workflows/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

.github/workflows/*.{yml,yaml}: Define permissions: on each job that needs token access, avoid workflow-level permissions unless centralized inheritance is intentionally documented, and grant each job only its minimum required permissions.
Pin every third-party action to a full commit SHA and retain a readable version comment after the SHA.
Prefer action-native or ecosystem-native caching over generic actions/cache.
Tie cache invalidation to lockfiles, dependency manifests, or explicit tool versions; for uv, prefer astral-sh/setup-uv with cache-dependency-glob anchored to uv.lock, and for Rust prefer Swatinem/rust-cache with explicit shared-key and workspaces.
Do not cache generated outputs that can conceal stale behavior unless the repository deliberately relies on that cache.
Keep deploy and publish permissions isolated to the jobs that need them.
When using workflow_call, inspect both the caller and callee; callers must grant every permission required by called jobs because callees cannot elevate caller permissions.
Use contents: read as the minimum default for checkout-based build, test, documentation, and packaging jobs.
Grant pull-requests: read only to jobs that require pull-request metadata lookup.
Limit pages: write to Pages deployment jobs and callers that invoke those jobs through reusable workflows.
Limit id-token: write to jobs exchanging GitHub OIDC tokens with protected deployment targets, including Pages deployment and protected npm publication jobs.
Keep Python, Rust, and documentation jobs aligned with their lockfiles and corresponding justfile recipes.
Keep local commands aligned with equivalent justfile recipes.
Keep concurrency settings, branch and tag filters, and documentation publication guards consistent with repository intent.
Keep tag filters, prerelease normalization, and publication behavior aligned with RELEASING.md.
Before editing workflows, inspect the workflow graph for uses:, permissions:, `secr...

Files:

  • .github/workflows/publish_typescript.yml
.github/workflows/publish_typescript.yml

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

Publish the TypeScript contract through the protected npmjs environment, grant id-token: write for npm trusted publishing, and do not provide an npm write token that could mask an OIDC configuration failure.

Use npm trusted publishing through the protected npmjs environment.

Files:

  • .github/workflows/publish_typescript.yml
**/{.github/workflows/*,Cargo.toml,Cargo.lock,package.json,package-lock.json,pyproject.toml,uv.lock}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

For CI or packaging changes, use maintain-ci or maintain-packaging, then run recipes and checks whose behavior changed.

Files:

  • .github/workflows/publish_typescript.yml
.agents/skills/**

📄 CodeRabbit inference engine (.agents/skills/README.md)

.agents/skills/**: Maintainer skills must be discoverable from .agents/skills/; Claude Code exposes the same set through .claude/skills without mixing in consumer skills.
Keep consumer-facing integration guidance in the top-level skills/ directory and exclude it from the maintainer skill set.

Files:

  • .agents/skills/update-project-version/SKILL.md
.agents/skills/*/

📄 CodeRabbit inference engine (.agents/skills/README.md)

Use descriptive, task-based names for maintainer skill directories, such as contribute-api or validate-change.

Files:

  • .agents/skills/update-project-version/SKILL.md
.agents/skills/**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

Use maintainer skills under .agents/skills/ for repository-internal API, documentation, testing, CI, packaging, release, and PR contribution guidance.

Files:

  • .agents/skills/update-project-version/SKILL.md
**/*.{rs,toml}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For any Rust change, run just test-rust and cargo fmt --all -- --check.

For Rust core, CLI, or shared runtime semantic changes, run Rust formatting and tests; add Python tests when behavior is exposed through the SDK and run relevant CLI tests.

Files:

  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/schema.rs
crates/fabric-core/**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes under crates/fabric-core must run both the Rust and Python test suites.

Files:

  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/schema.rs
crates/fabric-core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

For Rust API reference changes, update Rust documentation comments under crates/fabric-core/ instead of generated API reference files.

If crates/fabric-core changes in a way exposed through Python, run both the Rust and Python suites.

Files:

  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/schema.rs
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Start implementation from the shared Rust core behavior first.

When Rust code changes, run cargo fmt --all -- --check and just test-rust.

**/*.rs: Format Rust code with cargo fmt --all, verify formatting with cargo fmt --all -- --check, and run cargo check --workspace --locked for core runtime, CLI, and native extension changes.
Rust files must use the specified two-line SPDX header with Rust comments.

Files:

  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/schema.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/agent_config.rs
  • crates/fabric-core/src/schema.rs
RELEASING.md

📄 CodeRabbit inference engine (AGENTS.md)

Keep release policy and the end-to-end maintainer workflow in RELEASING.md; do not move release-history policy into user-facing documentation or add a duplicate CHANGELOG.md.

Files:

  • RELEASING.md
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use pytest to run Python tests.
Do not add @pytest.mark.asyncio to tests; async tests are automatically detected by the async runner.
Do not add -> None return type annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or AsyncMock, using the spec argument when necessary, rather than defining a new class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it once in conftest.py rather than repeating it.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a <fixture_name>_fixture function; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its returned value is unused or it returns no value.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as using results["data"] instead of results.get("data").
When adapter installation metadata changes, packaging metadata tests must directly assert that the root project depends unconditionally on the exact-version nemo-fabric-runtime distribution.
Packaging metadata tests must verify that each root harness extra delegates to the matching version of the leaf adapter's harness extra.
Packaging metadata tests must verify that bare leaf dependencies remain adapter-owned and that the root adapter-tests dependency group installs each leaf through its harness extra.
Packaging metadata tests must verify that every leaf provides full; only adapters importing NeMo Relay Python APIs provide relay, while adapters using an external Relay executable have full equal to harness.

Files:

  • tests/scripts/test_publish_typescript_package.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/scripts/test_publish_typescript_package.py
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Determine whether the CLI, PyO3 binding, Python SDK, type stubs, schemas, or Python and TypeScript adapter-contract bindings must expose a new or changed public API surface.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Keep every affected public API surface in parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Clearly describe the public behavior.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Cover every affected public surface.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Ensure the validation matrix matches the changed public surfaces.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Explain the user-facing change in pull request notes.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:14.307Z
Learning: Keep changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:48.390Z
Learning: For prerelease or build-metadata releases, use valid Cargo SemVer and equivalent PEP 440 Python metadata; ensure Maturin-built and setuptools-built packages resolve to equivalent versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:48.390Z
Learning: Use `just set-version <cargo-version>` to update release metadata and lockfiles rather than performing blind repository-wide replacement.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:48.390Z
Learning: When modifying version-update helpers, keep their contracts aligned: invoke Cargo, Python, and TypeScript helpers; recursively process adapter manifests; validate Cargo metadata; reject a static runtime version; preserve dependency versions; and run `just lock-python`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:48.390Z
Learning: Audit old-version references with targeted searches and distinguish package-version surfaces from examples and unrelated dependency versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:48.390Z
Learning: Validate version changes with targeted metadata searches, `cargo check --workspace --locked`, `just build-python`, `just wheels`, `just pack-typescript`, and `git diff --check`; run `just test-python` when integration or packaging behavior changes materially.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:47:48.390Z
Learning: Do not update only Cargo metadata, add a literal runtime Python version, omit exact internal pins or lockfiles, update the TypeScript manifest without its npm lockfile entry, or blindly replace version-like strings.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:10.168Z
Learning: Use branch prefixes `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:10.168Z
Learning: Name branches after the work and never include Linear ticket IDs or slugs.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:10.168Z
Learning: Use signed-off commits for pull request work with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:10.168Z
Learning: When creating a pull request from the current branch, target the upstream repository rather than a fork.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:10.168Z
Learning: If repository-local PR guidance conflicts with generic GitHub connector or plugin guidance, follow the repository-local guidance for PR body format and review handoff details.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:10.168Z
Learning: PR descriptions must state what changed, why it changed, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:21.135Z
Learning: Release tags must use SemVer with a leading `v`, such as `v0.1.0` or `v0.1.0-rc.1`; tags without the leading `v` are invalid.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:21.135Z
Learning: All contributions must include DCO sign-off; contributors should commit with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:21.135Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:21.135Z
Learning: Pull requests require at least one approving review and passing CI before merge.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:21.135Z
Learning: Do not force-push during review; address review feedback with additional commits.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:48:21.135Z
Learning: Commit messages must use `type: short description`, use one of the documented types, and keep the first line under 72 characters.
🪛 ast-grep (0.45.1)
tests/scripts/test_publish_typescript_package.py

[info] 46-55: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
[
{
"name": PACKAGE,
"version": version,
"integrity": INTEGRITY,
"filename": filename,
}
]
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)

🪛 LanguageTool
RELEASING.md

[uncategorized] ~383-~383: The official name of this software platform is spelled with a capital “H”.
Context: ...ml) | For RC, beta and release tags | | [.github/workflows/publish_typescript.yml](.git...

(GITHUB)

🪛 Ruff (0.16.1)
tests/scripts/test_publish_typescript_package.py

[warning] 440-440: Boolean-typed positional argument in function definition

(FBT001)

🪛 zizmor (1.29.0)
.github/workflows/publish_typescript.yml

[warning] 32-32: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)

🔇 Additional comments (9)
crates/fabric-core/src/runtime.rs (1)

561-561: 📐 Maintainability & Code Quality

Verify the required Rust core validation.

The supplied validation evidence does not show the required checks for these Rust core changes. Run and report cargo fmt --all -- --check, cargo check --workspace --locked, just test-rust, and just test-python.

  • crates/fabric-core/src/runtime.rs#L561-L561: validate runtime startup behavior.
  • crates/fabric-core/src/agent_config.rs#L246-L319: validate projected configuration rejection paths.
  • crates/fabric-core/src/config.rs#L2426-L2429: validate telemetry provider selection.
  • crates/fabric-core/src/schema.rs#L357-L373: validate schema parity behavior.

As per coding guidelines, Rust changes require formatting and Rust tests. As per path instructions, changes under crates/fabric-core must run both Rust and Python test suites.

Sources: Coding guidelines, Path instructions

typescript/adapter-contract/scripts/check-dependencies.mjs (1)

15-15: LGTM!

Also applies to: 43-55

.agents/skills/update-project-version/SKILL.md (2)

3-3: LGTM!

Also applies to: 20-47, 84-91, 100-100, 108-108, 121-122


51-63: 🗄️ Data Integrity & Integration

No implementation change required. The documented workflow matches the implementation, including TypeScript manifest and lockfile updates without dependency changes, and the just lock-python step.

.pre-commit-config.yaml (1)

12-12: LGTM!

scripts/lint/check_copyright.py (1)

79-89: LGTM!

Also applies to: 98-99

.github/workflows/publish_typescript.yml (1)

1-123: LGTM!

tests/scripts/test_publish_typescript_package.py (1)

1-118: LGTM!

Also applies to: 121-157, 186-426

RELEASING.md (1)

27-34: LGTM!

Also applies to: 191-249, 375-413

Comment thread RELEASING.md
Comment thread tests/scripts/test_publish_typescript_package.py Outdated
Comment thread tests/scripts/test_publish_typescript_package.py
Signed-off-by: Ajay Thorve <athorve@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@RELEASING.md`:
- Around line 457-463: Wrap the temporary verification commands in RELEASING.md,
including verification_dir setup, trap, cd, npm init, npm install, and npm audit
signatures, in a subshell configured with set -euo pipefail. Keep cleanup scoped
to that subshell so failed mktemp or cd commands cannot run npm in the checkout
or alter the caller’s working directory.
- Around line 457-463: Update the post-release verification commands in the
documented npm check to pass both the generic npmjs registry and the `@nvidia`
scope-specific npmjs registry to each npm command, including npm init, npm
install, and npm audit signatures.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 8e4e7ad7-7d36-40f4-8a9e-1e036c1ca02d

📥 Commits

Reviewing files that changed from the base of the PR and between d6ac027 and 6b24b22.

📒 Files selected for processing (2)
  • RELEASING.md
  • tests/scripts/test_publish_typescript_package.py
📜 Review details
⏰ Context from checks skipped due to timeout. (9)
  • GitHub Check: Preview docs
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (15)
**/*

📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)

**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.

**/*: Always spell NVIDIA in all caps; do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names with NVIDIA on first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...

Files:

  • tests/scripts/test_publish_typescript_package.py
  • RELEASING.md
**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For native binding changes, run cargo check -p fabric-python --locked.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/*.{md,mdx,yml,py,rs,sh}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.

Files:

  • tests/scripts/test_publish_typescript_package.py
  • RELEASING.md
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use pytest to run Python tests.
Do not add @pytest.mark.asyncio to tests; async tests are automatically detected by the async runner.
Do not add -> None return type annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or AsyncMock, using the spec argument when necessary, rather than defining a new class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it once in conftest.py rather than repeating it.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a <fixture_name>_fixture function; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its returned value is unused or it returns no value.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as using results["data"] instead of results.get("data").
When adapter installation metadata changes, packaging metadata tests must directly assert that the root project depends unconditionally on the exact-version nemo-fabric-runtime distribution.
Packaging metadata tests must verify that each root harness extra delegates to the matching version of the leaf adapter's harness extra.
Packaging metadata tests must verify that bare leaf dependencies remain adapter-owned and that the root adapter-tests dependency group installs each leaf through its harness extra.
Packaging metadata tests must verify that every leaf provides full; only adapters importing NeMo Relay Python APIs provide relay, while adapters using an external Relay executable have full equal to harness.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/*.{rs,py,ts,tsx}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

**/*.{rs,py,ts,tsx}: Start from the shared Rust core behavior first when contributing a public API addition or behavior change.
Determine whether the CLI, PyO3 binding, Python SDK, type stubs, schemas, or Python and TypeScript adapter-contract bindings must expose the new public surface.

**/*.{rs,py,ts,tsx}: Use language-appropriate naming conventions: Rust and Python functions and variables use snake_case; Rust, Python, and TypeScript types use PascalCase; TypeScript contract properties preserve wire snake_case names.
When changing the Rust core or public adapter-contract schemas, run the Rust, Python, and TypeScript test suites because the bindings depend on the generated wire contract.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/*.{py,pyi,ts,tsx}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Maintain parity for Python SDK, Python type stubs, and Python/TypeScript adapter-contract bindings when they are affected by a new API surface.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/*.{py,rs}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

Keep Python and Rust CI jobs aligned with their lockfiles and corresponding justfile recipes.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/*.{py,pyi}

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

When changing version-helper code, set_python_project_versions must update the root setuptools version, recursively discovered adapter manifests, and all internal exact-version pins while rejecting a static version in python/pyproject.toml.

Run just test-python when Python code or a Python-facing adapter changes.

Python public APIs must use type annotations, and native binding declarations must remain synchronized with their Rust implementations.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/{tests,*/tests}/**/*.{rs,py,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

When adding functionality, include tests in the corresponding Rust crate or relevant area under tests/. Keep JSON Schema snapshots, Python representations, and generated TypeScript declarations synchronized for public contract changes.

Files:

  • tests/scripts/test_publish_typescript_package.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/scripts/test_publish_typescript_package.py
**/*.{md,mdx,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values; use numerals for 10 or greater and commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.

**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...

Files:

  • RELEASING.md
**/*.{md,rst,txt,adoc}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)

**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 12:30 to 1:00 p.m. for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...

Files:

  • RELEASING.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on first use, typically in the title and H1; use NeMo Fabric thereafter. Use fabric alone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
Capitalize NVIDIA correctly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such as here, and use repository-relative .mdx paths for links within docs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Use after instead of once when expressing temporal sequence, and use can rather than may when describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead with Must fix, Should fix, and Nice to have categories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.

Update documentation and examples in the same branch as the public API change.

Documentation and examples must use the current install, import, and build commands.

Changes affecting public behavior, adapters, examples, or workspace structure must update the corresponding documentation.

Files:

  • RELEASING.md
RELEASING.md

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Reflect public packaging changes, release tags, registry publication, and release-facing commands in the release documentation.

Keep release policy and the end-to-end maintainer workflow in RELEASING.md.

Files:

  • RELEASING.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercase fabric CLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.

Files:

  • RELEASING.md
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:44.520Z
Learning: Keep every affected public surface in parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:44.520Z
Learning: Public behavior must be clearly described.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:44.520Z
Learning: Every affected public surface must be covered.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:44.520Z
Learning: The validation matrix must match the changed surfaces.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:44.520Z
Learning: PR notes must explain the user-facing change.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:55.301Z
Learning: Keep changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:55:55.301Z
Learning: If local lint passes but GitHub authorization remains uncertain, inspect GitHub's permission model and the upstream action or reusable-workflow source rather than assuming local success proves remote success.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:18.320Z
Learning: Validate version changes with targeted metadata searches, `cargo check --workspace --locked`, Python build/package checks, applicable integration tests, wheel and TypeScript packaging checks, and `git diff --check`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:38.243Z
Learning: Use branch prefixes `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:38.243Z
Learning: Name branches after the work and never include Linear ticket IDs or slugs in branch names.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:38.243Z
Learning: Use Conventional Commit PR titles in the form `<type>: <summary>`; reserve `fix` for actual product bugs, not CI, documentation, or chores.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:38.243Z
Learning: Use signed-off commits for pull request work with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:38.243Z
Learning: When creating a pull request from the current branch, target the upstream repository rather than a fork.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:38.243Z
Learning: PR descriptions must state what changed, why, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:46.576Z
Learning: Release tags must use SemVer with a leading `v`; tags such as `0.1.0` and `0.1.0-rc.1` are prohibited.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:46.576Z
Learning: All contributors must sign off commits with `git commit -s`; commits without DCO sign-off will not be accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:46.576Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:46.576Z
Learning: Pull requests require at least one approving review and passing CI before merge; do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-08-11T16:56:46.576Z
Learning: Commit messages must use `type: short description`, use one of the documented types, and keep the first line under 72 characters.
🔇 Additional comments (1)
tests/scripts/test_publish_typescript_package.py (1)

95-102: LGTM!

Also applies to: 161-186, 435-450

Comment thread RELEASING.md Outdated
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve AjayThorve changed the title ci: publish TypeScript contract to npm feat: add and publish TypeScript adapter contract Aug 11, 2026
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
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.

1 participant