HPNEX-6: Enable self-service plugin contributions - #487
Conversation
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThe PR implements a comprehensive ownership governance system by centralizing approvals through the ChangesOwnership Governance System
Documentation System Migration
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 9 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (9 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
Makefile (1)
19-20: ⚡ Quick winUse
$(CLAUDELINT_IMAGE)inlintto avoid image drift.
lint-pulluses the variable, butlintstill hardcodes the image name.💡 Suggested fix
- $(CONTAINER_RUNTIME) run --rm $(SELINUX_OPT) -v $(PWD):/workspace:Z ghcr.io/stbenjam/claudelint:main -v --strict + $(CONTAINER_RUNTIME) run --rm $(SELINUX_OPT) -v $(PWD):/workspace:Z $(CLAUDELINT_IMAGE) -v --strict🤖 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 `@Makefile` around lines 19 - 20, The lint recipe in the Makefile hardcodes ghcr.io/stbenjam/claudelint:main; change that to use the existing variable $(CLAUDELINT_IMAGE) so the image can be controlled centrally (keep $(CONTAINER_RUNTIME), $(SELINUX_OPT), volume mount and flags unchanged), i.e., replace the literal image token in the lint command with $(CLAUDELINT_IMAGE) to match lint-pull and avoid image drift.
🤖 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 @.skillsaw-custom.py:
- Around line 42-88: The current check runs website_script_path via
subprocess.run and reads/writes data_json_path (via original_data_json,
generated_data_json) which can create or modify docs/data.json during linting;
change it to run the script without mutating the repo by directing its output
into an isolated temporary location or running it against a temporary copy of
the repo: invoke subprocess.run(website_script_path) with environment or
arguments that make it write to a temp file (or set cwd to a tmpdir copy), then
compare the temp file contents to original_data_json
(data_json_path.read_text()) and report violations; remove any code that writes
back to data_json_path and ensure all temp files/directories are cleaned up even
on timeout/exception (handle subprocess.TimeoutExpired and other exceptions
accordingly).
---
Nitpick comments:
In `@Makefile`:
- Around line 19-20: The lint recipe in the Makefile hardcodes
ghcr.io/stbenjam/claudelint:main; change that to use the existing variable
$(CLAUDELINT_IMAGE) so the image can be controlled centrally (keep
$(CONTAINER_RUNTIME), $(SELINUX_OPT), volume mount and flags unchanged), i.e.,
replace the literal image token in the lint command with $(CLAUDELINT_IMAGE) to
match lint-pull and avoid image drift.
🪄 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: 4235eaee-2f07-4ce2-a7e7-7af5c712de57
📒 Files selected for processing (59)
.cursor/OWNERS.github/OWNERS.github/workflows/lint-plugins.yml.github/workflows/update-docs.yml.skillsaw-custom.py.skillsaw.yaml.skillsaw/owners_rule.py.skillsaw/plugindocs_rule.py.skillsaw/promptfoo_budget_rule.pyCONTRIBUTING.mdMakefileOWNERSOWNERS_ALIASESPLUGINS.mdREADME.mdagents/feedback.mdcommands/hello-world/echo.tomlevals/OWNERSimages/OWNERSplugins/agendas/OWNERSplugins/ai-operator-dashboard-generator/OWNERSplugins/ai-sbom/OWNERSplugins/bigquery/OWNERSplugins/ci/OWNERSplugins/code-review/OWNERSplugins/compliance/OWNERSplugins/console/OWNERSplugins/container-image/OWNERSplugins/doc/OWNERSplugins/etcd/OWNERSplugins/git/OWNERSplugins/golang/OWNERSplugins/gwapi/OWNERSplugins/hcp/OWNERSplugins/hello-world/OWNERSplugins/jira/OWNERSplugins/lvms/OWNERSplugins/marketplace-ops/OWNERSplugins/must-gather/OWNERSplugins/native-notifications/OWNERSplugins/node-tuning/OWNERSplugins/node/OWNERSplugins/olm-team/OWNERSplugins/olm/OWNERSplugins/openshift-tls-profile/OWNERSplugins/openshift/OWNERSplugins/origin/OWNERSplugins/ote-migration/OWNERSplugins/rds-analyzer/OWNERSplugins/session/OWNERSplugins/snowflake/OWNERSplugins/sosreport/OWNERSplugins/teams/OWNERSplugins/test-coverage/OWNERSplugins/testing/OWNERSplugins/utils/OWNERSplugins/workspaces/OWNERSplugins/yaml/OWNERSscripts/OWNERS
💤 Files with no reviewable changes (5)
- commands/hello-world/echo.toml
- .skillsaw/owners_rule.py
- .skillsaw/plugindocs_rule.py
- agents/feedback.md
- .skillsaw/promptfoo_budget_rule.py
a7d5ef2 to
702178f
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
.skillsaw/plugindocs_rule.py (1)
42-86:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAlways restore
docs/index.htmlin afinallyblock.This check still mutates the repo on failure paths (
returncode != 0, timeout, exception) ifskillsaw docstouchesdocs/index.htmlbefore failing.💡 Proposed fix
- try: - original_content = index_path.read_text() + original_content = index_path.read_text() + try: @@ - generated_content = index_path.read_text() - if original_content != generated_content: - index_path.write_text(original_content) + generated_content = index_path.read_text() + if original_content != generated_content: @@ except subprocess.TimeoutExpired: violations.append( self.violation( "'skillsaw docs' timed out", file_path=index_path ) ) except Exception as e: violations.append( self.violation( f"Error checking docs up-to-date status: {e}", file_path=index_path ) ) + finally: + if index_path.exists(): + current_content = index_path.read_text() + if current_content != original_content: + index_path.write_text(original_content)🤖 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 @.skillsaw/plugindocs_rule.py around lines 42 - 86, Read and store original_content from index_path before entering the try, then run subprocess.run and perform your comparison logic inside try without calling index_path.write_text there; instead add a finally block that always restores docs/index.html by writing original_content back if original_content is set; update references in the code to remove the in-try write (the line that called index_path.write_text(original_content)) and rely on the new finally to restore state (use the same symbols: index_path, original_content, generated_content, subprocess.run, self.violation, violations).
🤖 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 @.skillsaw-owners-rule.py:
- Around line 64-69: The rule currently accepts any symlink for sub_owners;
change the check so that after confirming sub_owners.is_symlink() you resolve
the symlink target (e.g., via sub_owners.readlink()/resolve()) and verify it
points exactly to the plugin root OWNERS file (the path built from node.path /
"OWNERS" or equivalent in this codebase); if the target is different, append the
same violation (or a slightly adjusted message) so only symlinks that delegate
to the plugin root OWNERS pass. Ensure this logic lives with the existing branch
that handles non-symlinks (around sub_owners.is_symlink()) and use the same
symbols plugin_name, subdir.relative_to(node.path), sub_owners, and node.path to
construct the violation message.
---
Duplicate comments:
In @.skillsaw/plugindocs_rule.py:
- Around line 42-86: Read and store original_content from index_path before
entering the try, then run subprocess.run and perform your comparison logic
inside try without calling index_path.write_text there; instead add a finally
block that always restores docs/index.html by writing original_content back if
original_content is set; update references in the code to remove the in-try
write (the line that called index_path.write_text(original_content)) and rely on
the new finally to restore state (use the same symbols: index_path,
original_content, generated_content, subprocess.run, self.violation,
violations).
🪄 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: 96b3a526-ffa9-4525-933d-3f25cd79dbb2
📒 Files selected for processing (252)
.cursor/OWNERS.github/OWNERS.github/workflows/OWNERS.github/workflows/update-docs.yml.github/workflows/validate-plugin-version.yml.skillsaw-owners-rule.py.skillsaw-promptfoo-budget-rule.py.skillsaw.yaml.skillsaw/plugindocs_rule.pyCONTRIBUTING.mdMakefileOWNERSOWNERS_ALIASESPLUGINS.mdREADME.mdagents/feedback.mdcommands/hello-world/echo.tomldocs/README.mddocs/data.jsondocs/index.htmlevals/OWNERSimages/OWNERSplugins/agendas/OWNERSplugins/agendas/commands/OWNERSplugins/ai-operator-dashboard-generator/OWNERSplugins/ai-operator-dashboard-generator/commands/OWNERSplugins/ai-operator-dashboard-generator/skills/OWNERSplugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERSplugins/ai-sbom/OWNERSplugins/ai-sbom/docs/OWNERSplugins/ai-sbom/scripts/OWNERSplugins/ai-sbom/skills/OWNERSplugins/ai-sbom/skills/generate/OWNERSplugins/bigquery/OWNERSplugins/bigquery/commands/OWNERSplugins/bigquery/skills/OWNERSplugins/bigquery/skills/analyze-usage/OWNERSplugins/bigquery/skills/ci-data-analyst/OWNERSplugins/ci/OWNERSplugins/ci/agents/OWNERSplugins/ci/commands/OWNERSplugins/ci/docs/OWNERSplugins/ci/scripts/OWNERSplugins/ci/skills/OWNERSplugins/ci/skills/add-jira-triage-link/OWNERSplugins/ci/skills/analyze-disruption/OWNERSplugins/ci/skills/analyze-payload/OWNERSplugins/ci/skills/fetch-jira-issue/OWNERSplugins/ci/skills/fetch-job-run-summary/OWNERSplugins/ci/skills/fetch-new-prs-in-payload/OWNERSplugins/ci/skills/fetch-payloads/OWNERSplugins/ci/skills/fetch-prowjob-json/OWNERSplugins/ci/skills/fetch-regression-details/OWNERSplugins/ci/skills/fetch-related-triages/OWNERSplugins/ci/skills/fetch-releases/OWNERSplugins/ci/skills/fetch-test-report/OWNERSplugins/ci/skills/fetch-test-runs/OWNERSplugins/ci/skills/oc-auth/OWNERSplugins/ci/skills/payload-autodl-json/OWNERSplugins/ci/skills/payload-experimental-reverts/OWNERSplugins/ci/skills/payload-results-yaml/OWNERSplugins/ci/skills/prow-job-analyze-install-failure/OWNERSplugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERSplugins/ci/skills/prow-job-analyze-resource/OWNERSplugins/ci/skills/prow-job-analyze-test-failure/OWNERSplugins/ci/skills/prow-job-artifact-search/OWNERSplugins/ci/skills/prow-job-extract-must-gather/OWNERSplugins/ci/skills/revert-pr/OWNERSplugins/ci/skills/set-release-blocker/OWNERSplugins/ci/skills/stage-payload-reverts/OWNERSplugins/ci/skills/triage-regression/OWNERSplugins/ci/skills/trigger-payload-job/OWNERSplugins/code-review/OWNERSplugins/code-review/commands/OWNERSplugins/code-review/evals/OWNERSplugins/code-review/skills/OWNERSplugins/code-review/skills/classify-review-comment/OWNERSplugins/code-review/skills/lang-go/OWNERSplugins/code-review/skills/profile-hypershift/OWNERSplugins/compliance/OWNERSplugins/compliance/commands/OWNERSplugins/compliance/skills/OWNERSplugins/compliance/skills/call-graph-analysis/OWNERSplugins/compliance/skills/codebase-impact-analysis/OWNERSplugins/compliance/skills/cve-intelligence-gathering/OWNERSplugins/compliance/skills/remediation-planning/OWNERSplugins/console/OWNERSplugins/console/skills/OWNERSplugins/console/skills/upgrade-sdk/OWNERSplugins/container-image/OWNERSplugins/container-image/commands/OWNERSplugins/doc/OWNERSplugins/doc/commands/OWNERSplugins/etcd/OWNERSplugins/etcd/commands/OWNERSplugins/git/OWNERSplugins/git/commands/OWNERSplugins/git/skills/OWNERSplugins/git/skills/suggest-reviewers/OWNERSplugins/golang/OWNERSplugins/golang/hooks/OWNERSplugins/golang/hooks/scripts/OWNERSplugins/golang/skills/OWNERSplugins/golang/skills/fix-cve/OWNERSplugins/golang/skills/lint-fix/OWNERSplugins/golang/skills/lint/OWNERSplugins/gwapi/OWNERSplugins/gwapi/commands/OWNERSplugins/gwapi/resources/OWNERSplugins/hcp/OWNERSplugins/hcp/commands/OWNERSplugins/hcp/skills/OWNERSplugins/hcp/skills/hcp-create-agent/OWNERSplugins/hcp/skills/hcp-create-aws/OWNERSplugins/hcp/skills/hcp-create-azure/OWNERSplugins/hcp/skills/hcp-create-kubevirt/OWNERSplugins/hcp/skills/hcp-create-openstack/OWNERSplugins/hcp/skills/hcp-create-powervs/OWNERSplugins/hello-world/OWNERSplugins/hello-world/commands/OWNERSplugins/hello-world/evals/OWNERSplugins/jira/OWNERSplugins/jira/commands/OWNERSplugins/jira/evals/OWNERSplugins/jira/evals/fixtures/OWNERSplugins/jira/reference/OWNERSplugins/jira/skills/OWNERSplugins/jira/skills/catch-me-up/OWNERSplugins/jira/skills/catch-me-up/scripts/OWNERSplugins/jira/skills/categorize-activity-type/OWNERSplugins/jira/skills/cntrlplane/OWNERSplugins/jira/skills/create-bug/OWNERSplugins/jira/skills/create-epic/OWNERSplugins/jira/skills/create-feature-request/OWNERSplugins/jira/skills/create-feature/OWNERSplugins/jira/skills/create-release-note/OWNERSplugins/jira/skills/create-story/OWNERSplugins/jira/skills/create-task/OWNERSplugins/jira/skills/extract-prs/OWNERSplugins/jira/skills/gcp-hcp/OWNERSplugins/jira/skills/generate-enhancement/OWNERSplugins/jira/skills/hypershift/OWNERSplugins/jira/skills/jira-doc-generator/OWNERSplugins/jira/skills/jira-issues-by-component/OWNERSplugins/jira/skills/jira-validate-blockers/OWNERSplugins/jira/skills/ocpbugs/OWNERSplugins/jira/skills/ready-to-solve/OWNERSplugins/jira/skills/status-analysis/OWNERSplugins/jira/skills/status-analysis/scripts/OWNERSplugins/lvms/OWNERSplugins/lvms/commands/OWNERSplugins/lvms/skills/OWNERSplugins/lvms/skills/lvms-analyzer/OWNERSplugins/lvms/skills/lvms-analyzer/scripts/OWNERSplugins/marketplace-ops/OWNERSplugins/marketplace-ops/commands/OWNERSplugins/marketplace-ops/scripts/OWNERSplugins/must-gather/OWNERSplugins/must-gather/commands/OWNERSplugins/must-gather/skills/OWNERSplugins/must-gather/skills/must-gather-analyzer/OWNERSplugins/must-gather/skills/must-gather-analyzer/scripts/OWNERSplugins/native-notifications/OWNERSplugins/native-notifications/hooks/OWNERSplugins/node-tuning/OWNERSplugins/node-tuning/commands/OWNERSplugins/node-tuning/skills/OWNERSplugins/node-tuning/skills/scripts/OWNERSplugins/node/OWNERSplugins/node/commands/OWNERSplugins/olm-team/OWNERSplugins/olm-team/commands/OWNERSplugins/olm-team/scripts/OWNERSplugins/olm-team/skills/OWNERSplugins/olm-team/skills/k8s-ocp-olm-expert/OWNERSplugins/olm/OWNERSplugins/olm/commands/OWNERSplugins/openshift-tls-profile/OWNERSplugins/openshift-tls-profile/commands/OWNERSplugins/openshift-tls-profile/skills/OWNERSplugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERSplugins/openshift/OWNERSplugins/openshift/commands/OWNERSplugins/openshift/skills/OWNERSplugins/openshift/skills/generating-ovn-topology/OWNERSplugins/openshift/skills/generating-ovn-topology/scripts/OWNERSplugins/openshift/skills/openshift-node-kernel/OWNERSplugins/origin/OWNERSplugins/origin/commands/OWNERSplugins/ote-migration/OWNERSplugins/ote-migration/commands/OWNERSplugins/ote-migration/skills/OWNERSplugins/ote-migration/skills/ote-migration-workflow/OWNERSplugins/rds-analyzer/OWNERSplugins/rds-analyzer/commands/OWNERSplugins/rds-analyzer/scripts/OWNERSplugins/rds-analyzer/skills/OWNERSplugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERSplugins/session/OWNERSplugins/session/commands/OWNERSplugins/snowflake/OWNERSplugins/snowflake/commands/OWNERSplugins/snowflake/scripts/OWNERSplugins/snowflake/skills/OWNERSplugins/snowflake/skills/setup-snowflake/OWNERSplugins/sosreport/OWNERSplugins/sosreport/commands/OWNERSplugins/sosreport/skills/OWNERSplugins/sosreport/skills/logs-analysis/OWNERSplugins/sosreport/skills/network-analysis/OWNERSplugins/sosreport/skills/ovs-db-analysis/OWNERSplugins/sosreport/skills/ovs-db-analysis/scripts/OWNERSplugins/sosreport/skills/resource-analysis/OWNERSplugins/sosreport/skills/system-config-analysis/OWNERSplugins/teams/OWNERSplugins/teams/commands/OWNERSplugins/teams/skills/OWNERSplugins/teams/skills/analyze-regressions/OWNERSplugins/teams/skills/coderabbit-adoption/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERSplugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERSplugins/teams/skills/get-release-dates/OWNERSplugins/teams/skills/list-components/OWNERSplugins/teams/skills/list-jiras/OWNERSplugins/teams/skills/list-regressions/OWNERSplugins/teams/skills/list-teams/OWNERSplugins/teams/skills/summarize-jiras/OWNERSplugins/test-coverage/OWNERSplugins/test-coverage/commands/OWNERSplugins/test-coverage/skills/OWNERSplugins/test-coverage/skills/analyze/OWNERSplugins/test-coverage/skills/gaps/OWNERSplugins/testing/OWNERSplugins/testing/commands/OWNERSplugins/testing/skills/OWNERSplugins/testing/skills/mutation-generator/OWNERSplugins/testing/skills/mutation-tester/OWNERSplugins/utils/OWNERSplugins/utils/commands/OWNERSplugins/utils/scripts/OWNERSplugins/workspaces/OWNERSplugins/workspaces/commands/OWNERSplugins/workspaces/commands/create/OWNERSplugins/workspaces/commands/delete/OWNERSplugins/yaml/OWNERSplugins/yaml/commands/OWNERSscripts/OWNERSscripts/build-website.pyscripts/generate_plugin_docs.py
💤 Files with no reviewable changes (7)
- docs/data.json
- agents/feedback.md
- scripts/generate_plugin_docs.py
- docs/README.md
- commands/hello-world/echo.toml
- .github/workflows/update-docs.yml
- scripts/build-website.py
✅ Files skipped from review due to trivial changes (150)
- plugins/ci/skills/analyze-payload/OWNERS
- plugins/ci/skills/add-jira-triage-link/OWNERS
- plugins/ci/skills/fetch-payloads/OWNERS
- plugins/ai-operator-dashboard-generator/commands/OWNERS
- .github/workflows/OWNERS
- plugins/ai-sbom/skills/OWNERS
- plugins/ci/skills/prow-job-extract-must-gather/OWNERS
- plugins/container-image/OWNERS
- plugins/ai-sbom/OWNERS
- plugins/jira/skills/generate-enhancement/OWNERS
- images/OWNERS
- OWNERS_ALIASES
- plugins/ci/skills/revert-pr/OWNERS
- plugins/code-review/skills/lang-go/OWNERS
- plugins/jira/skills/jira-issues-by-component/OWNERS
- plugins/openshift/skills/generating-ovn-topology/scripts/OWNERS
- OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERS
- plugins/node-tuning/skills/OWNERS
- plugins/rds-analyzer/skills/OWNERS
- plugins/ote-migration/skills/OWNERS
- plugins/ci/skills/payload-experimental-reverts/OWNERS
- plugins/jira/skills/jira-validate-blockers/OWNERS
- plugins/console/OWNERS
- plugins/must-gather/skills/must-gather-analyzer/OWNERS
- plugins/sosreport/skills/ovs-db-analysis/scripts/OWNERS
- plugins/node-tuning/commands/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERS
- plugins/ci/skills/prow-job-analyze-install-failure/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERS
- plugins/sosreport/skills/logs-analysis/OWNERS
- plugins/compliance/skills/cve-intelligence-gathering/OWNERS
- plugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERS
- plugins/teams/skills/OWNERS
- plugins/jira/skills/create-release-note/OWNERS
- plugins/rds-analyzer/commands/OWNERS
- plugins/agendas/commands/OWNERS
- plugins/jira/skills/ocpbugs/OWNERS
- plugins/ci/skills/fetch-regression-details/OWNERS
- plugins/gwapi/commands/OWNERS
- plugins/testing/skills/mutation-generator/OWNERS
- plugins/teams/commands/OWNERS
- plugins/jira/skills/gcp-hcp/OWNERS
- plugins/golang/skills/lint/OWNERS
- plugins/testing/skills/OWNERS
- plugins/snowflake/skills/OWNERS
- plugins/bigquery/skills/OWNERS
- plugins/ci/skills/stage-payload-reverts/OWNERS
- plugins/marketplace-ops/OWNERS
- plugins/compliance/skills/call-graph-analysis/OWNERS
- plugins/test-coverage/skills/OWNERS
- plugins/olm-team/OWNERS
- plugins/utils/commands/OWNERS
- plugins/test-coverage/OWNERS
- plugins/sosreport/skills/ovs-db-analysis/OWNERS
- plugins/jira/evals/fixtures/OWNERS
- plugins/doc/commands/OWNERS
- plugins/jira/skills/catch-me-up/scripts/OWNERS
- scripts/OWNERS
- plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
- plugins/jira/skills/status-analysis/OWNERS
- plugins/lvms/skills/OWNERS
- plugins/ai-operator-dashboard-generator/skills/OWNERS
- plugins/hcp/skills/hcp-create-aws/OWNERS
- plugins/jira/skills/jira-doc-generator/OWNERS
- plugins/bigquery/skills/ci-data-analyst/OWNERS
- plugins/jira/skills/create-feature/OWNERS
- plugins/snowflake/skills/setup-snowflake/OWNERS
- plugins/ci/skills/payload-autodl-json/OWNERS
- .cursor/OWNERS
- plugins/utils/scripts/OWNERS
- plugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERS
- plugins/teams/skills/coderabbit-adoption/OWNERS
- plugins/golang/skills/fix-cve/OWNERS
- plugins/jira/skills/create-epic/OWNERS
- plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
- plugins/node-tuning/skills/scripts/OWNERS
- plugins/workspaces/commands/delete/OWNERS
- plugins/console/skills/upgrade-sdk/OWNERS
- plugins/test-coverage/skills/analyze/OWNERS
- plugins/snowflake/scripts/OWNERS
- plugins/olm-team/scripts/OWNERS
- plugins/golang/hooks/OWNERS
- plugins/jira/skills/status-analysis/scripts/OWNERS
- plugins/ci/skills/payload-results-yaml/OWNERS
- plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
- plugins/ote-migration/skills/ote-migration-workflow/OWNERS
- plugins/gwapi/resources/OWNERS
- plugins/teams/skills/list-teams/OWNERS
- plugins/hcp/skills/OWNERS
- plugins/ci/skills/fetch-releases/OWNERS
- plugins/teams/skills/list-regressions/OWNERS
- plugins/workspaces/commands/create/OWNERS
- plugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERS
- plugins/ai-sbom/docs/OWNERS
- plugins/native-notifications/hooks/OWNERS
- plugins/code-review/skills/profile-hypershift/OWNERS
- plugins/golang/skills/lint-fix/OWNERS
- plugins/ci/skills/fetch-jira-issue/OWNERS
- plugins/node/commands/OWNERS
- plugins/olm-team/skills/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERS
- plugins/marketplace-ops/commands/OWNERS
- plugins/ci/skills/fetch-job-run-summary/OWNERS
- plugins/jira/skills/categorize-activity-type/OWNERS
- plugins/olm-team/commands/OWNERS
- plugins/container-image/commands/OWNERS
- evals/OWNERS
- plugins/jira/skills/create-feature-request/OWNERS
- plugins/hcp/skills/hcp-create-agent/OWNERS
- plugins/test-coverage/commands/OWNERS
- plugins/code-review/OWNERS
- plugins/ai-sbom/skills/generate/OWNERS
- PLUGINS.md
- plugins/code-review/evals/OWNERS
- plugins/jira/skills/cntrlplane/OWNERS
- plugins/sosreport/commands/OWNERS
- CONTRIBUTING.md
- plugins/teams/skills/summarize-jiras/OWNERS
- plugins/jira/skills/catch-me-up/OWNERS
- plugins/teams/skills/list-components/OWNERS
- plugins/hello-world/OWNERS
- plugins/code-review/skills/classify-review-comment/OWNERS
- plugins/ote-migration/OWNERS
- plugins/compliance/OWNERS
- plugins/compliance/skills/OWNERS
- plugins/olm/commands/OWNERS
- plugins/openshift/skills/openshift-node-kernel/OWNERS
- plugins/teams/skills/get-release-dates/OWNERS
- plugins/code-review/skills/OWNERS
- plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
- plugins/jira/evals/OWNERS
- plugins/must-gather/skills/OWNERS
- plugins/compliance/skills/codebase-impact-analysis/OWNERS
- plugins/golang/hooks/scripts/OWNERS
- plugins/node/OWNERS
- plugins/sosreport/OWNERS
- plugins/ci/skills/fetch-prowjob-json/OWNERS
- plugins/bigquery/skills/analyze-usage/OWNERS
- README.md
- plugins/teams/skills/list-jiras/OWNERS
- plugins/golang/OWNERS
- plugins/git/OWNERS
- plugins/origin/OWNERS
- plugins/workspaces/OWNERS
- plugins/ai-operator-dashboard-generator/OWNERS
- plugins/agendas/OWNERS
- plugins/bigquery/OWNERS
- plugins/jira/OWNERS
- plugins/sosreport/skills/OWNERS
6212aaa to
d7a952f
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (2)
.skillsaw-owners-rule.py (1)
64-71:⚠️ Potential issue | 🟠 Major | ⚡ Quick winValidate symlink target, not just symlink type.
A subdirectory
OWNERSsymlink currently passes even if it points somewhere other than the plugin-rootOWNERS, which can bypass the delegation model.Suggested fix
elif not sub_owners.is_symlink(): violations.append( self.violation( f"Plugin '{plugin_name}' subdirectory '{subdir.relative_to(node.path)}' " f"has an OWNERS file that is not a symlink to the plugin root", file_path=sub_owners, ) ) + else: + try: + if sub_owners.resolve(strict=True) != owners_path.resolve(strict=True): + violations.append( + self.violation( + f"Plugin '{plugin_name}' subdirectory '{subdir.relative_to(node.path)}' " + f"has an OWNERS symlink that does not point to the plugin root", + file_path=sub_owners, + ) + ) + except FileNotFoundError: + violations.append( + self.violation( + f"Plugin '{plugin_name}' subdirectory '{subdir.relative_to(node.path)}' " + f"has a broken OWNERS symlink", + file_path=sub_owners, + ) + )🤖 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 @.skillsaw-owners-rule.py around lines 64 - 71, The current check only verifies that sub_owners.is_symlink() is true; update the logic in the block that builds violations for sub_owners to also validate the symlink target points to the plugin root OWNERS file (the expected target is node.path / "OWNERS" for the given plugin). After detecting a symlink, read its target (using Path.readlink or resolve via Path.resolve(strict=False)/os.path.realpath) and normalize both target and expected paths (absolute/real) before comparing; if they differ, append a violation via self.violation (same message context) indicating the OWNERS symlink does not point to the plugin root OWNERS. Ensure the check handles relative symlink targets correctly by comparing resolved paths rather than raw strings..skillsaw/plugindocs_rule.py (1)
53-60:⚠️ Potential issue | 🟠 Major | ⚡ Quick winLint check can leave
docs/index.htmlmodified on failure paths.
index.htmlis restored only on content-mismatch success path; ifskillsaw docsfails, times out, or throws after writing, the repo can remain dirty.Suggested fix
- try: - original_content = index_path.read_text() + original_content = index_path.read_text() + try: @@ - if result.returncode != 0: + if result.returncode != 0: violations.append( @@ ) return violations @@ - if original_content != generated_content: - index_path.write_text(original_content) + if original_content != generated_content: @@ except subprocess.TimeoutExpired: @@ except Exception as e: @@ + finally: + if index_path.exists(): + index_path.write_text(original_content)Also applies to: 73-85
🤖 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 @.skillsaw/plugindocs_rule.py around lines 53 - 60, The check leaves docs/index.html modified on non-success paths; update the function in .skillsaw/plugindocs_rule.py to capture the original contents of index_path (docs/index.html) before running skillsaw (e.g., read into a variable) and ensure you restore that content on all failure/timeout/exception paths (use a try/finally or explicit restore in the error branches that handle result.returncode != 0 and the other block around lines 73-85). Reference the existing variables/functions in the file (index_path, result, self.violation, violations) and make sure the restore happens before returning violations so the repo is not left dirty.
🤖 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 @.skillsaw-owners-rule.py:
- Around line 50-54: The current recursive traversal uses node.path.rglob("*")
and only checks subdir.name, which still visits descendants of excluded
directories; update the exclusion check to skip any path that contains an
excluded segment (e.g., check if any(part in exclusions for part in
subdir.parts)) so descendants are ignored too, or replace rglob traversal with
os.walk/Path.iterdir and prune excluded directories when encountered; reference
node.path.rglob and subdir.name to locate the loop and change the condition to
test subdir.parts (or perform pruning) so entire excluded trees (.claude-plugin,
__pycache__, .work) are not traversed.
In @.skillsaw-protected-dirs-rule.py:
- Around line 63-67: The current loop over protected_path.rglob("*") only checks
subdir.name and so still enters descendants of excluded trees; update the filter
to examine the full relative path instead: compute rel =
subdir.relative_to(protected_path) (or use subdir.parts) and skip if any part of
rel (or the first part) matches the excluded set like "__pycache__" or ".work"
so that entire excluded trees and their descendants are ignored; adjust the
condition around subdir.is_dir() to use this rel-path check instead of only
subdir.name.
In `@Makefile`:
- Around line 40-43: The find command in the Makefile currently excludes only
the directories themselves (e.g., '*/.claude-plugin') but not their descendants;
update the find invocation used in the while-read loop to prune entire trees and
match descendants (for example replace the current -not -path '*/.claude-plugin'
style with -path '*/.claude-plugin*' -prune -o and do the same for .work and
__pycache__ patterns), ensuring the final expression selects directories after
the prunes so nested files under those trees are excluded.
---
Duplicate comments:
In @.skillsaw-owners-rule.py:
- Around line 64-71: The current check only verifies that
sub_owners.is_symlink() is true; update the logic in the block that builds
violations for sub_owners to also validate the symlink target points to the
plugin root OWNERS file (the expected target is node.path / "OWNERS" for the
given plugin). After detecting a symlink, read its target (using Path.readlink
or resolve via Path.resolve(strict=False)/os.path.realpath) and normalize both
target and expected paths (absolute/real) before comparing; if they differ,
append a violation via self.violation (same message context) indicating the
OWNERS symlink does not point to the plugin root OWNERS. Ensure the check
handles relative symlink targets correctly by comparing resolved paths rather
than raw strings.
In @.skillsaw/plugindocs_rule.py:
- Around line 53-60: The check leaves docs/index.html modified on non-success
paths; update the function in .skillsaw/plugindocs_rule.py to capture the
original contents of index_path (docs/index.html) before running skillsaw (e.g.,
read into a variable) and ensure you restore that content on all
failure/timeout/exception paths (use a try/finally or explicit restore in the
error branches that handle result.returncode != 0 and the other block around
lines 73-85). Reference the existing variables/functions in the file
(index_path, result, self.violation, violations) and make sure the restore
happens before returning violations so the repo is not left dirty.
🪄 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: a702079b-ea71-42ac-94da-038fb592dd80
📒 Files selected for processing (256)
.cursor/OWNERS.github/OWNERS.github/workflows/OWNERS.github/workflows/update-docs.yml.github/workflows/validate-plugin-version.yml.skillsaw-owners-rule.py.skillsaw-promptfoo-budget-rule.py.skillsaw-protected-dirs-rule.py.skillsaw.yaml.skillsaw/plugindocs_rule.pyCONTRIBUTING.mdMakefileOWNERSOWNERS_ALIASESPLUGINS.mdREADME.mdagents/feedback.mdcommands/hello-world/echo.tomldocs/README.mddocs/data.jsondocs/index.htmlevals/OWNERSimages/OWNERSplugins/agendas/OWNERSplugins/agendas/commands/OWNERSplugins/ai-operator-dashboard-generator/OWNERSplugins/ai-operator-dashboard-generator/commands/OWNERSplugins/ai-operator-dashboard-generator/skills/OWNERSplugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERSplugins/ai-sbom/OWNERSplugins/ai-sbom/docs/OWNERSplugins/ai-sbom/scripts/OWNERSplugins/ai-sbom/skills/OWNERSplugins/ai-sbom/skills/generate/OWNERSplugins/bigquery/OWNERSplugins/bigquery/commands/OWNERSplugins/bigquery/skills/OWNERSplugins/bigquery/skills/analyze-usage/OWNERSplugins/bigquery/skills/ci-data-analyst/OWNERSplugins/ci/OWNERSplugins/ci/agents/OWNERSplugins/ci/commands/OWNERSplugins/ci/docs/OWNERSplugins/ci/scripts/OWNERSplugins/ci/skills/OWNERSplugins/ci/skills/add-jira-triage-link/OWNERSplugins/ci/skills/analyze-disruption/OWNERSplugins/ci/skills/analyze-payload/OWNERSplugins/ci/skills/fetch-jira-issue/OWNERSplugins/ci/skills/fetch-job-run-summary/OWNERSplugins/ci/skills/fetch-new-prs-in-payload/OWNERSplugins/ci/skills/fetch-payloads/OWNERSplugins/ci/skills/fetch-prowjob-json/OWNERSplugins/ci/skills/fetch-regression-details/OWNERSplugins/ci/skills/fetch-related-triages/OWNERSplugins/ci/skills/fetch-releases/OWNERSplugins/ci/skills/fetch-test-report/OWNERSplugins/ci/skills/fetch-test-runs/OWNERSplugins/ci/skills/oc-auth/OWNERSplugins/ci/skills/payload-autodl-json/OWNERSplugins/ci/skills/payload-experimental-reverts/OWNERSplugins/ci/skills/payload-results-yaml/OWNERSplugins/ci/skills/prow-job-analyze-install-failure/OWNERSplugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERSplugins/ci/skills/prow-job-analyze-resource/OWNERSplugins/ci/skills/prow-job-analyze-test-failure/OWNERSplugins/ci/skills/prow-job-artifact-search/OWNERSplugins/ci/skills/prow-job-extract-must-gather/OWNERSplugins/ci/skills/revert-pr/OWNERSplugins/ci/skills/set-release-blocker/OWNERSplugins/ci/skills/stage-payload-reverts/OWNERSplugins/ci/skills/triage-regression/OWNERSplugins/ci/skills/trigger-payload-job/OWNERSplugins/code-review/OWNERSplugins/code-review/commands/OWNERSplugins/code-review/evals/OWNERSplugins/code-review/skills/OWNERSplugins/code-review/skills/classify-review-comment/OWNERSplugins/code-review/skills/lang-go/OWNERSplugins/code-review/skills/profile-hypershift/OWNERSplugins/compliance/OWNERSplugins/compliance/commands/OWNERSplugins/compliance/skills/OWNERSplugins/compliance/skills/call-graph-analysis/OWNERSplugins/compliance/skills/codebase-impact-analysis/OWNERSplugins/compliance/skills/cve-intelligence-gathering/OWNERSplugins/compliance/skills/remediation-planning/OWNERSplugins/console/OWNERSplugins/console/skills/OWNERSplugins/console/skills/upgrade-sdk/OWNERSplugins/container-image/OWNERSplugins/container-image/commands/OWNERSplugins/doc/OWNERSplugins/doc/commands/OWNERSplugins/etcd/OWNERSplugins/etcd/commands/OWNERSplugins/git/OWNERSplugins/git/commands/OWNERSplugins/git/skills/OWNERSplugins/git/skills/suggest-reviewers/OWNERSplugins/golang/OWNERSplugins/golang/hooks/OWNERSplugins/golang/hooks/scripts/OWNERSplugins/golang/skills/OWNERSplugins/golang/skills/fix-cve/OWNERSplugins/golang/skills/lint-fix/OWNERSplugins/golang/skills/lint/OWNERSplugins/gwapi/OWNERSplugins/gwapi/commands/OWNERSplugins/gwapi/resources/OWNERSplugins/hcp/OWNERSplugins/hcp/commands/OWNERSplugins/hcp/skills/OWNERSplugins/hcp/skills/hcp-create-agent/OWNERSplugins/hcp/skills/hcp-create-aws/OWNERSplugins/hcp/skills/hcp-create-azure/OWNERSplugins/hcp/skills/hcp-create-kubevirt/OWNERSplugins/hcp/skills/hcp-create-openstack/OWNERSplugins/hcp/skills/hcp-create-powervs/OWNERSplugins/hello-world/OWNERSplugins/hello-world/commands/OWNERSplugins/hello-world/evals/OWNERSplugins/jira/OWNERSplugins/jira/commands/OWNERSplugins/jira/evals/OWNERSplugins/jira/evals/fixtures/OWNERSplugins/jira/reference/OWNERSplugins/jira/skills/OWNERSplugins/jira/skills/catch-me-up/OWNERSplugins/jira/skills/catch-me-up/scripts/OWNERSplugins/jira/skills/categorize-activity-type/OWNERSplugins/jira/skills/cntrlplane/OWNERSplugins/jira/skills/create-bug/OWNERSplugins/jira/skills/create-epic/OWNERSplugins/jira/skills/create-feature-request/OWNERSplugins/jira/skills/create-feature/OWNERSplugins/jira/skills/create-release-note/OWNERSplugins/jira/skills/create-story/OWNERSplugins/jira/skills/create-task/OWNERSplugins/jira/skills/extract-prs/OWNERSplugins/jira/skills/gcp-hcp/OWNERSplugins/jira/skills/generate-enhancement/OWNERSplugins/jira/skills/hypershift/OWNERSplugins/jira/skills/jira-doc-generator/OWNERSplugins/jira/skills/jira-issues-by-component/OWNERSplugins/jira/skills/jira-validate-blockers/OWNERSplugins/jira/skills/ocpbugs/OWNERSplugins/jira/skills/ready-to-solve/OWNERSplugins/jira/skills/status-analysis/OWNERSplugins/jira/skills/status-analysis/scripts/OWNERSplugins/lvms/OWNERSplugins/lvms/commands/OWNERSplugins/lvms/skills/OWNERSplugins/lvms/skills/lvms-analyzer/OWNERSplugins/lvms/skills/lvms-analyzer/scripts/OWNERSplugins/marketplace-ops/OWNERSplugins/marketplace-ops/commands/OWNERSplugins/marketplace-ops/scripts/OWNERSplugins/must-gather/OWNERSplugins/must-gather/commands/OWNERSplugins/must-gather/skills/OWNERSplugins/must-gather/skills/must-gather-analyzer/OWNERSplugins/must-gather/skills/must-gather-analyzer/scripts/OWNERSplugins/native-notifications/OWNERSplugins/native-notifications/hooks/OWNERSplugins/node-tuning/OWNERSplugins/node-tuning/commands/OWNERSplugins/node-tuning/skills/OWNERSplugins/node-tuning/skills/scripts/OWNERSplugins/node/OWNERSplugins/node/commands/OWNERSplugins/olm-team/OWNERSplugins/olm-team/commands/OWNERSplugins/olm-team/scripts/OWNERSplugins/olm-team/skills/OWNERSplugins/olm-team/skills/k8s-ocp-olm-expert/OWNERSplugins/olm/OWNERSplugins/olm/commands/OWNERSplugins/openshift-tls-profile/OWNERSplugins/openshift-tls-profile/commands/OWNERSplugins/openshift-tls-profile/skills/OWNERSplugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERSplugins/openshift/OWNERSplugins/openshift/commands/OWNERSplugins/openshift/skills/OWNERSplugins/openshift/skills/generating-ovn-topology/OWNERSplugins/openshift/skills/generating-ovn-topology/scripts/OWNERSplugins/openshift/skills/openshift-node-kernel/OWNERSplugins/origin/OWNERSplugins/origin/commands/OWNERSplugins/ote-migration/OWNERSplugins/ote-migration/commands/OWNERSplugins/ote-migration/skills/OWNERSplugins/ote-migration/skills/ote-migration-workflow/OWNERSplugins/rds-analyzer/OWNERSplugins/rds-analyzer/commands/OWNERSplugins/rds-analyzer/scripts/OWNERSplugins/rds-analyzer/skills/OWNERSplugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERSplugins/session/OWNERSplugins/session/commands/OWNERSplugins/snowflake/OWNERSplugins/snowflake/commands/OWNERSplugins/snowflake/scripts/OWNERSplugins/snowflake/skills/OWNERSplugins/snowflake/skills/setup-snowflake/OWNERSplugins/sosreport/OWNERSplugins/sosreport/commands/OWNERSplugins/sosreport/skills/OWNERSplugins/sosreport/skills/logs-analysis/OWNERSplugins/sosreport/skills/network-analysis/OWNERSplugins/sosreport/skills/ovs-db-analysis/OWNERSplugins/sosreport/skills/ovs-db-analysis/scripts/OWNERSplugins/sosreport/skills/resource-analysis/OWNERSplugins/sosreport/skills/system-config-analysis/OWNERSplugins/teams/OWNERSplugins/teams/commands/OWNERSplugins/teams/skills/OWNERSplugins/teams/skills/analyze-regressions/OWNERSplugins/teams/skills/coderabbit-adoption/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERSplugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERSplugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERSplugins/teams/skills/get-release-dates/OWNERSplugins/teams/skills/list-components/OWNERSplugins/teams/skills/list-jiras/OWNERSplugins/teams/skills/list-regressions/OWNERSplugins/teams/skills/list-teams/OWNERSplugins/teams/skills/summarize-jiras/OWNERSplugins/test-coverage/OWNERSplugins/test-coverage/commands/OWNERSplugins/test-coverage/skills/OWNERSplugins/test-coverage/skills/analyze/OWNERSplugins/test-coverage/skills/gaps/OWNERSplugins/testing/OWNERSplugins/testing/commands/OWNERSplugins/testing/skills/OWNERSplugins/testing/skills/mutation-generator/OWNERSplugins/testing/skills/mutation-tester/OWNERSplugins/utils/OWNERSplugins/utils/commands/OWNERSplugins/utils/scripts/OWNERSplugins/workspaces/OWNERSplugins/workspaces/commands/OWNERSplugins/workspaces/commands/create/OWNERSplugins/workspaces/commands/delete/OWNERSplugins/yaml/OWNERSplugins/yaml/commands/OWNERSscripts/OWNERSscripts/build-website.pyscripts/generate_plugin_docs.pytests/conftest.pytests/test_owners_rule.pytests/test_protected_dirs_rule.py
💤 Files with no reviewable changes (7)
- commands/hello-world/echo.toml
- docs/README.md
- agents/feedback.md
- scripts/build-website.py
- docs/data.json
- .github/workflows/update-docs.yml
- scripts/generate_plugin_docs.py
✅ Files skipped from review due to trivial changes (196)
- plugins/hcp/skills/hcp-create-aws/OWNERS
- plugins/ai-sbom/skills/generate/OWNERS
- plugins/bigquery/skills/ci-data-analyst/OWNERS
- plugins/compliance/skills/cve-intelligence-gathering/OWNERS
- plugins/bigquery/OWNERS
- plugins/ci/OWNERS
- plugins/rds-analyzer/skills/OWNERS
- plugins/openshift-tls-profile/skills/OWNERS
- plugins/jira/evals/fixtures/OWNERS
- plugins/jira/skills/categorize-activity-type/OWNERS
- plugins/console/skills/upgrade-sdk/OWNERS
- plugins/hcp/skills/hcp-create-openstack/OWNERS
- plugins/git/skills/OWNERS
- plugins/golang/skills/lint/OWNERS
- plugins/lvms/skills/lvms-analyzer/OWNERS
- plugins/ci/skills/payload-autodl-json/OWNERS
- plugins/jira/skills/status-analysis/OWNERS
- plugins/jira/skills/create-feature-request/OWNERS
- plugins/lvms/skills/OWNERS
- plugins/golang/skills/lint-fix/OWNERS
- plugins/hello-world/evals/OWNERS
- plugins/compliance/skills/codebase-impact-analysis/OWNERS
- plugins/git/commands/OWNERS
- plugins/jira/skills/catch-me-up/OWNERS
- plugins/jira/skills/OWNERS
- plugins/jira/skills/create-bug/OWNERS
- plugins/session/commands/OWNERS
- plugins/ci/skills/payload-results-yaml/OWNERS
- plugins/compliance/skills/OWNERS
- plugins/rds-analyzer/scripts/OWNERS
- plugins/ci/skills/set-release-blocker/OWNERS
- plugins/ci/skills/add-jira-triage-link/OWNERS
- plugins/workspaces/commands/delete/OWNERS
- plugins/code-review/skills/classify-review-comment/OWNERS
- plugins/sosreport/commands/OWNERS
- plugins/test-coverage/skills/gaps/OWNERS
- plugins/ci/skills/fetch-test-report/OWNERS
- plugins/sosreport/skills/OWNERS
- plugins/node-tuning/skills/scripts/OWNERS
- plugins/golang/OWNERS
- plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
- plugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERS
- plugins/jira/skills/create-task/OWNERS
- plugins/sosreport/skills/resource-analysis/OWNERS
- plugins/code-review/skills/OWNERS
- plugins/ci/skills/fetch-jira-issue/OWNERS
- plugins/node-tuning/commands/OWNERS
- plugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERS
- plugins/utils/commands/OWNERS
- plugins/ci/skills/OWNERS
- plugins/jira/skills/ocpbugs/OWNERS
- plugins/compliance/OWNERS
- plugins/jira/skills/create-release-note/OWNERS
- plugins/snowflake/scripts/OWNERS
- plugins/jira/skills/create-epic/OWNERS
- plugins/utils/scripts/OWNERS
- plugins/teams/skills/OWNERS
- plugins/olm-team/commands/OWNERS
- plugins/yaml/commands/OWNERS
- plugins/snowflake/commands/OWNERS
- plugins/openshift/skills/generating-ovn-topology/scripts/OWNERS
- plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
- plugins/olm-team/OWNERS
- plugins/jira/skills/generate-enhancement/OWNERS
- plugins/must-gather/skills/OWNERS
- plugins/code-review/skills/lang-go/OWNERS
- plugins/jira/skills/hypershift/OWNERS
- plugins/code-review/evals/OWNERS
- plugins/jira/skills/extract-prs/OWNERS
- plugins/native-notifications/hooks/OWNERS
- plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
- plugins/bigquery/skills/analyze-usage/OWNERS
- plugins/test-coverage/commands/OWNERS
- plugins/hcp/skills/hcp-create-agent/OWNERS
- plugins/ci/skills/fetch-releases/OWNERS
- plugins/ci/skills/fetch-regression-details/OWNERS
- plugins/marketplace-ops/scripts/OWNERS
- plugins/hcp/skills/hcp-create-powervs/OWNERS
- plugins/test-coverage/skills/OWNERS
- plugins/ci/skills/prow-job-artifact-search/OWNERS
- plugins/olm-team/scripts/OWNERS
- plugins/testing/commands/OWNERS
- plugins/openshift-tls-profile/commands/OWNERS
- plugins/marketplace-ops/commands/OWNERS
- plugins/node/OWNERS
- plugins/console/skills/OWNERS
- plugins/ci/docs/OWNERS
- plugins/ote-migration/skills/ote-migration-workflow/OWNERS
- plugins/hcp/skills/OWNERS
- plugins/bigquery/commands/OWNERS
- plugins/testing/OWNERS
- plugins/golang/hooks/OWNERS
- plugins/ci/skills/fetch-payloads/OWNERS
- plugins/golang/skills/fix-cve/OWNERS
- plugins/node-tuning/skills/OWNERS
- plugins/hcp/skills/hcp-create-kubevirt/OWNERS
- plugins/ci/skills/payload-experimental-reverts/OWNERS
- plugins/jira/skills/cntrlplane/OWNERS
- plugins/workspaces/commands/OWNERS
- plugins/ote-migration/skills/OWNERS
- plugins/doc/OWNERS
- plugins/teams/skills/list-teams/OWNERS
- plugins/ai-sbom/docs/OWNERS
- plugins/ci/skills/fetch-prowjob-json/OWNERS
- plugins/doc/commands/OWNERS
- plugins/jira/skills/status-analysis/scripts/OWNERS
- OWNERS_ALIASES
- plugins/olm/commands/OWNERS
- plugins/jira/reference/OWNERS
- plugins/sosreport/skills/ovs-db-analysis/OWNERS
- .github/OWNERS
- plugins/ci/agents/OWNERS
- plugins/ci/skills/fetch-test-runs/OWNERS
- plugins/ci/skills/stage-payload-reverts/OWNERS
- plugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERS
- plugins/jira/skills/catch-me-up/scripts/OWNERS
- plugins/code-review/OWNERS
- plugins/container-image/commands/OWNERS
- plugins/ci/skills/revert-pr/OWNERS
- plugins/teams/skills/summarize-jiras/OWNERS
- plugins/session/OWNERS
- plugins/hello-world/OWNERS
- plugins/ote-migration/OWNERS
- plugins/teams/skills/coderabbit-adoption/OWNERS
- plugins/marketplace-ops/OWNERS
- scripts/OWNERS
- plugins/openshift/skills/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERS
- plugins/olm-team/skills/OWNERS
- plugins/agendas/commands/OWNERS
- plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
- plugins/jira/OWNERS
- plugins/snowflake/skills/setup-snowflake/OWNERS
- plugins/testing/skills/OWNERS
- plugins/ci/skills/prow-job-extract-must-gather/OWNERS
- plugins/ci/skills/fetch-job-run-summary/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERS
- plugins/workspaces/OWNERS
- plugins/node/commands/OWNERS
- plugins/rds-analyzer/commands/OWNERS
- plugins/teams/skills/list-regressions/OWNERS
- plugins/jira/skills/jira-issues-by-component/OWNERS
- images/OWNERS
- plugins/jira/skills/jira-validate-blockers/OWNERS
- plugins/workspaces/commands/create/OWNERS
- plugins/ci/skills/analyze-disruption/OWNERS
- plugins/git/OWNERS
- plugins/etcd/commands/OWNERS
- plugins/container-image/OWNERS
- plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
- plugins/openshift/OWNERS
- plugins/jira/skills/ready-to-solve/OWNERS
- plugins/snowflake/skills/OWNERS
- plugins/ote-migration/commands/OWNERS
- plugins/compliance/commands/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERS
- plugins/test-coverage/OWNERS
- plugins/ai-operator-dashboard-generator/OWNERS
- plugins/must-gather/skills/must-gather-analyzer/OWNERS
- plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
- plugins/teams/skills/get-release-dates/OWNERS
- plugins/ai-operator-dashboard-generator/commands/OWNERS
- plugins/jira/evals/OWNERS
- plugins/jira/skills/create-feature/OWNERS
- plugins/gwapi/commands/OWNERS
- plugins/teams/OWNERS
- plugins/teams/skills/list-jiras/OWNERS
- plugins/jira/skills/gcp-hcp/OWNERS
- plugins/compliance/skills/call-graph-analysis/OWNERS
- plugins/teams/skills/analyze-regressions/OWNERS
- plugins/golang/hooks/scripts/OWNERS
- plugins/ci/skills/analyze-payload/OWNERS
- plugins/compliance/skills/remediation-planning/OWNERS
- plugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERS
- plugins/must-gather/OWNERS
- plugins/openshift/skills/openshift-node-kernel/OWNERS
- plugins/jira/skills/create-story/OWNERS
- plugins/git/skills/suggest-reviewers/OWNERS
- plugins/testing/skills/mutation-generator/OWNERS
- plugins/ai-sbom/OWNERS
- plugins/ci/commands/OWNERS
- plugins/ai-sbom/skills/OWNERS
- plugins/ci/skills/oc-auth/OWNERS
- plugins/teams/commands/OWNERS
- plugins/ci/skills/prow-job-analyze-resource/OWNERS
- plugins/code-review/commands/OWNERS
- README.md
- plugins/testing/skills/mutation-tester/OWNERS
- .cursor/OWNERS
- PLUGINS.md
- plugins/openshift-tls-profile/OWNERS
- plugins/sosreport/skills/ovs-db-analysis/scripts/OWNERS
- plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
- plugins/agendas/OWNERS
- CONTRIBUTING.md
- plugins/jira/commands/OWNERS
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.github/workflows/lint-review.yml (1)
17-22:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAdd
contents: readwhen using a scopedpermissionsblock.
actions/checkoutneeds repository read access. When a job-levelpermissionsblock is present, any omitted scopes default tonone, makingcontentsinaccessible unless explicitly granted.Proposed fix
permissions: + contents: read pull-requests: write🤖 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 @.github/workflows/lint-review.yml around lines 17 - 22, The workflow's job-level permissions block currently only sets pull-requests: write, which revokes default repository read access and breaks actions/checkout; update the permissions block to explicitly include contents: read alongside pull-requests: write so actions/checkout (uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd) can access the repository; ensure the permissions stanza contains both "contents: read" and "pull-requests: write".
🤖 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 @.skillsaw/plugindocs_rule.py:
- Around line 39-40: The current check that returns early when
index_path.exists() is false should instead record a violation so missing docs
fail lint: replace the early return with logic that appends a descriptive
violation to the violations list (mentioning missing docs/index.html) and then
return the violations; update the function that contains index_path and
violations (the plugindocs rule function in .skillsaw/plugindocs_rule.py) so
callers still get the violations list rather than silently passing.
In `@plugins/olm/OWNERS`:
- Around line 1-6: Update the OWNERS entries to reflect git history: remove the
user "chiragkyal" from both the approvers and reviewers lists and add
"stephen@redhat.com" in their place so the approvers list contains
"ai-helpers-admins" and "stephen@redhat.com" and the reviewers list contains
"ai-helpers-admins" and "stephen@redhat.com"; ensure there are no duplicates and
formatting remains valid YAML.
---
Outside diff comments:
In @.github/workflows/lint-review.yml:
- Around line 17-22: The workflow's job-level permissions block currently only
sets pull-requests: write, which revokes default repository read access and
breaks actions/checkout; update the permissions block to explicitly include
contents: read alongside pull-requests: write so actions/checkout (uses:
actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd) can access the
repository; ensure the permissions stanza contains both "contents: read" and
"pull-requests: write".
🪄 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: af896572-c8da-4690-8432-0e9bb8712e35
📒 Files selected for processing (179)
.cursor/OWNERS.github/OWNERS.github/workflows/OWNERS.github/workflows/lint-review.yml.github/workflows/update-docs.yml.github/workflows/validate-plugin-version.yml.skillsaw-owners-rule.py.skillsaw-promptfoo-budget-rule.py.skillsaw-protected-dirs-rule.py.skillsaw.yaml.skillsaw/plugindocs_rule.pyCONTRIBUTING.mdMakefileOWNERSOWNERS_ALIASESPLUGINS.mdREADME.mdagents/feedback.mdcommands/hello-world/echo.tomldocs/README.mddocs/data.jsondocs/index.htmlevals/OWNERSimages/OWNERSplugins/agendas/OWNERSplugins/agendas/commands/OWNERSplugins/ai-operator-dashboard-generator/OWNERSplugins/ai-operator-dashboard-generator/commands/OWNERSplugins/ai-operator-dashboard-generator/skills/OWNERSplugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERSplugins/ai-sbom/OWNERSplugins/ai-sbom/docs/OWNERSplugins/ai-sbom/scripts/OWNERSplugins/ai-sbom/skills/OWNERSplugins/ai-sbom/skills/generate-sbom/OWNERSplugins/bigquery/OWNERSplugins/bigquery/commands/OWNERSplugins/bigquery/skills/OWNERSplugins/bigquery/skills/analyze-usage/OWNERSplugins/bigquery/skills/ci-data-analyst/OWNERSplugins/ci/OWNERSplugins/ci/agents/OWNERSplugins/ci/commands/OWNERSplugins/ci/docs/OWNERSplugins/ci/scripts/OWNERSplugins/ci/skills/OWNERSplugins/ci/skills/add-jira-triage-link/OWNERSplugins/ci/skills/analyze-disruption/OWNERSplugins/ci/skills/analyze-payload/OWNERSplugins/ci/skills/fetch-jira-issue/OWNERSplugins/ci/skills/fetch-job-run-summary/OWNERSplugins/ci/skills/fetch-new-prs-in-payload/OWNERSplugins/ci/skills/fetch-payloads/OWNERSplugins/ci/skills/fetch-prowjob-json/OWNERSplugins/ci/skills/fetch-regression-details/OWNERSplugins/ci/skills/fetch-related-triages/OWNERSplugins/ci/skills/fetch-releases/OWNERSplugins/ci/skills/fetch-test-report/OWNERSplugins/ci/skills/fetch-test-runs/OWNERSplugins/ci/skills/oc-auth/OWNERSplugins/ci/skills/payload-autodl-json/OWNERSplugins/ci/skills/payload-experimental-reverts/OWNERSplugins/ci/skills/payload-results-yaml/OWNERSplugins/ci/skills/prow-job-analyze-install-failure/OWNERSplugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERSplugins/ci/skills/prow-job-analyze-resource/OWNERSplugins/ci/skills/prow-job-analyze-test-failure/OWNERSplugins/ci/skills/prow-job-artifact-search/OWNERSplugins/ci/skills/prow-job-extract-must-gather/OWNERSplugins/ci/skills/revert-pr/OWNERSplugins/ci/skills/set-release-blocker/OWNERSplugins/ci/skills/stage-payload-reverts/OWNERSplugins/ci/skills/triage-regression/OWNERSplugins/ci/skills/trigger-payload-job/OWNERSplugins/code-review/OWNERSplugins/code-review/commands/OWNERSplugins/code-review/evals/OWNERSplugins/code-review/skills/OWNERSplugins/code-review/skills/classify-review-comment/OWNERSplugins/code-review/skills/go-code-review/OWNERSplugins/code-review/skills/hypershift-code-review/OWNERSplugins/compliance/OWNERSplugins/compliance/commands/OWNERSplugins/compliance/skills/OWNERSplugins/compliance/skills/call-graph-analysis/OWNERSplugins/compliance/skills/codebase-impact-analysis/OWNERSplugins/compliance/skills/cve-intelligence-gathering/OWNERSplugins/compliance/skills/remediation-planning/OWNERSplugins/console/OWNERSplugins/console/skills/OWNERSplugins/console/skills/upgrade-console-sdk/OWNERSplugins/container-image/OWNERSplugins/container-image/commands/OWNERSplugins/doc/OWNERSplugins/doc/commands/OWNERSplugins/etcd/OWNERSplugins/etcd/commands/OWNERSplugins/git/OWNERSplugins/git/commands/OWNERSplugins/git/skills/OWNERSplugins/git/skills/suggest-reviewers/OWNERSplugins/golang/OWNERSplugins/golang/hooks/OWNERSplugins/golang/hooks/scripts/OWNERSplugins/golang/skills/OWNERSplugins/golang/skills/fix-cve/OWNERSplugins/golang/skills/go-lint-fix/OWNERSplugins/golang/skills/go-lint/OWNERSplugins/gwapi/OWNERSplugins/gwapi/commands/OWNERSplugins/gwapi/resources/OWNERSplugins/hcp/OWNERSplugins/hcp/commands/OWNERSplugins/hcp/skills/OWNERSplugins/hcp/skills/hcp-create-agent/OWNERSplugins/hcp/skills/hcp-create-aws/OWNERSplugins/hcp/skills/hcp-create-azure/OWNERSplugins/hcp/skills/hcp-create-kubevirt/OWNERSplugins/hcp/skills/hcp-create-openstack/OWNERSplugins/hcp/skills/hcp-create-powervs/OWNERSplugins/hello-world/OWNERSplugins/hello-world/commands/OWNERSplugins/hello-world/evals/OWNERSplugins/jira/OWNERSplugins/jira/commands/OWNERSplugins/jira/evals/OWNERSplugins/jira/evals/fixtures/OWNERSplugins/jira/reference/OWNERSplugins/jira/skills/OWNERSplugins/jira/skills/catch-me-up/OWNERSplugins/jira/skills/catch-me-up/scripts/OWNERSplugins/jira/skills/categorize-activity-type/OWNERSplugins/jira/skills/cntrlplane/OWNERSplugins/jira/skills/create-bug/OWNERSplugins/jira/skills/create-epic/OWNERSplugins/jira/skills/create-feature-request/OWNERSplugins/jira/skills/create-feature/OWNERSplugins/jira/skills/create-release-note/OWNERSplugins/jira/skills/create-story/OWNERSplugins/jira/skills/create-task/OWNERSplugins/jira/skills/extract-prs/OWNERSplugins/jira/skills/gcp-hcp/OWNERSplugins/jira/skills/generate-enhancement/OWNERSplugins/jira/skills/hypershift/OWNERSplugins/jira/skills/jira-doc-generator/OWNERSplugins/jira/skills/jira-issues-by-component/OWNERSplugins/jira/skills/jira-validate-blockers/OWNERSplugins/jira/skills/ocpbugs/OWNERSplugins/jira/skills/ready-to-solve/OWNERSplugins/jira/skills/status-analysis/OWNERSplugins/jira/skills/status-analysis/scripts/OWNERSplugins/lvms/OWNERSplugins/lvms/commands/OWNERSplugins/lvms/skills/OWNERSplugins/lvms/skills/lvms-analyzer/OWNERSplugins/lvms/skills/lvms-analyzer/scripts/OWNERSplugins/marketplace-ops/OWNERSplugins/marketplace-ops/commands/OWNERSplugins/marketplace-ops/scripts/OWNERSplugins/must-gather/OWNERSplugins/must-gather/commands/OWNERSplugins/must-gather/skills/OWNERSplugins/must-gather/skills/must-gather-analyzer/OWNERSplugins/must-gather/skills/must-gather-analyzer/scripts/OWNERSplugins/native-notifications/OWNERSplugins/native-notifications/hooks/OWNERSplugins/node-tuning/OWNERSplugins/node-tuning/commands/OWNERSplugins/node-tuning/skills/OWNERSplugins/node-tuning/skills/scripts/OWNERSplugins/node/OWNERSplugins/node/commands/OWNERSplugins/olm-team/OWNERSplugins/olm-team/commands/OWNERSplugins/olm-team/scripts/OWNERSplugins/olm-team/skills/OWNERSplugins/olm-team/skills/k8s-ocp-olm-expert/OWNERSplugins/olm/OWNERSplugins/olm/commands/OWNERS
💤 Files with no reviewable changes (5)
- commands/hello-world/echo.toml
- docs/data.json
- agents/feedback.md
- docs/README.md
- .github/workflows/update-docs.yml
✅ Files skipped from review due to trivial changes (131)
- plugins/compliance/skills/OWNERS
- plugins/container-image/commands/OWNERS
- plugins/code-review/skills/classify-review-comment/OWNERS
- plugins/ci/skills/fetch-test-report/OWNERS
- plugins/ci/skills/fetch-prowjob-json/OWNERS
- plugins/ai-sbom/skills/generate-sbom/OWNERS
- plugins/code-review/skills/go-code-review/OWNERS
- plugins/ai-operator-dashboard-generator/skills/OWNERS
- plugins/compliance/OWNERS
- plugins/jira/skills/ocpbugs/OWNERS
- .github/OWNERS
- plugins/jira/skills/create-epic/OWNERS
- plugins/compliance/skills/codebase-impact-analysis/OWNERS
- plugins/ai-sbom/OWNERS
- plugins/jira/skills/cntrlplane/OWNERS
- plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
- plugins/ai-sbom/docs/OWNERS
- plugins/container-image/OWNERS
- plugins/ci/skills/fetch-jira-issue/OWNERS
- plugins/jira/skills/jira-doc-generator/OWNERS
- plugins/ai-sbom/skills/OWNERS
- plugins/ai-sbom/scripts/OWNERS
- plugins/hcp/commands/OWNERS
- plugins/ci/skills/payload-autodl-json/OWNERS
- plugins/jira/skills/create-story/OWNERS
- plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
- plugins/agendas/commands/OWNERS
- plugins/golang/skills/fix-cve/OWNERS
- images/OWNERS
- plugins/jira/skills/catch-me-up/scripts/OWNERS
- plugins/jira/commands/OWNERS
- plugins/ci/skills/analyze-payload/OWNERS
- plugins/bigquery/skills/OWNERS
- plugins/ci/docs/OWNERS
- plugins/native-notifications/hooks/OWNERS
- plugins/must-gather/skills/OWNERS
- plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
- plugins/hcp/skills/hcp-create-openstack/OWNERS
- plugins/jira/OWNERS
- plugins/ci/skills/fetch-job-run-summary/OWNERS
- plugins/bigquery/skills/ci-data-analyst/OWNERS
- plugins/ci/skills/fetch-releases/OWNERS
- plugins/ci/skills/prow-job-extract-must-gather/OWNERS
- plugins/jira/skills/create-feature-request/OWNERS
- plugins/ci/skills/stage-payload-reverts/OWNERS
- plugins/ci/skills/prow-job-analyze-resource/OWNERS
- plugins/git/commands/OWNERS
- plugins/jira/skills/status-analysis/OWNERS
- plugins/hcp/skills/OWNERS
- plugins/must-gather/commands/OWNERS
- plugins/olm-team/commands/OWNERS
- plugins/golang/skills/go-lint/OWNERS
- plugins/ci/skills/prow-job-artifact-search/OWNERS
- plugins/jira/skills/create-feature/OWNERS
- plugins/lvms/skills/OWNERS
- plugins/jira/skills/jira-validate-blockers/OWNERS
- plugins/ci/skills/fetch-test-runs/OWNERS
- plugins/node-tuning/commands/OWNERS
- plugins/ci/skills/revert-pr/OWNERS
- plugins/ci/skills/add-jira-triage-link/OWNERS
- plugins/ci/commands/OWNERS
- plugins/jira/reference/OWNERS
- plugins/jira/skills/status-analysis/scripts/OWNERS
- plugins/jira/skills/extract-prs/OWNERS
- plugins/jira/evals/OWNERS
- plugins/hcp/skills/hcp-create-aws/OWNERS
- plugins/hcp/skills/hcp-create-powervs/OWNERS
- plugins/code-review/skills/hypershift-code-review/OWNERS
- PLUGINS.md
- plugins/jira/skills/create-bug/OWNERS
- plugins/jira/skills/jira-issues-by-component/OWNERS
- plugins/node-tuning/skills/scripts/OWNERS
- plugins/jira/skills/hypershift/OWNERS
- plugins/marketplace-ops/OWNERS
- plugins/bigquery/commands/OWNERS
- plugins/console/skills/OWNERS
- plugins/doc/commands/OWNERS
- plugins/console/skills/upgrade-console-sdk/OWNERS
- plugins/lvms/commands/OWNERS
- plugins/node/OWNERS
- plugins/compliance/skills/cve-intelligence-gathering/OWNERS
- plugins/ai-operator-dashboard-generator/commands/OWNERS
- plugins/jira/skills/categorize-activity-type/OWNERS
- plugins/git/skills/OWNERS
- plugins/jira/skills/generate-enhancement/OWNERS
- plugins/ci/skills/fetch-related-triages/OWNERS
- plugins/jira/skills/catch-me-up/OWNERS
- plugins/ci/skills/oc-auth/OWNERS
- plugins/etcd/commands/OWNERS
- plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
- plugins/hcp/skills/hcp-create-kubevirt/OWNERS
- plugins/node-tuning/skills/OWNERS
- plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
- plugins/ci/skills/triage-regression/OWNERS
- plugins/jira/skills/create-task/OWNERS
- plugins/agendas/OWNERS
- plugins/hello-world/evals/OWNERS
- plugins/jira/skills/gcp-hcp/OWNERS
- plugins/ai-operator-dashboard-generator/OWNERS
- plugins/code-review/commands/OWNERS
- plugins/etcd/OWNERS
- plugins/gwapi/commands/OWNERS
- .cursor/OWNERS
- plugins/ci/skills/payload-results-yaml/OWNERS
- plugins/golang/hooks/OWNERS
- plugins/node/commands/OWNERS
- plugins/bigquery/OWNERS
- plugins/code-review/skills/OWNERS
- plugins/olm/commands/OWNERS
- plugins/ci/skills/trigger-payload-job/OWNERS
- plugins/hcp/skills/hcp-create-agent/OWNERS
- plugins/jira/skills/ready-to-solve/OWNERS
- plugins/golang/skills/OWNERS
- plugins/git/skills/suggest-reviewers/OWNERS
- plugins/olm-team/skills/OWNERS
- plugins/doc/OWNERS
- plugins/bigquery/skills/analyze-usage/OWNERS
- plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
- plugins/golang/OWNERS
- plugins/olm-team/OWNERS
- plugins/hello-world/OWNERS
- plugins/jira/skills/OWNERS
- plugins/compliance/skills/call-graph-analysis/OWNERS
- plugins/must-gather/skills/must-gather-analyzer/OWNERS
- plugins/compliance/commands/OWNERS
- .github/workflows/validate-plugin-version.yml
- README.md
- plugins/must-gather/OWNERS
- plugins/git/OWNERS
- CONTRIBUTING.md
- .skillsaw-promptfoo-budget-rule.py
e94128b to
91685da
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.skillsaw-owners-rule.py (1)
32-44:⚠️ Potential issue | 🟠 Major | ⚡ Quick winEnforce
OWNERSas a file, not just an existing path.Line 32 currently accepts any existing path, so an
OWNERS/directory can bypass this rule. Add a file-type check before the empty-file check.Proposed fix
if not owners_path.exists(): violations.append( self.violation( f"Plugin '{plugin_name}' is missing an OWNERS file", file_path=node.path / ".claude-plugin" / "plugin.json", ) ) + elif not owners_path.is_file(): + violations.append( + self.violation( + f"Plugin '{plugin_name}' has an OWNERS path that is not a file", + file_path=owners_path, + ) + ) elif owners_path.stat().st_size == 0: violations.append( self.violation( f"Plugin '{plugin_name}' has an empty OWNERS file", file_path=owners_path, ) )🤖 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 @.skillsaw-owners-rule.py around lines 32 - 44, The current check only verifies owners_path.exists(), letting an OWNERS/ directory pass; update the logic to require a regular file by using owners_path.is_file(): replace the initial if with a single condition like "if not owners_path.exists() or not owners_path.is_file()" to append the missing OWNERS violation (using plugin_name and file_path as before), and keep the subsequent "elif owners_path.stat().st_size == 0" branch to detect empty files; reference owners_path, violations.append, and self.violation to locate and modify the code.
♻️ Duplicate comments (2)
.skillsaw-protected-dirs-rule.py (1)
63-67:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winExclude entire ignored trees, not just directories with matching leaf names.
Line 66 checks only
subdir.name, so descendants inside.work/__pycache__can still be linted viarglob("*").Proposed fix
for subdir in protected_path.rglob("*"): if not subdir.is_dir(): continue - if subdir.name in ("__pycache__", ".work"): + rel_parts = subdir.relative_to(protected_path).parts + if any(part in ("__pycache__", ".work") for part in rel_parts): continue🤖 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 @.skillsaw-protected-dirs-rule.py around lines 63 - 67, The loop currently only checks subdir.name so descendants under ignored directories still get processed; change the check to skip any path that has an ignored ancestor by testing the path parts (e.g., use protected_path.rglob("*") and skip when any(part in ("__pycache__",".work") for part in subdir.parts)) or otherwise use a Path.match like subdir.match("**/.work") / "**/__pycache__" to exclude the entire ignored tree; update the condition around subdir.is_dir() and the name check to perform this ancestor-aware test so all descendants of .work and __pycache__ are excluded..skillsaw/plugindocs_rule.py (1)
39-40:⚠️ Potential issue | 🟠 Major | ⚡ Quick winDo not silently pass when
docs/index.htmlis missing.The rule returns early without a violation when
docs/index.htmldoesn't exist, allowing repositories with missing documentation to pass lint checks. This defeats the purpose of the rule.💡 Proposed fix
if not index_path.exists(): + violations.append( + self.violation( + "docs/index.html is missing. Run 'skillsaw docs -o docs/' to generate docs.", + file_path=docs_path, + ) + ) return violations🤖 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 @.skillsaw/plugindocs_rule.py around lines 39 - 40, The rule currently returns early when index_path (docs/index.html) doesn't exist, which hides missing-docs problems; instead, update the check around index_path.exists() to add a violation to the violations collection (e.g., violations.append(...) or violations.add(...)) describing that docs/index.html is missing (include context like index_path and a clear message), and only return after recording that violation so repos with no docs fail the lint rule; keep the rest of the function logic the same and reference index_path and the violations variable when making the change.
🧹 Nitpick comments (1)
Makefile (1)
43-43: ⚖️ Poor tradeoffPython 3 dependency for symlink path calculation.
The relative path calculation requires Python 3 at build time. While reasonable for most environments, consider if a pure shell alternative (or a build-time check) would improve portability.
🤖 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 `@Makefile` at line 43, The Makefile currently computes rel with rel=$$(python3 -c "import os.path; print(os.path.relpath('$${root_dir}OWNERS', '$$dir'))") which forces a Python 3 dependency; either replace this with a pure-shell fallback or add a build-time check and clear error/fallback when python3 is missing. Implement one of two fixes: (a) add a small preflight step that checks command -v python3 (or python) and fails fast with a helpful message if not found before using rel, or (b) replace the python3 invocation with a shell-only computation using dirname/realpath/awk/sed logic to compute the relative path and assign it to rel; update usages of rel accordingly (the rel assignment and any rule that relies on rel) so the Makefile works without requiring python3.
🤖 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 @.skillsaw-protected-dirs-rule.py:
- Around line 53-70: The check for OWNERS currently only uses Path.exists(),
which treats directories named "OWNERS" as valid; update the validation in the
loop that handles protected_path (references owners_path and sub_owners) to
ensure the OWNERS entry is an actual file by using an is_file() check (or
equivalent) instead of exists() for both the top-level owners_path and each
sub_owners, and treat non-file OWNERS (missing or not a file) as a violation so
the logic that appends self.violation and continues behaves correctly.
In `@tests/test_protected_dirs_rule.py`:
- Around line 70-78: The test test_violation_when_root_owners_missing is too
loose because it only checks for "missing an OWNERS file" and could match a
violation for .github/workflows; update the assertion to verify the violation
targets the root directory explicitly by inspecting the violation's path or
message for the root ".github" (e.g., assert violations[0].path == str(temp_dir
/ ".github") or assert ".github\" in violations[0].message and not "workflows"),
keeping the rest of the test (RepositoryContext, protected_dirs_rule,
rule.check) unchanged.
---
Outside diff comments:
In @.skillsaw-owners-rule.py:
- Around line 32-44: The current check only verifies owners_path.exists(),
letting an OWNERS/ directory pass; update the logic to require a regular file by
using owners_path.is_file(): replace the initial if with a single condition like
"if not owners_path.exists() or not owners_path.is_file()" to append the missing
OWNERS violation (using plugin_name and file_path as before), and keep the
subsequent "elif owners_path.stat().st_size == 0" branch to detect empty files;
reference owners_path, violations.append, and self.violation to locate and
modify the code.
---
Duplicate comments:
In @.skillsaw-protected-dirs-rule.py:
- Around line 63-67: The loop currently only checks subdir.name so descendants
under ignored directories still get processed; change the check to skip any path
that has an ignored ancestor by testing the path parts (e.g., use
protected_path.rglob("*") and skip when any(part in ("__pycache__",".work") for
part in subdir.parts)) or otherwise use a Path.match like
subdir.match("**/.work") / "**/__pycache__" to exclude the entire ignored tree;
update the condition around subdir.is_dir() and the name check to perform this
ancestor-aware test so all descendants of .work and __pycache__ are excluded.
In @.skillsaw/plugindocs_rule.py:
- Around line 39-40: The rule currently returns early when index_path
(docs/index.html) doesn't exist, which hides missing-docs problems; instead,
update the check around index_path.exists() to add a violation to the violations
collection (e.g., violations.append(...) or violations.add(...)) describing that
docs/index.html is missing (include context like index_path and a clear
message), and only return after recording that violation so repos with no docs
fail the lint rule; keep the rest of the function logic the same and reference
index_path and the violations variable when making the change.
---
Nitpick comments:
In `@Makefile`:
- Line 43: The Makefile currently computes rel with rel=$$(python3 -c "import
os.path; print(os.path.relpath('$${root_dir}OWNERS', '$$dir'))") which forces a
Python 3 dependency; either replace this with a pure-shell fallback or add a
build-time check and clear error/fallback when python3 is missing. Implement one
of two fixes: (a) add a small preflight step that checks command -v python3 (or
python) and fails fast with a helpful message if not found before using rel, or
(b) replace the python3 invocation with a shell-only computation using
dirname/realpath/awk/sed logic to compute the relative path and assign it to
rel; update usages of rel accordingly (the rel assignment and any rule that
relies on rel) so the Makefile works without requiring python3.
🪄 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: eca6b730-52ae-42a3-b244-9ef35d8f1ed1
📒 Files selected for processing (70)
.cursor/OWNERS.github/OWNERS.github/workflows/OWNERS.github/workflows/lint-review.yml.github/workflows/update-docs.yml.github/workflows/validate-plugin-version.yml.skillsaw-owners-rule.py.skillsaw-promptfoo-budget-rule.py.skillsaw-protected-dirs-rule.py.skillsaw.yaml.skillsaw/plugindocs_rule.pyCONTRIBUTING.mdMakefileOWNERSOWNERS_ALIASESPLUGINS.mdREADME.mdagents/feedback.mdcommands/hello-world/echo.tomldocs/README.mddocs/data.jsondocs/index.htmlevals/OWNERSimages/OWNERSplugins/agendas/OWNERSplugins/ai-operator-dashboard-generator/OWNERSplugins/ai-sbom/OWNERSplugins/bigquery/OWNERSplugins/ci/OWNERSplugins/code-review/OWNERSplugins/compliance/OWNERSplugins/console/OWNERSplugins/container-image/OWNERSplugins/doc/OWNERSplugins/etcd/OWNERSplugins/git/OWNERSplugins/golang/OWNERSplugins/gwapi/OWNERSplugins/hcp/OWNERSplugins/hello-world/OWNERSplugins/jira/OWNERSplugins/lvms/OWNERSplugins/marketplace-ops/OWNERSplugins/must-gather/OWNERSplugins/native-notifications/OWNERSplugins/node-tuning/OWNERSplugins/node/OWNERSplugins/olm-team/OWNERSplugins/olm/OWNERSplugins/openshift-tls-profile/OWNERSplugins/openshift/OWNERSplugins/origin/OWNERSplugins/ote-migration/OWNERSplugins/rds-analyzer/OWNERSplugins/session/OWNERSplugins/snowflake/OWNERSplugins/sosreport/OWNERSplugins/teams/OWNERSplugins/test-coverage/OWNERSplugins/testing/OWNERSplugins/utils/OWNERSplugins/workspaces/OWNERSplugins/yaml/OWNERSscripts/OWNERSscripts/build-website.pyscripts/generate_plugin_docs.pytests/OWNERStests/conftest.pytests/test_owners_rule.pytests/test_protected_dirs_rule.py
💤 Files with no reviewable changes (7)
- agents/feedback.md
- docs/README.md
- .github/workflows/update-docs.yml
- docs/data.json
- commands/hello-world/echo.toml
- scripts/generate_plugin_docs.py
- scripts/build-website.py
✅ Files skipped from review due to trivial changes (40)
- plugins/teams/OWNERS
- plugins/session/OWNERS
- plugins/console/OWNERS
- tests/OWNERS
- plugins/test-coverage/OWNERS
- plugins/ai-operator-dashboard-generator/OWNERS
- plugins/ote-migration/OWNERS
- plugins/code-review/OWNERS
- plugins/olm-team/OWNERS
- plugins/ai-sbom/OWNERS
- plugins/openshift/OWNERS
- plugins/jira/OWNERS
- plugins/compliance/OWNERS
- plugins/sosreport/OWNERS
- .github/OWNERS
- plugins/node/OWNERS
- plugins/workspaces/OWNERS
- plugins/openshift-tls-profile/OWNERS
- plugins/hello-world/OWNERS
- OWNERS_ALIASES
- plugins/node-tuning/OWNERS
- plugins/bigquery/OWNERS
- plugins/rds-analyzer/OWNERS
- .cursor/OWNERS
- .github/workflows/OWNERS
- PLUGINS.md
- plugins/container-image/OWNERS
- plugins/origin/OWNERS
- plugins/must-gather/OWNERS
- scripts/OWNERS
- plugins/git/OWNERS
- CONTRIBUTING.md
- plugins/golang/OWNERS
- plugins/marketplace-ops/OWNERS
- plugins/testing/OWNERS
- plugins/doc/OWNERS
- README.md
- .skillsaw-promptfoo-budget-rule.py
- evals/OWNERS
- plugins/agendas/OWNERS
552cbdc to
2f56cc8
Compare
…o skillsaw - Add OWNERS_ALIASES with ai-helpers-admins group - Enable auto_approve_unowned_subfolders in root OWNERS so any collaborator can approve new plugin PRs without needing a root approver - Add OWNERS files to all plugin directories with per-plugin contributors - Add OWNERS files to images/, scripts/, .github/, .cursor/, evals/ - Replace PLUGINS.md with a link to the docs site - Switch docs generation to skillsaw docs, remove old scripts and workflow - Add custom lint rules for OWNERS validation and promptfoo budgets - Migrate lint workflow to skillsaw GitHub Action Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
@stbenjam: This pull request references HPNEX-6 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "5.0.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
cblecker
left a comment
There was a problem hiding this comment.
Overall this looks good — the OWNERS structure and auto_approve_unowned_subfolders approach makes sense for lowering the contribution barrier.
One minor inline comment on the plugindocs lint rule. Also worth noting: the new tests cover owners_rule.py well, but the refactored plugindocs_rule.py (which changed from two-script/two-file checking to single skillsaw docs invocation) doesn't have test coverage yet. Not blocking, just flagging for future consideration.
Move index.html restoration to a finally block so the file is always restored even when skillsaw docs fails, times out, or throws. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
/lgtm Holding if there are any other reviews. Feel free to remove when ready. |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: cblecker, stbenjam The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
Thanks, everyone I talked to was on board and this is probably subject to merge conflicts -- we can revert if there's issues /hold cancel |
|
@stbenjam the format of index.html where basically all of the data is included in a JSON blob on a single line means that practically every PR that merges is going to conflict with practically every other PR. |
Summary
Makes it easier for anyone to contribute plugins without needing admin approval.
auto_approve_unowned_subfoldersin root OWNERS so plugin PRs can be approved by any collaborator.github,evals,images,scripts,tests) so they remain admin-onlyplugin-owners-requiredskillsaw lint rule to enforce that every plugin has an OWNERS fileskillsaw docs(avoids needing to touch any files in/of the repo)make testfor lint rule unit tests andmake list-unprotectedto show open directoriesTest plan
make lintpassesmake testpasses🤖 Generated with Claude Code