Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
02f1ecc
ci(openshell): enable trusted SDK package reads
apurvvkumaria Aug 26, 2026
6d16a8a
test(ci): enforce package permission values
apurvvkumaria Aug 26, 2026
3d57390
fix(ci): isolate SDK package credentials
apurvvkumaria Aug 26, 2026
3f3d318
Merge remote-tracking branch 'origin/main' into codex/9872-sdk-ci-boo…
apurvvkumaria Aug 26, 2026
56c3cd8
fix(ci): complete SDK package isolation
apurvvkumaria Aug 26, 2026
6016736
fix(ci): restrict reviewed SDK artifacts
apurvvkumaria Aug 26, 2026
24c6fe9
fix(ci): allow SDK workflow bootstrap
apurvvkumaria Aug 26, 2026
8f28226
fix(ci): validate reviewed package specs
apurvvkumaria Aug 26, 2026
2da330a
fix(ci): validate exact package semver
apurvvkumaria Aug 26, 2026
1468a45
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 26, 2026
c9b48f7
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 26, 2026
91d86c7
chore(ci): format value stream analyzer
apurvvkumaria Aug 26, 2026
9948e8c
fix(ci): validate npm cache implementation version
apurvvkumaria Aug 26, 2026
18a71ff
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 26, 2026
78f31f7
fix(ci): support managed-image npm cache
apurvvkumaria Aug 26, 2026
69cfec6
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 27, 2026
1ac4d14
test(ci): keep SDK workflow checks on balanced shard
apurvvkumaria Aug 27, 2026
12aac4d
merge: resolve conflicts with main
github-actions[bot] Aug 27, 2026
c962660
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 27, 2026
40678a8
fix(ci): close SDK package readiness gaps
apurvvkumaria Aug 27, 2026
3249a5d
fix(ci): stage reviewed SDK with npm
apurvvkumaria Aug 27, 2026
25a339e
test(ci): make SDK package coverage self-contained
apurvvkumaria Aug 27, 2026
20ad4ab
fix(ci): make SDK artifact recovery reliable
apurvvkumaria Aug 27, 2026
2caf010
fix(ci): recover reviewed SDK artifacts
apurvvkumaria Aug 27, 2026
afb99dc
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 27, 2026
63d2599
fix(ci): report package failures without test timeouts
apurvvkumaria Aug 27, 2026
38fe780
fix(ci): cancel stale SDK package runs
apurvvkumaria Aug 27, 2026
1e2153a
fix(ci): keep package diagnostics dependency-free
apurvvkumaria Aug 27, 2026
21fe927
merge: resolve conflicts with main
github-actions[bot] Aug 27, 2026
3a83843
Merge remote-tracking branch 'origin/codex/9872-sdk-ci-bootstrap' int…
apurvvkumaria Aug 27, 2026
a6a97c6
fix(ci): report SDK workflow lookup failures
apurvvkumaria Aug 27, 2026
2d35ca2
fix(ci): explain SDK package wait recovery
apurvvkumaria Aug 27, 2026
637d5ea
fix(ci): isolate SDK package metadata runs
apurvvkumaria Aug 27, 2026
52eb46c
merge(main): refresh SDK CI bootstrap
apurvvkumaria Aug 27, 2026
08d60dd
fix(e2e): build changed OpenClaw base image
apurvvkumaria Aug 28, 2026
6ba1f67
fix(e2e): exercise candidate base image
apurvvkumaria Aug 28, 2026
e06966c
Merge remote-tracking branch 'origin/main' into codex/9872-sdk-ci-boo…
apurvvkumaria Aug 28, 2026
34cbb71
test(e2e): check external gateway SDK health
apurvvkumaria Aug 28, 2026
753c169
test(e2e): map external health fast coverage
apurvvkumaria Aug 28, 2026
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
2 changes: 2 additions & 0 deletions .github/actions/ci-build-typecheck/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ runs:

- name: Install dependencies
shell: bash
env:
NODE_AUTH_TOKEN: ${{ github.event_name == 'push' && github.token || '' }}
run: bash "$GITHUB_ACTION_PATH/../ci-install-dependencies.sh"

- name: Build TypeScript plugin
Expand Down
4 changes: 3 additions & 1 deletion .github/actions/ci-cli-coverage-merge/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ runs:

- name: Install dependencies
shell: bash
run: npm install --ignore-scripts
env:
NODE_AUTH_TOKEN: ${{ github.event_name == 'push' && github.token || '' }}
run: bash "$GITHUB_ACTION_PATH/../ci-install-dependencies.sh"

- name: Download compiled CLI artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down
2 changes: 2 additions & 0 deletions .github/actions/ci-cli-coverage-shard/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ runs:

- name: Install dependencies
shell: bash
env:
NODE_AUTH_TOKEN: ${{ github.event_name == 'push' && github.token || '' }}
run: bash "$GITHUB_ACTION_PATH/../ci-install-dependencies.sh"

- name: Validate changed live E2E mock parity
Expand Down
56 changes: 54 additions & 2 deletions .github/actions/ci-install-dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,57 @@

set -euo pipefail

npm ci --ignore-scripts
npm --prefix nemoclaw ci --ignore-scripts
candidate_npmrc="$(find . -path './.git' -prune -o -name .npmrc -print -quit)"
if [ -n "$candidate_npmrc" ]; then
echo "Candidate repository npm configuration is not allowed during trusted dependency installation." >&2
exit 1
fi

Comment thread
coderabbitai[bot] marked this conversation as resolved.
for shrinkwrap in npm-shrinkwrap.json nemoclaw/npm-shrinkwrap.json; do
if [ -e "$shrinkwrap" ]; then
echo "Candidate npm shrinkwrap files are not allowed during trusted dependency installation." >&2
exit 1
fi
done

event_name="${GITHUB_EVENT_NAME:-local}"
package_mode="registry"
if [ "$event_name" = "pull_request" ]; then
package_mode="artifact"
if [ -n "${NODE_AUTH_TOKEN:-}" ]; then
echo "Pull request dependency installation must not receive a package credential." >&2
exit 1
fi
fi

target_root="$(pwd -P)"
trusted_root="$(cd "$(dirname "$0")/../.." && pwd -P)"
npm_cache="${NPM_CONFIG_CACHE:-${RUNNER_TEMP:-$target_root/.ci-cache}/npm}"
mkdir -p "$npm_cache"

NEMOCLAW_CI_NPM_CACHE="$npm_cache" \
NEMOCLAW_CI_NPM_PACKAGE_MODE="$package_mode" \
NEMOCLAW_CI_TARGET_ROOT="$target_root" \
NEMOCLAW_OPEN_SHELL_SDK_ARTIFACT_DIRECTORY="${RUNNER_TEMP:-$target_root/.ci-artifacts}/openshell-sdk" \
node --experimental-strip-types "$trusted_root/scripts/checks/prepare-ci-npm-install.mts"

trusted_npmrc=""
cleanup() {
if [ -n "$trusted_npmrc" ]; then
rm -f "$trusted_npmrc"
fi
}
trap cleanup EXIT

if [ "$package_mode" = "registry" ] && [ -n "${NODE_AUTH_TOKEN:-}" ]; then
trusted_npmrc="${RUNNER_TEMP:-$target_root/.ci-cache}/trusted-npmrc"
mkdir -p "$(dirname "$trusted_npmrc")"
umask 077
printf '%s\n' \
'@nvidia:registry=https://npm.pkg.github.com' \
"//npm.pkg.github.com/:_authToken=\${NODE_AUTH_TOKEN}" >"$trusted_npmrc"
export NPM_CONFIG_USERCONFIG="$trusted_npmrc"
fi

npm ci --ignore-scripts --prefer-offline --cache "$npm_cache"
npm --prefix nemoclaw ci --ignore-scripts --prefer-offline --cache "$npm_cache"
2 changes: 2 additions & 0 deletions .github/actions/ci-installer-integration/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ runs:

- name: Install dependencies
shell: bash
env:
NODE_AUTH_TOKEN: ${{ github.event_name == 'push' && github.token || '' }}
run: bash "$GITHUB_ACTION_PATH/../ci-install-dependencies.sh"

- name: Build installer integration artifacts
Expand Down
2 changes: 2 additions & 0 deletions .github/actions/ci-plugin-coverage/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ runs:

- name: Install dependencies
shell: bash
env:
NODE_AUTH_TOKEN: ${{ github.event_name == 'push' && github.token || '' }}
run: bash "$GITHUB_ACTION_PATH/../ci-install-dependencies.sh"

