Skip to content

fix: align NeMo skill catalog install contracts - #1118

Open
mckornfield wants to merge 4 commits into
mainfrom
6556546-skills-catalog-contracts/mck
Open

fix: align NeMo skill catalog install contracts#1118
mckornfield wants to merge 4 commits into
mainfrom
6556546-skills-catalog-contracts/mck

Conversation

@mckornfield

@mckornfield mckornfield commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Parse and expose bundled skill preconditions through the skills registry and JSON listing output.
  • Fix installed skill folder/frontmatter naming so already-prefixed nemo-* skills do not become nemo-nemo-*.
  • Add preconditions frontmatter to bundled NeMo skills and fix the inference virtual-models command reference.
  • Vendor the NeMo Platform CLI changes into the SDK copy.

NVBugs

  • 6556546
  • 6556561
  • 6556564
  • 6556565

Validation

  • uv run --frozen pytest packages/nemo_platform_ext/tests/cli/commands/skills -q
  • uv run --frozen ruff check ... on touched source/tests
  • uv run --frozen ty check ... on touched source
  • make vendor-nemo-platform-ext
  • Focused vendored skills pytest
  • Live nemo skills list -f json --source nemo-platform and install smoke

Summary by CodeRabbit

  • New Features

    • Added skill precondition metadata for required setup, tools, plugins, workspaces, and confirmations.
    • Skill listings and generated metadata now display applicable preconditions.
    • Skill names are normalized consistently, preserving existing nemo- prefixes.
  • Bug Fixes

    • Prevented duplicate prefixes and destination conflicts during installation.
    • Rejected unsafe, path-like skill names.
    • Improved output formatting validation and timestamp defaults.
  • Documentation

    • Updated inference examples and cleanup guidance with safer, targeted commands.

Review follow-up

  • Pushed d0d07aa99 (fix: address skill catalog review feedback).
  • Pushed 150ca34e6 (fix: harden skill installer cleanup handling) for the latest CodeRabbit findings.
  • Validation for 150ca34e6: focused source skill tests 21 passed; focused vendored skill tests 21 passed; targeted Ruff and ty checks passed; git diff --check passed.
  • Note: uv run pre-commit run -a was attempted, but pre-commit failed while fetching https://github.com/norwoodj/helm-docs/ with HTTP 503 before hooks ran.

Latest push

  • Pushed ddc35cae5: merged current origin/main and resolved the nemo-teardown/SKILL.md conflict by keeping the precondition metadata plus main ClickHouse teardown guidance.
  • Validation: make vendor-nemo-platform-ext; source skills pytest 124 passed; focused vendored non-plugin skill pytest 51 passed; targeted Ruff passed; PR diff whitespace check passed; DCO audit passed.
  • Blocked validation: uv run pre-commit run -a still fails before hooks run because GitHub returns HTTP 503 fetching norwoodj/helm-docs; uv run --frozen pytest ... now attempts to build nemo-fabric-runtime and fails with local Cargo 1.75 lacking edition2024 support.

@mckornfield
mckornfield requested review from a team as code owners August 5, 2026 23:06
NVBugs: 6556546, 6556561, 6556564, 6556565
Signed-off-by: Matt Kornfield <mkornfield@nvidia.com>
@mckornfield
mckornfield force-pushed the 6556546-skills-catalog-contracts/mck branch from c23a938 to ab09cef Compare August 5, 2026 23:10
@mckornfield mckornfield changed the title Fix NeMo skill catalog install contracts fix: align NeMo skill catalog install contracts Aug 5, 2026
@github-actions github-actions Bot added the fix label Aug 5, 2026
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4e507066-6308-4dfd-a7a3-ed37053f166e

📥 Commits

Reviewing files that changed from the base of the PR and between cb45559 and ddc35ca.

⛔ Files ignored due to path filters (32)
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/claude.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/codex.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/cursor.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/opencode.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/cli.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/installer.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/core/formatters.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/inference/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-agent-config/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-build-agent/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-evaluator/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-experiments-upload/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-explore/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-files/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-guardrails/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-intake/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-secrets/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-spec/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-status/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-teardown/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-try-agent/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_claude.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_codex.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_cursor.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_opencode.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_cli.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_installer.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_skill_content.py is excluded by !sdk/**
📒 Files selected for processing (32)
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/claude.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/codex.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/cursor.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/opencode.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/cli.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/installer.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-agent-config/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-build-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-evaluator/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experiments-upload/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-explore/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-files/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-intake/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-secrets/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-spec/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-status/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-teardown/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-try-agent/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_claude.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_codex.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_cursor.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_opencode.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_base.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_installer.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_registry.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py
🚧 Files skipped from review as they are similar to previous changes (27)
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-evaluator/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-build-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-secrets/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/cursor.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-try-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-intake/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-status/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/installer.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-explore/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_cursor.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-files/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/claude.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_codex.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_opencode.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/cli.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_installer.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/codex.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_claude.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/opencode.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py

📝 Walkthrough

Walkthrough

Skill metadata now supports validated names and preconditions. Installers avoid duplicate nemo- prefixes. Platform skill documentation declares preconditions, and inference examples use namespaced VirtualModel commands.

Changes

Skill metadata and installation

Layer / File(s) Summary
Metadata contract and installation validation
packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py, .../registry.py, .../installer.py, .../cli.py, packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py, packages/nemo_platform_ext/tests/cli/commands/skills/test_*.py
Skill names are validated as safe path components. Skill instances store preconditions. Frontmatter parsing validates preconditions. Installation planning rejects duplicate destinations before writing files. Skill listings expose preconditions and resolved output columns.
Installer naming and generated metadata
packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/*.py, packages/nemo_platform_ext/tests/cli/commands/skills/agents/*.py
Claude, Codex, Cursor, and OpenCode use installed_skill_name. Claude and Codex include preconditions in generated frontmatter. Tests verify prefix preservation and metadata serialization.
Platform skill declarations
packages/nemo_platform_ext/src/nemo_platform_ext/skills/*/SKILL.md, packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py
Platform skills declare required preconditions. Tests validate that declarations use recognized values.

