<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Claude-Code on Vitalii Sukach</title><link>https://sukachvitally.github.io/tags/claude-code/</link><description>Recent content in Claude-Code on Vitalii Sukach</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 21 Jun 2026 15:26:54 +0000</lastBuildDate><atom:link href="https://sukachvitally.github.io/tags/claude-code/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Skills: The Reusable Knowledge Modules That Make AI Truly Powerful</title><link>https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/</link><pubDate>Sun, 21 Jun 2026 15:26:54 +0000</pubDate><guid>https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/</guid><description>&lt;p>&lt;em>How Claude loads specialised instructions on demand — and how you can write your own to transform workflows forever.&lt;/em>&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-01.png">&lt;/p>
&lt;p>Every time you open Claude and ask it to create a Word document, build a data analysis pipeline, or write presentation slides — something invisible happens first. Claude scans a directory of &lt;em>skills&lt;/em>, finds the most relevant one, reads it, and only then starts working.&lt;/p>
&lt;p>This system is called &lt;strong>Claude Skills&lt;/strong>. It is one of the most underappreciated features in the entire Claude ecosystem. And once you understand how it works, you will see why it changes everything about how you build AI-powered workflows.&lt;/p></description><content:encoded><![CDATA[<p><em>How Claude loads specialised instructions on demand — and how you can write your own to transform workflows forever.</em></p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-01.png"></p>
<p>Every time you open Claude and ask it to create a Word document, build a data analysis pipeline, or write presentation slides — something invisible happens first. Claude scans a directory of <em>skills</em>, finds the most relevant one, reads it, and only then starts working.</p>
<p>This system is called <strong>Claude Skills</strong>. It is one of the most underappreciated features in the entire Claude ecosystem. And once you understand how it works, you will see why it changes everything about how you build AI-powered workflows.</p>
<blockquote>
<p>“Skills are how Claude learns domain-specific workflows without retraining. They are runtime instructions, not model weights.”</p></blockquote>
<h3 id="what-is-askill">What Is a Skill?</h3>
<p>A skill is a directory containing a SKILL.md file (and optionally supporting assets, scripts, and reference documents). When Claude starts handling a request, it reads the <em>name</em> and <em>description</em> of every available skill. If a description matches the current task, Claude loads the full SKILL.md body and follows its instructions.</p>
<p>Think of it like a context-sensitive manual. When a carpenter picks up a dovetail saw, they know exactly how to use it — not because they memorised every detail about every tool upfront, but because they learned the right technique for the right moment. Skills work the same way for Claude.</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-02.png"></p>
<h3 id="the-three-layer-loadingsystem">The Three-Layer Loading System</h3>
<p>Skills use progressive disclosure — Claude never loads everything at once. There are three distinct layers, each loaded only as needed:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-03.png"></p>
<p>This is elegant engineering. Layer 1 is tiny — just enough for Claude to decide <em>whether</em> a skill applies. Layer 2 gives full instructions once relevant. Layer 3 provides deep reference material only when needed, keeping context usage lean.</p>
<h3 id="anatomy-of-a-skill-directory">Anatomy of a Skill Directory</h3>
<p>A skill is a folder with a predictable structure. Here is the full layout:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-04.png"></p>
<p>Only SKILL.md is required. Everything else is optional and only loaded when the skill itself explicitly references it.</p>
<h3 id="inside-skillmdthe-configuration-fields">Inside SKILL.md — The Configuration Fields</h3>
<p>The file starts with a YAML frontmatter block (between &mdash; delimiters), followed by markdown instructions. Here is every supported field:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-05.png"></p>
<blockquote>
<p><strong>KEY INSIGHT</strong>The description field is the most important part of any skill. Claude decides whether to load your skill based solely on this field — the body never loads unless the description matches. Write it with real triggers, real contexts, and a slight &ldquo;push&rdquo; to combat under-triggering.</p></blockquote>
<h3 id="a-minimal-skillstep-bystep">A Minimal Skill — Step by Step</h3>
<p>Let’s build a real skill from scratch. Imagine you regularly need to convert raw PostgreSQL query results into nicely formatted Markdown reports. Here is how to package that as a skill.</p>
<h4 id="step-1create-the-directory">Step 1 — Create the directory</h4>
<pre tabindex="0"><code>mkdir pg-report-skill
cd pg-report-skill
touch SKILL.md
</code></pre><h4 id="step-2write-the-frontmatter">Step 2 — Write the frontmatter</h4>
<pre tabindex="0"><code>---
name: pg-report
description: |
  Converts raw PostgreSQL query results into formatted Markdown reports
  with tables, summary stats, and query metadata. Use whenever the user
  pastes SQL output, mentions &#34;format this query result&#34;, or wants to
  turn database output into a readable report or document. Also trigger
  when user asks to summarise a dataset from a .csv or .tsv that looks
  like a DB export.
---
</code></pre><blockquote>
<p><strong>TIP: WRITE THE DESCRIPTION LIKE A TRIGGER RULESET</strong>Notice how the description lists multiple phrasings (“pastes SQL output”, “format this query result”, “summarise a dataset”). This breadth is intentional — Claude uses fuzzy matching, so covering several natural phrasings dramatically improves trigger reliability.</p></blockquote>
<h4 id="step-3write-the-skillbody">Step 3 — Write the skill body</h4>
<pre tabindex="0"><code># PostgreSQL Report Formatter
## What this skill does
Formats raw PostgreSQL tabular output into clean Markdown reports.
## Required output sections
1. A ## Summary block: row count, column count, date range (if present)
2. A ## Data block: full Markdown table with aligned columns
3. A ## Observations block: 3-5 key insights from the data
## Formatting rules
- Numeric columns: right-align, add thousand separators
- Date columns: format as YYYY-MM-DD
- NULL values: render as `—` (em dash), never blank
- Column headers: Title Case
## Example input
</code></pre><p>id | user_name | total_orders | revenue
&mdash;-+&mdash;&mdash;&mdash;&ndash;+&mdash;&mdash;&mdash;&mdash;&ndash;+&mdash;&mdash;&mdash;
1 | alice     |           12 | 4500.00
2 | bob       |            3 |  890.50</p>
<pre tabindex="0"><code>## Example output
### Summary
- **Rows:** 2  |  **Columns:** 4  |  **Total revenue:** $5,390.50
### Data
| ID | User Name | Total Orders | Revenue |
|----|-----------|-------------:|--------:|
|  1 | Alice     |           12 | $4,500.00 |
|  2 | Bob       |            3 |   $890.50 |
</code></pre><h3 id="step-4add-a-reference-file-optional">Step 4 — Add a reference file (optional)</h3>
<p>If your skill needs to handle multiple database types — PostgreSQL, MySQL, SQLite — you can create a references/ folder and have the skill body instruct Claude to load the right one:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-skills-the-reusable-knowledge-modules-that-make-ai-truly-powerful/image-06.png"></p>
<p>In your SKILL.md body, you then write:</p>
<pre tabindex="0"><code>## Database-specific rules
Detect which database produced the output from syntax clues.
- If `||` concatenation → read references/sqlite.md
- If `AUTO_INCREMENT` → read references/mysql.md
- Default → read references/postgres.md
</code></pre><p>Claude will read only the relevant file, keeping the context window lean and responses accurate.</p>
<h3 id="real-world-example-the-built-in-docxskill">Real-World Example: The Built-in DOCX Skill</h3>
<p>Claude ships with several built-in skills. The docx skill is a great example of production-quality configuration. Here is its description field, distilled:</p>
<pre tabindex="0"><code>description: |
  Use this skill whenever the user wants to create, read, edit, or
  manipulate Word documents (.docx files). Triggers include: any
  mention of &#39;Word doc&#39;, &#39;word document&#39;, &#39;.docx&#39;, or requests to
  produce professional documents with formatting like tables of
  contents, headings, page numbers, or letterheads. Also use when
  extracting content from .docx files, inserting images, performing
  find-and-replace, working with tracked changes, or converting
  content into a polished Word document.
</code></pre><p>Notice the pattern: the description is almost a checklist. Every plausible user phrasing that should trigger the skill is listed. This is intentional — Claude has a natural tendency to <em>under-trigger</em> skills, so descriptions are deliberately thorough.</p>
<blockquote>
<p><strong>WARNING: AVOID GENERIC DESCRIPTIONS</strong></p></blockquote>
<blockquote>
<p>A description like “Helps with documents” will rarely trigger. Claude needs enough specificity to distinguish your skill from general knowledge. Name the exact task, the exact file types, and the exact user phrases that should activate it.</p></blockquote>
<h3 id="the-progressive-disclosure-principle">The Progressive Disclosure Principle</h3>
<p>The most important architectural decision in skill design is knowing what goes where. The three-layer rule is simple:</p>
<h4 id="1-description--triggering-logiconly">1. Description = triggering logic only</h4>
<p>Never put instructions in the description. It exists solely to help Claude decide whether to load the skill. Keep it focused on “when to use” language, not “how to do”.</p>
<h4 id="2-skillmd-body--coreworkflow">2. SKILL.md body = core workflow</h4>
<p>Put the main instructions, output format rules, required sections, formatting guidelines, and examples here. Target under 500 lines. If you need more, move deep content into reference files.</p>
<h4 id="3-references--scripts--deep-knowledge">3. References + scripts = deep knowledge</h4>
<p>Detailed documentation, database-specific rules, platform-specific templates, and executable scripts go in subfolders. The SKILL.md body tells Claude when to read them.</p>
<h3 id="writing-descriptions-that-actuallytrigger">Writing Descriptions That Actually Trigger</h3>
<p>The description field is the hardest part to get right. Here is a battle-tested template:</p>
<pre tabindex="0"><code>description: |
  [What the skill does in one sentence].
  Use this skill when: [scenario A], [scenario B], [scenario C].
  Also trigger when the user [natural phrase], [natural phrase],
  or mentions [keyword / file type / tool name].
  Do NOT use for [explicit exclusion to avoid false positives].
</code></pre><p>And a concrete example for a “Java Code Review” skill:</p>
<pre tabindex="0"><code>description: |
  Reviews Java source files for correctness, performance, thread
  safety, and style — producing structured inline feedback.
  Use whenever the user shares Java code and asks for review,
  feedback, improvements, or a PR review. Also trigger on phrases
  like &#34;check my code&#34;, &#34;what&#39;s wrong here&#34;, or &#34;how can I improve
  this&#34; when the code is Java. Trigger on .java files even without
  an explicit review request.
  Do NOT use for Kotlin, Scala, or general architecture questions
  without code attached.
</code></pre><h3 id="when-skills-usescripts">When Skills Use Scripts</h3>
<p>For deterministic or repetitive transformations — file conversions, data extraction, package generation — skills can include executable scripts. Claude reads the script path from the SKILL.md body, runs it via the bash tool, and uses the output.</p>
<p>The built-in docx skill, for example, uses a Python script to write .docxfiles using the python-docx library. The skill body contains step-by-step instructions for calling the script correctly — Claude follows them at runtime.</p>
<pre tabindex="0"><code>## Creating a DOCX file
1. Generate Python code using python-docx from the template at
   scripts/create_doc.py
2. Run: python scripts/create_doc.py output.docx
3. Copy result to /mnt/user-data/outputs/
4. Present to user with present_files tool
</code></pre><h3 id="testing-yourskill">Testing Your Skill</h3>
<p>Before deploying, write 5–10 test prompts that should trigger your skill, and 3–5 that should not. Run Claude with the skill installed and check whether it loads correctly.</p>
<p>Good test prompts for a “pg-report” skill:</p>
<pre tabindex="0"><code># Should trigger:
&#34;Here&#39;s my query result, can you format it nicely?&#34;
&#34;Turn this SQL output into a report&#34;
&#34;I exported this CSV from my database, summarise it&#34;
# Should NOT trigger:
&#34;How do I write a JOIN query?&#34;
&#34;What is normalisation in databases?&#34;
</code></pre><blockquote>
<p><strong>PRO TIP: QUANTITATIVE EVALUATION</strong>If you are building skills at scale, the skill-creator meta-skill includes an automated optimization loop. It splits your test set 60/40 (train/held-out), runs Claude against each case multiple times, proposes description improvements, and iterates up to 5 rounds — outputting the best-performing description with before/after scores.</p></blockquote>
<h3 id="packaging-and-sharingskills">Packaging and Sharing Skills</h3>
<p>A finished skill can be packaged into a .skill file for distribution. Anyone can install it by dropping the file into their skills directory. The package script handles archiving:</p>
<pre tabindex="0"><code>python -m scripts.package_skill path/to/pg-report-skill/
# → outputs pg-report-skill.skill
</code></pre><h3 id="the-biggerpicture">The Bigger Picture</h3>
<p>Skills are not just a convenience feature. They are the mechanism by which Claude becomes <em>domain-aware</em> without retraining. A legal firm can build a contract-review skill. A data team can build a dashboard-generation skill. A game studio can build a Godot export skill. Each one runs inside the same Claude — just with different runtime instructions.</p>
<p>The architecture is deliberately modular. Skills compose. A single request might trigger the pdf-reading skill to extract content, then the docx skill to write the output. Each stays in its lane, and Claude orchestrates.</p>
<blockquote>
<p>“You don’t teach Claude new tricks by changing the model. You teach it by writing better skills.”</p></blockquote>
<p>For solo developers and small teams, this is genuinely powerful. You can codify your best workflows once, as a skill, and they run reliably on every request — without prompting, without repetition, and without hoping Claude happens to “know” your preferred format.</p>
<p>Start small. Pick one workflow you repeat every week. Write a 30-line SKILL.md. Test it on five prompts. Then iterate. That is all it takes to start building your own personalised AI toolkit.</p>
<p><strong>RESOURCES</strong>The skills discussed in this article — including docx, pdf, pptx, xlsx, and skill-creator — are built into Claude&rsquo;s computer-use environment. You can explore them at /mnt/skills/public/ in any Claude session with computer use enabled.</p>
]]></content:encoded></item><item><title>Claude Code: The Complete Guide Nobody Wrote</title><link>https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/</link><pubDate>Tue, 02 Jun 2026 17:21:27 +0000</pubDate><guid>https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/</guid><description>&lt;p>&lt;img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-01.png">&lt;/p>
&lt;h3 id="the-agentic-loop-how-claude-actuallythinks">The Agentic Loop (How Claude Actually Thinks)&lt;/h3>
&lt;p>Before anything else, you need to understand what makes Claude Code different from your IDE’s autocomplete. Autocomplete guesses the next word. Claude Code runs a loop — it gathers context, takes action, verifies results, then repeats until the task is done. Think of it less like a text editor feature and more like a developer who works asynchronously while you make coffee.&lt;/p></description><content:encoded><![CDATA[<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-01.png"></p>
<h3 id="the-agentic-loop-how-claude-actuallythinks">The Agentic Loop (How Claude Actually Thinks)</h3>
<p>Before anything else, you need to understand what makes Claude Code different from your IDE’s autocomplete. Autocomplete guesses the next word. Claude Code runs a loop — it gathers context, takes action, verifies results, then repeats until the task is done. Think of it less like a text editor feature and more like a developer who works asynchronously while you make coffee.</p>
<p>The loop has three phases that blend together depending on the task:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-02.png"></p>
<p>The loop adapts to what you ask. A question might only hit phase 1. A bug fix cycles through all three phases multiple times. A full feature might chain dozens of tool calls before Claude surfaces for air. You’re part of the loop too — you can interrupt at any point with Ctrl+C and steer it in a different direction.</p>
<blockquote>
<p><strong>THE HONEST SUMMARY</strong></p></blockquote>
<blockquote>
<p>Claude Code is basically a language model with access to your entire computer strapped to it. It can read everything, run anything you could run from a terminal, and it just keeps going until it either finishes the task or you tell it to stop. This is either exhilarating or terrifying depending on how much you trust your test coverage.</p></blockquote>
<h3 id="sessions--how-claude-remembers-ordoesnt">Sessions &amp; How Claude Remembers (Or Doesn’t)</h3>
<p>Here’s the thing about Claude: <strong>every session starts with a completely blank memory.</strong> No recollection of last week’s chat. No memory of that convention you mentioned. Tabula rasa. Every. Single. Time. If you don’t explicitly persist knowledge, it’s gone when the session closes.</p>
<p>This isn’t a bug — it’s how LLMs work. But Claude Code gives you two mechanisms to work around it:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-03.png"></p>
<h4 id="how-a-session-actuallystarts">How a session actually starts</h4>
<p>When you run claude in a directory, here&rsquo;s what happens in the first few seconds before you&rsquo;ve typed anything:</p>
<ol>
<li>**Settings load (all scopes)**Global ~/.claude/settings.json → project .claude/settings.json → local .claude/settings.local.json. Scalar settings use the most specific value; array settings (like permissions) merge across all scopes.</li>
<li><strong>MCP servers connect</strong>All configured MCP servers from .mcp.json and ~/.claude.json start up. Tool schemas are deferred and load on demand. If a server fails to connect, Claude continues without it — it just loses those tools.</li>
<li><strong>CLAUDE.md files load into context</strong>Org-level → user-level (~/.claude/CLAUDE.md) → project-level (./CLAUDE.md) → local (./CLAUDE.local.md). Plus your ~/.claude/MEMORY.md auto memory. All of this costs context window tokens immediately.</li>
<li><strong>Plugins activate</strong>All enabled plugins load their skills, hooks, MCP servers, and settings. Run /reload-plugins to activate changes mid-session.</li>
<li><strong>Session is ready</strong>You see the prompt. Everything above has already happened. Claude now has your project context and is ready to work.</li>
</ol>
<blockquote>
<p><strong>CONTEXT WINDOW BUDGET</strong></p></blockquote>
<blockquote>
<p>Everything loaded at startup costs tokens before you type a single character. A bloated CLAUDE.md, a dozen MCP servers, and a large MEMORY.md can eat a significant chunk of your context window. Run /status to see current token usage. Use /compact when a session gets long.</p></blockquote>
<h3 id="theclaude-directoryevery-folder-explained">The .claude Directory — Every Folder Explained</h3>
<p>The .claude/ folder is Claude Code&rsquo;s configuration home in your project. There&rsquo;s also ~/.claude/ in your home directory for global settings. Here&rsquo;s the complete layout with every file and folder you&rsquo;ll actually encounter:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-04.png"></p>
<blockquote>
<p><strong>COMMIT STRATEGY</strong></p></blockquote>
<blockquote>
<p>Everything marked <strong>committed</strong> should go in Git so your whole team gets the same Claude setup. Everything marked <strong>gitignored</strong> is personal — Claude automatically adds settings.local.json to your global Git ignore. Add CLAUDE.local.md to your project&rsquo;s .gitignore manually.</p></blockquote>
<h3 id="claudemdthe-fullstory">CLAUDE.md — The Full Story</h3>
<p>You’ve heard about CLAUDE.md. Everyone mentions it. But few people explain the <em>entire</em> system behind it, which has four separate scope levels that load in a specific order:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-05.png"></p>
<p>They load in that order — managed first, local last. More specific scopes appear later in the context window, giving them higher effective priority.</p>
<h4 id="what-to-actually-put-in-claudemd">What to actually put in CLAUDE.md</h4>
<p>The golden rule: add something to CLAUDE.md when Claude makes the same mistake a second time. Here’s a battle-tested example for a Spring Boot project:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-06.png"></p>
<blockquote>
<p><strong>SIZE MATTERS</strong></p></blockquote>
<blockquote>
<p>Target under 200 lines per CLAUDE.md. Longer files still load fully but adherence drops. If it’s getting long, split topic-specific rules into .claude/rules/ files and skills for complex procedures — they load conditionally and save your context window.</p></blockquote>
<h4 id="auto-memory-memorymd">Auto Memory (MEMORY.md)</h4>
<p>This is the magical part most people miss. Claude can write its own notes — automatically. When you correct Claude, it optionally remembers that correction for next session in ~/.claude/MEMORY.md. The first 200 lines or 25KB load at the start of every session.</p>
<p>Enable it with /memory in session or toggle it in settings. Then: tell Claude something once, it remembers it forever (until you delete the entry). This is how you get a Claude that feels like it&rsquo;s been on your team for months.</p>
<h3 id="settingsjsonthe-enforcement-layer">settings.json — The Enforcement Layer</h3>
<p>There’s a critical distinction most people miss: <strong>CLAUDE.md is guidance Claude reads.settings.json is configuration Claude Code enforces.</strong> One is a polite suggestion. The other is a locked door.</p>
<p>Settings live in .claude/settings.json (project/team) and .claude/settings.local.json(personal overrides). Here&rsquo;s what you can configure:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-07.png"></p>
<blockquote>
<p><strong>ALLOW VS DENY PRECEDENCE</strong></p></blockquote>
<blockquote>
<p>Deny rules always win over allow rules. If you allow Bash(kubectl *) and deny Bash(kubectl delete *), the delete command is blocked. Patterns support wildcards — Bash(npm test *)matches any command starting with npm test.</p></blockquote>
<h3 id="rulesscoped-instructions-that-load-ondemand">rules/ — Scoped Instructions That Load On Demand</h3>
<p>Once your CLAUDE.md hits 200 lines, start splitting it into .claude/rules/. Rules are Markdown files that can load <em>conditionally</em> based on which files Claude is working with — only when it reads a file that matches the rule&rsquo;s path pattern. This keeps your global context lean while ensuring Claude gets the right rules at the right time.</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-08.png"></p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-09.png"></p>
<blockquote>
<p><strong>THE REAL POWER</strong></p></blockquote>
<blockquote>
<p>A rule file without paths: frontmatter loads every session like CLAUDE.md. A rule WITH paths:only loads when Claude reads a matching file. This means your Kafka rules don&rsquo;t eat context window during a CLAUDE.md update, and your migration rules only appear when Claude actually opens a migration file.</p></blockquote>
<h3 id="skillsyour-custom-slashcommands">skills/ — Your Custom Slash Commands</h3>
<p>Skills are reusable prompts you or Claude can invoke by name using /skill-name. Think of them as saved workflows — things you do repeatedly that are more than a one-liner but less than a custom tool. You write the instructions once in a SKILL.md, and invoke it whenever you need it.</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-10.png"></p>
<p>Now you type /db-migrate and Claude walks through all seven steps. No more explaining the process from scratch every time. Skills also accept arguments via $ARGUMENTS:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-11.png"></p>
<p>Usage: /review-pr 127 — Claude reviews MR #127 with your exact conventions baked in.</p>
<blockquote>
<p>SKILLS VS COMMANDS</p></blockquote>
<blockquote>
<p>You may see references to .claude/commands/ in older docs — this is the same mechanism as skills. For new workflows, use skills/ instead: same /name invocation, plus you can bundle supporting files alongside the SKILL.md.</p></blockquote>
<h3 id="hooksthe-automation-engine">Hooks — The Automation Engine</h3>
<p>Hooks are shell commands that fire automatically at specific points in Claude’s lifecycle. They’re deterministic — they <em>always</em> run when triggered, regardless of what Claude decides. This is the difference between “please format the file” (Claude might forget) and “PostToolUse hook runs Spotless” (it definitely happens).</p>
<h4 id="available-hookevents">Available hook events</h4>
<p><strong>PreToolUse</strong><em>Fires before any tool call. Can block execution (exit 2). Use to protect files or validate commands.</em></p>
<p><strong>PostToolUse</strong><em>Fires after a tool completes. Perfect for auto-formatting files after Claude edits them.</em></p>
<p><strong>Notification</strong><em>Fires when Claude needs your input. Desktop notification so you don’t stare at the terminal.</em></p>
<p><strong>SessionStart</strong><em>Fires when a session begins. Inject additional context, set environment, run setup scripts.</em></p>
<p><strong>PreCompact</strong><em>Fires before conversation compaction. Re-inject context that would otherwise be lost.</em></p>
<p><strong>Stop</strong><em>Fires when Claude finishes a response. Useful for post-response validation or logging.</em></p>
<h3 id="practical-examples-for-a-javaspring-bootproject">Practical examples for a Java/Spring Boot project</h3>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-12.png"></p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-13.png"></p>
<blockquote>
<p><strong>EXIT CODES MATTER</strong></p></blockquote>
<blockquote>
<p>exit 0 = allow. exit 1 = warn Claude but let it continue. exit 2 = hard block — Claude gets told why and has to try something else. It&rsquo;s the digital equivalent of a bouncer who also explains the dress code.</p></blockquote>
<h3 id="mcpconnecting-claude-to-theworld">MCP — Connecting Claude to the World</h3>
<p>Model Context Protocol (MCP) is an open standard for connecting AI to external tools. Without MCP, Claude can only see your filesystem and run terminal commands. With MCP, Claude can query your Jira board, check Sentry errors, read Slack messages, query your PostgreSQL database, and more — all without you copying and pasting anything.</p>
<blockquote>
<p><strong>THE MENTAL MODEL</strong></p></blockquote>
<blockquote>
<p>MCP is how Claude gets a login to your tools. Without it: “here’s a pasted error from Sentry.” With it: “Claude, check what errors happened in prod in the last hour and correlate them with my recent commits.”</p></blockquote>
<h4 id="three-types-of-mcpservers">Three types of MCP servers</h4>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-14.png"></p>
<h4 id="project-scoped-mcp-mcpjson">Project-scoped MCP (.mcp.json)</h4>
<p>Put your team’s MCP servers in .mcp.json at the project root. This file gets committed to Git so everyone on the team gets the same tools:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-15.png"></p>
<h4 id="user-scoped-mcp-personal-tools">User-scoped MCP (personal tools)</h4>
<p>For tools only you need (not your team), use the &ndash;scope user flag. This writes to ~/.claude.json instead of .mcp.json:</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-16.png"></p>
<blockquote>
<p><strong>CHANNELS: MCP THAT PUSHES TO CLAUDE</strong></p></blockquote>
<blockquote>
<p>Normal MCP is pull — Claude queries a server when it needs something. Channels flip this: an MCP server <em>pushes</em> messages into your running session. This means Claude can react to CI results, monitoring alerts, or Slack messages while you’re doing something else. Enable with &ndash;channelsflag on startup.</p></blockquote>
<h3 id="pluginspackage--share-everything">Plugins — Package &amp; Share Everything</h3>
<p>Everything you’ve built — skills, hooks, MCP servers, rules — can be packaged into a <strong>plugin</strong> and shared with your team, your org, or the whole world. Plugins are just directories with a .claude-plugin/plugin.json manifest. They&rsquo;re the difference between &ldquo;config that lives in one project&rdquo; and &ldquo;config that lives everywhere.&rdquo;</p>
<h4 id="standalone-config-vsplugins">Standalone config vs plugins</h4>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-17.png"></p>
<h4 id="plugin-structure">Plugin structure</h4>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-18.png"></p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-19.png"></p>
<h4 id="installing-aplugin">Installing a plugin</h4>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-20.png"></p>
<blockquote>
<p><strong>THE REAL VALUE</strong></p></blockquote>
<blockquote>
<p>Your platform team builds a plugin once with all the Spring Boot conventions, Kafka rules, code review skills, and MCP servers your org uses. Every developer installs it once. Every project gets the same setup. No more “did you add the Flyway rules to your CLAUDE.md?” Slack messages.</p></blockquote>
<h3 id="subagentsclaude-spawningclaude">Subagents — Claude Spawning Claude</h3>
<p>This is the part where things get genuinely science-fiction. Subagents let Claude spin up <em>other Claude instances</em> to handle subtasks in parallel or in isolated contexts. The main Claude orchestrates; the subagents execute. Think distributed computing, but the workers are also AI and can also spawn more workers.</p>
<p><img loading="lazy" src="https://sukachvitally.github.io/posts/claude-code-the-complete-guide-nobody-wrote/image-21.png"></p>
<p>Subagents can maintain their own MEMORY.md too. Imagine a &ldquo;database specialist&rdquo; subagent that remembers every schema change it&rsquo;s ever helped with. That&rsquo;s the direction this is heading.</p>
<blockquote>
<p><strong>WHEN TO USE SUBAGENTS</strong></p></blockquote>
<blockquote>
<p>For most day-to-day tasks, you don’t need subagents. They’re most useful when you have truly parallel workstreams (implement feature A and feature B simultaneously without conflicts), when you need a clean context for a specific task, or when you’re building automation pipelines that run without human interaction.</p></blockquote>
<h3 id="complete-quick-reference">Complete Quick Reference</h3>
<ul>
<li><strong>.claude/settings.json</strong> — permissions + hooks + model config. Enforced, not just read.</li>
<li><strong>CLAUDE.md</strong> — persistent instructions. Team version in ./CLAUDE.md, personal in ~/.claude/CLAUDE.md.</li>
<li><strong>MEMORY.md</strong> — auto-written by Claude. Persists learnings across sessions (200 lines / 25KB limit).</li>
<li><strong>.claude/rules/</strong> — conditional instruction files. Use paths: frontmatter to load only for relevant files.</li>
<li><strong>.claude/skills/</strong> — custom /commands. Each skill = a folder with SKILL.md. Accepts $ARGUMENTS.</li>
<li><strong>hooks</strong> — deterministic automation. PreToolUse (block/allow), PostToolUse (format), Notification (alert).</li>
<li><strong>.mcp.json</strong> — team MCP servers (committed). ~/.claude.json for personal servers.</li>
<li><strong>Plugins</strong> — packaged, shareable bundles of skills + hooks + MCP + settings. Install with /plugin install.</li>
<li><strong>Subagents</strong> — parallel Claude instances for complex multi-track workflows. Three isolation levels.</li>
<li><strong>/init</strong> — always run first in a new project. Generates CLAUDE.md automatically.</li>
<li><strong>/compact</strong> — compresses long sessions. <strong>/clear</strong> = fresh start (CLAUDE.md reloads).</li>
<li><strong>/mcp</strong> — shows server status + tool count. <strong>/hooks</strong> — shows configured hooks. <strong>/memory</strong> — edit CLAUDE.md.</li>
</ul>
]]></content:encoded></item></channel></rss>