Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion .github/workflows/ci_typescript.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,35 @@ jobs:
tool: just@1.50.0

- name: Test TypeScript contract package
run: just test-typescript
run: just test-typescript-contract

test-adapters:
name: Test adapters (Node ${{ matrix.node-version }})
runs-on: ubuntu-24.04
timeout-minutes: 20
permissions:
contents: read
strategy:
fail-fast: false
matrix:
node-version: ['22.19.0', '24']
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false

- name: Set up Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: ${{ matrix.node-version }}
cache: npm
cache-dependency-path: adapters/typescript/package-lock.json

- name: Install just
uses: taiki-e/install-action@c070f87102a1c75b3183910f391c1cb887fe13c8 # v2.77.6
with:
tool: just@1.50.0

- name: Test TypeScript adapter packages
run: just test-typescript-adapters
131 changes: 131 additions & 0 deletions .github/workflows/publish_typescript_adapters.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

name: Publish TypeScript adapter package

on:
push:
tags:
- 'npm/nemo-fabric-adapters-common/v*'
- 'npm/nemo-fabric-adapters-pi/v*'

concurrency:
group: publish-typescript-adapter-${{ github.ref }}
cancel-in-progress: false

defaults:
run:
shell: bash

jobs:
publish-typescript-adapter:
name: Publish adapter (npmjs.com)
runs-on: ubuntu-24.04
timeout-minutes: 25
permissions:
contents: read
id-token: write # Required for npm trusted-publishing OIDC token issuance.
environment: npmjs
Comment thread
coderabbitai[bot] marked this conversation as resolved.
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false

- name: Verify release tag
id: source
env:
RELEASE_REF: ${{ github.ref }}
run: |
set -euo pipefail
if [[ "$RELEASE_REF" != refs/tags/* ]]; then
echo "Release ref must be a tag: ${RELEASE_REF}" >&2
exit 1
fi
release_tag="${RELEASE_REF#refs/tags/}"
tag_commit="$(git rev-parse --verify "refs/tags/${release_tag}^{commit}")"
head_commit="$(git rev-parse HEAD)"
if [[ "$tag_commit" != "$head_commit" ]]; then
echo "Release tag ${release_tag} does not match the checked-out commit" >&2
exit 1
fi
echo "tag=${release_tag}" >> "$GITHUB_OUTPUT"

- name: Set up Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: '24'
package-manager-cache: false

- name: Install just
uses: taiki-e/install-action@c070f87102a1c75b3183910f391c1cb887fe13c8 # v2.77.6
with:
tool: just@1.50.0

- name: Validate trusted publishing toolchain
run: |
set -euo pipefail
node --version
npm_version="$(npm --version)"
echo "$npm_version"
NPM_VERSION="$npm_version" node <<'NODE'
const actual = process.env.NPM_VERSION.split('.').map(Number);
const minimum = [11, 5, 1];
const comparison = actual.findIndex(
(part, index) => part !== minimum[index],
);
if (
actual.length !== minimum.length ||
actual.some(Number.isNaN) ||
(comparison !== -1 && actual[comparison] < minimum[comparison])
) {
throw new Error('npm 11.5.1 or newer is required for trusted publishing');
}
NODE

- name: Resolve package release
id: release
env:
RELEASE_TAG: ${{ steps.source.outputs.tag }}
run: |
set -euo pipefail
case "$RELEASE_TAG" in
npm/nemo-fabric-adapters-common/v*) package_name="nemo-fabric-adapters-common" ;;
npm/nemo-fabric-adapters-pi/v*) package_name="nemo-fabric-adapters-pi" ;;
*) echo "Unsupported TypeScript adapter tag: $RELEASE_TAG" >&2; exit 1 ;;
esac
version="$(python3 scripts/ci/normalize_release_tag.py "${RELEASE_TAG##*/}")"
if [[ "$version" == *+* ]]; then
echo "npm publication does not support build metadata: $version" >&2
exit 1
fi
case "$version" in
*-alpha*) dist_tag="alpha" ;;
*-beta*|*-rc*) dist_tag="next" ;;
*-*) echo "Unsupported npm prerelease: $version" >&2; exit 1 ;;
*) dist_tag="latest" ;;
esac
python3 scripts/ci/set_typescript_adapter_version.py "$package_name" "$version"
package_directory="adapters/typescript/${package_name##nemo-fabric-adapters-}"
{
echo "package_name=$package_name"
echo "package_directory=$package_directory"
echo "version=$version"
echo "dist_tag=$dist_tag"
} >> "$GITHUB_OUTPUT"

- name: Test adapter packages
Comment thread
AnuradhaKaruppiah marked this conversation as resolved.
run: just test-typescript-adapters

- name: Preflight and publish adapter package
env:
NPM_CONFIG_REGISTRY: https://registry.npmjs.org
RELEASE_VERSION: ${{ steps.release.outputs.version }}
RELEASE_DIST_TAG: ${{ steps.release.outputs.dist_tag }}
PACKAGE_DIRECTORY: ${{ steps.release.outputs.package_directory }}
run: |
set -euo pipefail
python3 scripts/ci/publish_typescript_package.py \
--package-directory "$PACKAGE_DIRECTORY" \
--version "$RELEASE_VERSION" \
--dist-tag "$RELEASE_DIST_TAG"
7 changes: 5 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

# Generated agent-skill artifacts are managed independently and must not trigger repository checks.
exclude: '^skills/[^/]+/(?:BENCHMARK\.md|skill-card\.md|skill\.oms\.sig)$'

repos:
# SPDX copyright header check
- repo: local
Expand Down Expand Up @@ -64,13 +67,13 @@ repos:
name: ATTRIBUTIONS-Node.md (TypeScript package-lock.json)
entry: bash scripts/generate_attributions.sh node
language: system
files: '^(adapter-contract/typescript/package-lock\.json|ATTRIBUTIONS-Node\.md)$'
files: '^(adapter-contract/typescript/package-lock\.json|adapters/typescript/package-lock\.json|ATTRIBUTIONS-Node\.md)$'
pass_filenames: false

- id: license-diff
name: Dependency license diff
entry: uv run --no-project python scripts/licensing/license_diff.py --base-ref HEAD
language: system
files: '(^|/)(Cargo\.toml|Cargo\.lock|pyproject\.toml|uv\.lock)$|^adapter-contract/typescript/package(?:-lock)?\.json$'
files: '(^|/)(Cargo\.toml|Cargo\.lock|pyproject\.toml|uv\.lock)$|^(adapter-contract/typescript|adapters/typescript(?:/[^/]+)?)/package(?:-lock)?\.json$'
pass_filenames: false
verbose: false
Loading
Loading