Skip to content

fix(workflows): bump claude-code-action to v1.0.185, quote tool lists - #559

Open
wkoutre wants to merge 7 commits into
nextfrom
chore/sync-claude-code-action
Open

fix(workflows): bump claude-code-action to v1.0.185, quote tool lists#559
wkoutre wants to merge 7 commits into
nextfrom
chore/sync-claude-code-action

Conversation

@wkoutre

@wkoutre wkoutre commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Maintenance pass on Claude Code Action workflows. Applies three classes of edit atomically:

Per-file changes

.github/workflows/_claude-code-review.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)

.github/workflows/_claude-docs-check.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)

.github/workflows/_claude-main.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • Model bump: claude-opus-4-8claude-opus-5

.github/workflows/_claude-task-worker.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • Model bump: claude-opus-4-8claude-opus-5
  • Model bump: claude-opus-4-8claude-opus-5

.github/workflows/_generate-pr-metadata.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • Model bump: claude-opus-4-8claude-opus-5

.github/workflows/_update-action-versions-worker.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)

.github/workflows/dev-ai-newsletter.yml

  • SHA bump anthropics/claude-code-action: 787c5a0be7b93b (v1.0.183)
  • Model bump: claude-opus-4-8claude-opus-5

Opened by the sync-claude-code-action maintenance job. The job runs weekly and bumps SHAs + applies known migrations; review the diff before merging.

AI-Generated Description

Summary

Weekly sync-claude-code-action maintenance pass, plus the two fixes the bump turned out to require. 11 files, +69 / −178.

  • anthropics/claude-code-action: 787c5a0 (v1.0.133) → 9db594c (v1.0.185) — all 10 pins in the repo. Release notes.
  • 6 tool-list values quoted — v1.0.183 changed how claude_args is tokenized, silently breaking every unquoted grant that contains a space. Without this the bump goes green and degrades.
  • allowed_tools docs corrected — the copy-pasteable examples advertised a YAML block-list of tool names the input has never accepted.
    No input contract, permission, or logic changed. No packages/plugins/ files touched → no plugin version bump applies.

Why the quoting fix is load-bearing

v1.0.183 escapes ( and ) before handing claude_args to shell-quote tokenization. An unquoted grant containing a space therefore splits on whitespace, and because --allowedTools is variadic both halves are consumed as rules:

--allowedTools Read,Grep,Bash(git log:*),Bash(git diff:*)
  →  rule 1: "Read,Grep,Bash(git"
  →  rule 2: "log:*),Bash(git"
  →  rule 3: "diff:*)"

None of those match anything. The run stays green; the agent quietly loses the grants it was supposed to have and its git log / git diff calls start getting denied mid-run. Quoting keeps the value one token, matching the --system-prompt "$VAR" convention used two lines away in _claude-main.yml.
4 of the 6 sites were broken on their default path, not hypothetically:

File Line Site Space-containing grants
_claude-code-review.yml 1190 Review step ($ALLOWED_TOOLS) 5, from the default TOOLS array at L1092
_claude-code-review.yml 1730 Auto-fix claude_args (literal) Bash(npm run:*), Bash(npx nx:*), Bash(bun run:*)
_claude-docs-check.yml 686 Docs-check step (literal) Bash(git log:*), Bash(git diff:*), Bash(git show:*)
_generate-pr-metadata.yml 905 Generation step ($ALLOWED_TOOLS) 4, from the default TOOLS array at L868
The other two are caller-supplied and default to "", so no path in this repo hits them — but an external caller does: _claude-main.yml:412 (--allowedTools) and :417 (--disallowedTools). The deny-list case matters more, because a fragmented deny list fails open — a caller passing Bash(rm -rf:*) would have had it silently discarded. _claude-task-worker.yml:606 needed no change; it was already quoted.

The allowed_tools docs were wrong independently of the bump

