Prevent shell-quoting and command-substitution bugs when posting GitHub issue/PR comments or editing bodies with gh CLI.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add vamseeachanta/workspace-hub --skill github-comment-body-file-safety --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Github Comment Body File Safety?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vamseeachanta-github-comment-body-file-safety-workspace-hub)More formats (shields.io, HTML) on the badges page.
---
name: github-comment-body-file-safety
description: Prevent shell-quoting and command-substitution bugs when posting GitHub issue/PR comments or editing bodies with gh CLI.
version: 1.0.0
author: Hermes Agent
license: MIT
triggers:
- When using `gh issue comment`, `gh pr comment`, `gh issue edit --body`, `gh pr edit --body`, or `gh issue create --body`
- When comment/body text contains backticks, code spans, file paths, markdown, or dynamic content
- When a GitHub comment/body is being assembled from plan paths, test names, or command output
tags: [github, gh, shell-safety, comments, quoting]
---
# GitHub Comment Body-File Safety
## Problem
Inline `gh ... --body "..."` looks convenient, but shell parsing happens before GitHub CLI sees the text.
If the body contains backticks, `$()`, code fences, or other shell-significant characters, the shell can:
- execute unintended commands
- strip or mangle content
- turn file paths into failing shell commands
- post broken comments
This happened in live use when a GitHub comment included markdown code spans like `docs/plans/...` and `tests/...` inline; the shell tried to execute those paths.
## Rule
If the body contains any markdown/code formatting or dynamic content, use `--body-file`.
Do not use inline `--body`.
## Safe pattern
```bash
cat > /tmp/gh-comment.md <<'EOF'
Planning update:
- Draft saved at `docs/plans/2026-04-20-issue-2419-skill-markdown-contract-drift.md`
- Index updated in `docs/plans/README.md`
- Next check: `uv run pytest tests/skills/test_repo_skill_parity_merges.py -q`
EOF
gh issue comment 2419 --body-file /tmp/gh-comment.md
```
Also use the same pattern for:
- `gh pr comment ... --body-file`
- `gh issue edit ... --body-file`
- `gh pr edit ... --body-file`
- `gh issue create ... --body-file`
Important: this is not just a comment/edit problem. `gh issue create --body "..."` is equally vulnerable. In live use, an inline create body containing markdown code spans caused bash to try executing repo paths and run IDs, producing a malformed issue body. The safe recovery was to rewrite the intended issue body to a temp markdown file and run `gh issue edit --body-file ...`.
## When body-file is mandatory
Use `--body-file` if the text includes:
- backticks: `` `...` ``
- command substitutions: `$()`
- fenced code blocks
- file paths or commands copied from plans/tests
- multiline markdown
- text generated from tools/scripts
- any user-provided content you did not fully hand-escape
## Recovery pattern
If an inline comment/body was already posted and looks mangled:
1. write the intended text to a temp markdown file
2. re-post or edit using `--body-file`
3. for malformed new issues created via `gh issue create --body`, immediately repair the issue with `gh issue edit --body-file <file>`
4. verify the rendered GitHub comment/body afterward
## Heredoc pitfall: Python generators still need quoted delimiters
Do not embed markdown with backticks inside an **unquoted** shell heredoc, even if the heredoc feeds Python instead of `cat`. Bash performs command substitution before Python runs:
```bash
# BAD: backticks inside the Python string are executed by bash first
python3 - <<PY
body = "Plan: `docs/plans/example.md`"
PY
```
Use a quoted heredoc delimiter, pass dynamic values through environment variables or argv, and then post with `--body-file`:
```bash
SHA="$sha" FULL="$full" python3 - <<'PY'
from pathlib import Path
import os
body = f"Plan: `docs/plans/example.md`\nCommit: `{os.environ['SHA']}` (`{os.environ['FULL']}`)\n"
Path('/tmp/gh-comment.md').write_text(body)
PY
gh issue comment 123 --body-file /tmp/gh-comment.md
```
## Minimal checklist
Before any `gh ... --body` call, ask:
1. Does this text contain backticks or markdown? If yes, use `--body-file`.
2. Was any part of this text produced dynamically? If yes, use `--body-file`.
3. Do I want exact rendering with zero shell interpretation? If yes, use `--body-file`.
## Bottom line
`--body-file` is the safe default.
Inline `--body` is only for truly simple, shell-safe one-liners.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!