Skip to content

Commit 071f42f

Browse files
committed
fix(ci): harden CI agent invocation — allowedTools, max-turns, diff validation
1 parent f2c10b3 commit 071f42f

1 file changed

Lines changed: 35 additions & 6 deletions

File tree

.github/workflows/weekly-update.yml

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)