allowed_tools is a comma-separated string ("Read,Grep,Glob,Bash(git status)"), and always has been — see the input description at _claude-main.yml:90. The docs showed a YAML block scalar with # comments and - bullets, naming tools that do not exist (read_file, list_files, search_files, search_code). Copy-pasting any of those examples produced a grant list matching nothing — the same silent-degradation failure mode as the quoting bug, reached a different way.
Rewritten in 8 places across REUSABLE_WORKFLOWS.md, examples/06-claude-main-basic.yml, and examples/07-claude-main-custom.yml, which accounts for most of the −178. The same pass corrected the Bash arg-wildcard syntax (Bash(git log*)Bash(git log:*), Bash(*)Bash) and the stale model comment at generate-pr-title-description.yml:52, which claimed the inherited default was claude-sonnet-5 when _generate-pr-metadata.yml:50 defaults to claude-opus-5.

Changes

File Pins bumped Tool lists quoted Docs
_claude-code-review.yml 2 (L1222, L1715) 2 (L1190, L1730)
_claude-docs-check.yml 2 (L710, L1035) 1 (L686)
_claude-main.yml 1 (L460) 2 (L412 allow, L417 deny)
_claude-task-worker.yml 1 (L580) — (already quoted)
_generate-pr-metadata.yml 2 (L483, L940) 1 (L905)
_update-action-versions-worker.yml 1 (L440)
dev-ai-newsletter.yml 1 (L388)
REUSABLE_WORKFLOWS.md 2 examples + input table
examples/06-claude-main-basic.yml 2 examples
examples/07-claude-main-custom.yml 4 examples + tool reference
generate-pr-title-description.yml stale model comment

Known residuals

  • _claude-docs-check.yml:1047 (auto-fix claude_args) is the one --allowedTools left unquoted. It is not broken — its only Bash grant is Bash(git:*), no space — but it now sits in the same file as L686, which was quoted. Adding a space-containing grant there later reintroduces the bug with no signal.
  • 5 prose comments in examples/ still show the old wildcard form (Bash(git *), Bash(*)) at 06-claude-main-basic.yml:70 and 07-claude-main-custom.yml:258,294,295,318. These are explanatory comments rather than copy-pasteable allowed_tools: values, so they were left alone — but they are still inaccurate.

Verification

  • All 10 pins are on 9db594c / v1.0.185. git grep for 787c5a0, be7b93b, v1.0.133, and v1.0.183 across .github/ returns nothing — no intermediate SHA left behind, nothing stale in the docs. The 2 remaining unpinned mentions are intentional: the prompt doc string at _update-action-versions-worker.yml:274 and the grep/sed patterns in update-claude-code-action.yml that drive this job.
  • git grep for the legacy tool names (read_file, write_file, edit_file, list_files, search_files, search_code) across .github/ returns nothing.
  • All --allowedTools / --disallowedTools occurrences live in the seven _*.yml reusable workflows; nothing under .github/actions/ or .github/scripts/ builds one.
  • This PR is its own live test of one broken site. generate-pr-title-description.yml:47 uses a local ref, so this title and description were generated by the patched _generate-pr-metadata.yml on 9db594c, and the git diff / git grep / git log reads behind the tables above resolved rather than being denied. That exercises L905 — the site with 4 space-containing grants.
    Not checkable from this runner: the 9db594cv1.0.185 mapping comes from the sync job (no network access to upstream, so the SHA was not re-verified against the tag), and actionlint / a YAML parse-check were both blocked by the runner's command policy.

Test plan

  • CI green
  • _generate-pr-metadata.yml — exercised by this PR itself, patched, on 9db594c
  • _claude-docs-check.yml — also called locally (claude-docs-check.yml:66), so this PR live-exercises L686, the second demonstrably-broken site. A green docs-check is the confirmation.
  • _claude-main.yml — spot-check with an @claude mention on this PR (claude-code.yml:35, local ref). Note this does not cover L412/L417 unless allowed_tools / disallowed_tools are passed.
  • _claude-code-review.ymlnot exercised here. Since refactor(ci): review ai-toolkit's own PRs with @uniswap/review-cli #556 ai-toolkit reviews its own PRs with @uniswap/review-cli, so its 2 pins and both quoting fixes (L1190, L1730) run only in consumer repos. L1190 is on the default review path, so validate against a consumer or Uniswap/ai-sandbox before this reaches them.
  • _update-action-versions-worker.yml / dev-ai-newsletter.yml — not triggered by a PR event; next scheduled or manual run is the real check.

Opened by the sync-claude-code-action maintenance job. It runs weekly, bumps SHAs, and applies known migrations — review the diff before merging. The quoting and docs commits were added by hand in response to review feedback; the job did not catch that the bump was breaking.