Inference skill guidance

Layer / File(s) Summary
VirtualModel command guidance
packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md
VirtualModel creation and deletion examples use the nemo inference virtual-models namespace. Cleanup targets explicit example models and requires DELETE confirmation.

Possibly related PRs

Suggested reviewers: mmogallapalli

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.52% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: aligning NeMo skill catalog installation contracts.
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.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 6556546-skills-catalog-contracts/mck

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py (1)

10-10: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Keep the expected path independent of installed_skill_name.

This test now uses the same helper as the installer. If that helper regresses, the production path and expected path can change together. Use an explicit or independently computed normalization expectation.

Proposed test adjustment
-from nemo_platform_ext.cli.commands.skills.base import installed_skill_name
...
-            installed_name = installed_skill_name(skill_name)
+            installed_name = (
+                skill_name if skill_name.startswith("nemo-") else f"nemo-{skill_name}"
+            )

Also applies to: 222-223

🤖 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 `@packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py` at line 10,
Update the test expectations around the skill installation flow, including the
cases near the imported installed_skill_name usage, so they no longer derive
expected paths from installed_skill_name. Compute the expected normalized skill
name independently or use an explicit expected value, while preserving the
production helper usage in the code under test.
🤖 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
`@packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py`:
- Around line 14-18: Validate skill names before installation so path-like
values such as names containing separators or traversal components cannot escape
the intended install directory. Update installed_skill_name and the
BaseAgentInstaller.install flow to require a single safe path component, or
resolve the destination and enforce containment within the install root before
creating or writing files.
- Line 28: Update the Skill dataclass field ordering so preconditions follows
source_dist, or make preconditions keyword-only, preserving positional
Skill(..., raw, source_dir) calls and ensuring source_dir receives the path
while preconditions retains its default.

In `@packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md`:
- Around line 561-563: Update the cleanup example to track the exact VM names or
IDs returned by each create command and delete only those tracked resources,
rather than listing and filtering all workspace VMs. Add an explicit
confirmation step before executing the deletions.

In
`@packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-skill-selection/SKILL.md`:
- Around line 25-26: Make the skill preconditions path-aware: in
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-skill-selection/SKILL.md:25-26,
remove nemo_cli_available from the first-time bootstrap route; in
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md:11-15,
scope provider_registered to VirtualModel chat guardrailing; and in
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-model-selection/SKILL.md:16-18,
scope provider_registered to Platform-routed model selection.

---

Nitpick comments:
In `@packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py`:
- Line 10: Update the test expectations around the skill installation flow,
including the cases near the imported installed_skill_name usage, so they no
longer derive expected paths from installed_skill_name. Compute the expected
normalized skill name independently or use an explicit expected value, while
preserving the production helper usage in the code under test.
🪄 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: CHILL

Plan: Enterprise

Run ID: 8300bb51-83be-4fcf-9128-b92d8be45036

📥 Commits

Reviewing files that changed from the base of the PR and between 96cb643 and c23a938.

