Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
462cae7
Enhance pack card display and search functionality; add plugin titles
dmartinol Feb 24, 2026
8136a17
Update AAP integration documentation and skills
dmartinol Feb 25, 2026
a432a93
Merge branch 'RHEcosystemAppEng:main' into remediation-aap
dmartinol Feb 25, 2026
1985901
Merge branch 'RHEcosystemAppEng:main' into remediation-aap
dmartinol Feb 26, 2026
f2d06cc
chore(validation): Added first approach of SKILL_CHECKLIST file and v…
r2dedios Feb 26, 2026
c2ad2f4
fix(workflow): Modified workflow for only validating with Skill Spec …
r2dedios Feb 27, 2026
892eccb
fix(workflow): Added missing linter script
r2dedios Feb 27, 2026
bd4c182
fix(workflow): Removed Claude's internal skills. Only evaluating ours
r2dedios Feb 27, 2026
b242045
fix(workflow): Linter runs over every skill
r2dedios Feb 27, 2026
c086941
fix(merge-skill-design): Merged SKILL_CHECKLIST.md and SKILL_DESIGN_P…
r2dedios Mar 2, 2026
dcd7161
reviewed remediation solution
dmartinol Mar 2, 2026
a051bca
fix(docs): Clarify known issues with MCP client parameter serialization
dmartinol Mar 2, 2026
5b1a520
TODO file
dmartinol Mar 2, 2026
8e5ff76
Merge upstream/main: resolve conflicts in CLAUDE.md and SKILL_DESIGN_…
dmartinol Mar 2, 2026
89d083a
fix linting issues
dmartinol Mar 2, 2026
fb33234
fix(linter): Update collection extraction logic in run-skill-linter.s…
dmartinol Mar 2, 2026
a113f48
chore(gitattributes): Add .gitattributes to enforce LF line endings f…
dmartinol Mar 2, 2026
e27e232
fix(linter): Improve frontmatter delimiter checks and ASCII art detec…
dmartinol Mar 2, 2026
7bc310f
Update docs/app.js
dmartinol Mar 2, 2026
b022cb8
Update rh-sre/docs/testing/aap-integration-test-guide.md
dmartinol Mar 2, 2026
6320156
Update documentation dates to reflect the latest access and validatio…
dmartinol Mar 2, 2026
ea21371
Update README.md to enhance AAP job execution details and clarify MCP…
dmartinol Mar 2, 2026
ed8ff26
Update plugin title in plugins.json to reflect OpenShift Virtualization
dmartinol Mar 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
},
"source": "./rh-sre",
"category": "sre",
"agents": "./agents/remediator.md",
"agents": [],
"skills": "./skills"
},
{
Expand Down
17 changes: 9 additions & 8 deletions .claude/skills/skill-linter/scripts/validate-skill.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,15 @@ pass "SKILL.md exists"
# 3. Extract frontmatter
CONTENT=$(cat "$SKILL_FILE")

# Check for frontmatter delimiters
if ! echo "$CONTENT" | head -1 | grep -q '^---$'; then
# Check for frontmatter delimiters (read from file to avoid broken pipe with set -o pipefail)
FIRST_LINE=$(head -1 "$SKILL_FILE")
if [ "$FIRST_LINE" != "---" ]; then
fail "Missing frontmatter opening delimiter (---)"
exit 2
fi

# Find closing delimiter (skip first line)
CLOSING_LINE=$(echo "$CONTENT" | tail -n +2 | grep -n '^---$' | head -1 | cut -d: -f1)
# Find closing delimiter (skip first line) - use awk to avoid broken pipe (head -1 exits early)
CLOSING_LINE=$(awk 'NR>1 && /^---$/{print NR-1; exit}' "$SKILL_FILE")
if [ -z "$CLOSING_LINE" ]; then
fail "Missing frontmatter closing delimiter (---)"
exit 2
Expand Down Expand Up @@ -172,7 +173,7 @@ if [ -n "$TOOLS" ]; then
fi
# FAIL if YAML multi-line array detected (allowed-tools:\n - item)
if echo "$FRONTMATTER" | grep -q '^allowed-tools:$'; then
NEXT_LINE=$(echo "$FRONTMATTER" | grep -A1 '^allowed-tools:$' | tail -1)
NEXT_LINE=$(echo "$FRONTMATTER" | grep -A1 '^allowed-tools:$' | sed -n '2p')
if echo "$NEXT_LINE" | grep -qE '^[[:space:]]*-[[:space:]]'; then
fail "allowed-tools must be space-delimited, not YAML array"
fi
Expand Down Expand Up @@ -215,15 +216,15 @@ fi
# 10. Content analysis - strip fenced code blocks for checks that need prose-only content
CONTENT_NO_FENCES=$(awk '/^```/{skip=!skip; next} !skip{print}' "$SKILL_FILE")

# 10a. Check for ASCII art outside fenced code blocks (WARN)
if echo "$CONTENT_NO_FENCES" | grep -qE '[─│┌┐└┘├┤┬┴┼╭╮╯╰═║╔╗╚╝╠╣╦╩╬↑↓←→↔⇒⇐⇔▲▼◄►]{3,}'; then
# 10a. Check for ASCII art outside fenced code blocks (WARN) - grep (no -q) reads full input to avoid broken pipe
if grep -E '[─│┌┐└┘├┤┬┴┼╭╮╯╰═║╔╗╚╝╠╣╦╩╬↑↓←→↔⇒⇐⇔▲▼◄►]{3,}' <<< "$CONTENT_NO_FENCES" > /dev/null; then
warn "ASCII art detected outside code blocks - use plain lists or tables"
else
pass "No ASCII art outside code blocks"
fi

# 10b. Check for persona statements outside fenced code blocks (FAIL)
if echo "$CONTENT_NO_FENCES" | grep -qiE '^[[:space:]]*You are (a|an|the) '; then
if grep -iE '^[[:space:]]*You are (a|an|the) ' <<< "$CONTENT_NO_FENCES" > /dev/null; then
fail "Persona statement detected ('You are a/an/the...') - use Audience/Goal framing"
else
pass "No persona statements"
Expand Down
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Enforce LF line endings for text files (prevents CRLF issues in CI)
* text=auto eol=lf
*.md text eol=lf
*.sh text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
23 changes: 6 additions & 17 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@ Each pack follows this structure:
├── .claude-plugin/ # Claude Code plugin metadata
│ └── plugin.json # Name, version, description, author, license
├── .mcp.json # MCP server configurations (uses env vars for credentials)
├── agents/ # Multi-step workflow orchestrators
│ └── <agent>.md # Agent definition with YAML frontmatter
├── skills/ # Specialized task executors
├── skills/ # Specialized task executors (including orchestration skills)
│ └── <skill>/
│ └── SKILL.md # Skill definition with YAML frontmatter
└── docs/ # AI-optimized knowledge base (rh-sre only currently)
Expand All @@ -39,7 +37,7 @@ Each pack follows this structure:

## Working with Agentic Collections

### Skills vs Agents
### Skills

**Skills** (`skills/<skill-name>/SKILL.md`):
- Single-purpose task executors
Expand All @@ -48,14 +46,7 @@ Each pack follows this structure:
- Structure: YAML frontmatter + implementation guide
- Example: `cve-impact` (CVE risk assessment), `playbook-generator` (Ansible generation)

**Agents** (`agents/<agent>.md`):
- Multi-step workflow orchestrators
- Delegate to multiple skills in sequence
- Invoked via the `Task` tool with `subagent_type`
- Structure: YAML frontmatter + workflow definition
- Example: `remediator` (orchestrates 5 skills for end-to-end CVE remediation)

**Key Pattern**: Agents orchestrate skills; skills encapsulate tools. Never call MCP tools directly - always go through skills.
**Key Pattern**: Skills encapsulate tools; orchestration skills invoke other skills. Never call MCP tools directly - always go through skills. For end-to-end CVE remediation, use the `/remediation` skill which orchestrates 6 specialized skills.

## Skill and Agent Requirements

Expand Down Expand Up @@ -151,7 +142,6 @@ last_updated: YYYY-MM-DD

### Files
- Skills: `skills/<skill-name>/SKILL.md` (uppercase SKILL.md)
- Agents: `agents/<agent-name>.md` (lowercase, no folder)
- Docs: Lowercase with dashes, categorized by directory

## Development Workflow
Expand All @@ -163,8 +153,7 @@ last_updated: YYYY-MM-DD
3. Create `skills/` directory
4. Optional: Add `.claude-plugin/plugin.json` for Claude Code
5. Optional: Add `.mcp.json` for MCP server integrations
6. Optional: Add `agents/` for multi-step workflows
7. Update main `README.md` table with link
6. Update main `README.md` table with link

### Adding a Skill

Expand Down Expand Up @@ -221,7 +210,7 @@ last_updated: YYYY-MM-DD

The `rh-sre` pack is the most complete implementation, demonstrating:
- Full skill orchestration (10 skills)
- Agent-based workflows (remediator agent)
- Orchestration skills (remediation skill orchestrates 6 skills)
- AI-optimized documentation system
- MCP server integration
- Red Hat Lightspeed platform integration
Expand All @@ -245,7 +234,7 @@ When creating new collections, follow the pattern that best matches your needs:

### Core Architecture
1. **Skills encapsulate tools** - Never call MCP tools directly; always invoke skills
2. **Agents orchestrate skills** - Complex workflows delegate to specialized skills
2. **Orchestration skills invoke other skills** - Complex workflows delegate to specialized skills; agents orchestrate skills
3. **agentskills.io compliance** - All skills follow the official specification
4. **Progressive disclosure** - Load docs incrementally based on task needs

Expand Down
74 changes: 64 additions & 10 deletions SKILL_DESIGN_PRINCIPLES.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ Delegate to skills, not raw MCP tools.

**✅ Complete Example:**
```yaml
---
description: |
Analyze CVE impact without remediation.

Expand All @@ -94,7 +95,10 @@ description: |
- "Show CVEs affecting systems"
- User mentions "CVEs", "vulnerabilities"

NOT for remediation (use remediator agent instead).
NOT for remediation actions (use remediation skill instead).
model: inherit # Root: Runtime configuration required before skill execution
color: blue # Root: UX - IDE sidebar/terminal theme
---
```

**Rationale**: Minimizes token usage at initialization; prevents skill misuse.
Expand All @@ -105,7 +109,53 @@ description: |

Every skill MUST include complete Dependencies section.

**Required Structure:**
**Standard Color Values** (Cursor, Claude Code):

| Color | Use Case |
|-------|----------|
| blue, cyan | Analysis, read-only |
| green | Success, deployment |
| yellow | Caution, validation |
| red | Critical, security, remediation |
| magenta | Creative, generation |

## 4. Skill-to-Skill Invocation Standard

**Standard format**: Use the slash format `/skill-name` when one skill or agent invokes another.

```markdown
**How to invoke**: Execute the `/mcp-lightspeed-validator` skill
**Action**: Execute the `/mcp-aap-validator` skill
```

**❌ Avoid** - Skill tool format (inconsistent):
```markdown
Use the Skill tool:
skill: "mcp-lightspeed-validator"
```

**✅ Use** - Slash format (consistent across rh-sre):
```markdown
Execute the `/mcp-lightspeed-validator` skill
Invoke the `/playbook-executor` skill
```

**Applies to**:
- Skill → skill (remediation invokes `/cve-validation`, `/playbook-generator`, etc.)
- Skill → skill prerequisites (cve-validation invokes `/mcp-lightspeed-validator`)
- Skill → skill delegation (playbook-generator delegates to `/playbook-executor`)

**Rationale**: Single format across agent and skill invocations improves consistency and reduces confusion.

## 5. Dependencies Declaration

Every skill MUST include a **Dependencies** section listing:
- **Skills**: Other skills this skill may invoke
- **MCP Tools**: Specific tools from MCP servers
- **MCP Servers**: Required MCP server names
- **Documentation**: Reference docs for context

**Required Format**:
```markdown
## Dependencies

Expand All @@ -126,9 +176,7 @@ Every skill MUST include complete Dependencies section.

**Rationale**: Makes dependencies explicit for debugging and troubleshooting.

---

### 5. Human-in-the-Loop Requirements
## 6. Human-in-the-Loop Requirements

Skills performing critical operations MUST require explicit confirmation.

Expand All @@ -152,15 +200,21 @@ Skills performing critical operations MUST require explicit confirmation.
2. **Typed Confirmation**
- Ask: "Type exact resource name to confirm: <name>"
- Verify exact match, cancel if mismatch
- Ask: "Type 'DELETE' to proceed"
- Only proceed on exact match
- Ask: "Type 'DELETE' to proceed"
- Only proceed on exact match
```

**Rationale**: Prevents unintended automation; maintains user control; reduces accidental data loss.

---
**When to Use**:
- Playbook execution (ansible-mcp-server)
- System modifications (package updates, config changes)
- Multi-system operations (batch remediation)
- Data deletion or irreversible actions

## 7. Mandatory Skill Sections

### 6. Mandatory Skill Sections
Every skill MUST include these sections in order:

**Required Section Order:**
1. YAML frontmatter
Expand Down Expand Up @@ -219,7 +273,7 @@ See Principle #7 for details.

---

### 7. MCP Server Availability Verification
## 8. MCP Server Availability Verification

Prerequisites MUST include verification and human notification protocol.

Expand Down
30 changes: 27 additions & 3 deletions docs/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ function createPackCard(pack) {
}

const titleText = document.createElement('span');
titleText.textContent = pack.plugin.name || pack.name;
titleText.textContent = pack.plugin.title || pack.plugin.name || pack.name;
Comment thread
dmartinol marked this conversation as resolved.
h3.appendChild(titleText);

div.appendChild(h3);
Expand Down Expand Up @@ -360,10 +360,11 @@ function handleSearch(event) {

// Filter packs
const filteredPacks = allPacks.filter(pack => {
// Search in pack name, description, skills, agents
// Search in pack name, title, description, skills, agents
const searchText = [
pack.name,
pack.plugin.name,
pack.plugin.title,
pack.plugin.description,
...pack.skills.map(s => s.name + ' ' + s.description),
...pack.agents.map(a => a.name + ' ' + a.description)
Comment thread
dmartinol marked this conversation as resolved.
Expand Down Expand Up @@ -451,7 +452,7 @@ function showPackDetails(packName) {
titleGroup.className = 'modal-title-group';

const h2 = document.createElement('h2');
h2.textContent = pack.plugin.name || pack.name;
h2.textContent = pack.plugin?.title || pack.plugin?.name || pack.name;
titleGroup.appendChild(h2);

// Owner subtitle
Expand Down Expand Up @@ -512,6 +513,29 @@ function showPackDetails(packName) {
header.appendChild(desc);
}

// Plugin name field (if different from title)
if (pack.plugin.name && pack.plugin.name !== pack.plugin.title) {
const pluginNameDiv = document.createElement('div');
pluginNameDiv.style.marginTop = '1rem';
pluginNameDiv.style.fontSize = '0.9rem';
pluginNameDiv.style.color = 'var(--text-muted)';

const label = document.createElement('strong');
label.textContent = 'Plugin name: ';
label.style.color = 'var(--text-primary)';
pluginNameDiv.appendChild(label);

const nameCode = document.createElement('code');
nameCode.textContent = pack.plugin.name;
nameCode.style.backgroundColor = 'rgba(238, 0, 0, 0.1)';
nameCode.style.padding = '0.25rem 0.5rem';
nameCode.style.borderRadius = '4px';
nameCode.style.fontSize = '0.85rem';
pluginNameDiv.appendChild(nameCode);

header.appendChild(pluginNameDiv);
}
Comment thread
dmartinol marked this conversation as resolved.

details.appendChild(header);

// Create modal body
Expand Down
17 changes: 17 additions & 0 deletions docs/plugins.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"rh-sre": {
"title": "Red Hat SRE Agentic Skills Collection"
},
"rh-virt": {
"title": "Red Hat OpenShift Virtualization Agentic Collection"
},
"rh-developer": {
"title": "Red Hat Developer Agentic Skills Collection"
},
"ocp-admin": {
"title": "Red Hat OpenShift Administration Agentic Skills Collection"
},
"rh-support-engineer": {
"title": "Red Hat Support Engineer Agentic Skills Collection"
}
}
Comment thread
dmartinol marked this conversation as resolved.
2 changes: 1 addition & 1 deletion ocp-admin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "OpenShift Administration Agentic Skills Collection",
"name": "ocp-admin",
"version": "1.0.0",
"description": "Automation capabilities for OpenShift Container Platform cluster management, workload orchestration, security policies, and operational tasks.",
"author": {
Expand Down
2 changes: 1 addition & 1 deletion rh-sre/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "Red Hat SRE Agentic Skills Collection",
"name": "rh-sre",
"version": "1.0.0",
"description": "Site reliability engineering tools and automation for managing Red Hat platforms and infrastructure.",
"author": {
Expand Down
12 changes: 2 additions & 10 deletions rh-sre/.mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,18 @@
},
"aap-mcp-job-management": {
"type": "http",
"url": "https://${AAP_SERVER}/job_management/mcp",
"url": "https://${AAP_MCP_SERVER}/job_management/mcp",
Comment thread
dmartinol marked this conversation as resolved.
"headers": {
"Authorization": "Bearer ${AAP_API_TOKEN}"
},
"env": {
"AAP_SERVER": "${AAP_SERVER}",
"AAP_API_TOKEN": "${AAP_API_TOKEN}"
},
"description": "Ansible Automation Platform (AAP) job management MCP server for managing job templates, job executions, and workflows"
},
"aap-mcp-inventory-management": {
"type": "http",
"url": "https://${AAP_SERVER}/inventory_management/mcp",
"url": "https://${AAP_MCP_SERVER}/inventory_management/mcp",
"headers": {
"Authorization": "Bearer ${AAP_API_TOKEN}"
},
"env": {
"AAP_SERVER": "${AAP_SERVER}",
"AAP_API_TOKEN": "${AAP_API_TOKEN}"
},
"description": "Ansible Automation Platform (AAP) inventory management MCP server for managing inventories, hosts, and groups"
}
}
Expand Down
2 changes: 1 addition & 1 deletion rh-sre/DEMO.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Tools: <tool1>, <tool2>,...
Docs: <doc1>, <doc2>, ...
**** EXECUTION SUMMARY END ****
"""
Agent, skills and tools names must include the plugin name, as in remediation-agent:remediator.
Agent, skills and tools names must include the plugin name, as in sre-agents:remediation.
Doc names must include only the folder and the document name, omit everything before the docs/ folder. Example: docs/ansible/cve-remediation-templates.md
```

Expand Down
Loading