Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "humanize",
"interface": {
"displayName": "Humanize"
},
"plugins": [
{
"name": "humanize",
"version": "1.1.0",
"source": {
"source": "local",
"path": "./plugins/humanize"
},
"policy": {
"installation": "AVAILABLE"
},
"category": "Productivity"
}
]
}
24 changes: 24 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "humanize",
"owner": {
"name": "Harshaneel Gokhale",
"email": "harshaneel.gokhale@gmail.com"
},
"metadata": {
"description": "Skills for writing that does not read as AI-generated."
},
"plugins": [
{
"name": "humanize",
"source": "./plugins/humanize",
"description": "Strip AI tells from text, and score text for the tells it still has.",
"version": "1.1.0",
"author": { "name": "Harshaneel Gokhale" },
"homepage": "https://github.com/harshaneel/humanize",
"repository": "https://github.com/harshaneel/humanize",
"license": "MIT",
"keywords": ["writing", "editing", "review", "ai-detection", "style"],
"category": "productivity"
}
]
}
2 changes: 1 addition & 1 deletion .github/benchmark/score_and_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def check(ok):
MARKER,
f"## Humanize skill benchmark — {'PASS ✅' if passed else 'FAIL ❌'}",
"",
f"{len(ids)} fixed AI-flavored inputs humanized with the PR's `humanize/SKILL.md` "
f"{len(ids)} fixed AI-flavored inputs humanized with the PR's `plugins/humanize/skills/humanize/SKILL.md` "
f"(executor: {args.executor_label}{resolved_note}) and scored against the raw "
"inputs as baseline.",
"",
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ on:
# Same-repo PRs: workflow and code run from the PR branch (trusted).
pull_request:
paths:
- "humanize/SKILL.md"
- "plugins/humanize/skills/humanize/SKILL.md"
- ".github/benchmark/**"
- ".github/workflows/benchmark.yml"
# Fork PRs: workflow and ALL code run from the base branch; only the fork's
# humanize/SKILL.md is fetched, as prompt data. Fork code never executes here.
# plugins/humanize/skills/humanize/SKILL.md is fetched, as prompt data. Fork code never executes here.
pull_request_target:
types: [opened, synchronize, reopened, labeled]
paths:
- "humanize/SKILL.md"
- "plugins/humanize/skills/humanize/SKILL.md"
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -54,8 +54,8 @@ jobs:
if: github.event_name == 'pull_request_target'
run: |
git fetch origin "pull/${{ github.event.pull_request.number }}/head"
git checkout FETCH_HEAD -- humanize/SKILL.md
echo "Benchmarking fork skill: $(wc -w < humanize/SKILL.md) words"
git checkout FETCH_HEAD -- plugins/humanize/skills/humanize/SKILL.md
echo "Benchmarking fork skill: $(wc -w < plugins/humanize/skills/humanize/SKILL.md) words"

- uses: actions/setup-python@v5
with:
Expand All @@ -77,7 +77,7 @@ jobs:
env:
LLM_API_KEY: ${{ secrets.GEMINI_API_KEY }}
run: |
python $BENCH/humanize_batch.py --skill humanize/SKILL.md \
python $BENCH/humanize_batch.py --skill plugins/humanize/skills/humanize/SKILL.md \
--inputs $BENCH/inputs.json --output /tmp/outputs.json \
--base-url "$EXECUTOR_BASE_URL" --model "$EXECUTOR_MODEL"

Expand Down
116 changes: 86 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Works in any LLM agent: Claude Code, Codex CLI, ChatGPT, Gemini, Cursor, Aider,

