Every week someone on Reddit ships a "Top 10 Claude Code Skills You MUST Have" post. You copy them. They work — for the toy React project the author wrote them against.
Overview
Every week someone on Reddit ships a "Top 10 Claude Code Skills You MUST Have" post. You copy them. They work — for the toy React project the author wrote them against. In your 4-year-old DDD monolith they recommend *Controller.cs when your team standardized on *Handler.cs three refactors ago, and now your junior is writing code that looks correct and reviews like a hostage situation. is the opposite playbook. It refuses to import a single rule from the internet. Instead it reads your codebase, finds where your team actually disagrees with Microsoft Docs, and writes Claude skills that quote Features/Order/CreateOrderHandler.cs:42 as evidence — not Kent Beck. Four skills in ten minutes. You type y or N for each. Nothing gets committed you didn't approve. Works on Windows, macOS, Linux. Conforms to the official Claude Code Skills spec so Claude actually loads what we forge. "Skills should be ergonomics for your team — not tourism brochures from someone else's stack.
README
Skill Forge
Stop pasting strangers’ skills into your repo.
Every week someone on Reddit ships a “Top 10 Claude Code Skills You MUST Have”
post. You copy them. They work — for the toy React project the author wrote them
against. In your 4-year-old DDD monolith they recommend *Controller.cs when
your team standardized on *Handler.cs three refactors ago, and now your junior
is writing code that looks correct and reviews like a hostage situation.
Skill Forge is the opposite playbook. It refuses to import a single rule
from the internet. Instead it reads your codebase, finds where your team
actually disagrees with Microsoft Docs, and writes Claude skills that quote
Features/Order/CreateOrderHandler.cs:42 as evidence — not Kent Beck.
Four skills in ten minutes. You type y or N for each. Nothing gets
committed you didn’t approve. Works on Windows, macOS, Linux. Conforms to the
official Claude Code Skills spec so
Claude actually loads what we forge.
“Skills should be ergonomics for your team — not tourism brochures from someone else’s stack.”
Release Notes
[0.2.0] — 2026-05-17 — Spec-compliance pass. Four fixes against the official Claude Code Skills documentation:
| Change | Why it matters | |
|---|---|---|
| A | Enforce skill name rule: ^[a-z0-9-]{1,64}$ |
Underscores / uppercase silently break loading. |
| B | Cap description + when_to_use at 1,536 chars |
Beyond this Claude truncates and auto-invocation degrades. |
| C | Move tracking manifest out of .claude/skills/ |
Claude Code treats every child of skills/ as a candidate skill — a flat INDEX.md there is at best ignored, at worst mis-parsed. |
| D | Add optional when_to_use field to skill template |
Lets authors split trigger phrases from short description. |
Upgrading from 0.1.x? See the migration guide in CHANGELOG.md — 5 shell commands, no data loss.
Full history: CHANGELOG.md
Table of contents
- What it does
- Package layout
- Prerequisites
- Installation — choose one placement
- Usage — Windows
- Usage — macOS
- Usage — Linux
- Sample recon output
- Setting the system prompt in Claude Code
- The forge workflow (what to type)
- Draft → Skill promotion flow
- Re-forging when the codebase drifts
- Troubleshooting
What it does
You run one script. It scans your repo (read-only) and writes 5 plain-text files
to .claude/forge-recon/ describing the codebase. You then open Claude Code,
load the Skill Forge system prompt, and pick a tier (1/2/3). Claude drafts skills
that quote real path:Lxx from your repo, and you type y/N to promote each
one. Strict review, no surprises.
Package layout
skill-forge/
├── QUICKSTART.md # 3-step cheat sheet
├── README.md # this file
├── prompts/SYSTEM.md # Claude's system prompt
├── scripts/
│ ├── forge.sh # Linux / macOS / Git Bash
│ └── forge.ps1 # Windows PowerShell (native)
└── templates/
├── SKILL.md # frontmatter + body for each forged skill
└── skill-forge-index.md # tracking manifest (lives OUTSIDE .claude/skills/)
Prerequisites
| OS | Required | Optional |
|---|---|---|
| Windows | PowerShell 5.1+ (built-in) or PowerShell 7, git |
— |
| macOS | Bash 3.2+ (built-in) or zsh, git |
tree (via Homebrew: brew install tree) |
| Linux | Bash 4+, git |
tree (via apt: sudo apt install tree) |
You also need Claude Code installed and authenticated. The script itself does not call Claude — it only prepares files Claude will read.
Installation — choose one placement
Option A — Vendor inside the project (recommended for teams)
Clone Skill Forge somewhere temporary, then copy its files into tools/skill-forge/
inside your project. This vendors the source — no submodule, no extra clone flags
for teammates, no surprise breakage when the upstream moves.
# 1. Clone Skill Forge to a temporary location
git clone https://github.com/jarvis823/skill-forge.git /tmp/skill-forge
# 2. Copy into your project under tools/
cd /path/to/your/project
mkdir -p tools
cp -r /tmp/skill-forge tools/skill-forge
# 3. Drop the upstream .git so it doesn't conflict with your repo
rm -rf tools/skill-forge/.git
# 4. Commit it as part of your project
git add tools/skill-forge
git commit -m "chore: vendor skill-forge under tools/"
New joiners then only need the normal clone of your project — nothing special, no submodule flags to remember:
git clone https://your-git-host/your-project.git
cd your-project
# tools/skill-forge/ is already there as regular files
Windows (PowerShell) equivalent:
git clone https://github.com/jarvis823/skill-forge.git $env:TEMP\skill-forge
cd D:\path\to\your\project
New-Item -ItemType Directory -Force -Path tools | Out-Null
Copy-Item -Recurse $env:TEMP\skill-forge tools\skill-forge
Remove-Item -Recurse -Force tools\skill-forge\.git
git add tools/skill-forge
git commit -m "chore: vendor skill-forge under tools/"
Why vendor instead of submodule? Submodules are powerful but a notorious footgun for new joiners — forget
--recurse-submodulesonce and you waste an afternoon. Vendoring is dumb, durable, and version-pinned by your own commit history. When you want to upgrade, repeat the steps above and review the diff.
Option B — Standalone clone outside the project (recommended for solo devs)
git clone https://github.com/jarvis823/skill-forge.git ~/skill-forge
Then point at the target project via the --repo / -Repo flag (see below).
Usage — Windows
One-time setup
PowerShell blocks unsigned scripts by default. Allow local scripts to run:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
RemoteSignedmeans: local scripts run freely, scripts downloaded from the internet require a signature. Safe for development.
Run recon
If skill-forge is inside the project (Option A):
cd D:\Working\Mobile\quick_saves
.\tools\skill-forge\scripts\forge.ps1
If skill-forge is outside the project (Option B):
C:\tools\skill-forge\scripts\forge.ps1 -Repo D:\Working\Mobile\quick_saves
Expected console output
Skill Forge recon @ a1b2c3d
Output: D:\Working\Mobile\quick_saves\.claude\forge-recon
[1/5] Tree...
[2/5] Languages...
[3/5] Manifests...
[4/5] Entry points...
[5/5] Tests...
Done. Recon files:
Name Length LastWriteTime
---- ------ -------------
01-tree.txt 258 5/16/2026 5:20:40 PM
02-languages.txt 94 5/16/2026 5:20:40 PM
03-manifests.txt 49 5/16/2026 5:20:40 PM
04-entrypoints.txt 52 5/16/2026 5:20:40 PM
05-tests.txt 102 5/16/2026 5:20:40 PM
Next: open Claude Code, set system prompt = prompts/SYSTEM.md, then reply 1/2/3.
Usage — macOS
One-time setup
Make the script executable (only the first time after clone):
chmod +x ~/skill-forge/scripts/forge.sh
# Or if vendored inside the project:
chmod +x tools/skill-forge/scripts/forge.sh
Run recon
From inside the project (auto-detects git root):
cd ~/work/quick_saves
bash tools/skill-forge/scripts/forge.sh
Pointing at a target project from anywhere:
bash ~/skill-forge/scripts/forge.sh --repo ~/work/quick_saves
Expected console output
Skill Forge recon @ a1b2c3d
Output: /Users/jimmy/work/quick_saves/.claude/forge-recon
[1/5] Tree...
[2/5] Languages...
[3/5] Manifests...
[4/5] Entry points...
[5/5] Tests...
Done. Recon files:
total 40
-rw-r--r-- 1 jimmy staff 258 May 16 17:20 01-tree.txt
-rw-r--r-- 1 jimmy staff 94 May 16 17:20 02-languages.txt
-rw-r--r-- 1 jimmy staff 49 May 16 17:20 03-manifests.txt
-rw-r--r-- 1 jimmy staff 52 May 16 17:20 04-entrypoints.txt
-rw-r--r-- 1 jimmy staff 102 May 16 17:20 05-tests.txt
Next: open Claude Code, set system prompt = prompts/SYSTEM.md, then reply 1/2/3.
Usage — Linux
One-time setup
chmod +x tools/skill-forge/scripts/forge.sh
# Optional but improves the tree output:
sudo apt install tree # Debian/Ubuntu
sudo dnf install tree # Fedora
Run recon
From inside the project:
cd ~/work/quick_saves
bash tools/skill-forge/scripts/forge.sh
Pointing at a target project from anywhere:
bash ~/skill-forge/scripts/forge.sh --repo ~/work/quick_saves
Expected console output
Identical to macOS, just with linux paths.
Sample recon output
Below is what Claude will read on its first turn — make sure these files look
sensible before continuing. If 02-languages.txt shows mostly .lock or
.json files, your recon picked up vendored code; check exclude patterns.
01-tree.txt
# Top-level layout (depth 2)
[DIR] .claude
[DIR] .claude/forge-recon
[DIR] .claude/skills
[DIR] .claude/skills-draft
go.mod
[DIR] internal
[DIR] internal/billing
package.json
[DIR] src
[DIR] src/Features
[DIR] tests
[DIR] tests/Order
02-languages.txt
# File count by extension (top 20)
3 cs
2 go
1 json
1 mod
1 txt
03-manifests.txt
# Build/dependency manifests
go.mod
package.json
04-entrypoints.txt
# Likely entry points
src/Features/Order/Program.cs
05-tests.txt
# Co-located test files (first 50)
internal/billing/refund_test.go
# Test directories/projects
tests
Setting the system prompt in Claude Code
Claude Code reads CLAUDE.md at the project root automatically. The easiest way
to load the Skill Forge prompt is to import it from CLAUDE.md:
Windows (cmd or PowerShell)
cd D:\Working\Mobile\quick_saves
echo @tools/skill-forge/prompts/SYSTEM.md > CLAUDE.md
macOS / Linux
cd ~/work/quick_saves
echo "@tools/skill-forge/prompts/SYSTEM.md" > CLAUDE.md
Verify it loaded
Open Claude Code in the project, then ask:
What role are you playing right now?
Pass: Claude replies with something like “Skill Forge ready. Recon files in .claude/forge-recon/. Reply with 1, 2, 3, or custom.”
Fail: Claude replies generically “I’m Claude, an AI assistant”. The import didn’t load — check CLAUDE.md content and the path inside it.
⚠️ The filename must be exactly
CLAUDE.md(all uppercase). Windows is case-insensitive so this works locally, but a teammate on Linux will hit a broken import if you accidentally save it asClaude.md.
The forge workflow (what to type)
After Claude greets you with the tier menu:
Step 1 — Pick a tier
Type just a number or custom:
| Reply | What you get |
|---|---|
1 |
Minimal (4 skills): code-reviewer, test-author, feature-scaffolder, drift-doctor |
2 |
Standard (8 skills): Minimal + migration-author, api-contract-author, logging-instrumentor, error-handler-coach |
3 |
Comprehensive (12 skills): Standard + perf-guide, security-linter, observability-wirer, legacy-strangler |
custom |
Pick à la carte — Claude will list candidates and let you tick them off |
Step 2 — Approve the proposal
Claude prints a one-screen plan: each skill with rationale and which evidence
file backs it. You reply y to proceed, or N to abort and rethink.
Example:
Plan for Minimal tier:
1. code-reviewer ← evidence: src/Features/Order/*.cs (HIGH)
2. test-author ← evidence: internal/billing/refund_test.go (HIGH)
3. feature-scaffolder ← evidence: src/Features/Order/ structure (MEDIUM)
4. drift-doctor ← meta-skill, monitors others (HIGH)
Proceed to draft? [y/N]
Step 3 — Approve each draft one-by-one
For each skill, Claude writes a draft and asks y/N/edit:
Drafted: .claude/skills-draft/code-reviewer/SKILL.md
Confidence: HIGH
Evidence:
- src/Features/Order/CreateOrderHandler.cs:14-32
- src/Features/Order/CreateOrderRequest.cs:1-28
- internal/billing/refund.go:38-62
Drift findings: 2
Promote `code-reviewer` to .claude/skills/? [y/N/edit]
y → Claude moves the folder, updates .claude/skill-forge-index.md, moves on to the next skill.
N → draft stays in .claude/skills-draft/; you can review later or delete.
edit → Claude asks what to change, redrafts, asks again.
Draft → Skill promotion flow
This is the part the official spec is strict about. Each skill is a directory, not a flat file.
Before promotion (draft state)
.claude/
├── forge-recon/ # recon files, read-only
│ ├── 01-tree.txt
│ └── ...
├── skills-draft/ # all current drafts live here
│ ├── code-reviewer/
│ │ └── SKILL.md # ← draft, NOT loaded by Claude Code
│ ├── test-author/
│ │ ├── SKILL.md
│ │ └── examples/
│ │ └── sample-test.cs # supporting file
│ └── feature-scaffolder/
│ └── SKILL.md
└── skills/ # empty until you approve
You type y for test-author
Claude performs these exact steps:
- Create
.claude/skills/test-author/ - Move
.claude/skills-draft/test-author/SKILL.md→.claude/skills/test-author/SKILL.md - Move
.claude/skills-draft/test-author/examples/→.claude/skills/test-author/examples/ - Remove the now-empty
.claude/skills-draft/test-author/directory - Append a row to
.claude/skill-forge-index.md(kept OUTSIDEskills/— see Spec compliance)
After promotion (committed state)
.claude/
├── skills-draft/ # code-reviewer + feature-scaffolder still here
│ ├── code-reviewer/
│ │ └── SKILL.md
│ └── feature-scaffolder/
│ └── SKILL.md
└── skills/ # ← only what you approved
# NO flat files here — spec treats every child as a skill directory
└── test-author/
├── SKILL.md # ← Claude Code now auto-loads this
└── examples/
└── sample-test.cs
What gets committed to Git
Add these to your repo:
git add .claude/skills/
git commit -m "feat: forge initial skill set (tier: minimal)"
Add these to .gitignore (they’re disposable):
.claude/forge-recon/
.claude/skills-draft/
The recon is reproducible (
forge.sh/forge.ps1regenerates it any time) and drafts are work-in-progress noise. Only the approved skills belong in Git.
Re-forging when the codebase drifts
After a major refactor, regenerate the recon and ask Claude to diff:
# Step 1 — fresh recon
bash tools/skill-forge/scripts/forge.sh # or .ps1 on Windows
# Step 2 — in Claude Code, type:
Re-forge. Compare new recon against existing skills in
.claude/skills/. Surface skills whose evidence files have changed and propose updates.
Claude will:
- Read the existing skills in
.claude/skills//SKILL.md - Re-check whether the cited
path:Lxxanchors still match the current code - For each drifted skill, write an updated draft to
.claude/skills-draft// - Ask
y/Nper skill before overwriting
Same strict-review gate. No silent overwrites.
Troubleshooting
“bash: not recognized” on Windows
You’re in cmd.exe. Either:
- Use the PowerShell version:
.\tools\skill-forge\scripts\forge.ps1 - Or open Git Bash (right-click the project folder → “Git Bash Here”)
“cannot be loaded because running scripts is disabled” on PowerShell
Run once:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Recon output shows node_modules or vendor files
The exclusion patterns missed your folder layout. Open forge.sh / forge.ps1,
find the ExcludeDirs / exclusion list, and add your folder name. Re-run.
Claude greets generically instead of saying “Skill Forge ready”
The system prompt didn’t load. Check:
CLAUDE.mdexists at project root- Its content is exactly:
@tools/skill-forge/prompts/SYSTEM.md(or absolute path) - The referenced path actually exists — case sensitive on macOS/Linux
Claude promotes drafts without asking y
Hard violation of the prompt. Reset by:
- Move accidentally-promoted skills back to
.claude/skills-draft/ - Re-import the system prompt (it includes the strict-review rule)
- If it happens twice in one session, restart Claude Code
“Repository not detected” warning
You ran the script outside a git repo. The script still works (it scans the
current directory) but repo_sha will be no-git in the skill metadata.
Either run inside a git repo, or accept the limitation for sandbox/prototype work.
When NOT to use this package
- Repo < 2 weeks old — no real conventions to detect yet
- You want fully autonomous AI — wrong philosophy, use a different tool
- You need one universal skill pack across many repos — forge per repo instead
License
Licensed under the Apache License 2.0.
In plain English: you can use, modify, fork, redistribute, even use this
commercially — just keep the copyright notice and the LICENSE / NOTICE
files intact. If you contribute back, your contribution is also Apache 2.0.
Apache 2.0 was chosen over MIT specifically for the explicit patent grant and retaliation clause (§3) — protects both the author and downstream users from patent shakedowns. See the Release Notes commentary for the full rationale.
Third-party trademarks (Claude, Anthropic, Microsoft, Go, etc.) belong to
their respective owners and are referenced descriptively only — see NOTICE.
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add jarvis823/skill-forge