TL;DR और निष्कर्ष
जो चार काम आप Claude Code में बार-बार टाइप करते हैं, उनमें से हर एक अलग फ़ाइल का है। release चेकलिस्ट एक skill है। जो नियम कभी नहीं टूटना चाहिए वह एक PreToolUse hook है। बहुत सारी फ़ाइलें पढ़ने वाला ऑडिट एक subagent है। जो डेटा Claude देख नहीं सकता वह एक MCP server है।
हमने चारों एक असली repo पर चलाए, 34 tests वाला एक इनवॉइस API, और हर बार पहले गलत चुनाव किया। गलत चुनाव स्क्रीन पर फेल हुए:
- CLAUDE.md में चेकलिस्ट ने /context में हर turn पर एक
Memory files: 210 tokensलाइन जोड़ दी। - पहला hook चला, उसने चेतावनी छापी, और write हो गया (unitPrice 8000 से 12000)।
- inline चलाए गए ऑडिट ने thread भर दिया: Messages 19.3k token पर, जबकि नाम लिए हुए subagent के साथ 7.2k।
- docs server के बिना Claude ने जवाब दिया "I couldn't find that setting... I won't guess one."
निष्कर्ष: प्रकार docs की तालिका से चुनिए, फिर फ़ाइल से जवाब दिलवाइए, सिर्फ़ उसे मौजूद मत रखिए। जो hook सिर्फ़ लॉग करता है वह सलाह भर है, उसी CLAUDE.md की लाइन की तरह जिसकी जगह उसने ली। चारों में से सिर्फ़ hook कभी नहीं पूछता।
नीचे की फ़ाइलें कॉपी कीजिए, उन्हें commit कीजिए, और उस से शुरू कीजिए जिसे आप सबसे ज़्यादा दोहराकर टाइप करते हैं।
सोर्स वाला सार
आपका session आपके पहले शब्द से पहले क्या लोड करता है। हमारा बेसलाइन /context 26.2k/1m token दिखाता था, न कोई memory लाइन और न कोई MCP लाइन। आप जो भी काम जोड़ते हैं वह या तो उस तालिका में एक लाइन डालता है या नहीं डालता। पहले उसे पढ़िए, फिर उसके मुकाबले नापिए।
CLAUDE.md का नियम एक अनुरोध है, hook enforcement है। docs कहते हैं कि CLAUDE.md या किसी skill में "never edit .env" जैसा निर्देश एक अनुरोध है, और edit को रोकने वाला PreToolUse hook enforcement है s1। Memory पेज CLAUDE.md को context कहता है, enforcement नहीं s8। Hacker News के एक thread ने यही बात hook की तरफ़ से बताई: exit 0 करने वाला hook कुछ नहीं रोकता s10।
ट्रिगर तालिका बताती है कि कौन सी फ़ाइल। किसी प्रक्रिया को तीसरी बार चिपकाना मतलब skill। जो आउटपुट चैट को भर दे, मतलब subagent। एक टैब जो Claude नहीं देख सकता, मतलब MCP server। कुछ जो हर बार होना चाहिए, मतलब hook s1।
काम 1, release चेकलिस्ट, एक skill है।
- जो प्रक्रिया CLAUDE.md के अंदर बड़ी हो गई, उसकी जगह skill में है, और उसकी body सिर्फ़ इस्तेमाल होने पर लोड होती है s3।
- हमारे run में CLAUDE.md में चिपकाई गई चेकलिस्ट ने एक
Memory files: 210 tokensलाइन जोड़ी।disable-model-invocation: trueवाली skill के रूप में /context बेसलाइन पर लौट आया। /releaseने छह steps चलाए (34 tests, 0.4.0 से 0.4.1, tag v0.4.1)। उसने यह भी पकड़ा किgit commit -amuntracked फ़ाइलें छोड़ देता है, इसलिए उसने पहले नया changelog stage किया।
काम 2, जो नियम टिकना चाहिए, एक hook है, और गारंटी वह जवाब है जो वह लौटाता है।
- कोई आउटपुट नहीं के साथ exit 0 कोई फ़ैसला नहीं है। Exit 2 रोकता है। deny JSON भी रोकता है s2।
- हमारे पहले hook ने लॉग किया, exit 0 किया और write हो गया (unitPrice 8000 से 12000)। Claude के जवाब में hook का ज़िक्र कभी नहीं आया।
- वही hook deny JSON लौटाकर edit से इनकार कर गया, इस
PreToolUse:Edit hook error: Stored data is never edited by hand: write a migration in src/store/migrations.ts (README § Conventions).के साथ। फिर Claude ने पूछा: override करे, या migration लिखे। - docs संरक्षित फ़ाइलों के लिए एक PreToolUse नुस्खा छापते हैं s23।
- सीमा: यह hook Edit और Write पर नज़र रखता है। shell को भी कवर कीजिए, या shell को अपनी allow सूची से बाहर रखिए।
onFailure: "block"फेल हुए hook को चुपचाप जाने देने की जगह रोकने वाला बनाता है। यह v2.1.295 में आया s2 s15।
काम 3, जो ऑडिट भर देता है, एक subagent है।
- subagent खाली शुरू होता है और एक सारांश लौटाता है s4।
- Inline में Messages 19.3k पढ़ा। नाम लिए हुए subagent के साथ 7.2k।
- सिर्फ़ agent फ़ाइल ने 2 में से 0 runs में delegate किया। prompt में उसका नाम लेने पर delegate हुआ। फ़ाइल उसे अस्तित्व देती है, आपका prompt Claude से उसका इस्तेमाल करवाता है।
- फ़ाइल में
model:पिन कीजिए। बिल नहीं हिला: पढ़ना फिर भी होता है, बस आपकी window में नहीं।
काम 4, जो डेटा Claude तक नहीं पहुँचता, एक MCP server है।
claude mcp add --scope project.mcp.jsonलिखता है, और tool search सिर्फ़ टूल नाम लोड करता है s5।- Claude Code के अपने docs के लिए एक मुफ़्त, बिना login वाला HTTP server मौजूद है, जिसमें
search_claude_code_docsऔरquery_docs_filesystem_claude_code_docsहैं s24। - उसके बिना Claude ने जवाब दिया "I couldn't find that setting... I won't guess one." उसके साथ Claude ने
"onFailure": "block"बताया, जो v2.1.295 में जोड़ा गया, जबकि हमारा install 2.1.294 था। - जिस लाइब्रेरी को model पहले से जानता है उसके docs server से हमारे लिए कुछ नहीं बदला। वह जोड़िए जो model के पास हो ही नहीं सकता।
फ़ील्ड रिपोर्ट। एक Reddit thread ने बताया कि Claude CLAUDE.md की "MUST use agent" लाइन को अनदेखा करता है s9। हम इसे रिपोर्ट के रूप में उद्धृत करते हैं, माप के रूप में नहीं। Anthropic की engineering पोस्ट्स इसी बँटवारे को कवर करती हैं s6 s7।
Code
run की चार फ़ाइलें, और दो सहायक। Paths वे हैं जहाँ हर एक आपके repo में रहती है।
1. release skill, .claude/skills/release/SKILL.md में। /release टाइप कीजिए। disable-model-invocation: true उसे आपके शुरू करने के लिए रखता है, और जो चीज़ commit और tag करती है उसके लिए आप यही चाहते हैं।
SKILL.md
---
name: release
description: Cut a patch release of ledgerly (typecheck, tests, version bump, changelog line, commit, tag).
disable-model-invocation: true
---
Run these steps in order and stop at the first failure:
1. `pnpm typecheck` must exit 0.
2. `pnpm test` must pass.
3. Bump the patch version in `package.json` (e.g. 0.4.0 -> 0.4.1).
4. Add one line at the top of `CHANGELOG.md` (create it if missing): `## vX.Y.Z - YYYY-MM-DD` followed by a one-line summary of the commits since the last tag.
5. `git commit -am "release vX.Y.Z"`
6. `git tag vX.Y.Z`. Never push.
2. protect-data hook, .claude/settings.json में। यह deny फ़ैसला उस कारण के साथ लौटाता है जिसे Claude पढ़ता है। इसे आपके PATH पर jq चाहिए और यह inline समा जाता है, इसलिए hook को अपनी कोई स्क्रिप्ट फ़ाइल नहीं चाहिए। data/.*\.json$ pattern और कारण को अपने नियम के हिसाब से बदलिए।
settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -c 'if (.tool_input.file_path // \"\") | test(\"data/.*\\\\.json$\") then {hookSpecificOutput: {hookEventName: \"PreToolUse\", permissionDecision: \"deny\", permissionDecisionReason: \"Stored data is never edited by hand: write a migration in src/store/migrations.ts (README § Conventions).\"}} else empty end'"
}
]
}
]
}
}
3. conventions auditor, .claude/agents/conventions-auditor.md में। टूल्स सिर्फ़ पढ़ने वालों तक सीमित हैं और model पिन किया हुआ है। conventions की सूची को अपने README से मिलाकर बदलिए।
conventions-auditor.md
---
name: conventions-auditor
description: Use when asked to audit the code against the README conventions
model: sonnet
tools: Read, Grep, Glob
---
You audit ledgerly's source against README § Conventions:
- Money is always an integer number of cents. Never floats.
- Domain functions return new objects; they never mutate their input.
- Validation failures throw `ValidationError` (400), missing records `NotFoundError` (404), illegal state transitions `ConflictError` (409).
- A change of stored shape bumps `schemaVersion` and adds a migration in `src/store/migrations.ts`.
Read every file under `src/`. Return only the findings: one line per violation as `file:line - convention - what is wrong`, then borderline cases the same way, then one line with the count of files read. No file contents, no summary of clean files.
conventions-auditor.md on GitHub
4. MCP config, repo की जड़ में .mcp.json के रूप में सहेजी हुई। claude mcp add --transport http claude-docs --scope project https://code.claude.com/docs/mcp यही लिखता है। Claude Code project server को pending दिखाता है जब तक आप अगले session में उसे मंज़ूर न करें।
mcp.json
{
"mcpServers": {
"claude-docs": {
"type": "http",
"url": "https://code.claude.com/docs/mcp"
}
}
}
सहायक। ctx.sh एक headless session में /context चलाता है और token लाइनें छापता है, ताकि आप पहले और बाद की तुलना कर सकें। mcp-probe.sh किसी HTTP MCP url को initialize और tools/list भेजता है, ताकि जोड़ने से पहले आप जाँच सकें कि server जवाब देता है।
ctx.sh
#!/usr/bin/env bash
# Usage: ctx.sh <step> -> runs "/context" through run-session.sh, writes context-<step>.txt (honours STRICT_MCP / EXTRA_ALLOW)
C="$(cd "$(dirname "$0")" && pwd)"
"$C/run-session.sh" "$C/out/context-$1.json" "/context" >/dev/null
python3 -c "import json,sys;d=json.load(open(sys.argv[1]));print(d['result'])" "$C/out/context-$1.json" > "$C/context-$1.txt"
grep -E '^\*\*Tokens|^\| (System prompt|System tools|MCP tools|Memory files|Skills|Custom agents|Messages) ' "$C/context-$1.txt"
mcp-probe.sh
#!/usr/bin/env bash
# Usage: mcp-probe.sh <url> [tools/call json params] -> initialize + notifications/initialized + tools/list (+ optional tools/call) over streamable HTTP
U="$1"; H=$(mktemp)
curl -s -D "$H" -m 30 -X POST "$U" -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}'
echo; SID=$(grep -i '^mcp-session-id:' "$H" | tr -d '\r' | cut -d' ' -f2); echo "session-id: ${SID:-none}"
HS=(-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream'); [ -n "$SID" ] && HS+=(-H "Mcp-Session-Id: $SID")
curl -s -m 30 -X POST "$U" "${HS[@]}" -d '{"jsonrpc":"2.0","method":"notifications/initialized"}' >/dev/null
curl -s -m 30 -X POST "$U" "${HS[@]}" -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'; echo
[ -n "${2:-}" ] && { curl -s -m 90 -X POST "$U" "${HS[@]}" -d "{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":$2}"; echo; }
rm -f "$H"
सोमवार को यह कीजिए
- एक नया session खोलिए और /context चलाइए। कुल लिख लीजिए। वही आपकी बेसलाइन है।
- वह चेकलिस्ट चुनिए जो आप सबसे ज़्यादा चिपकाते हैं। उसे
.claude/skills/<name>/SKILL.mdमें ले जाइए, अगर वह commit या tag करती है तोdisable-model-invocation: trueजोड़िए, और/<name>से चलाइए। - वह एक नियम लीजिए जो कभी नहीं टूटना चाहिए और उसे एक PreToolUse hook में रखिए जो
permissionDecision: "deny"लौटाए या 2 से exit करे। Claude से नियम तुड़वाने को कहिए, और जाँचिए कि edit से इनकार हुआ। - अगर आपका hook सिर्फ़ लॉग करता है, तो उसे बदलिए। exit 0 करने वाला hook कुछ नहीं रोकता।
- बहुत सारी फ़ाइलें पढ़ने वाला एक काम
.claude/agents/<name>.mdमें ले जाइए, पिन किए हुएmodel:के साथ। जब तक Claude खुद उसे न चुने, अपने prompt में उसका नाम लीजिए। - कोई एक तथ्य जाँचिए जिसका अंदाज़ा Claude ने हाल में आपके लिए लगाया। अगर वह model से नया है, तो
claude mcp add --transport http <name> --scope project <url>से docs server जोड़िए और.mcp.jsonको commit कीजिए। - किसी सेटिंग पर भरोसा करने से पहले अपना Claude Code version जाँचिए।
onFailure: "block"को 2.1.295 चाहिए। -
git add -A && git statusचलाइए और नई फ़ाइलें commit कीजिए। हमारे run में ठीक चार दिखीं।
आगे बढ़ें
चुनाव कार्ड। एक पेज। ये docs की पंक्तियाँ हैं s1 जिन पर हमारे चारों काम लिखे हैं। इस पैक का हीरो ऊपर की चार फ़ाइलें और यह कार्ड है।
| प्रकार | क्या करता है | कब इस्तेमाल करें | हमारा काम | हमारी फ़ाइल |
|---|---|---|---|---|
| CLAUDE.md | स्थायी context जो हर बातचीत में लोड होता है | एक convention जिसे Claude दो बार गलत करे | एक लाइन, प्रक्रिया नहीं | कोई नहीं |
| Skill | निर्देश और workflows जिन्हें Claude इस्तेमाल कर सके | आप तीसरी बार वही playbook चिपका रहे हैं | release चेकलिस्ट | .claude/skills/release/SKILL.md |
| Hook | events से चलने वाली एक स्क्रिप्ट | आप चाहते हैं कि वह हर बार, बिना पूछे हो | संग्रहीत डेटा को कभी हाथ से edit न करना | .claude/settings.json |
| Subagent | अलग context जो सारांश में नतीजे लौटाता है | एक साइड काम आपकी बातचीत को भर देता है | conventions ऑडिट | .claude/agents/conventions-auditor.md |
| MCP | बाहरी सेवाओं से जुड़ना | आप ऐसे टैब से डेटा कॉपी करते रहते हैं जो Claude को नहीं दिखता | Claude Code के docs | .mcp.json |
| Plugin | चारों को एक इंस्टॉल होने वाली इकाई में बाँधता है | किसी दूसरी repository को वही सेटअप चाहिए | इस्तेमाल नहीं किया | कोई नहीं |
कार्ड प्रकार तय करता है, गुणवत्ता नहीं। जो hook सिर्फ़ लॉग करता है, जिस subagent का आप नाम नहीं लेते, और जिस लाइब्रेरी को model जानता है उसका server, ये सब सही प्रकार में थे और फेल हुए। प्रकार चुनिए, फिर फ़ाइल से जवाब दिलवाइए।
इन्हें कब न चुनें।
- जो convention Claude बार-बार गलत करता है वह CLAUDE.md में एक लाइन के रूप में रहती है, प्रक्रिया के रूप में नहीं।
- जिस काम को आप अपने इतिहास को सामने रखकर आगे-पीछे चलाते हैं, वह मुख्य thread में रहता है, subagent में नहीं।
- जिस लाइब्रेरी को model पहले से जानता है उसका docs server context खर्च करता है और कुछ नहीं बदलता।
pnpm testएक CLI है जो आपके पास पहले से है। यह MCP का काम नहीं है।
Plugins. plugin वह डिब्बा है जो चारों को साथ भेजता है। तब उठाइए जब किसी दूसरे repo को वही सेटअप चाहिए।
Skill के साथ MCP। docs दोनों को जोड़ते हैं: server कनेक्शन देता है, और skill Claude को सिखाती है कि उसे अच्छी तरह कैसे इस्तेमाल करना है।
context: fork वाली skill। एक skill forked subagent में चल सकती है, ताकि उसका पढ़ना आपकी window से बाहर रहे। उस पर भरोसा करने से पहले उसे एक काम पर आज़माइए।
command के अलावा hook प्रकार। हमने command इस्तेमाल किया। hooks रेफ़रेंस दूसरे handler प्रकार गिनाता है, जिनमें http और prompt hooks हैं। नियम वही रहता है: hook जो लौटाता है वही तय करता है, और चुप hook कुछ तय नहीं करता।
MCP बनाम CLI. एक खुली बहस है कि MCP servers context खा जाते हैं, एक पोस्ट पहले CLI की वकालत करती है s11 और दूसरी MCP servers की context लागत पर s12। हमारा नियम: अगर कोई CLI पहले से काम कर देता है, तो उसे इस्तेमाल कीजिए। MCP उसके लिए इस्तेमाल कीजिए जिसका कोई CLI नहीं। Tool search अब सिर्फ़ नाम लोड करता है, इसलिए फ़ैसला करने से पहले अपने सेटअप पर /context से नापिए s5।
skills को छोटा और जाँचा हुआ रखिए। हर काम के लिए एक छोटी skill, असली run से जाँची हुई। SkillsBench पेपर देखिए s13 और एक practitioner का नज़रिया कि skills इस्तेमाल होने तक इतनी सस्ती क्यों हैं s14।
FAQ
मेरा hook चला फिर भी edit क्यों हो गया? hook सिर्फ़ उससे फ़ैसला करता है जो उसका कमांड लौटाता है। कोई आउटपुट नहीं के साथ exit 0 कोई फ़ैसला नहीं है s2। deny JSON लौटाइए, या 2 से exit कीजिए।
subagent होने पर भी Claude फ़ाइलें खुद क्यों पढ़ता है? हमारे run में सिर्फ़ agent फ़ाइल ने 2 में से 0 runs में delegate किया। prompt में उसका नाम लीजिए, जैसे "use the conventions auditor subagent"।
क्या hook वह सब कवर करता है जो Claude कर सकता है? नहीं। हमारा Edit और Write से मेल खाता है। एक बाद के run में Claude ने बदलाव shell के रास्ते करने की पेशकश की, इसलिए shell को कवर कीजिए या उसे अपनी allow सूची से बाहर रखिए।
क्या मुझे हर इस्तेमाल की लाइब्रेरी के लिए एक MCP server जोड़ना चाहिए? नहीं। अगर model लाइब्रेरी को पहले से जानता है, तो server कुछ नहीं बदलता और context खर्च करता है। उसे model से नए डेटा के लिए, या आपकी डिस्क के बाहर के डेटा के लिए जोड़िए, और अपना इंस्टॉल किया version उस version से मिलाइए जिसने फ़ीचर जोड़ा।
क्या मैं यह सब commit कर सकता हूँ?
हाँ। skill, settings फ़ाइल, agent फ़ाइल और .mcp.json सब repo में रहती हैं, इसलिए जो भी उसे clone करे उसे ये मिल जाती हैं। project MCP server को अगले session में एक बार मंज़ूर कीजिए।
AIDive