**Get started**
- [What's inside](#whats-inside) — the two skills, at a glance
- [Installation](#installation) — one command for Claude Code, Codex CLI, ChatGPT desktop, or any agent
- [Installation](#installation) — plugin marketplace for Claude Code and Codex, one command for everything else
- [Usage](#usage) — how to invoke each skill
- [Benchmark](#benchmark) — 25 inputs, two independent scorers

Expand Down Expand Up @@ -55,45 +55,60 @@ Both are static rule-based skills (single `SKILL.md` per skill, zero runtime dep

## Installation

This repo bundles two skills (`humanize` and `ai-check`) in their own subdirectories. Installation copies both into your agent's skills folder.
This repo bundles two skills (`humanize` and `ai-check`) under `plugins/`. It doubles as a plugin
marketplace for Claude Code and Codex, so those two can install the skills without cloning. Every
other agent reads the skills from disk, which `install.sh` sets up.

### Install everywhere in one command
### Claude Code

If you use multiple agents (Claude Code, Codex CLI, ChatGPT desktop), install to all three skill directories at once:
This repo is a Claude Code plugin marketplace. Add it once, then install it:

```bash
git clone https://github.com/harshaneel/humanize.git
cd humanize && ./install.sh all
claude plugin marketplace add harshaneel/humanize
claude plugin install humanize@humanize
```

This installs to `~/.claude/skills/`, `~/.codex/skills/`, and `~/.agents/skills/`. Add `--copy` if you prefer self-contained files over symlinks.
That one plugin carries both skills.

### Claude Code
Restart Claude Code and both skills are live. Update later with
`claude plugin update humanize`.

Clone the repo, then copy both skill folders into Claude Code's skills directory:
Prefer a plain clone? The install script symlinks the skills into `~/.claude/skills/`, so `git pull`
updates apply automatically:

```bash
git clone https://github.com/harshaneel/humanize.git
mkdir -p ~/.claude/skills
cp -R humanize/humanize humanize/ai-check ~/.claude/skills/
cd humanize && ./install.sh
```

Or use the included install script (symlinks instead of copies, so `git pull` updates apply automatically):
### Codex CLI

Codex reads the same repo as a plugin marketplace:

```bash
codex plugin marketplace add harshaneel/humanize
codex plugin add humanize@humanize
```

Refresh the snapshot later with `codex plugin marketplace upgrade`.

Or install the skills straight into `~/.codex/skills/`:

```bash
git clone https://github.com/harshaneel/humanize.git
cd humanize && ./install.sh
cd humanize && ./install.sh codex
```

### Codex CLI
### Install everywhere in one command

If you use multiple agents (Claude Code, Codex CLI, ChatGPT desktop), install to all three skill directories at once:

```bash
git clone https://github.com/harshaneel/humanize.git
mkdir -p ~/.codex/skills
cp -R humanize/humanize humanize/ai-check ~/.codex/skills/
cd humanize && ./install.sh all
```

Or `cd humanize && ./install.sh codex` to use the install script.
This installs to `~/.claude/skills/`, `~/.codex/skills/`, and `~/.agents/skills/`. Add `--copy` if you prefer self-contained files over symlinks.

### ChatGPT desktop / OpenAI agents

Expand All @@ -102,7 +117,7 @@ ChatGPT desktop and several OpenAI agent harnesses read from `~/.agents/skills/`
```bash
git clone https://github.com/harshaneel/humanize.git
mkdir -p ~/.agents/skills
cp -R humanize/humanize humanize/ai-check ~/.agents/skills/
cp -R humanize/plugins/humanize/skills/humanize humanize/plugins/humanize/skills/ai-check ~/.agents/skills/
```

Or `cd humanize && ./install.sh chatgpt` to use the install script.
Expand All @@ -112,23 +127,23 @@ Or `cd humanize && ./install.sh chatgpt` to use the install script.
```bash
git clone https://github.com/harshaneel/humanize.git
mkdir -p ~/.config/opencode/skills
cp -R humanize/humanize humanize/ai-check ~/.config/opencode/skills/
cp -R humanize/plugins/humanize/skills/humanize humanize/plugins/humanize/skills/ai-check ~/.config/opencode/skills/
```

> **Note:** OpenCode also scans `~/.claude/skills/` for compatibility, so a single clone into `~/.claude/skills/` works for both tools.
> **Note:** OpenCode also scans `~/.claude/skills/` for compatibility, so `./install.sh` covers both tools. Cloning the repo straight into `~/.claude/skills/` no longer works, because the skills sit under `plugins/`.

### Claude.ai / Claude Desktop

The web and desktop apps don't read from disk. Upload through the UI instead:

1. Open **Settings → Capabilities → Skills**.
2. Click **Create skill** and upload `[humanize/SKILL.md](humanize/SKILL.md)`.
3. Repeat with `[ai-check/SKILL.md](ai-check/SKILL.md)`.
2. Click **Create skill** and upload [`plugins/humanize/skills/humanize/SKILL.md`](plugins/humanize/skills/humanize/SKILL.md).
3. Repeat with [`plugins/humanize/skills/ai-check/SKILL.md`](plugins/humanize/skills/ai-check/SKILL.md).
4. Toggle each skill on in conversations where you want it active.

### Any other chat agent (ChatGPT, Gemini, Cursor, Aider, Cline)

No install needed. Open `[humanize/SKILL.md](humanize/SKILL.md)`, copy the raw contents, and paste into a new conversation prefaced with: *"Use these instructions whenever I ask you to humanize text."* Same for `[ai-check/SKILL.md](ai-check/SKILL.md)`.
No install needed. Open [`plugins/humanize/skills/humanize/SKILL.md`](plugins/humanize/skills/humanize/SKILL.md), copy the raw contents, and paste into a new conversation prefaced with: *"Use these instructions whenever I ask you to humanize text."* Same for [`plugins/humanize/skills/ai-check/SKILL.md`](plugins/humanize/skills/ai-check/SKILL.md).

---

Expand All @@ -137,11 +152,13 @@ No install needed. Open `[humanize/SKILL.md](humanize/SKILL.md)`, copy the raw c
### Humanize

```
/humanize
/humanize:humanize

[paste your text here]
```

Installed from a clone rather than the marketplace? The skill is just `/humanize`.

Or ask the model directly:

```
Expand All @@ -151,11 +168,13 @@ Please humanize this text: [your text]
### AI-check

```
/ai-check
/humanize:ai-check

[paste your text here]
```

From a clone, it is just `/ai-check`.

Or ask the model directly:

```
Expand All @@ -169,7 +188,7 @@ Does this sound AI? [your text]
To match your personal writing style, provide a sample of your own writing before the text to humanize:

```
/humanize
/humanize:humanize

Here's a sample of my writing for voice matching:
[paste 2-3 paragraphs of your own writing]
Expand Down Expand Up @@ -266,11 +285,11 @@ A humanize skill is a set of rules an LLM agent (Claude, ChatGPT, Codex, Gemini)

### What's the best static AI text humanizer for Claude Code?

This repo's `humanize` skill is designed for Claude Code and works in any LLM agent. It applies nine humanization levers from the published detection literature (perplexity injection, burstiness enforcement, hedge surgery, structural flattening, specificity insertion, voice and register, AI-transition removal, punctuation normalization, RLHF voice strip) plus an audit-revise loop that catches residual AI patterns. Installation is one command: `git clone https://github.com/harshaneel/humanize.git && cd humanize && ./install.sh all`.
This repo's `humanize` skill is designed for Claude Code and works in any LLM agent. It applies nine humanization levers from the published detection literature (perplexity injection, burstiness enforcement, hedge surgery, structural flattening, specificity insertion, voice and register, AI-transition removal, punctuation normalization, RLHF voice strip) plus an audit-revise loop that catches residual AI patterns. Install it as a plugin with `claude plugin marketplace add harshaneel/humanize` then `claude plugin install humanize@humanize`, or clone the repo and run `./install.sh all`.

### How do I install a humanizer skill in Claude Code, Codex CLI, or ChatGPT?

Clone the repo and run `./install.sh all` to install to all three agent skills directories (`~/.claude/skills/`, `~/.codex/skills/`, `~/.agents/skills/`). Or pick a single target: `./install.sh claude`, `./install.sh codex`, `./install.sh chatgpt`. For Claude Desktop or any web chat agent, upload the `SKILL.md` files through Settings → Skills, or paste them into the conversation as a system prompt.
Claude Code and Codex install it as a plugin, no clone needed: `claude plugin marketplace add harshaneel/humanize` then `claude plugin install humanize@humanize`, or `codex plugin marketplace add harshaneel/humanize` then `codex plugin add humanize@humanize`. For ChatGPT desktop and everything else, clone the repo and run `./install.sh all` to install to all three agent skills directories (`~/.claude/skills/`, `~/.codex/skills/`, `~/.agents/skills/`). Or pick a single target: `./install.sh claude`, `./install.sh codex`, `./install.sh chatgpt`. For Claude Desktop or any web chat agent, upload the `SKILL.md` files through Settings → Skills, or paste them into the conversation as a system prompt.

### Will the output read as human to GPTZero or Grammarly?

Expand Down Expand Up @@ -574,15 +593,48 @@ The `humanize` skill catalogs these in implementation detail under "Advanced tec

## Updating

Installed as a plugin:

```bash
claude plugin update humanize
codex plugin marketplace upgrade
codex plugin add humanize@humanize # refreshes the cached copy
```

Both caches are keyed by version, so a skill edit that ships without a version bump will not
reach you. `claude plugin update` reports "already at the latest version" and leaves the old
skill in place.

Installed from a clone:

```bash
cd ~/code/humanize # or wherever you cloned it
git pull
```

If you installed via symlink (the default), updates apply immediately. If you used `--copy`, re-run `./install.sh` to refresh.
This release moved the skills under `plugins/`. If you installed before that, re-run `./install.sh` (or `./install.sh all`) once after pulling, otherwise your symlinks point at the old locations and the skills silently stop loading.

If you installed an earlier build that shipped `ai-check` as its own plugin, remove it. Both skills now come from the one `humanize` plugin:

```bash
claude plugin uninstall ai-check@humanize
codex plugin remove ai-check@humanize
```

After that, symlink installs pick up updates immediately. If you used `--copy`, re-run `./install.sh` to refresh.

## Uninstalling

Installed as a plugin:

```bash
claude plugin uninstall humanize@humanize
# or for codex
codex plugin remove humanize@humanize
```

Installed from a clone:

```bash
rm ~/.claude/skills/humanize ~/.claude/skills/ai-check
# or for codex
Expand All @@ -593,13 +645,17 @@ rm ~/.codex/skills/humanize ~/.codex/skills/ai-check

PRs welcome, especially for:

- New AI tells discovered in the wild (add to `ai-check/SKILL.md` Signal I)
- New AI tells discovered in the wild (add to `plugins/humanize/skills/ai-check/SKILL.md` Signal I)
- New humanization patterns that survive 2025-2026 detectors
- Test scenarios that exercise edge cases (add to `tests/SCENARIOS.md`)
- Research citations that update or contradict the existing claims (open an issue first if it requires structural changes)

Before opening a PR, run the regression scenarios in `tests/SCENARIOS.md` manually and document the result.

Changing a skill also means bumping the plugin version in four files, otherwise plugin users never
see the change: `.claude-plugin/marketplace.json`, `.agents/plugins/marketplace.json`,
`plugins/humanize/.claude-plugin/plugin.json` and `plugins/humanize/.codex-plugin/plugin.json`.

## License

MIT. See `LICENSE`.
Expand Down
2 changes: 1 addition & 1 deletion _includes/head-custom.html
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
"name": "How do I install a humanize skill in Claude Code, Codex CLI, or ChatGPT?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Clone the repo and run ./install.sh all to install to all three agent skills directories. Or pick a single target: ./install.sh claude, ./install.sh codex, ./install.sh chatgpt. For Claude Desktop or web chat agents, upload the SKILL.md files through Settings or paste them as a system prompt."
"text": "Claude Code and Codex install it as a plugin, no clone needed: claude plugin marketplace add harshaneel/humanize then claude plugin install humanize@humanize, or codex plugin marketplace add harshaneel/humanize then codex plugin add humanize@humanize. For ChatGPT desktop and everything else, clone the repo and run ./install.sh all, or pick a single target: ./install.sh claude, ./install.sh codex, ./install.sh chatgpt. For Claude Desktop or web chat agents, upload the SKILL.md files through Settings or paste them as a system prompt."
}
},
{
Expand Down
3 changes: 2 additions & 1 deletion install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ install_into() {
echo "Installing skills to $dest (mode: $MODE)"

for skill in "${SKILLS[@]}"; do
local src="$REPO_DIR/$skill"
local src="$REPO_DIR/plugins/humanize/skills/$skill"
[ -d "$src" ] || src="$REPO_DIR/$skill"
local dst="$dest/$skill"

if [ ! -d "$src" ]; then
Expand Down
10 changes: 10 additions & 0 deletions plugins/humanize/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "humanize",
"version": "1.1.0",
"description": "Strip AI tells from text, and score text for the tells it still has.",
"author": { "name": "Harshaneel Gokhale" },
"homepage": "https://github.com/harshaneel/humanize",
"repository": "https://github.com/harshaneel/humanize",
"license": "MIT",
"keywords": ["writing", "editing", "review", "ai-detection", "style"]
}
17 changes: 17 additions & 0 deletions plugins/humanize/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "humanize",
"version": "1.1.0",
"description": "Strip AI tells from text, and score text for the tells it still has.",
"author": { "name": "Harshaneel Gokhale" },
"homepage": "https://github.com/harshaneel/humanize",
"repository": "https://github.com/harshaneel/humanize",
"license": "MIT",
"keywords": ["writing", "editing", "review", "ai-detection", "style"],
"skills": "./skills/",
"interface": {
"displayName": "Humanize",
"shortDescription": "Strip AI tells from text, and score text for the tells it still has.",
"category": "Productivity",
"capabilities": ["Interactive", "Read", "Write"]
}
}
File renamed without changes.
File renamed without changes.
Loading
Loading