⛔ Files ignored due to path filters (31)
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/claude.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/codex.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/cursor.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/opencode.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/cli.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/core/formatters.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/inference/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-agent-config/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-build-agent/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-evaluator/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-experiments-upload/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-explore/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-files/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-guardrails/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-intake/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-model-selection/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-secrets/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-skill-selection/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-spec/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-status/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-teardown/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-try-agent/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_claude.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_codex.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_cursor.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_opencode.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_cli.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_skill_content.py is excluded by !sdk/**
📒 Files selected for processing (31)
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/claude.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/codex.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/cursor.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/opencode.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/cli.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-agent-config/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-build-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-evaluator/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experiments-upload/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-explore/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-files/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-intake/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-model-selection/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-secrets/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-skill-selection/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-spec/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-status/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-teardown/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-try-agent/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_claude.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_codex.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_cursor.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_opencode.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_base.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py

Comment thread packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py Outdated
Comment thread packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md Outdated
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 31480/40109 78.5% 63.1%
Integration Tests 18318/38060 48.1% 20.8%

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md (1)

561-563: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Other (CWE-20): Improper Input Validation

Reachability: External

Restrict cleanup to VMs created by this skill.

grep vm- matches unrelated VirtualModels. The loop then deletes every match in my-workspace. Track the exact names or IDs returned by the create commands, and delete only those resources. Require confirmation immediately before deletion.

🤖 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 `@packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md`
around lines 561 - 563, Replace the cleanup loop’s broad `grep vm-` discovery
with tracking of the exact VirtualModel names or IDs returned by each create
command, and delete only those tracked resources in the `nemo inference
virtual-models delete` calls. Add an explicit confirmation step immediately
before deletion, without changing cleanup of unrelated resources.

Source: Linters/SAST tools

🤖 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 `@packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md`:
- Around line 15-19: Make the bootstrap preconditions path-aware: in
packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md lines
15-19, scope workspace_exists, provider_registered, and secrets_configured to
the post-setup route or split setup into a separate skill; in
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-skill-selection/SKILL.md
lines 25-26, scope nemo_cli_available to only the CLI-dependent route so
first-time bootstrap remains selectable.

---

Duplicate comments:
In `@packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md`:
- Around line 561-563: Replace the cleanup loop’s broad `grep vm-` discovery
with tracking of the exact VirtualModel names or IDs returned by each create
command, and delete only those tracked resources in the `nemo inference
virtual-models delete` calls. Add an explicit confirmation step immediately
before deletion, without changing cleanup of unrelated resources.
🪄 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: CHILL

Plan: Enterprise

Run ID: f8c4dd80-fab2-4e7f-a607-dfa852e0c967

📥 Commits

Reviewing files that changed from the base of the PR and between 96cb643 and ab09cef.

⛔ Files ignored due to path filters (31)
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/claude.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/codex.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/cursor.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/agents/opencode.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/cli.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/core/formatters.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/inference/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-agent-config/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-build-agent/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-evaluator/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-experiments-upload/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-explore/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-files/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-guardrails/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-intake/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-model-selection/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-secrets/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-skill-selection/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-spec/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-status/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-teardown/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-try-agent/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_claude.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_codex.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_cursor.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/agents/test_opencode.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_cli.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_skill_content.py is excluded by !sdk/**
📒 Files selected for processing (31)
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/claude.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/codex.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/cursor.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/opencode.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/cli.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-agent-config/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-build-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-evaluator/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experiments-upload/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-explore/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-files/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-intake/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-model-selection/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-secrets/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-skill-selection/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-spec/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-status/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-teardown/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-try-agent/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_claude.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_codex.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_cursor.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_opencode.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_base.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py
🚧 Files skipped from review as they are similar to previous changes (25)
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-secrets/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/opencode.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-evaluator/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-model-selection/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-build-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-files/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-try-agent/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-status/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-intake/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_base.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_cursor.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_cli.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-explore/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/claude.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/cursor.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_opencode.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/agents/codex.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/cli.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_claude.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/agents/test_codex.py

Comment thread packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md Outdated
Comment thread packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py Outdated
Signed-off-by: Matt Kornfield <mkornfield@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

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
`@packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/installer.py`:
- Line 30: Update the installer flow around validate_skill_name to precompute
each raw skill name’s installed_skill_name destination and reject duplicate
normalized destinations before any file operation. Ensure “foo” and “nemo-foo”
cannot proceed together, and add a regression test covering both raw names.

In `@packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md`:
- Around line 567-569: Update the cleanup confirmation flow around the
confirmation prompt to name the VirtualModels, provider, secret, and workspace
being deleted. After reading confirmation, explicitly exit before any cleanup
when its value is not exactly DELETE, rather than relying on the standalone test
command.
🪄 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: CHILL

Plan: Enterprise

Run ID: 34697234-acab-48e4-8da4-5458d9d646ac

📥 Commits

Reviewing files that changed from the base of the PR and between ab09cef and d0d07aa.

⛔ Files ignored due to path filters (10)
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/installer.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/skills/registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/core/formatters.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/inference/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/skills/nemo-guardrails/SKILL.md is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_base.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_installer.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/skills/test_skill_content.py is excluded by !sdk/**
📒 Files selected for processing (10)
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/base.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/installer.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_base.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_installer.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_registry.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py
💤 Files with no reviewable changes (1)
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-guardrails/SKILL.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/skills/registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/core/formatters.py
  • packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py

Comment thread packages/nemo_platform_ext/src/nemo_platform_ext/skills/inference/SKILL.md Outdated
Signed-off-by: Matt Kornfield <mkornfield@nvidia.com>
…g-contracts/mck

Signed-off-by: Matt Kornfield <mkornfield@nvidia.com>

# Conflicts:
#	packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-teardown/SKILL.md
#	sdk/python/nemo-platform/src/nemo_platform/skills/nemo-teardown/SKILL.md
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant