From beagle-docs
Humanizes AI-generated developer docs and code comments by auto-applying safe fixes from review-ai-writing results. Includes git stash safety, dry-run preview, full scans, and category filtering.
npx claudepluginhub existential-birds/beagle --plugin beagle-docsThis skill uses the workspace's default tool permissions.
Apply fixes from a previous `review-ai-writing` run with automatic safe/risky classification.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Apply fixes from a previous review-ai-writing run with automatic safe/risky classification.
/beagle-docs:humanize [--dry-run] [--all] [--category <name>]
Flags:
--dry-run - Show what would be fixed without changing files--all - Fix entire codebase (runs review with --all first)--category <name> - Only fix specific category: content|vocabulary|formatting|communication|filler|code_docsExtract flags from $ARGUMENTS:
--dry-run - Preview mode only--all - Full codebase scan--category <name> - Filter to specific category# Check for uncommitted changes
git status --porcelain
If working directory is dirty, warn:
Warning: You have uncommitted changes. Creating a git stash before proceeding.
Run `git stash pop` to restore if needed.
Create stash if dirty:
git stash push -u -m "beagle-docs: pre-humanize backup"
Check for existing review file:
cat .beagle/ai-writing-review.json 2>/dev/null
If file missing:
--all flag: Run /beagle-docs:review-ai-writing --all first/beagle-docs:review-ai-writing first."If file exists, validate freshness:
# Get stored git HEAD from JSON
stored_head=$(jq -r '.git_head' .beagle/ai-writing-review.json)
current_head=$(git rev-parse HEAD)
if [ "$stored_head" != "$current_head" ]; then
echo "Warning: Review was run at commit $stored_head, but HEAD is now $current_head"
fi
If stale, prompt: "Review results are stale. Re-run review? (y/n)"
Skill(skill: "beagle-docs:humanize")
If --category is set, filter findings to that category only.
Partition remaining findings by fix_safety:
Safe Fixes (auto-apply):
chat_leak - Delete conversational artifactscutoff_disclaimer - Delete knowledge cutoff referencesfiller_phrase - Delete filler phrasesheading_restatement - Delete restating first sentenceemoji_decoration - Remove emoji from technical textboldface_overuse - Remove excessive bold formattingai_vocabulary_high - Swap high-signal AI wordsnarrating_obvious - Delete obvious code commentssynthetic_opener - Delete "In today's..." openerssycophantic_tone - Delete or neutralize praisevague_authority - Delete unattributed claimsexcessive_hedging - Remove qualifiersgeneric_conclusion - Delete summary paddingcopula_avoidance - Use "is/are" naturallyrhetorical_device - Delete rhetorical questionsNeeds Review Fixes (require confirmation):
promotional_language - Rewrite with specificsformulaic_structure - Restructure sectionssynonym_cycling - Pick consistent termcommit_inflation - Rewrite commit scopetautological_docstring - Rewrite or delete docstringexhaustive_enumeration - Trim parameter docsthis_noun_verbs - Rewrite docstring voiceai_vocabulary_low - Reduce cluster densityapologetic_error - Rewrite error messageIf --dry-run:
## Safe Fixes (would apply automatically)
| # | File | Line | Type | Action |
|---|------|------|------|--------|
| 1 | README.md | 3 | synthetic_opener | Delete "In today's rapidly evolving..." |
| 2 | src/auth.py | 15 | narrating_obvious | Delete "# Check if user exists" |
| 3 | README.md | 42 | ai_vocabulary_high | Replace "utilize" with "use" |
...
Otherwise, apply fixes grouped by file to minimize file I/O:
git:commit:*, git:pr:*), skip — these can't be auto-fixed. Report them for manual attention.If --dry-run, list them:
## Needs Review Fixes (would prompt interactively)
| # | File | Line | Type | Original | Suggested |
|---|------|------|------|----------|-----------|
| 4 | README.md | 8 | promotional_language | "powerful, enterprise-grade solution" | "authentication library" |
...
Otherwise, for each fix, prompt interactively:
[README.md:8] Promotional language: "powerful, enterprise-grade solution"
Suggested: "authentication library"
(y)es / (n)o / (e)dit / (s)kip all:
Track user choices:
y - Apply this fix as suggestedn - Skip this fixe - User provides custom replacements - Skip all remaining interactive fixesFor each modified markdown file, verify basic validity:
# Check for broken markdown (unclosed code blocks, broken links)
# Simple check: matching ``` pairs
grep -c '```' "$file" | awk '{print ($1 % 2 == 0) ? "OK" : "WARNING: odd number of code fences"}'
For modified source files, check syntax is still valid:
Python:
python3 -c "import ast; ast.parse(open('$file').read())"
TypeScript/JavaScript:
npx -y acorn --ecma2020 "$file" > /dev/null 2>&1
If validation fails for any file, revert that file:
git checkout -- "$file"
echo "Reverted $file due to validation failure"
## Humanize Summary
### Applied Fixes
- [x] README.md:3 - Deleted synthetic opener
- [x] README.md:42 - Replaced "utilize" with "use"
- [x] src/auth.py:15 - Deleted obvious comment
### Interactive Fixes
- [x] README.md:8 - Rewrote promotional language (user approved)
- [ ] docs/guide.md:22 - Skipped by user
### Skipped (Git Artifacts)
- [ ] git:commit:abc1234 - Chat leak in commit message (amend manually)
### Validation
- README.md: OK
- src/auth.py: OK
### Diff Summary
git diff --stat
On successful completion (all validations pass):
rm .beagle/ai-writing-review.json
If any validation fails, keep the file and report:
Review file preserved at .beagle/ai-writing-review.json
Fix issues and re-run, or restore with: git stash pop
# Preview all fixes without applying
/beagle-docs:humanize --dry-run
# Fix only vocabulary issues
/beagle-docs:humanize --category vocabulary
# Full codebase scan and fix
/beagle-docs:humanize --all
# Preview filler fixes only
/beagle-docs:humanize --category filler --dry-run
beagle-docs:humanize skill firstFix AI-generated writing patterns in docs, docstrings, commit messages, PR descriptions, and code comments. Prioritize deletion over rewriting — the best fix for filler is removal.
| Type | Strategy | Risk |
|---|---|---|
| Promotional language | Replace superlatives with specifics | Needs review |
| Vague authority | Delete the claim or add a citation | Safe |
| Formulaic structure | Remove the intro/conclusion wrapper | Needs review |
| Synthetic openers | Delete the opener, start with the point | Safe |
Before:
In today's rapidly evolving software landscape, authentication is a crucial
component that plays a pivotal role in securing modern applications.
After:
This guide covers authentication setup for the API.
| Type | Strategy | Risk |
|---|---|---|
| High-signal AI words | Direct word swap | Safe |
| Low-signal clusters | Reduce density, keep 1-2 | Needs review |
| Copula avoidance | Use "is/are" naturally | Safe |
| Rhetorical devices | Delete the question, state the fact | Safe |
| Synonym cycling | Pick one term, use it consistently | Needs review |
| Commit inflation | Rewrite to match actual change scope | Needs review |
Word swap reference:
| AI Word | Replacement |
|---|---|
| utilize | use |
| leverage (as "use") | use |
| delve | look at, explore, examine |
| facilitate | help, enable, let |
| endeavor | try, work, effort |
| harnessing | using |
| paradigm | approach, model, pattern |
| whilst | while |
| furthermore | also, and |
| moreover | also, and |
| robust (non-technical) | reliable, solid, strong |
| seamless | smooth, easy |
| cutting-edge | modern, latest, new |
| pivotal | important, key |
| elevate | improve |
| empower | let, enable |
| revolutionize | change, improve |
| unleash | release, enable |
| synergy | (delete — rarely means anything) |
| embark | start, begin |
Before:
feat: Leverage robust caching paradigm to facilitate seamless data retrieval
After:
feat: add response caching for faster reads
| Type | Strategy | Risk |
|---|---|---|
| Boldface overuse | Remove bold from non-key terms | Safe |
| Emoji decoration | Remove emoji from technical content | Safe |
| Heading restatement | Delete the restating sentence | Safe |
Before:
## Error Handling
**Error handling** is a **critical** aspect of building **reliable** applications.
The `handleError` function **catches** and **processes** all **runtime errors**.
After:
## Error Handling
The `handleError` function catches runtime errors and logs them with context.
| Type | Strategy | Risk |
|---|---|---|
| Chat leaks | Delete entirely | Safe |
| Cutoff disclaimers | Delete entirely | Safe |
| Sycophantic tone | Delete or neutralize | Safe |
| Apologetic errors | Rewrite as direct error message | Needs review |
Before:
# Great implementation! This elegantly handles the edge case.
# As of my last update, this API endpoint supports JSON.
After:
# Handles the re-entrant edge case from issue #42.
# This endpoint accepts JSON.
| Type | Strategy | Risk |
|---|---|---|
| Filler phrases | Delete the phrase | Safe |
| Excessive hedging | Remove qualifiers, state directly | Safe |
| Generic conclusions | Delete the conclusion paragraph | Safe |
Before:
It's worth noting that the configuration file might potentially need to be
updated. Going forward, this could possibly affect performance.
After:
Update the configuration file. This affects performance.
| Type | Strategy | Risk |
|---|---|---|
| Tautological docstrings | Delete or add real information | Needs review |
| Narrating obvious code | Delete the comment | Safe |
| "This noun verbs" | Rewrite in active/direct voice | Safe |
| Exhaustive enumeration | Keep only non-obvious params | Needs review |
Before:
def get_user(user_id: int) -> User:
"""Get a user.
This method retrieves a user from the database by their ID.
Args:
user_id: The ID of the user to get.
Returns:
User: The user object.
Raises:
ValueError: If the user ID is invalid.
"""
return db.query(User).get(user_id)
After:
def get_user(user_id: int) -> User:
"""Raises UserNotFound if ID doesn't exist in the database."""
return db.query(User).get(user_id)
Good developer writing is:
| Artifact | Tone | Length | Example |
|---|---|---|---|
| Commit message | Terse, imperative | 50-72 chars | fix: prevent nil panic in auth middleware |
| Code comment | Brief, explains why | 1-2 lines | // retry once — transient DNS failures are common in k8s |
| Docstring | Precise, adds value | What the name doesn't tell you | """Raises ConnectionError after 3 retries.""" |
| PR description | Structured, factual | Context + what changed + how to test | Bullet points, not paragraphs |
| README | Conversational, scannable | As short as possible | Start with what it does, then how to use it |
| Error message | Actionable, specific | What happened + what to do | Config file not found at ~/.app/config.yml. Run 'app init' to create one. |
These are mechanical and can be applied without human review:
These require a human to verify the replacement preserves intent: