@@ -178,20 +178,30 @@ jobs:
178178
179179 - name : Run updating skill with Claude Code
180180 id : claude
181- timeout-minutes : 90
181+ timeout-minutes : 15
182182 env :
183183 ANTHROPIC_API_KEY : ${{ secrets.ANTHROPIC_API_KEY }}
184184 GITHUB_ACTIONS : ' true'
185185 run : |
186+ # Wrap pnpm through Socket firewall for all subprocesses (not just this shell).
187+ if [ -n "$SFW_BIN" ]; then
188+ mkdir -p /tmp/sfw-bin
189+ printf '#!/bin/bash\nexec "%s" pnpm "$@"\n' "$SFW_BIN" > /tmp/sfw-bin/pnpm
190+ chmod +x /tmp/sfw-bin/pnpm
191+ export PATH="/tmp/sfw-bin:$PATH"
192+ fi
193+
186194 if [ -z "$ANTHROPIC_API_KEY" ]; then
187195 echo "ANTHROPIC_API_KEY not set - skipping automated update"
188196 echo "success=false" >> $GITHUB_OUTPUT
189197 exit 0
190198 fi
191199
192200 set +e
193- claude --print --dangerously-skip-permissions \
194- --model sonnet \
201+ claude --print \
202+ --allowedTools "Bash(pnpm:*)" "Bash(git:*)" "Read" "Write" "Edit" "Glob" "Grep" \
203+ --model haiku \
204+ --max-turns 25 \
195205 "$(cat <<'PROMPT'
196206 /updating
197207
@@ -225,6 +235,25 @@ jobs:
225235 echo "success=false" >> $GITHUB_OUTPUT
226236 fi
227237
238+ - name : Validate changes
239+ id : validate
240+ if : steps.claude.outputs.success == 'true'
241+ run : |
242+ # Only allow changes to dependency-related files.
243+ UNEXPECTED=""
244+ for file in $(git diff --name-only origin/main..HEAD); do
245+ case "$file" in
246+ package.json|*/package.json|pnpm-lock.yaml|*/pnpm-lock.yaml|.npmrc|pnpm-workspace.yaml) ;;
247+ *) UNEXPECTED="$UNEXPECTED $file" ;;
248+ esac
249+ done
250+ if [ -n "$UNEXPECTED" ]; then
251+ echo "::error::Unexpected files modified by Claude:$UNEXPECTED"
252+ echo "valid=false" >> $GITHUB_OUTPUT
253+ else
254+ echo "valid=true" >> $GITHUB_OUTPUT
255+ fi
256+
228257 - name : Check for changes
229258 id : changes
230259 run : |
@@ -235,13 +264,13 @@ jobs:
235264 fi
236265
237266 - name : Push branch
238- if : steps.claude.outputs.success == 'true' && steps.changes.outputs.has-changes == 'true'
267+ if : steps.claude.outputs.success == 'true' && steps.validate.outputs.valid == 'true' && steps. changes.outputs.has-changes == 'true'
239268 env :
240269 BRANCH_NAME : ${{ steps.branch.outputs.branch }}
241270 run : git push origin "$BRANCH_NAME"
242271
243272 - name : Create Pull Request
244- if : steps.claude.outputs.success == 'true' && steps.changes.outputs.has-changes == 'true'
273+ if : steps.claude.outputs.success == 'true' && steps.validate.outputs.valid == 'true' && steps. changes.outputs.has-changes == 'true'
245274 env :
246275 GH_TOKEN : ${{ github.token }}
247276 UPDATE_SUMMARY_B64 : ${{ needs.check-updates.outputs.update-summary }}
@@ -283,7 +312,7 @@ jobs:
283312 --base main
284313
285314 - name : Add job summary
286- if : steps.claude.outputs.success == 'true' && steps.changes.outputs.has-changes == 'true'
315+ if : steps.claude.outputs.success == 'true' && steps.validate.outputs.valid == 'true' && steps. changes.outputs.has-changes == 'true'
287316 env :
288317 UPDATE_SUMMARY_B64 : ${{ needs.check-updates.outputs.update-summary }}
289318 BRANCH_NAME : ${{ steps.branch.outputs.branch }}
0 commit comments