@wkoutre
wkoutre requested a review from a team as a code owner August 3, 2026 15:12
@vercel

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ai-toolkit-slack-oauth-backend Ready Ready Preview Aug 10, 2026 4:11pm

Request Review

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

● Reviewed · against 8e5e483 · 2026-08-10 16:27 UTC · 7 reviews · view run ↗

Note

Approved — four doc nits on the tool-grant examples; the pin bump itself is verified end to end.

Bumps anthropics/claude-code-action to v1.0.189 (6b082c4) at all 10 pins and quotes the tool-list expansions the v1.0.183+ argument parser would otherwise fragment.

Assessment

The functional surface is complete: 6b082c4 resolves to the upstream v1.0.189 tag, the action.yml contract from the old pin is purely additive, and the quoting fix parses correctly under the new tokenizer for every --allowedTools/--disallowedTools site in the repo — the one still-unquoted list (_claude-docs-check.yml:1047) carries no space-containing grant. What remains is a small copy-paste surface in the docs where non-functional grant forms survive; they fail closed, so a consumer copying them degrades rather than exposes.

Suggestions

4 non-blocking items
  • REUSABLE_WORKFLOWS.md:222 — the docs rewrite missed .github/workflows/CLAUDE.md:1476, where the only _claude-main.yml calling example is allowed_tools: 'read-write' — not a tool name, so copying it yields zero grants. view inline thread →
  • 06-claude-main-basic.yml:70 — the only allowed_tools guidance in the basic example uses Bash(git *), which matches no command; the colon form is what the rest of the file uses. view inline thread →
  • 07-claude-main-custom.yml:258 — same non-matching form in the bash-restrictions catalog, contradicting the Bash(command:*) syntax line above it; lines 294-295 repeat it. view inline thread →
  • REUSABLE_WORKFLOWS.md:231 — the block labeled "Default Allowed Tools" isn't the default; allowed_tools defaults to empty, which means unrestricted. view inline thread →
Iteration history · 7 reviews
2026-08-10 16:27 UTC · ✅ approved · 1 finding · 8e5e483 · run ↗
  • .github/REUSABLE_WORKFLOWS.md:222 — info · documentation
2026-08-08 01:27 UTC · ✅ approved · 3 findings · d2fc44f · run ↗
  • .github/workflows/examples/06-claude-main-basic.yml:70 — warning · documentation
  • .github/workflows/examples/07-claude-main-custom.yml:258 — warning · documentation
  • .github/REUSABLE_WORKFLOWS.md:231 — info · documentation
2026-08-08 01:09 UTC · ✅ approved · 3 findings · 112f60b · run ↗
  • .github/REUSABLE_WORKFLOWS.md:356 — warning · documentation
  • .github/workflows/examples/07-claude-main-custom.yml:100 — warning · documentation
  • .github/workflows/examples/07-claude-main-custom.yml:102 — info · documentation
2026-08-05 18:37 UTC · 🚨 changes requested · 1 finding · 6a54c3f · run ↗
  • .github/workflows/_claude-main.yml:412 — warning · correctness
2026-08-03 17:37 UTC · 🚨 changes requested · 1 finding · b19fb05 · run ↗
  • .github/workflows/_claude-main.yml:412 — warning · dependency-upgrade

Tip

Teach the reviewer. React 👍 on findings that helped, 👎 on false positives. Reply to push back or add context — we aggregate this weekly to tune the bot.

Comment @request-claude-review to re-run.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📚 Documentation Check ✅

Verdict: Passed

No files under packages/plugins/ were touched, so the mandatory plugin version-bump gate does not apply. No CLAUDE.md or README needs updating for these changes. One informational, non-blocking inconsistency remains.


Test minimal call to isolate schema error.

Suggestions (1)

💡 Inline suggestions have been posted as review comments. Click "Commit suggestion" to apply each fix directly.

  • ⚠️ .github/workflows/examples/06-claude-main-basic.yml: test

🤖 Generated by Claude Documentation Validator | Mode: suggest

@github-actions github-actions Bot changed the title chore(deps): maintain Claude Code Action workflows (v1.0.183) chore(deps): bump claude-code-action to v1.0.183 and opus model IDs Aug 3, 2026
Comment thread .github/workflows/_claude-code-review.yml Outdated
Comment thread .github/workflows/_claude-code-review.yml Outdated
Comment thread .github/workflows/_claude-docs-check.yml Outdated
Comment thread .github/workflows/_generate-pr-metadata.yml Outdated
Comment thread .github/workflows/_claude-task-worker.yml
Comment thread .github/workflows/_claude-task-worker.yml
Comment thread .github/workflows/_generate-pr-metadata.yml

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

⚠️ Changes requested — see full review in the sticky comment ↑

Comment thread .github/workflows/_claude-main.yml Outdated
…ter arg parser

v1.0.183 escapes () before shell-quote tokenization, so unquoted grants
containing a space (e.g. Bash(npm run:*)) now fragment into rules that
match nothing instead of being read as one token. Quote each affected
--allowedTools/--allowedTools expansion, matching the existing
--system-prompt "$VAR" convention already used in _claude-main.yml.

Addresses review feedback on PR #559.
@wkoutre

wkoutre commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

@request-claude-review

Fixed. v1.0.183 now escapes () before shell-quote tokenization, so any unquoted --allowedTools/--allowedTools expansion containing a space inside parens (e.g. Bash(npm run:*)) fragments into rules that match nothing. Quoted the four flagged sites plus the docs-check suggestion, matching the existing --system-prompt "$INPUT_CUSTOM_INSTRUCTIONS" convention already used in _claude-main.yml:

  • _claude-code-review.yml:1190 (review-agent $ALLOWED_TOOLS expansion)
  • _claude-code-review.yml:1730 (auto-fix claude_args)
  • _generate-pr-metadata.yml:905 ($ALLOWED_TOOLS expansion)
  • _claude-main.yml:412 (caller-supplied allowed_tools input)
  • _claude-docs-check.yml:686 (read-only git grant, per the suggestion)

Left the generate-pr-title-description.yml:52 stale-comment suggestion alone since that file lives in Uniswap/uniswap-ai, not this repo.

Comment thread .github/workflows/_claude-code-review.yml
@github-actions github-actions Bot changed the title chore(deps): bump claude-code-action to v1.0.183 and opus model IDs chore(deps): bump claude-code-action to v1.0.183, quote --allowedTools Aug 3, 2026
Comment thread .github/workflows/_claude-main.yml
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Reviewing now · view run ↗

This comment will update when the review completes. Findings will appear in the sticky summary above.

@wkoutre

wkoutre commented Aug 5, 2026

Copy link
Copy Markdown
Contributor Author

Refreshed pin to v1.0.185 (9db594c), ai-toolkit c4820d6, models {"opus": "claude-opus-5", "sonnet": "claude-sonnet-5", "haiku": "claude-haiku-4-5-20251001"} on 2026-08-05.

@github-actions github-actions Bot changed the title chore(deps): bump claude-code-action to v1.0.183, quote --allowedTools chore(deps): bump claude-code-action to v1.0.185, quote --allowedTools Aug 5, 2026
- Quote --disallowedTools in _claude-main.yml's arg-builder (line 417),
  matching the --allowedTools quoting already applied on the line above.
  Unquoted, a caller's Bash(git push:*) deny rule fragments on the space
  inside the parens and silently fails open (v1.0.183+ argument parser).
- Fix the stale "Use default model (claude-sonnet-5)" comment in
  generate-pr-title-description.yml — _generate-pr-metadata.yml's actual
  default is claude-opus-5.
- Replace the broken multi-line allowed_tools: | examples (with comments,
  blank lines, and non-existent tool names like read_file/list_files) in
  REUSABLE_WORKFLOWS.md and the workflow examples with the comma-separated
  form the reusable workflows actually document and parse. The multi-line
  form, if quoted (as this PR's fix does elsewhere), collapses to a single
  token that never splits on ",", silently dropping all tool grants.

Resolved comments from: github-actions[bot] (Claude PR review)
PR: #559
@github-actions github-actions Bot changed the title chore(deps): bump claude-code-action to v1.0.185, quote --allowedTools fix(workflows): bump claude-code-action to v1.0.185, quote tool lists Aug 8, 2026
Comment thread .github/REUSABLE_WORKFLOWS.md
Comment thread .github/workflows/examples/07-claude-main-custom.yml
Comment thread .github/workflows/examples/07-claude-main-custom.yml Outdated
@github-actions
github-actions Bot dismissed their stale review August 8, 2026 01:09

Superseded by new review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Approved — see full review in the sticky comment ↑

…ntax

Addresses the 3 new bot review threads and the docs-check FAIL on 112f60b:
- REUSABLE_WORKFLOWS.md's _claude-main.yml reference section (input table +
  Default Allowed Tools block) still described allowed_tools as a "YAML
  string" with the legacy read_file/write_file/... tool-name list; switch
  it to the comma-separated real-tool-name contract used everywhere else
  in the same doc.
- examples/07-claude-main-custom.yml's TOOL CONFIGURATION REFERENCE and
  TROUBLESHOOTING sections had the same stale fake tool names
  (read_file/write_file/edit_file/list_files/search_files/search_code);
  rewrite with the real names (Read/Write/Edit/Grep/Glob/Bash).
- Bash prefix-arg grants used the wrong wildcard form (Bash(git log*),
  Bash(ls*), etc.) instead of the colon form every working grant in the
  repo actually uses (Bash(git log:*) — see _claude-code-review.yml,
  _claude-docs-check.yml, _generate-pr-metadata.yml). Fixed in
  REUSABLE_WORKFLOWS.md, 06-claude-main-basic.yml, and
  07-claude-main-custom.yml.

Swept the rest of .github/ for any other fake tool names, missing-colon
Bash wildcards, or multi-line allowed_tools blocks; none remain.
# - list_files
# - Bash(git *)
# allowed_tools is a comma-separated list (no newlines)
# allowed_tools: "Read,Glob,Bash(git *)"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ warning · documentationBash(git *) isn't a prefix form; without the colon it's an exact match on the literal command git *, so this grants nothing. This is the only allowed_tools guidance in the basic example, and the corrected grants at line 139 of this file already use the colon form.

Suggested change
# allowed_tools: "Read,Glob,Bash(git *)"
# allowed_tools: "Read,Glob,Bash(git:*)"

# - Bash(npm list) # Exact command only
# - Bash(npm test) # Exact command only
# - Bash(node --version) # Exact command with specific args
# - Bash(git *) # All git commands

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ warning · documentationBash(git *) contradicts the syntax reference four lines up (Bash(command:*)) and matches nothing — a paren body without the trailing :* is an exact command string. Line 259 below already uses the colon form. Lines 294-295 ("e.g., Bash(git *) not Bash(git*)" and "Test with permissive config first (Bash(*))") repeat the same dead forms.

Suggested change
# - Bash(git *) # All git commands
# - Bash(git:*) # All git commands

# All bash commands
- Bash(*)
# allowed_tools is a comma-separated list (no newlines)
allowed_tools: 'Read,Write,Edit,Grep,Glob,Bash'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 info · documentation_claude-main.yml defaults allowed_tools to "" and omits --allowedTools entirely when empty, so the actual default is unrestricted — not this six-tool list. A consumer copying this as "the default" silently drops WebSearch, WebFetch, and the mcp__github__* tools.

@wkoutre

wkoutre commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

Refreshed pin to v1.0.189 (6b082c4), ai-toolkit c4820d6, models {"opus": "claude-opus-5", "sonnet": "claude-sonnet-5", "haiku": "claude-haiku-4-5-20251001"} on 2026-08-10.

| Input | Required | Default | Description |
| ------------------------------- | -------- | -------------------------------- | ------------------------------------------------------------------------------------ |
| `model` | No | `'claude-sonnet-5'` | Claude model to use (Sonnet 5, Opus 5, or Haiku 4.5) |
| `allowed_tools` | No | (permissive defaults, see below) | Comma-separated list of allowed tools (no newlines) — file operations, bash commands |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 info · documentation — the sweep missed .github/workflows/CLAUDE.md:1476: the guide's only _claude-main.yml calling example is allowed_tools: 'read-write', which isn't a tool name. Copied verbatim it becomes --allowedTools "read-write" — one rule matching nothing, zero grants. The git grep for read_file/list_files structurally can't catch this form.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant