Skip to content

ci(skills): align catalog refresh with repo gh-CLI PR pattern#4334

Merged
jyaunches merged 4 commits into
mainfrom
fix/4282-catalog-refresh-pr-action
May 27, 2026
Merged

ci(skills): align catalog refresh with repo gh-CLI PR pattern#4334
jyaunches merged 4 commits into
mainfrom
fix/4282-catalog-refresh-pr-action

Conversation

@jyaunches
Copy link
Copy Markdown
Contributor

@jyaunches jyaunches commented May 27, 2026

Summary

The Skills / Catalog Refresh workflow (merged via #4284 for issue #4282) fails immediately on every dispatch:

Unable to resolve action `peter-evans/create-pull-request@8ce3b843f60ac63fbde403f79364ff7d80b5fbb1`,
unable to find version `8ce3b843f60ac63fbde403f79364ff7d80b5fbb1`

That SHA does not exist in the upstream peter-evans/create-pull-request repo, so GitHub fails at "Prepare all required actions" before any job step runs. Failing run: 26518855615.

Fix

Replace the third-party action with an inline gh-CLI script. This is the pattern every other NemoClaw workflow uses for GitHub mutations:

Workflow Pattern
assign-linked-issue-author.yaml gh issue edit … --add-assignee, gh pr view, gh pr list
pr-limit.yaml gh pr list, gh pr comment, gh pr close
e2e-advisor.yaml / pr-review-advisor.yaml gh api, gh pr comment
catalog-skills-refresh.yaml (already, for /nvskills-ci) gh pr comment

peter-evans/create-pull-request was the only third-party mutation action in the repo, and the only place we had to maintain a SHA pin against an external action's release cadence.

Changes

  • .github/workflows/catalog-skills-refresh.yaml
    • Removed the broken peter-evans/create-pull-request@<bad-sha> step.
    • Replaced it with an inline git checkout -B / git push --force-with-lease / gh pr create script, idempotent against an existing open PR via gh pr list --head.
    • Flipped persist-credentials: falsetrue on the checkout so git push has a token.
    • Switched the /nvskills-ci step from secrets.GITHUB_TOKEN to github.token for consistency with the rest of the workflow and the repo.
  • .github/pr-bodies/catalog-skills-refresh.md (new)
    • Moved the long PR body out of the YAML to keep the workflow readable.

Validation

  • actionlint clean (no new warnings).
  • Idempotency: re-dispatch reuses the existing open PR via gh pr list --head instead of creating a duplicate.
  • Dry-run path is unchanged — the new step is gated by the same if: condition as before.

Notes

  • We could re-pin peter-evans/create-pull-request to the real v7.0.8 SHA (271a8d0340265f705b14b6d32b9829c1cb33d45e) instead. Choosing the inline script because it's the existing repo convention and removes the supply-chain pin entirely.

Refs #4282

Summary by CodeRabbit

  • Chores

    • Improved automation for catalog refreshes with safer credential handling, preservation of existing signing artifacts during refreshes, and a more robust inline process for creating/updating refresh branches and PRs.
    • Refined token usage for the signing request step.
  • Documentation

    • Added a PR body template detailing regeneration, validation checks, and how to request signing when needed.

Review Change Stack

The merged catalog-skills-refresh workflow pinned
peter-evans/create-pull-request to a SHA that does not exist
upstream, so every run fails at 'Prepare all required actions'
with 'Unable to resolve action ... unable to find version'.

Replace the third-party action with an inline gh-CLI script.
This matches the pattern every other workflow in the repo uses
for GitHub mutations (assign-linked-issue-author, pr-limit,
e2e-advisor, pr-review-advisor) and removes the pin maintenance
burden entirely.

- Flip persist-credentials to true so 'git push' has a token.
- Move the long PR body to .github/pr-bodies/catalog-skills-refresh.md
  to keep the workflow YAML readable.
- Preserve existing labels (documentation, CI/CD) and the
  /nvskills-ci comment step.

Refs #4282
@jyaunches jyaunches added the v0.0.53 Release target label May 27, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 27, 2026

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: 31f787a1-41d0-42b4-a461-06d3d1349c68

📥 Commits

Reviewing files that changed from the base of the PR and between e8cbaa7 and 5265351.

📒 Files selected for processing (1)
  • .github/workflows/catalog-skills-refresh.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/catalog-skills-refresh.yaml

📝 Walkthrough

Walkthrough

Adds a PR body template and updates the catalog-skills-refresh workflow to preserve existing signer artifacts, replace the create-pr action with an inline gh-based commit/force-push + PR reuse/create flow, and change the signing request token to ${{ github.token }}.

Changes

Catalog Skills Refresh Workflow Automation

Layer / File(s) Summary
PR template documentation
.github/pr-bodies/catalog-skills-refresh.md
New PR body template documenting catalog regeneration sources (.agents/catalog-skills.yaml, .agents/skills/, skills/nemoclaw/), determinism/reviewability expectations, required validation command (python3 scripts/export-catalog-skills.py --check), and /nvskills-ci signing instruction.
Preserve signer artifacts step
.github/workflows/catalog-skills-refresh.yaml
Adds a step that, when the refresh branch exists, fetches it and overlays skills/nemoclaw from that branch into the working tree before regeneration to avoid dropping NVSkills signing artifacts.
Inline PR creation & force-push flow
.github/workflows/catalog-skills-refresh.yaml
Replaces peter-evans/create-pull-request with an inline shell flow that sets GH_TOKEN, runs gh auth setup-git, commits and force-pushes a fixed branch containing .agents/catalog-skills.yaml and skills/nemoclaw, then uses gh pr list/gh pr create to reuse or create a PR and emits the PR number.
Signing token update
.github/workflows/catalog-skills-refresh.yaml
Changes the environment variable for requesting NVSkills signing to use ${{ github.token }} instead of secrets.GITHUB_TOKEN.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Possibly related PRs

  • NVIDIA/NemoClaw#4284: Builds on the initial skills/catalog refresh workflow and signing workflow setup.

Suggested labels

CI/CD

Suggested reviewers

  • miyoungc

Poem

🐰 I hopped through YAML, scripts, and git,
I taught the runner to never quit,
Commits and PRs now glide in line,
Signatures kept, exports pass the sign,
A tiny rabbit cheers: refresh complete! 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: aligning the catalog refresh workflow with the repository's gh-CLI PR pattern by replacing the broken peter-evans action.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/4282-catalog-refresh-pr-action

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 27, 2026

E2E Advisor Recommendation

Required E2E: None
Optional E2E: None

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • None. No existing product E2E is recommended. The changes are limited to GitHub Actions automation and a PR body template for catalog skill refresh; they do not alter runtime/user-flow code or generated skill assets. Existing NemoClaw E2E jobs such as skill-agent-e2e would exercise assistant skill runtime, not the changed workflow branch/PR/token behavior.

Optional E2E

  • None.

New E2E recommendations

  • CI/CD automation (medium): No existing NemoClaw E2E job appears to exercise the catalog-skills-refresh workflow end-to-end, including dry-run behavior, preserving existing signer artifacts from automation/catalog-skills-refresh, creating/updating a PR with .github/pr-bodies/catalog-skills-refresh.md, and optionally posting /nvskills-ci.
    • Suggested test: Add a workflow/integration test for catalog-skills-refresh using a temporary test repository or mocked gh/git remote to validate dry_run, branch overlay preservation, PR body selection, and signing-comment paths.
  • Workflow credential handling (medium): The security-sensitive behavior is that checkout uses persist-credentials: false and gh auth setup-git is delayed until push time. Existing runtime credential E2Es do not validate GitHub Actions credential exposure in this workflow.
    • Suggested test: Add a CI workflow validation test that statically or dynamically asserts catalog-skills-refresh does not persist GITHUB_TOKEN in git config before repository exporter code runs.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 27, 2026

E2E Scenario Advisor Recommendation

Required scenario E2E: None
Optional scenario E2E: None

Workflow run

Full scenario advisor summary

E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required scenario E2E

  • None. No scenario workflow, scenario metadata, scenario runtime, or validation-suite files changed.

Optional scenario E2E

  • None.

Relevant changed files

  • None.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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/pr-bodies/catalog-skills-refresh.md:
- Around line 4-9: Add a blank line immediately after the Markdown headings "##
Summary" and "## Validation" so they each have a separating empty line before
the following paragraph; update the section blocks that start with those
headings in the catalog-skills-refresh.md content to insert a single newline
after each heading to satisfy markdownlint rule MD022.
🪄 Autofix (Beta)

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: 21e4640e-af9a-4fd5-a721-fe32d861939a

📥 Commits

Reviewing files that changed from the base of the PR and between e139dbc and 364393c.

📒 Files selected for processing (2)
  • .github/pr-bodies/catalog-skills-refresh.md
  • .github/workflows/catalog-skills-refresh.yaml

Comment thread .github/pr-bodies/catalog-skills-refresh.md
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 27, 2026

PR Review Advisor

Findings: 0 needs attention, 4 worth checking, 0 nice ideas
Since last review: 1 prior item resolved, 2 still apply, 2 new items found

Review findings

🛠️ Needs attention

  • None.

🔎 Worth checking

  • Source-of-truth review needed: .github/workflows/catalog-skills-refresh.yaml remote refresh-branch overlay before export: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: The workflow fetches `origin/$BRANCH`, checks for `origin/$BRANCH:skills/nemoclaw`, checks out that path, and then runs `python3 scripts/export-catalog-skills.py`.
  • Remote signer artifact overlay should reject symlinks and non-regular files (.github/workflows/catalog-skills-refresh.yaml:68): The workflow now checks out `skills/nemoclaw` from the existing refresh branch before running the exporter. The exporter preserves `skill.oms.sig` and `skill-card.md` using `Path.is_file()` and `shutil.copy2()`, which follow symlinks by default. If the automation branch ever contains a symlink at one of those artifact paths, the scheduled/manual workflow can copy the symlink target into generated PR content. Delaying `gh auth setup-git` limits credential exposure, but the remote branch remains a new trusted-code-boundary input.
    • Recommendation: Preserve signer artifacts from git tree metadata that enforces regular blob types, or add exporter validation that rejects symlinks and other non-regular files for preserved signing artifacts. Add a regression test with symlinked `skill.oms.sig`/`skill-card.md` on the refresh branch.
    • Evidence: The workflow fetches and checks out `origin/$BRANCH:skills/nemoclaw` before `python3 scripts/export-catalog-skills.py`; `scripts/export-catalog-skills.py` preserves artifacts with `artifact.is_file()` and `shutil.copy2()`.
  • Remote refresh-branch preservation still lacks a regression guard (.github/workflows/catalog-skills-refresh.yaml:52): The inline overlay is a localized workaround for signer artifacts that live on `automation/catalog-skills-refresh` but not on `main`. Existing tests cover local exporter preservation only; they do not model an existing remote refresh branch, the fetch/checkout overlay, a branch without `skills/nemoclaw`, or malicious artifact file types.
    • Recommendation: Extract the preservation logic into a small script/helper or add a targeted workflow-validation test that creates a local remote branch with signed artifacts, reruns the refresh logic, and verifies artifacts survive. Include negative cases for a branch without `skills/nemoclaw` and symlink/non-regular artifact paths. Document whether this overlay is permanent or what upstream signer/export workflow change would make it removable.
    • Evidence: Prior review requested a regression guard for the remote overlay path. The code now uses `git cat-file -e`, but the changed files do not add tests or documentation for the remote branch preservation path; `test/catalog-skills-export.test.ts` only exercises local exporter preservation.
  • Existing refresh PR updates can still churn commits on every rerun (.github/workflows/catalog-skills-refresh.yaml:113): The new inline script reuses an existing open PR number, but it still checks out a local branch, commits, and force-pushes whenever the generated tree differs from `main`. If the existing refresh branch already contains the desired generated export and signer artifacts, rerunning the workflow can create a new commit with the same tree and retrigger PR workflows/signing review unnecessarily. This weakens the PR body's idempotency claim.
    • Recommendation: Before committing or pushing, compare the staged tree against the current `origin/automation/catalog-skills-refresh` tree after the overlay/export step. If there is no branch-relative change, skip commit/push and only return the existing PR number.
    • Evidence: The diff check is against `.agents/catalog-skills.yaml skills/nemoclaw` in the main checkout. The create/update step always runs `git checkout -B "$BRANCH"`, `git commit`, and `git push --force-with-lease` when `steps.diff.outputs.changed == 'true'`, then uses `gh pr list --head` only to avoid duplicate PR creation.

🌱 Nice ideas

  • None.
Since last review details

Current findings:

  • Source-of-truth review needed: .github/workflows/catalog-skills-refresh.yaml remote refresh-branch overlay before export: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: The workflow fetches `origin/$BRANCH`, checks for `origin/$BRANCH:skills/nemoclaw`, checks out that path, and then runs `python3 scripts/export-catalog-skills.py`.
  • Remote signer artifact overlay should reject symlinks and non-regular files (.github/workflows/catalog-skills-refresh.yaml:68): The workflow now checks out `skills/nemoclaw` from the existing refresh branch before running the exporter. The exporter preserves `skill.oms.sig` and `skill-card.md` using `Path.is_file()` and `shutil.copy2()`, which follow symlinks by default. If the automation branch ever contains a symlink at one of those artifact paths, the scheduled/manual workflow can copy the symlink target into generated PR content. Delaying `gh auth setup-git` limits credential exposure, but the remote branch remains a new trusted-code-boundary input.
    • Recommendation: Preserve signer artifacts from git tree metadata that enforces regular blob types, or add exporter validation that rejects symlinks and other non-regular files for preserved signing artifacts. Add a regression test with symlinked `skill.oms.sig`/`skill-card.md` on the refresh branch.
    • Evidence: The workflow fetches and checks out `origin/$BRANCH:skills/nemoclaw` before `python3 scripts/export-catalog-skills.py`; `scripts/export-catalog-skills.py` preserves artifacts with `artifact.is_file()` and `shutil.copy2()`.
  • Remote refresh-branch preservation still lacks a regression guard (.github/workflows/catalog-skills-refresh.yaml:52): The inline overlay is a localized workaround for signer artifacts that live on `automation/catalog-skills-refresh` but not on `main`. Existing tests cover local exporter preservation only; they do not model an existing remote refresh branch, the fetch/checkout overlay, a branch without `skills/nemoclaw`, or malicious artifact file types.
    • Recommendation: Extract the preservation logic into a small script/helper or add a targeted workflow-validation test that creates a local remote branch with signed artifacts, reruns the refresh logic, and verifies artifacts survive. Include negative cases for a branch without `skills/nemoclaw` and symlink/non-regular artifact paths. Document whether this overlay is permanent or what upstream signer/export workflow change would make it removable.
    • Evidence: Prior review requested a regression guard for the remote overlay path. The code now uses `git cat-file -e`, but the changed files do not add tests or documentation for the remote branch preservation path; `test/catalog-skills-export.test.ts` only exercises local exporter preservation.
  • Existing refresh PR updates can still churn commits on every rerun (.github/workflows/catalog-skills-refresh.yaml:113): The new inline script reuses an existing open PR number, but it still checks out a local branch, commits, and force-pushes whenever the generated tree differs from `main`. If the existing refresh branch already contains the desired generated export and signer artifacts, rerunning the workflow can create a new commit with the same tree and retrigger PR workflows/signing review unnecessarily. This weakens the PR body's idempotency claim.
    • Recommendation: Before committing or pushing, compare the staged tree against the current `origin/automation/catalog-skills-refresh` tree after the overlay/export step. If there is no branch-relative change, skip commit/push and only return the existing PR number.
    • Evidence: The diff check is against `.agents/catalog-skills.yaml skills/nemoclaw` in the main checkout. The create/update step always runs `git checkout -B "$BRANCH"`, `git commit`, and `git push --force-with-lease` when `steps.diff.outputs.changed == 'true'`, then uses `gh pr list --head` only to avoid duplicate PR creation.

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

Add top-level heading and blank lines around headings/lists in
.github/pr-bodies/catalog-skills-refresh.md to satisfy MD041,
MD022, and MD032. Validated locally with markdownlint-cli2.

Refs #4282
@jyaunches jyaunches changed the title fix(ci): replace broken peter-evans pin in catalog refresh ci(skills): align catalog refresh with repo gh-CLI PR pattern May 27, 2026
Address PR Review Advisor findings on the inline gh-CLI catalog
refresh path:

1. Preserve NVSkills signer artifacts on branch reuse.
   Before regenerating the export, overlay skills/nemoclaw from
   the existing automation/catalog-skills-refresh branch (when it
   exists) into the working tree. The exporter already auto-
   preserves skill.oms.sig and skill-card.md from any existing
   export tree, so this overlay is what keeps signer artifacts
   from being dropped when the workflow force-pushes the refresh
   branch.

2. Narrow the write-token trust boundary.
   Restore persist-credentials: false on checkout so the GitHub
   token is not installed in git config while exporter code runs.
   Configure push credentials only inside the create/update step
   via 'gh auth setup-git', immediately before 'git push'.

The diff check still works correctly after the overlay because
'git checkout origin/branch -- skills/nemoclaw' updates both the
working tree and the index, so 'git diff' detects only the
exporter's changes against the branch's prior export rather than
reporting signer artifacts as spurious differences.

Refs #4282
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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/catalog-skills-refresh.yaml:
- Around line 64-66: The existing check uses `git ls-tree -d "origin/$BRANCH" --
skills/nemoclaw` which can succeed with empty output; replace or augment that
guard by verifying the path truly exists using `git cat-file -e
"origin/$BRANCH:skills/nemoclaw"` before running `git checkout "origin/$BRANCH"
-- skills/nemoclaw` so the `git checkout` is only executed when the overlay
object is present; update the conditional that currently references `git
ls-tree` to call `git cat-file -e` (or combine both checks) and ensure the
subsequent `rm -rf skills/nemoclaw` and `git checkout` remain inside the guarded
branch.
🪄 Autofix (Beta)

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: bae96fa8-9247-479b-a385-2c91a07ece4c

📥 Commits

Reviewing files that changed from the base of the PR and between b0c1a32 and e8cbaa7.

📒 Files selected for processing (1)
  • .github/workflows/catalog-skills-refresh.yaml

Comment thread .github/workflows/catalog-skills-refresh.yaml Outdated
CodeRabbit and the PR Review Advisor both flagged that
'git ls-tree -d "origin/$BRANCH" -- skills/nemoclaw' can exit 0
with empty output when the tree exists but the path does not. In
that case the next two lines would 'rm -rf skills/nemoclaw' and
then fail at 'git checkout "origin/$BRANCH" -- skills/nemoclaw',
aborting the workflow.

'git cat-file -e <ref>:<path>' fails when the object is absent,
which is exactly the existence semantics we need.

Refs #4282
@jyaunches jyaunches merged commit 9a35831 into main May 27, 2026
27 checks passed
jyaunches added a commit that referenced this pull request May 27, 2026
…resh diff (#4342)

<!-- markdownlint-disable MD041 -->
## Summary

Two related fixes to the NemoClaw catalog skills export so the `Skills /
Catalog Refresh` workflow actually opens a refresh PR on `main`:

1. **Detect untracked files in the change-detection diff.** The workflow
ran `git diff --quiet` which only inspects tracked paths, so a
freshly-exported catalog against an empty tracked tree looked unchanged
and the workflow short-circuited via "Catalog skill export is already
current." without ever pushing the 43 generated files.
2. **Flatten the export from `skills/nemoclaw/` to `skills/`.** Every
other onboarded NVSkills product repo (`cuopt`, `nurec-skills`,
`digital-health-skills`, `aiq`) — and `nvskills-ci` itself, with
`skills/ci-smoke-test/SKILL.md` — uses `skills/<skill-name>/SKILL.md`.
The per-product namespace layer in NemoClaw was redundant and didn't
match anyone else's layout.

## Related Issue

Follow-up to #4282 / #4284 / #4334. Observed on post-merge runs
[26526695773](https://github.com/NVIDIA/NemoClaw/actions/runs/26526695773)
and
[26526772139](https://github.com/NVIDIA/NemoClaw/actions/runs/26526772139):
both completed `success` after exporting 11 skills, then exited via
`Stop after dry run` without producing a PR because no diff was detected
against the empty `skills/` tree on `main`.

## Changes

**Diff fix (commit 1):**
- `.github/workflows/catalog-skills-refresh.yaml`: run `git add
--intent-to-add` against the export paths before `git diff --quiet` so
untracked files surface as additions.

**Layout flattening (commit 2):**
- `.agents/catalog-skills.yaml`: `export: skills/nemoclaw` → `export:
skills`
- `scripts/export-catalog-skills.py`: default target updated
- `.github/workflows/catalog-skills-refresh.yaml`: every
`skills/nemoclaw` reference (preserve-overlay, change-detection,
commit-add) updated to `skills`
- `.pre-commit-config.yaml`: hook regex now anchors to `skills/.*`
- `.github/catalog-skills-signing-flow.md`,
`.github/pr-bodies/catalog-skills-refresh.md`: prose updated
- `test/catalog-skills-export.test.ts`: temp-fixture paths updated

## Why dropping the `nemoclaw/` subdir is safe

Verified directly against `NVIDIA/nvskills-ci` (cloned locally):

- `scripts/validate_request.py:21-26` — `WATCHED_PATH_PREFIXES =
(".agents/skills/", "skills/", "team-skills/", "rules/team-rules/",
"plugins/")` and `is_watched_path =
path.startswith(WATCHED_PATH_PREFIXES)`. **Plain prefix match — no
namespacing requirement.**
- `.github/workflows/team-request.yml:114` mirrors the same
`startswith("skills/")` filter.
- `docs/team-onboarding.md:27` — *"Store NVSkills content under
`skills/`, `team-skills/`, ..."* — no per-product subdir mentioned.
- `nvskills-ci`'s own example skill is at
`skills/ci-smoke-test/SKILL.md`.
- Every other product repo follows the same pattern (verified via GitHub
API on `cuopt`, `nurec-skills`, `digital-health-skills`, `aiq`).

## Type of Change

- [x] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Verification

Reproduced and validated locally on a clean `main` checkout:

```
$ python3 scripts/export-catalog-skills.py
Exported 11 catalog skill(s) to skills

$ ls skills/
catalog-metadata.json
nemoclaw-skills-guide
nemoclaw-user-agent-skills
nemoclaw-user-configure-inference
... (11 skills, flat layout)

# Old change-detection (broken — misses untracked tree):
$ git diff --quiet -- .agents/catalog-skills.yaml skills && echo changed=false || echo changed=true
changed=false

# Fixed change-detection:
$ git add --intent-to-add -- .agents/catalog-skills.yaml skills
$ git diff --quiet -- .agents/catalog-skills.yaml skills && echo changed=false || echo changed=true
changed=true
$ git diff --stat -- .agents/catalog-skills.yaml skills | tail -1
 44 files changed, 8907 insertions(+), 1 deletion(-)
```

Vitest:

```
$ npx vitest run test/catalog-skills-export.test.ts --project cli
 ✓ |cli| test/catalog-skills-export.test.ts (4 tests) 1201ms
 Test Files  1 passed (1)
      Tests  4 passed (4)
```

- [x] `npx prek run --all-files` passes
- [x] `npm test` passes for the affected test file (4/4)
- [x] Tests updated for changed export path
- [x] No secrets, API keys, or credentials committed
- [ ] Docs updated for user-facing behavior changes — N/A (CI-internal)
- [ ] `npm run docs` builds without warnings — N/A
- [ ] Doc pages follow the style guide — N/A
- [ ] New doc pages include SPDX header and frontmatter — N/A

---
Signed-off-by: Justin Yaunches <jyaunches@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Refresh process updated to regenerate and preserve exports under the
top-level skills/ directory, improving detection and staging of newly
created files and signer artifacts.
* Pre-commit checks widened to run against the broader skills/ export
tree.
* **Documentation**
* Updated signing-flow and PR guidance to reference the skills/ export
location.
* **Tests**
  * Test fixtures aligned to the new skills/ export layout.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NemoClaw/pull/4342?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v0.0.53 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants