Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
126 changes: 126 additions & 0 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,66 @@ env:
NEMOCLAW_E2E_SHARD: default

jobs:
package-openshell-sdk:
if: ${{ github.event_name == 'workflow_dispatch' && contains(format(',{0},', inputs.jobs), ',external-gateway-health,') }}
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
packages: read
outputs:
artifact_name: ${{ steps.identity.outputs.artifact_name }}
steps:
- name: Check out trusted OpenShell SDK package verifier
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.workflow_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: Set up Node 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"

- id: package
name: Download and verify exact OpenShell SDK 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)"
test -n "$artifact_path"
printf 'artifact_path=%s\n' "$artifact_path" >> "$GITHUB_OUTPUT"

- id: identity
name: Record reviewed OpenShell SDK artifact identity
env:
RUN_ATTEMPT: ${{ github.run_attempt }}
RUN_ID: ${{ github.run_id }}
run: |
set -euo pipefail
artifact_name="openshell-sdk-e2e-${RUN_ID}-${RUN_ATTEMPT}"
printf 'artifact_name=%s\n' "$artifact_name" >> "$GITHUB_OUTPUT"

- name: Upload reviewed OpenShell SDK archive
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ${{ steps.identity.outputs.artifact_name }}
path: ${{ steps.package.outputs.artifact_path }}
if-no-files-found: error
retention-days: 1

base-image-publication:
runs-on: ubuntu-latest
timeout-minutes: 55
Expand Down Expand Up @@ -3263,6 +3323,71 @@ jobs:
shell: bash
run: bash .github/scripts/docker-auth-cleanup.sh

external-gateway-health:
needs: [generate-matrix, package-openshell-sdk]
if: ${{ contains(fromJSON(needs.generate-matrix.outputs.selected_jobs), 'external-gateway-health') }}
runs-on: ubuntu-latest
timeout-minutes: 15
env:
E2E_JOB: "1"
E2E_DEFAULT_ENABLED: "0"
E2E_TARGET_ID: "external-gateway-health"
E2E_AGENT_RUNTIME: "none"
E2E_OBSERVABLE_OUTCOME: "The reviewed SDK observes exact public gateway health over explicit HTTPS and CA"
E2E_ENVIRONMENT_OR_INFERENCE_ENDPOINT: "Ubuntu host with OpenShell 0.0.106; no inference endpoint"
E2E_ARTIFACT_DIR: ${{ github.workspace }}/e2e-artifacts/live/external-gateway-health
NEMOCLAW_RUN_LIVE_E2E: "1"
NEMOCLAW_NON_INTERACTIVE: "1"
NEMOCLAW_OPENSHELL_PIN_VERSION: "0.0.106"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: ${{ inputs.checkout_repository || github.repository }}
ref: ${{ inputs.checkout_sha || github.sha }}
fetch-depth: 0
persist-credentials: false

- name: Prepare E2E workspace
uses: NVIDIA/NemoClaw/.github/actions/prepare-e2e@f6304bc25fc35bfaa441c8c2fbfee38f72805a75
with:
build-cli: "false"

- name: Restore exact-commit CLI artifact
uses: NVIDIA/NemoClaw/.github/actions/restore-e2e-cli-artifact@c246409193a31133cab10c8a3589001cc0d59eb3
with:
provenance-json: ${{ needs.generate-matrix.outputs.cli_artifact_provenance }}

- name: Download reviewed OpenShell SDK archive
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: ${{ needs.package-openshell-sdk.outputs.artifact_name }}
path: ${{ runner.temp }}/openshell-sdk

- name: Install reviewed OpenShell SDK archive without package credentials
run: |
set -euo pipefail
mapfile -t archives < <(find "$RUNNER_TEMP/openshell-sdk" -maxdepth 1 -type f -name '*.tgz' -print)
test "${#archives[@]}" -eq 1
env -u NODE_AUTH_TOKEN -u GITHUB_TOKEN \
npm install --no-save --package-lock=false --ignore-scripts "${archives[0]}"

- name: Install OpenShell CLI
run: env -u NODE_AUTH_TOKEN -u GITHUB_TOKEN bash scripts/install-openshell.sh

- name: Run external gateway health live test
run: |
set -euo pipefail
export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH"
npx tsx tools/e2e/live-vitest-invocation.mts run \
--test-path test/e2e/live/external-gateway-health.test.ts

- name: Upload external gateway health artifacts
if: always()
uses: NVIDIA/NemoClaw/.github/actions/upload-e2e-artifacts@7768e15eb90d3ee2d33432f481dfe8747e4f6d57
with:
name: e2e-external-gateway-health
path: e2e-artifacts/live/external-gateway-health/

mcp-bridge:
needs: [base-image-publication, generate-matrix]
if: ${{ contains(fromJSON(needs.generate-matrix.outputs.selected_jobs), 'mcp-bridge') }}
Expand Down Expand Up @@ -5737,6 +5862,7 @@ jobs:
catalogue-github-read,
catalogue-brave-nvidia-inference,
openshell-gateway-auth-contract,
external-gateway-health,
mcp-bridge,
openshell-credential-generation-window,
openshell-dev-artifact,
Expand Down
14 changes: 14 additions & 0 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ concurrency:

jobs:
static-checks:
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand All @@ -34,6 +37,9 @@ jobs:
uses: ./.github/actions/ci-static-checks

build-typecheck:
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand All @@ -46,6 +52,9 @@ jobs:
uses: ./.github/actions/ci-build-typecheck

installer-integration:
permissions:
contents: read
packages: read
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand Down Expand Up @@ -139,6 +148,9 @@ jobs:
run: npx vitest run --project integration test/agents/openclaw/openclaw-security-audit-suppressions-real.test.ts --silent=false --reporter=default

cli-test-shards:
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 @@ -167,6 +179,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 @@ -241,6 +254,7 @@ jobs:
permissions:
code-quality: write
contents: read
packages: read
pull-requests: read
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down
Loading
Loading