@@ -22,6 +22,7 @@ concurrency:
2222
2323permissions :
2424 contents : read
25+ pull-requests : read
2526
2627jobs :
2728 validate :
3637 .github/agents
3738 persist-credentials : false
3839
40+ # ── Determine changed skills/agents (PRs only) ───────────────
41+ - name : Determine changed skills and agents
42+ id : changed
43+ if : github.event_name == 'pull_request'
44+ env :
45+ GH_TOKEN : ${{ github.token }}
46+ shell : bash
47+ run : |
48+ changed_files=$(gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json files --jq '.files[].path')
49+
50+ changed_skill_files=$(echo "$changed_files" | grep '^\.github/skills/' || true)
51+ changed_agent_files=$(echo "$changed_files" | grep '^\.github/agents/' || true)
52+
53+ if [ -z "$changed_skill_files" ] && [ -z "$changed_agent_files" ]; then
54+ echo "No skill/agent files changed in this PR"
55+ echo "has_changes=false" >> "$GITHUB_OUTPUT"
56+ exit 0
57+ fi
58+
59+ echo "has_changes=true" >> "$GITHUB_OUTPUT"
60+
61+ # Extract unique skill directory names
62+ if [ -n "$changed_skill_files" ]; then
63+ echo "$changed_skill_files" | sed 's|\.github/skills/\([^/]*\)/.*|\1|' | sort -u > changed-skill-dirs.txt
64+ echo "has_skills=true" >> "$GITHUB_OUTPUT"
65+ echo "Changed skill directories:"
66+ cat changed-skill-dirs.txt
67+ else
68+ echo "has_skills=false" >> "$GITHUB_OUTPUT"
69+ fi
70+
71+ if [ -n "$changed_agent_files" ]; then
72+ echo "$changed_agent_files" > changed-agent-files.txt
73+ echo "has_agents=true" >> "$GITHUB_OUTPUT"
74+ echo "Changed agent files:"
75+ cat changed-agent-files.txt
76+ else
77+ echo "has_agents=false" >> "$GITHUB_OUTPUT"
78+ fi
79+
80+ # ── Filter to only changed skills/agents (PRs only) ──────────
81+ - name : Filter to changed skills and agents
82+ if : github.event_name == 'pull_request' && steps.changed.outputs.has_changes == 'true'
83+ shell : bash
84+ run : |
85+ # Remove unchanged skill directories
86+ if [ "${{ steps.changed.outputs.has_skills }}" = "true" ] && [ -f changed-skill-dirs.txt ]; then
87+ for dir in .github/skills/*/; do
88+ dirname=$(basename "$dir")
89+ if ! grep -Fxq "$dirname" changed-skill-dirs.txt; then
90+ rm -rf "$dir"
91+ fi
92+ done
93+ elif [ -d .github/skills ]; then
94+ rm -rf .github/skills
95+ fi
96+
97+ # Remove unchanged agent files
98+ if [ "${{ steps.changed.outputs.has_agents }}" = "true" ] && [ -f changed-agent-files.txt ]; then
99+ for f in .github/agents/*; do
100+ if ! grep -Fxq "$f" changed-agent-files.txt; then
101+ rm -f "$f"
102+ fi
103+ done
104+ elif [ -d .github/agents ]; then
105+ rm -rf .github/agents
106+ fi
107+
108+ # Log what remains
109+ echo "Skills to validate:"
110+ find .github/skills -mindepth 1 -maxdepth 1 -type d 2>/dev/null || echo " (none)"
111+ echo "Agents to validate:"
112+ find .github/agents -name '*.agent.md' 2>/dev/null || echo " (none)"
113+
39114 # ── Download & cache skill-validator ──────────────────────────
40115 - name : Get cache key date
41116 id : cache-date
74149 # ── Run skill-validator check ─────────────────────────────────
75150 - name : Run skill-validator check
76151 id : check
152+ if : github.event_name != 'pull_request' || steps.changed.outputs.has_changes == 'true'
77153 shell : bash
78154 run : |
79155 rc=0
@@ -132,14 +208,24 @@ jobs:
132208 if : always()
133209 run : |
134210 mkdir -p sv-results
135- skill_count=$(find .github/skills -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
136- agent_count=$(find .github/agents -name '*.agent.md' 2>/dev/null | wc -l)
137- total=$((skill_count + agent_count))
211+
212+ # If check step was skipped (PR with no skill/agent changes), emit zeros
213+ exit_code="${{ steps.check.outputs.exit_code }}"
214+ skill_count=0
215+ agent_count=0
216+ total=0
217+ if [ -z "$exit_code" ]; then
218+ exit_code=0
219+ else
220+ skill_count=$(find .github/skills -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
221+ agent_count=$(find .github/agents -name '*.agent.md' 2>/dev/null | wc -l)
222+ total=$((skill_count + agent_count))
223+ fi
138224 echo "${{ github.event.pull_request.number }}" > sv-results/pr-number.txt
139225 echo "$skill_count" > sv-results/skill-count.txt
140226 echo "$agent_count" > sv-results/agent-count.txt
141227 echo "$total" > sv-results/total.txt
142- echo "${{ steps.check.outputs. exit_code }} " > sv-results/exit-code.txt
228+ echo "$exit_code" > sv-results/exit-code.txt
143229 if [ -f sv-output.txt ]; then
144230 cp sv-output.txt sv-results/sv-output.txt
145231 fi
0 commit comments