- name: Run plugin coverage
Expand Down
11 changes: 6 additions & 5 deletions .github/actions/ci-static-checks/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ runs:
with:
node-version: "22"
cache: npm
cache-dependency-path: |
package-lock.json
nemoclaw/package-lock.json

- name: Install base-trusted createRequire verifier dependencies
shell: bash
Expand All @@ -33,13 +36,11 @@ runs:
[ "$HADOLINT_SHA256" = "$ACTUAL" ] || { echo "::error::hadolint checksum mismatch"; exit 1; }
chmod +x /usr/local/bin/hadolint

- name: Validate sandbox payload lockfile
shell: bash
run: npm --prefix nemoclaw ci --ignore-scripts --dry-run

- name: Install dependencies
shell: bash
run: npm install --ignore-scripts
env:
NODE_AUTH_TOKEN: ${{ github.event_name == 'push' && github.token || '' }}
run: bash "$GITHUB_ACTION_PATH/../ci-install-dependencies.sh"

- name: Verify reviewed runtime bundles
shell: bash
Expand Down
14 changes: 14 additions & 0 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ concurrency:
jobs:
static-checks:
name: Static Checks
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand All @@ -36,6 +39,9 @@ jobs:

build-typecheck:
name: Build and type-check
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand All @@ -49,6 +55,9 @@ jobs:

installer-integration:
name: Installer Integration
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand Down Expand Up @@ -146,6 +155,9 @@ jobs:

cli-test-shards:
name: CLI / Shard ${{ matrix.shard }}
permissions:
contents: read
packages: read
runs-on: ubuntu-24.04
# Keep the post-merge budget aligned with pull requests so the same
# duration-weighted coverage roster can finish and upload its artifacts.
Expand Down Expand Up @@ -175,6 +187,7 @@ jobs:
actions: read
code-quality: write
contents: read
packages: read
pull-requests: read
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down Expand Up @@ -250,6 +263,7 @@ jobs:
permissions:
code-quality: write
contents: read
packages: read
pull-requests: read
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down
68 changes: 68 additions & 0 deletions .github/workflows/openshell-sdk-package-pr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

name: Security / Package OpenShell SDK for PR

run-name: "OpenShell SDK PR #${{ github.event.pull_request.number }} head ${{ github.event.pull_request.head.sha }} base ${{ github.event.pull_request.base.sha }}"

# This workflow is loaded from the pull request base branch. It must never
# check out or execute pull request content because its token can read packages.
on:
pull_request_target:
types: [opened, synchronize, reopened, edited]

permissions:
contents: read

concurrency:
group: openshell-sdk-package-${{ github.event.pull_request.number }}-${{ github.event.pull_request.head.sha }}
cancel-in-progress: true

jobs:
package-openshell-sdk:
if: ${{ github.event.pull_request.head.repo.full_name == github.repository && (github.event.action != 'edited' || github.event.changes.base != null) }}
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout base-controlled package verifier
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.base.sha }}
persist-credentials: false
sparse-checkout: |
ci/reviewed-npm-audit.json
scripts/audit-reviewed-npm-graph.mts
scripts/checks/package-openshell-sdk-for-pr.mts
scripts/lib/openclaw-npm-remediation.mts
scripts/lib/reviewed-npm-archive.mts
scripts/lib/reviewed-npm-audit.mts
sparse-checkout-cone-mode: false

- name: Setup Node.js for reviewed package download
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "22"
registry-url: https://npm.pkg.github.com
scope: "@nvidia"

- name: Download and verify exact OpenShell SDK package
id: package
env:
NEMOCLAW_OPEN_SHELL_SDK_OUTPUT_DIRECTORY: ${{ runner.temp }}/openshell-sdk
NODE_AUTH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
artifact_path="$(node --experimental-strip-types scripts/checks/package-openshell-sdk-for-pr.mts)"
[ -n "$artifact_path" ]
printf 'artifact_path=%s\n' "$artifact_path" >> "$GITHUB_OUTPUT"

- name: Upload verified OpenShell SDK archive
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: openshell-sdk-${{ github.event.pull_request.head.sha }}
path: ${{ steps.package.outputs.artifact_path }}
if-no-files-found: error
retention-days: 1
Loading
Loading