Files
2026-04-16 11:47:52 +05:00

1781 lines
100 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="../../!/claude-jumping.svg">
<title>Claude Code — From Vibe Coding to Agentic Engineering</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #fff; color: #1a1a1a; line-height: 1.6; }
.slide { display: none; min-height: 100vh; padding: 60px 80px; max-width: 1200px; margin: 0 auto; }
.slide.active { display: block; }
h1 { font-size: 2.5rem; font-weight: 600; margin-bottom: 40px; color: #1a1a1a; border-bottom: 2px solid #e5e5e5; padding-bottom: 20px; }
h2 { font-size: 1.8rem; font-weight: 600; margin-bottom: 24px; color: #2a2a2a; }
h3 { font-size: 1.3rem; font-weight: 600; margin: 24px 0 12px 0; color: #333; }
p { font-size: 1.1rem; margin-bottom: 16px; color: #444; }
code { background: #f0f0f0; padding: 2px 6px; border-radius: 4px; font-family: 'SF Mono', Monaco, 'Courier New', monospace; font-size: 0.95rem; }
.slide.title-slide.active { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; text-align: center; padding: 40px; }
.title-slide h1 { font-size: 3.5rem; font-weight: 700; margin-bottom: 20px; border-bottom: none; padding-bottom: 0; }
.title-slide .subtitle { font-size: 1.4rem; color: #555; margin-bottom: 50px; font-weight: 400; }
.slide.section-slide.active { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; text-align: center; padding: 40px; }
.section-slide h1 { font-size: 3rem; font-weight: 700; border-bottom: none; padding-bottom: 0; margin-bottom: 16px; }
.section-slide .section-number { font-size: 1.1rem; text-transform: uppercase; letter-spacing: 3px; color: #999; margin-bottom: 20px; }
.section-slide .section-desc { font-size: 1.2rem; color: #666; max-width: 600px; }
.trigger-box { background: #f8f9fa; border-left: 4px solid #1a1a1a; padding: 20px 24px; margin: 24px 0; }
.trigger-box h4 { font-size: 0.9rem; text-transform: uppercase; letter-spacing: 1px; color: #666; margin-bottom: 8px; }
.trigger-box p { font-size: 1.05rem; color: #333; margin: 0; }
.how-to-trigger { background: #e8f5e9; border-left: 4px solid #4caf50; padding: 20px 24px; margin: 16px 0 24px 0; }
.how-to-trigger h4 { font-size: 0.9rem; text-transform: uppercase; letter-spacing: 1px; color: #2e7d32; margin-bottom: 8px; }
.how-to-trigger p { font-size: 1.05rem; color: #1b5e20; margin: 0; }
.how-to-trigger code { background: rgba(0,0,0,0.08); padding: 2px 6px; border-radius: 4px; font-family: 'SF Mono', Monaco, 'Courier New', monospace; font-size: 0.95rem; }
.warning-box { background: #fff3e0; border-left: 4px solid #ff9800; padding: 20px 24px; margin: 16px 0 24px 0; }
.warning-box h4 { font-size: 0.9rem; text-transform: uppercase; letter-spacing: 1px; color: #e65100; margin-bottom: 8px; }
.warning-box p { font-size: 1.05rem; color: #bf360c; margin: 0; }
.code-block { background: #1a1a1a; color: #e5e5e5; padding: 20px 24px; border-radius: 8px; font-family: 'SF Mono', Monaco, 'Courier New', monospace; font-size: 0.9rem; overflow-x: auto; margin: 20px 0; white-space: pre; line-height: 1.7; }
.code-block .comment { color: #6a9955; }
.code-block .key { color: #9cdcfe; }
.code-block .string { color: #ce9178; }
.code-block .cmd { color: #dcdcaa; }
.code-block .claude-file { color: #ff5252; }
.use-cases { margin: 24px 0; }
.use-case-item { display: flex; align-items: flex-start; margin-bottom: 12px; padding: 14px 20px; background: #fafafa; border-radius: 8px; }
.use-case-icon { font-size: 1.5rem; margin-right: 16px; min-width: 32px; }
.use-case-text { flex: 1; }
.use-case-text strong { display: block; font-size: 1.05rem; color: #1a1a1a; margin-bottom: 4px; }
.use-case-text span { font-size: 0.95rem; color: #666; }
.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin: 24px 0; }
.col-card { background: #f8f9fa; padding: 24px; border-radius: 8px; }
.col-card h4 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 1px; color: #666; margin-bottom: 12px; }
.col-card.good { border-left: 4px solid #4caf50; }
.col-card.bad { border-left: 4px solid #f44336; }
.info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin: 24px 0; }
.info-card { background: #f8f9fa; padding: 24px; border-radius: 8px; }
.info-card h4 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 1px; color: #666; margin-bottom: 12px; }
.matcher-tag { display: inline-block; padding: 4px 10px; background: #e9ecef; border-radius: 4px; font-family: 'SF Mono', Monaco, 'Courier New', monospace; font-size: 0.85rem; margin: 4px 4px 4px 0; color: #495057; }
.toc-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 32px; }
.toc-item { display: flex; align-items: center; padding: 16px 20px; background: #f8f9fa; border-radius: 8px; cursor: pointer; transition: all 0.2s; }
.toc-item:hover { background: #eee; }
.toc-number { width: 28px; height: 28px; background: #1a1a1a; color: #fff; border-radius: 50%; text-align: center; line-height: 28px; font-size: 0.85rem; margin-right: 12px; font-weight: 600; flex-shrink: 0; }
.toc-name { font-size: 1rem; color: #1a1a1a; }
.step-number { display: inline-block; width: 36px; height: 36px; background: #1a1a1a; color: #fff; border-radius: 50%; text-align: center; line-height: 36px; font-weight: 600; font-size: 1rem; margin-right: 12px; }
.feature-list { list-style: none; margin: 24px 0; }
.feature-list li { padding: 12px 0; border-bottom: 1px solid #eee; font-size: 1.05rem; }
.feature-list li:last-child { border-bottom: none; }
.navigation { position: fixed; bottom: 30px; right: 30px; display: flex; gap: 12px; z-index: 100; }
.nav-btn { width: 50px; height: 50px; border: 2px solid #1a1a1a; background: #fff; border-radius: 50%; cursor: pointer; font-size: 1.2rem; display: flex; align-items: center; justify-content: center; transition: all 0.2s; }
.nav-btn:hover { background: #1a1a1a; color: #fff; }
.nav-btn:disabled { opacity: 0.3; cursor: not-allowed; }
.progress { position: fixed; top: 0; left: 0; height: 4px; background: #1a1a1a; transition: width 0.3s; z-index: 100; }
.slide-counter { position: fixed; bottom: 40px; left: 40px; font-size: 0.9rem; color: #999; }
.keyboard-hint { position: fixed; bottom: 40px; left: 50%; transform: translateX(-50%); font-size: 0.85rem; color: #999; }
.keyboard-hint kbd { background: #f0f0f0; padding: 4px 8px; border-radius: 4px; border: 1px solid #ddd; font-family: inherit; }
.header-logo { position: fixed; top: 20px; right: 40px; width: 100px; height: 65px; z-index: 50; }
.header-logo img { width: 100%; height: 100%; }
.title-logo { width: 200px; height: 130px; margin-bottom: 40px; }
.title-logo img { width: 100%; height: 100%; }
/* Journey Bar — vertical, right side below mascot */
.journey-bar { position: fixed; top: 95px; right: 62px; display: flex; flex-direction: column; align-items: center; z-index: 99; gap: 6px; }
.journey-bar.hidden { display: none; }
.journey-track-wrap { position: relative; display: flex; align-items: stretch; gap: 4px; }
.journey-track { width: 20px; height: 280px; background: #e5e5e5; border-radius: 10px; overflow: hidden; position: relative; flex-shrink: 0; }
.journey-fill { position: absolute; bottom: 0; width: 100%; border-radius: 10px; transition: height 0.4s ease, background-color 0.4s ease; height: 0%; }
.journey-level-label { font-size: 0.65rem; color: #777; font-weight: 400; }
/* Level tick marks beside the journey track */
.journey-ticks { display: flex; flex-direction: column; justify-content: space-between; height: 280px; padding: 2px 0; }
.journey-tick { font-size: 0.45rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px; color: #999; white-space: nowrap; line-height: 1; }
/* Level badge shown on level-transition slides */
.level-badge { display: inline-block; background: #e8f5e9; color: #2e7d32; font-size: 0.75rem; font-weight: 700; padding: 2px 8px; border-radius: 12px; margin-left: 12px; vertical-align: middle; }
/* Celebration slide */
.celebration { font-size: 4rem; margin-bottom: 24px; }
</style>
</head>
<body>
<div class="progress" id="progress"></div>
<div class="journey-bar hidden" id="journeyBar">
<div class="journey-track-wrap">
<div class="journey-track"><div class="journey-fill" id="journeyFill"></div></div>
<div class="journey-ticks">
<span class="journey-tick">Pro</span>
<span class="journey-tick">High</span>
<span class="journey-tick">Med</span>
<span class="journey-tick">Low</span>
</div>
</div>
<span class="journey-level-label" id="journeyLevelLabel">Current = <strong>Low</strong></span>
</div>
<!-- ============================================================ -->
<!-- PART 0: INTRODUCTION (Slides 1-4, no weight) -->
<!-- ============================================================ -->
<!-- Slide 1: Title -->
<div class="slide active title-slide" data-slide="1">
<div class="title-logo">
<img src="../../!/claude-jumping.svg" alt="Claude Code mascot jumping" />
</div>
<h1>Claude Code</h1>
<p class="subtitle">From Vibe Coding to Agentic Engineering</p>
<p style="margin-top: 60px; font-size: 0.95rem; color: #888;">A journey through every best practice — with a real project.</p>
</div>
<!-- Slide 2: The Example Project -->
<div class="slide" data-slide="2">
<h1>The Example Project: TodoApp</h1>
<div class="trigger-box">
<h4>Running Example</h4>
<p>Every technique in this presentation is demonstrated on a <strong>TodoApp monorepo</strong> — showing the transformation from a plain project to one with full Claude Code configuration.</p>
</div>
<div class="two-col">
<div>
<h3 style="text-align: center; color: #c62828; margin-bottom: 16px;">Before (Vibe Coding)</h3>
<div class="code-block"><span class="comment"># Plain TodoApp</span>
todoapp/
<span class="key">backend/</span>
main.py
routes/
todos.py
users.py
models/
todo.py
user.py
tests/
test_todos.py
<span class="key">frontend/</span>
components/
TodoList.tsx
Sidebar.tsx
pages/
index.tsx
todos.tsx
lib/
api.ts</div>
</div>
<div>
<h3 style="text-align: center; color: #2e7d32; margin-bottom: 16px;">After (Agentic Engineering)</h3>
<div class="code-block"><span class="comment"># With Claude Code Best Practices</span>
todoapp/
<span class="claude-file">.claude/</span> <span class="claude-file comment"># Claude Code config</span>
<span class="claude-file">agents/</span> <span class="claude-file comment"># Custom subagents</span>
<span class="claude-file">skills/</span> <span class="claude-file comment"># Domain knowledge</span>
<span class="claude-file">commands/</span> <span class="claude-file comment"># Slash commands</span>
<span class="claude-file">hooks/</span> <span class="claude-file comment"># Lifecycle scripts</span>
<span class="claude-file">rules/</span> <span class="claude-file comment"># Modular instructions</span>
<span class="claude-file">settings.json</span> <span class="claude-file comment"># Team settings</span>
<span class="claude-file">settings.local.json</span> <span class="claude-file comment"># Personal settings</span>
<span class="key">backend/</span>
main.py
routes/
todos.py
users.py
models/
todo.py
user.py
tests/
test_todos.py
<span class="claude-file">CLAUDE.md</span> <span class="claude-file comment"># Backend instructions</span>
<span class="key">frontend/</span>
components/
TodoList.tsx
Sidebar.tsx
pages/
index.tsx
todos.tsx
lib/
api.ts
<span class="claude-file">CLAUDE.md</span> <span class="claude-file comment"># Frontend instructions</span>
<span class="claude-file">.mcp.json</span> <span class="claude-file comment"># Managed MCP servers</span>
<span class="claude-file">CLAUDE.md</span> <span class="claude-file comment"># Project instructions</span></div>
</div>
</div>
</div>
<!-- Slide 3: What is Vibe Coding? -->
<div class="slide" data-slide="3">
<h1>What is Vibe Coding?</h1>
<p>This is where everyone starts. The question is: how fast can you move beyond it?</p>
<div class="two-col">
<div class="col-card bad">
<h4>What Happens (Low Level)</h4>
<p><code>&gt; add a notes feature</code></p>
<p>Claude creates <code>/api/notes</code> with a random schema</p>
<p>Frontend gets a standalone page with no sidebar nav</p>
<p>Tests? None. Patterns? Ignored.</p>
<p style="margin-top: 16px; color: #c62828;">Every new feature is a coin flip. Code entropy increases with every prompt.</p>
</div>
<div class="col-card good">
<h4>What We Want (High Level)</h4>
<p>Claude knows the TodoApp architecture</p>
<p>New routes follow existing patterns in <code>routes/todos.py</code></p>
<p>Frontend uses <code>Sidebar.tsx</code> nav and Tailwind tokens</p>
<p>Tests written automatically matching <code>test_todos.py</code> style</p>
<p style="margin-top: 16px; color: #2e7d32;">Consistent, tested, production-quality code — every time.</p>
</div>
</div>
</div>
<!-- Slide 4: Journey Map -->
<div class="slide" data-slide="4">
<h1>The Journey</h1>
<div class="trigger-box">
<h4>From Low to High</h4>
<p>Each section adds techniques that move you from vibe coding toward fully agentic engineering.</p>
</div>
<div class="toc-list" style="margin-top: 24px;">
<div class="toc-item" onclick="goToSlide(5)"><span class="toc-number">1</span><span class="toc-name">Prerequisites</span></div>
<div class="toc-item" onclick="goToSlide(10)"><span class="toc-number">2</span><span class="toc-name">Better Prompting &mdash; Low</span></div>
<div class="toc-item" onclick="goToSlide(18)"><span class="toc-number">3</span><span class="toc-name">Project Memory &mdash; Medium</span></div>
<div class="toc-item" onclick="goToSlide(25)"><span class="toc-number">4</span><span class="toc-name">Structured Workflows &mdash; Medium</span></div>
<div class="toc-item" onclick="goToSlide(29)"><span class="toc-number">5</span><span class="toc-name">Domain Knowledge &mdash; High</span></div>
<div class="toc-item" onclick="goToSlide(34)"><span class="toc-number">6</span><span class="toc-name">Agentic Engineering &mdash; High</span></div>
</div>
</div>
<!-- ============================================================ -->
<!-- PART 1: PREREQUISITES (Slides 5-9, no weight) -->
<!-- ============================================================ -->
<!-- Slide 5: Installing -->
<div class="slide" data-slide="5">
<h1>Installing Claude Code</h1>
<div class="trigger-box">
<h4>Prerequisite</h4>
<p>Homebrew must be installed on your Mac.</p>
</div>
<div class="how-to-trigger">
<h4>Install via Homebrew</h4>
<p>Run this in your terminal:</p>
<div class="code-block">brew install claude-code</div>
</div>
<h3>Verify Installation</h3>
<div class="code-block">claude --version</div>
<h3>Update Later</h3>
<div class="code-block">brew upgrade claude-code</div>
<p style="margin-top: 24px; color: #666;">Run <code>/doctor</code> anytime to check your installation health.</p>
</div>
<!-- Slide 6: Login — Subscription -->
<div class="slide" data-slide="6">
<h1>Login Option A: Subscription</h1>
<p>Use your Claude Pro or Max subscription via OAuth login:</p>
<div class="code-block"><span class="cmd">claude</span>
<span class="comment"># Select "Claude.ai" at the login prompt</span>
<span class="comment"># Opens browser for OAuth</span></div>
<h3>Subscription Tiers</h3>
<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem; margin-top: 8px;">
<thead>
<tr style="border-bottom: 2px solid #ddd; text-align: left;">
<th style="padding: 8px 12px;">Plan</th>
<th style="padding: 8px 12px;">Price</th>
<th style="padding: 8px 12px;">Weekly Limit</th>
<th style="padding: 8px 12px;">Sonnet 4.5</th>
<th style="padding: 8px 12px;">Opus 4.6</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #eee;">
<td style="padding: 8px 12px;"><strong>Pro</strong></td>
<td style="padding: 8px 12px;">$20/mo</td>
<td style="padding: 8px 12px;">Base limit</td>
<td style="padding: 8px 12px; color: green;">&#10003;</td>
<td style="padding: 8px 12px; color: #c00;">&#10007;</td>
</tr>
<tr style="border-bottom: 1px solid #eee;">
<td style="padding: 8px 12px;"><strong>Max 5x</strong></td>
<td style="padding: 8px 12px;">$100/mo</td>
<td style="padding: 8px 12px;">5&times; Pro limit</td>
<td style="padding: 8px 12px; color: green;">&#10003;</td>
<td style="padding: 8px 12px; color: green;">&#10003;</td>
</tr>
<tr>
<td style="padding: 8px 12px;"><strong>Max 20x</strong></td>
<td style="padding: 8px 12px;">$200/mo</td>
<td style="padding: 8px 12px;">20&times; Pro limit</td>
<td style="padding: 8px 12px; color: green;">&#10003;</td>
<td style="padding: 8px 12px; color: green;">&#10003;</td>
</tr>
</tbody>
</table>
<p style="margin-top: 14px; color: #666; font-size: 0.85rem;">Weekly limits reset every 7 days. Usage is shared across Claude web, desktop, and Claude Code. Opus 4.6 requires a Max plan.</p>
</div>
<!-- Slide 7: Login — API Key -->
<div class="slide" data-slide="7">
<h1>Login Option B: API Key</h1>
<p>Pay per token with an Anthropic API key &mdash; no weekly caps:</p>
<h3>Token Pricing <span style="font-weight: 400; font-size: 0.8rem; color: #888;">(per million tokens)</span></h3>
<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem; margin-top: 8px;">
<thead>
<tr style="border-bottom: 2px solid #ddd; text-align: left;">
<th style="padding: 8px 12px;">Model</th>
<th style="padding: 8px 12px;">Input</th>
<th style="padding: 8px 12px;">Output</th>
<th style="padding: 8px 12px;">Context Window</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #eee;">
<td style="padding: 8px 12px;"><strong>Opus 4.6</strong></td>
<td style="padding: 8px 12px;">$5 / MTok</td>
<td style="padding: 8px 12px;">$25 / MTok</td>
<td style="padding: 8px 12px;">200K (1M beta)</td>
</tr>
<tr style="border-bottom: 1px solid #eee;">
<td style="padding: 8px 12px;"><strong>Sonnet 4.5</strong></td>
<td style="padding: 8px 12px;">$3 / MTok</td>
<td style="padding: 8px 12px;">$15 / MTok</td>
<td style="padding: 8px 12px;">200K (1M beta)</td>
</tr>
<tr>
<td style="padding: 8px 12px;"><strong>Haiku 4.5</strong></td>
<td style="padding: 8px 12px;">$0.80 / MTok</td>
<td style="padding: 8px 12px;">$4 / MTok</td>
<td style="padding: 8px 12px;">200K (1M beta)</td>
</tr>
</tbody>
</table>
<div class="how-to-trigger">
<h4>Setup</h4>
<div class="code-block"><span class="cmd">export</span> ANTHROPIC_API_KEY=sk-ant-...
<span class="cmd">claude</span></div>
</div>
<p><strong>Best for:</strong> Heavy usage, CI/CD pipelines, teams needing predictable billing</p>
</div>
<!-- Slide 8: First Session (this IS vibe coding) -->
<div class="slide" data-slide="8">
<h1>Your First Session</h1>
<div class="how-to-trigger">
<h4>Start Claude Code</h4>
<p>Navigate to your project and run:</p>
<div class="code-block"><span class="cmd">cd</span> ~/todoapp
<span class="cmd">claude</span></div>
</div>
<div class="trigger-box">
<h4>What Happens</h4>
<p>Claude Code scans your project structure, reads CLAUDE.md (if it exists), and opens an interactive REPL where you can type prompts.</p>
</div>
<h3>This IS Vibe Coding</h3>
<p>Right now, with no CLAUDE.md, no skills, no agents — you're at the <strong>Low</strong> level. Claude will guess at everything. That's okay. We'll fix it step by step.</p>
</div>
<!-- Slide 9: The Interface -->
<div class="slide" data-slide="9">
<h1>The Interface</h1>
<div class="code-block"><span class="comment">+-----------------------------------------+</span>
<span class="comment">|</span> <span class="string">Claude Code</span> v2.1.33
<span class="comment">|</span> Model: claude-opus-4-6
<span class="comment">|</span> Project: ~/todoapp
<span class="comment">+-----------------------------------------+</span>
<span class="cmd">&gt;</span> Type your prompt here...</div>
<h3>Quick Reference</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#9000;</span><div class="use-case-text"><strong>Enter</strong><span>Submit your prompt</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#8629;</span><div class="use-case-text"><strong>Shift+Enter or \</strong><span>New line (multiline input)</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9632;</span><div class="use-case-text"><strong>Ctrl+C</strong><span>Cancel current generation</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9654;</span><div class="use-case-text"><strong>Ctrl+D or /exit</strong><span>Exit Claude Code</span></div></div>
</div>
</div>
<!-- ============================================================ -->
<!-- PART 2: BETTER PROMPTING (Slides 10-17, 0% -> 20%) -->
<!-- ============================================================ -->
<!-- Slide 10: Section Divider - Better Prompting -->
<div class="slide section-slide" data-slide="10" data-level="low">
<p class="section-number">Part 2</p>
<h1>Better Prompting</h1>
<p class="section-desc">Level: Low &mdash; effective prompting that produces real, production-quality results.</p>
</div>
<!-- Slide 11: Your First Prompt -->
<div class="slide" data-slide="11">
<h1>Your First Prompt</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<p>Start simple &mdash; ask Claude to understand your project:</p>
<div class="code-block"><span class="cmd">&gt;</span> Read the README.md and give me a summary of this project</div>
</div>
<p>Claude will use the <strong>Read</strong> tool to open the file, then summarize it. You'll see the tool call in the output.</p>
<h3>What Just Happened?</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">1&#65039;&#8419;</span><div class="use-case-text"><strong>Claude read your prompt</strong><span>Understood you want a summary</span></div></div>
<div class="use-case-item"><span class="use-case-icon">2&#65039;&#8419;</span><div class="use-case-text"><strong>Used the Read tool</strong><span>Opened README.md from your project</span></div></div>
<div class="use-case-item"><span class="use-case-icon">3&#65039;&#8419;</span><div class="use-case-text"><strong>Responded with a summary</strong><span>Based on actual file contents, not guessing</span></div></div>
</div>
</div>
<!-- Slide 12: Good vs Bad Prompts -->
<div class="slide" data-slide="12">
<h1>Good vs Bad Prompts</h1>
<p>The difference between vibe coding and professional usage &mdash; shown on our TodoApp:</p>
<div class="two-col">
<div class="col-card bad">
<h4>Vibe Coding</h4>
<div class="code-block"><span class="cmd">&gt;</span> add a notes feature</div>
<p style="margin-top: 12px;">Claude creates a random <code>/api/notes</code> endpoint with a new schema that doesn't match <code>models/todo.py</code>. Frontend page has no sidebar nav.</p>
<p style="color: #c62828;">Vague, no context, no constraints.</p>
</div>
<div class="col-card good">
<h4>Professional</h4>
<div class="code-block"><span class="cmd">&gt;</span> In backend/routes/todos.py, add a
PUT /api/todos/{id}/complete endpoint.
Follow the existing route pattern and
update the Todo model's is_completed field.
Add a test in tests/test_todos.py.</div>
<p style="color: #2e7d32;">Specific file, specific endpoint, specific pattern.</p>
</div>
</div>
</div>
<!-- Slide 13: Providing Context -->
<div class="slide" data-slide="13">
<h1>Providing Context</h1>
<div class="trigger-box">
<h4>Key Rule</h4>
<p>The more context you give, the better Claude performs. Use <code>@</code> to reference files directly in your prompt.</p>
</div>
<div class="how-to-trigger">
<h4>TodoApp Example</h4>
<div class="code-block"><span class="cmd">&gt;</span> Look at @backend/routes/todos.py and @backend/models/todo.py
Add a priority field to the Todo model and update
the create endpoint to accept it.</div>
</div>
<h3>Context Tips</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128196;</span><div class="use-case-text"><strong>@file/path</strong><span>Reference specific files for Claude to read</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128248;</span><div class="use-case-text"><strong>Paste screenshots</strong><span>Ctrl+V to paste images of errors or UI</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128203;</span><div class="use-case-text"><strong>Paste error logs</strong><span>Copy the full error message into your prompt</span></div></div>
</div>
</div>
<!-- Slide 14: Context Window & /compact -->
<div class="slide" data-slide="14">
<h1>Context Window &amp; /compact</h1>
<div class="trigger-box">
<h4>Key Concept</h4>
<p>Claude has a <strong>context window</strong> &mdash; a limit on how much conversation it can remember. Every prompt, file read, and response fills it up.</p>
</div>
<img src="../assets/context-window.jpeg" alt="Context window diagram showing how the 1M token limit is divided" style="width: 100%; max-width: 800px; margin: 24px auto; display: block; border-radius: 8px;" />
<div class="info-grid">
<div class="info-card">
<h4>What Fills Context</h4>
<p>Your prompts and messages</p>
<p>Every file Claude reads</p>
<p>Bash command output</p>
<p>Claude's own responses</p>
</div>
<div class="info-card">
<h4>/compact &mdash; The Fix</h4>
<div class="code-block"><span class="cmd">&gt;</span> /compact</div>
<p>Compresses conversation history into a summary. Claude continues from that summary.</p>
</div>
</div>
<div class="warning-box">
<h4>Best Practice</h4>
<p>Run <code>/compact</code> manually at <strong>~50% context usage</strong>. Don't wait until it auto-compacts &mdash; you lose control over what gets preserved.</p>
</div>
</div>
<!-- Slide 15: /plan mode -->
<div class="slide" data-slide="15">
<h1>/plan &mdash; Plan Before Code</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /plan
<span class="cmd">&gt;</span> Add user authentication to the TodoApp backend</div>
</div>
<div class="two-col">
<div class="col-card bad">
<h4>Without /plan</h4>
<p>Claude writes code immediately</p>
<p>Wrong approach &mdash; redo everything</p>
<p>50% of context gone before real work starts</p>
</div>
<div class="col-card good">
<h4>With /plan</h4>
<p>Claude explores codebase read-only</p>
<p>Proposes approach for your approval</p>
<p>Right approach from the start</p>
</div>
</div>
<div class="trigger-box">
<h4>Rule of Thumb</h4>
<p>Always start with plan mode for any task that touches more than 2-3 files or involves architectural decisions.</p>
</div>
</div>
<!-- Slide 16: Plan Mode in Practice -->
<div class="slide" data-slide="16">
<h1>Plan Mode in Practice</h1>
<div class="how-to-trigger">
<h4>Step by Step</h4>
<div class="code-block"><span class="comment"># Step 1: Enter plan mode</span>
<span class="cmd">&gt;</span> /plan
<span class="comment"># Step 2: Describe what you want</span>
<span class="cmd">&gt;</span> Add pagination to the /api/todos endpoint
<span class="comment"># Step 3: Claude explores and writes a plan</span>
<span class="comment"># (reads routes/todos.py, checks models, proposes approach)</span>
<span class="comment"># Step 4: Review the plan and approve it</span>
<span class="comment"># Claude then executes the approved plan</span></div>
</div>
<div class="trigger-box">
<h4>TodoApp Benefit</h4>
<p>In plan mode, Claude discovers your existing SQLAlchemy pagination pattern before writing a single line &mdash; no reinventing the wheel.</p>
</div>
</div>
<!-- Slide 17: Prompting Best Practices -->
<div class="slide" data-slide="17">
<h1>Prompting Best Practices</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#127919;</span><div class="use-case-text"><strong>Be specific about files</strong><span>"In backend/routes/todos.py" not "in the backend code"</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128270;</span><div class="use-case-text"><strong>Describe the problem, not just the fix</strong><span>"The API returns 500 when..." not "make it work"</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128208;</span><div class="use-case-text"><strong>Reference existing patterns</strong><span>"Follow the pattern in routes/todos.py" gives Claude a template</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#129513;</span><div class="use-case-text"><strong>One task at a time</strong><span>Small, focused requests get better results than mega-prompts</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9989;</span><div class="use-case-text"><strong>Ask Claude to verify</strong><span>"Run pytest after making changes" catches errors early</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128248;</span><div class="use-case-text"><strong>Provide screenshots for UI issues</strong><span>A picture is worth a thousand words of description</span></div></div>
</div>
</div>
<!-- ============================================================ -->
<!-- PART 3: PROJECT MEMORY (Slides 18-24, 20% -> 40%) -->
<!-- ============================================================ -->
<!-- Slide 18: Section Divider - Project Memory -->
<div class="slide section-slide" data-slide="18" data-level="medium">
<p class="section-number">Part 3</p>
<h1>Project Memory</h1>
<p class="section-desc">Level: Medium &mdash; make Claude remember your project, conventions, and preferences.</p>
</div>
<!-- Slide 19: CLAUDE.md & /init -->
<div class="slide" data-slide="19">
<h1>CLAUDE.md &amp; /init</h1>
<div class="trigger-box">
<h4>Key Concept</h4>
<p>CLAUDE.md is a markdown file that Claude reads at the <strong>start of every session</strong>. It's your project's instruction manual for Claude.</p>
</div>
<div class="how-to-trigger">
<h4>Create It</h4>
<div class="code-block"><span class="cmd">&gt;</span> /init</div>
</div>
<h3>TodoApp CLAUDE.md</h3>
<div class="code-block"><span class="comment"># CLAUDE.md</span>
<span class="key">## Project</span>
TodoApp monorepo: FastAPI backend + Next.js frontend.
<span class="key">## Structure</span>
- backend/routes/ &mdash; FastAPI route handlers
- backend/models/ &mdash; SQLAlchemy models
- frontend/components/ &mdash; React components
- frontend/lib/api.ts &mdash; API client
<span class="key">## Commands</span>
- cd backend &amp;&amp; uvicorn main:app --reload
- cd frontend &amp;&amp; npm run dev
- cd backend &amp;&amp; pytest
<span class="key">## Conventions</span>
- Backend: follow route patterns in routes/todos.py
- Frontend: use Tailwind, add nav to Sidebar.tsx
- Always add tests for new endpoints</div>
</div>
<!-- Slide 20: What to Include in CLAUDE.md -->
<div class="slide" data-slide="20">
<h1>What to Include in CLAUDE.md</h1>
<div class="two-col">
<div class="col-card good">
<h4>Include</h4>
<p>Project architecture overview</p>
<p>Build and test commands</p>
<p>Key file locations</p>
<p>Coding conventions</p>
<p>Common patterns to follow</p>
<p>Critical do's and don'ts</p>
</div>
<div class="col-card bad">
<h4>Avoid</h4>
<p>Entire API documentation</p>
<p>Long code examples</p>
<p>Secrets or API keys</p>
<p>Information that changes often</p>
<p>Anything over 150 lines total</p>
</div>
</div>
<div class="warning-box">
<h4>Critical Rule</h4>
<p>Keep CLAUDE.md under <strong>150 lines</strong>. Longer files dilute the instructions &mdash; Claude may ignore parts of it. Use Rules and Skills for detail.</p>
</div>
</div>
<!-- Slide 21: Keep Under 150 Lines -->
<div class="slide" data-slide="21">
<h1>Keep It Under 150 Lines</h1>
<h3>If You Need More Space</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128196;</span><div class="use-case-text"><strong>Use Rules</strong><span>Put topic-specific instructions in <code>.claude/rules/*.md</code> files</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128218;</span><div class="use-case-text"><strong>Use Skills</strong><span>Put domain knowledge in <code>.claude/skills/</code> &mdash; loaded on demand</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128279;</span><div class="use-case-text"><strong>Reference files</strong><span>Point to docs rather than inlining content</span></div></div>
</div>
<div class="trigger-box">
<h4>The Hierarchy</h4>
<p><strong>CLAUDE.md</strong> (always loaded, &lt;150 lines) &rarr; <strong>Rules</strong> (path-scoped, auto-loaded) &rarr; <strong>Skills</strong> (on-demand, any length).</p>
</div>
</div>
<!-- Slide 22: Rules -->
<div class="slide" data-slide="22">
<h1>Rules (.claude/rules/)</h1>
<div class="trigger-box">
<h4>What Are Rules?</h4>
<p>Modular, topic-specific instructions in individual markdown files. Unlike CLAUDE.md, rules can be <strong>scoped to specific paths</strong>.</p>
</div>
<h3>TodoApp Backend Testing Rule</h3>
<div class="code-block"><span class="comment"># .claude/rules/backend-testing.md</span>
---
<span class="key">globs</span>: [<span class="string">"backend/tests/**"</span>]
---
When writing tests for the backend:
- Use pytest with the existing conftest.py fixtures
- Follow the pattern in test_todos.py:
- Use TestClient from FastAPI
- Create test data with factory functions
- Assert status codes AND response body
- Clean up test database after each test
- Name tests: test_{action}_{entity}_{scenario}
- Always test both success and error cases</div>
<p>This rule only activates when Claude is working on test files &mdash; keeping context clean for other tasks.</p>
</div>
<!-- Slide 23: /memory & Hierarchy [MERGED] -->
<div class="slide" data-slide="23">
<h1>/memory &amp; Memory Hierarchy</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /memory</div>
</div>
<p>Opens your CLAUDE.md memory files in an editor. Changes here persist across all sessions.</p>
<h3>Three Scopes (loaded in order)</h3>
<div class="code-block"><span class="comment"># All combined at session start:</span>
~/.claude/CLAUDE.md <span class="comment"># Global &mdash; all projects</span>
.claude/CLAUDE.md <span class="comment"># Project &mdash; shared with team via git</span>
.claude/CLAUDE.local.md <span class="comment"># Local &mdash; personal, git-ignored</span></div>
<div class="trigger-box">
<h4>TodoApp Tip</h4>
<p>Put your TodoApp CLAUDE.md in the repo root so the whole team shares it. Put personal preferences (editor, style) in <code>CLAUDE.local.md</code>.</p>
</div>
</div>
<!-- Slide 24: Memory Best Practices -->
<div class="slide" data-slide="24">
<h1>Memory Best Practices</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128207;</span><div class="use-case-text"><strong>CLAUDE.md under 150 lines</strong><span>Brief, focused, high-signal instructions</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128194;</span><div class="use-case-text"><strong>Use rules for specifics</strong><span>Path-scoped rules in .claude/rules/ for targeted guidance</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128101;</span><div class="use-case-text"><strong>Commit project CLAUDE.md</strong><span>Team shares project conventions via git</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128274;</span><div class="use-case-text"><strong>Use .local.md for personal prefs</strong><span>Git-ignored, won't affect teammates</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128260;</span><div class="use-case-text"><strong>Review and trim regularly</strong><span>Outdated instructions cause confusion</span></div></div>
</div>
</div>
<!-- ============================================================ -->
<!-- PART 4: STRUCTURED WORKFLOWS (Slides 25-28, 40% -> 50%) -->
<!-- ============================================================ -->
<!-- Slide 25: Section Divider - Structured Workflows -->
<div class="slide section-slide" data-slide="25">
<p class="section-number">Part 4</p>
<h1>Structured Workflows</h1>
<p class="section-desc">Level: Medium &mdash; systematic approaches that prevent wasted effort.</p>
</div>
<!-- Slide 26: Task Lists -->
<div class="slide" data-slide="26">
<h1>Task Lists</h1>
<p>For complex tasks, Claude creates a <strong>task list</strong> to track progress:</p>
<div class="code-block"><span class="cmd">&gt;</span> Add user authentication to the TodoApp:
- POST /api/register endpoint
- POST /api/login endpoint
- JWT auth middleware
- Protect /api/todos endpoints
- Tests for all auth endpoints</div>
<p>Claude breaks this into individual tasks and shows progress as it works through each one.</p>
<div class="trigger-box">
<h4>Best Practice</h4>
<p>Break subtasks small enough that each can be completed in under <strong>50% context</strong>. Commit after each subtask.</p>
</div>
</div>
<!-- Slide 27: /model Selection -->
<div class="slide" data-slide="27">
<h1>/model &mdash; Model Selection</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /model</div>
</div>
<p>Opens the model picker. Match the model to the task:</p>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#129504;</span><div class="use-case-text"><strong>Opus 4.6 (Default)</strong><span>Complex tasks &mdash; "Add auth to the TodoApp backend with JWT"</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9889;</span><div class="use-case-text"><strong>Sonnet 4.5</strong><span>Everyday coding &mdash; "Add a completed_at field to the Todo model"</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#127950;</span><div class="use-case-text"><strong>Haiku 4.5</strong><span>Simple tasks &mdash; "Read backend/routes/todos.py and summarize the endpoints"</span></div></div>
</div>
<div class="trigger-box">
<h4>Pro Tip</h4>
<p>Use <code>Option+P</code> (Mac) or <code>Alt+P</code> to quickly switch models. Use <code>/fast</code> for faster Opus output on non-complex tasks.</p>
</div>
</div>
<!-- Slide 28: Workflow Best Practices -->
<div class="slide" data-slide="28">
<h1>Workflow Best Practices</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128506;</span><div class="use-case-text"><strong>Always start with plan mode</strong><span>For any non-trivial task</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#129513;</span><div class="use-case-text"><strong>Break tasks into small pieces</strong><span>Each subtask should complete in under 50% context</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128190;</span><div class="use-case-text"><strong>Commit after each subtask</strong><span>Clean rollback points, not one mega-commit</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128230;</span><div class="use-case-text"><strong>Manual /compact at ~50%</strong><span>Don't wait for auto-compact</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#129302;</span><div class="use-case-text"><strong>Vanilla Claude Code for small tasks</strong><span>Simple tasks don't need elaborate workflows</span></div></div>
</div>
</div>
<!-- ============================================================ -->
<!-- PART 5: DOMAIN KNOWLEDGE (Slides 29-33, 50% -> 65%) -->
<!-- ============================================================ -->
<!-- Slide 29: Section Divider - Domain Knowledge -->
<div class="slide section-slide" data-slide="29" data-level="high">
<p class="section-number">Part 5</p>
<h1>Domain Knowledge</h1>
<p class="section-desc">Level: High &mdash; reusable knowledge that Claude loads on-demand.</p>
</div>
<!-- Slide 30: What Are Skills -->
<div class="slide" data-slide="30">
<h1>What Are Skills?</h1>
<div class="trigger-box">
<h4>Key Concept</h4>
<p>Skills are markdown files that contain <strong>domain knowledge</strong> &mdash; instructions, patterns, or workflows that Claude can load when needed. Think of them as micro-manuals.</p>
</div>
<h3>Why Skills?</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128218;</span><div class="use-case-text"><strong>Progressive Disclosure</strong><span>Knowledge loaded only when relevant &mdash; doesn't bloat every session</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9851;</span><div class="use-case-text"><strong>Reusable</strong><span>Same skill works across agents and workflows</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128101;</span><div class="use-case-text"><strong>Shareable</strong><span>Commit to git &mdash; your whole team benefits</span></div></div>
</div>
<div class="trigger-box">
<h4>Skills vs CLAUDE.md</h4>
<p><strong>CLAUDE.md</strong> = always loaded, every session. <strong>Skills</strong> = loaded on-demand, when relevant. Use skills for knowledge that's only needed sometimes.</p>
</div>
</div>
<!-- Slide 31: Creating Skills - TodoApp -->
<div class="slide" data-slide="31">
<h1>Creating Skills: TodoApp Frontend</h1>
<h3>Frontend Conventions Skill</h3>
<div class="code-block"><span class="comment"># .claude/skills/frontend-conventions/SKILL.md</span>
---
<span class="key">name</span>: <span class="string">frontend-conventions</span>
<span class="key">description</span>: <span class="string">TodoApp frontend patterns and conventions</span>
---
<span class="comment"># Frontend Conventions</span>
When creating or modifying frontend components:
<span class="key">## Sidebar Navigation</span>
- Add new page routes to frontend/components/Sidebar.tsx
- Use the existing NavLink pattern with icon + label
- Keep alphabetical order in the nav list
<span class="key">## Component Patterns</span>
- Use functional components with TypeScript
- Import API functions from lib/api.ts
- Follow TodoList.tsx as the reference component
- Use Tailwind classes: bg-white, rounded-lg, shadow-sm
<span class="key">## API Integration</span>
- All API calls go through lib/api.ts
- Use the existing fetch wrapper with error handling
- Base URL: process.env.NEXT_PUBLIC_API_URL</div>
</div>
<!-- Slide 32: Skill Frontmatter & Invocation -->
<div class="slide" data-slide="32">
<h1>Skill Frontmatter &amp; Invocation</h1>
<h3>Frontmatter Options</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128220;</span><div class="use-case-text"><strong>name</strong><span>Skill identifier (uses directory name if omitted)</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128221;</span><div class="use-case-text"><strong>description</strong><span>When to invoke &mdash; helps Claude auto-discover the skill</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#129302;</span><div class="use-case-text"><strong>model</strong><span>Override which model runs the skill</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128295;</span><div class="use-case-text"><strong>allowed-tools</strong><span>Restrict which tools the skill can use</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128257;</span><div class="use-case-text"><strong>context: fork</strong><span>Run the skill in an isolated subagent context for complex workflows</span></div></div>
</div>
<h3>Invocation &amp; Execution Modes</h3>
<div class="code-block"><span class="comment"># 1. Manual: slash command</span>
<span class="cmd">&gt;</span> /frontend-conventions
<span class="comment"># 2. Auto: Claude discovers via description field</span>
<span class="comment"># (happens when task matches description)</span>
<span class="comment"># 3. Preloaded: in an agent's frontmatter</span>
<span class="key">skills</span>:
- frontend-conventions
<span class="comment"># 4. Optional isolation for heavy workflows</span>
<span class="key">context</span>: <span class="string">fork</span></div>
</div>
<!-- Slide 33: Skills Summary -->
<div class="slide" data-slide="33">
<h1>Skills Summary</h1>
<div class="info-grid">
<div class="info-card">
<h4>What They Are</h4>
<p>Markdown files with domain knowledge</p>
<p>Live in <code>.claude/skills/</code></p>
<p>Have SKILL.md + optional supporting files</p>
</div>
<div class="info-card">
<h4>How to Use</h4>
<p><code>/skill-name</code> &mdash; manual invoke</p>
<p>Auto-discovered by description</p>
<p>Preloaded into agents via <code>skills:</code></p>
</div>
</div>
<div class="code-block"><span class="comment"># Skill directory structure</span>
.claude/
skills/
frontend-conventions/
SKILL.md <span class="comment"># Main skill file (required)</span>
backend-patterns/
SKILL.md
error-handling.md <span class="comment"># Supporting file (optional)</span></div>
</div>
<!-- ============================================================ -->
<!-- PART 6: AGENTIC ENGINEERING (Slides 34-46, 65% -> 75%) -->
<!-- ============================================================ -->
<!-- Slide 34: Section Divider - Agentic Engineering -->
<div class="slide section-slide" data-slide="34" data-level="high">
<p class="section-number">Part 6</p>
<h1>Agentic Engineering</h1>
<p class="section-desc">Level: High &mdash; custom agents that know your codebase and follow your patterns.</p>
</div>
<!-- Slide 35: What Are Agents -->
<div class="slide" data-slide="35">
<h1>What Are Agents?</h1>
<div class="trigger-box">
<h4>Key Concept</h4>
<p>Agents are markdown files in <code>.claude/agents/</code> that define a <strong>custom Claude persona</strong> with its own tools, model, skills, and behavior.</p>
</div>
<h3>Two Ways to Use Agents</h3>
<div class="two-col">
<div class="col-card">
<h4>As Main Agent</h4>
<p>Replaces default Claude for your conversation.</p>
<div class="code-block"><span class="cmd">$</span> claude --agent frontend-engineer</div>
</div>
<div class="col-card">
<h4>As Subagent</h4>
<p>Spawned in an isolated context via Agent tool.</p>
<div class="code-block">Task(
subagent_type=<span class="string">"frontend-engineer"</span>
prompt=<span class="string">"Add a settings page"</span>
)</div>
</div>
</div>
</div>
<!-- Slide 36: Frontend Engineer Agent -->
<div class="slide" data-slide="36">
<h1>Frontend Engineer Agent</h1>
<div class="two-col">
<div class="col-card bad">
<h4>Without Agent</h4>
<p><code>&gt; add a settings page</code></p>
<p>Claude creates <code>pages/settings.tsx</code> with:</p>
<p>&bull; Inline CSS (no Tailwind)</p>
<p>&bull; Direct fetch calls (ignores api.ts)</p>
<p>&bull; No sidebar nav entry</p>
<p style="color: #c62828;">Standalone page that doesn't fit the app.</p>
</div>
<div class="col-card good">
<h4>With Agent</h4>
<p>Frontend agent already knows:</p>
<p>&bull; Use Tailwind tokens from the design system</p>
<p>&bull; Import API functions from <code>lib/api.ts</code></p>
<p>&bull; Add route to <code>Sidebar.tsx</code></p>
<p>&bull; Follow <code>TodoList.tsx</code> component pattern</p>
<p style="color: #2e7d32;">Integrated page matching the app perfectly.</p>
</div>
</div>
<div class="code-block"><span class="comment"># .claude/agents/frontend-engineer.md</span>
---
<span class="key">name</span>: <span class="string">frontend-engineer</span>
<span class="key">description</span>: <span class="string">Frontend development following TodoApp conventions</span>
<span class="key">tools</span>: <span class="string">Read, Write, Edit, Bash, Glob, Grep</span>
<span class="key">model</span>: <span class="string">sonnet</span>
<span class="key">skills</span>:
- frontend-conventions
---
You are a frontend engineer for the TodoApp.
Always add new pages to the Sidebar navigation.
Use the existing API client in lib/api.ts.
Follow TodoList.tsx as your reference component.</div>
</div>
<!-- Slide 37: Backend Engineer Agent -->
<div class="slide" data-slide="37">
<h1>Backend Engineer Agent</h1>
<div class="two-col">
<div class="col-card bad">
<h4>Without Agent</h4>
<p><code>&gt; add a tags feature</code></p>
<p>Claude creates random endpoint structure</p>
<p>Different error handling than existing routes</p>
<p>No tests, no model validation</p>
</div>
<div class="col-card good">
<h4>With Agent</h4>
<p>Backend agent follows existing patterns:</p>
<p>&bull; Route structure from <code>routes/todos.py</code></p>
<p>&bull; SQLAlchemy model like <code>models/todo.py</code></p>
<p>&bull; Tests matching <code>test_todos.py</code> style</p>
<p>&bull; Pydantic schemas for validation</p>
</div>
</div>
<div class="code-block"><span class="comment"># .claude/agents/backend-engineer.md</span>
---
<span class="key">name</span>: <span class="string">backend-engineer</span>
<span class="key">description</span>: <span class="string">Backend development following TodoApp patterns</span>
<span class="key">tools</span>: <span class="string">Read, Write, Edit, Bash, Glob, Grep</span>
<span class="key">model</span>: <span class="string">sonnet</span>
<span class="key">skills</span>:
- backend-patterns
---
You are a backend engineer for the TodoApp.
Follow the route patterns in routes/todos.py.
Create SQLAlchemy models matching models/todo.py.
Always add pytest tests for new endpoints.
Use Pydantic schemas for request/response validation.</div>
</div>
<!-- Slide 38: Agent Frontmatter -->
<div class="slide" data-slide="38">
<h1>Agent Frontmatter</h1>
<div class="code-block"><span class="comment"># .claude/agents/code-reviewer.md</span>
---
<span class="key">name</span>: <span class="string">code-reviewer</span>
<span class="key">description</span>: <span class="string">Reviews code for quality and best practices</span>
<span class="key">tools</span>: <span class="string">Read, Grep, Glob</span>
<span class="key">model</span>: <span class="string">sonnet</span>
<span class="key">color</span>: <span class="string">green</span>
<span class="key">skills</span>:
- code-review
<span class="key">memory</span>: <span class="string">user</span>
---
You are a code reviewer. Check for security issues,
performance problems, and suggest improvements.
Review your memory for patterns you've seen before.</div>
<h3>Key Fields</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128295;</span><div class="use-case-text"><strong>tools</strong><span>What the agent can do (Read, Write, Edit, Bash, etc.)</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128218;</span><div class="use-case-text"><strong>skills</strong><span>Knowledge preloaded at startup</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#129504;</span><div class="use-case-text"><strong>memory</strong><span>Persistent learning across sessions (user/project/local)</span></div></div>
</div>
</div>
<!-- Slide 39: Agent Tools & Skills -->
<div class="slide" data-slide="39">
<h1>Agent Tools &amp; Skills</h1>
<h3>Restricting Tools</h3>
<div class="code-block"><span class="comment"># Read-only agent &mdash; can't modify anything</span>
<span class="key">tools</span>: <span class="string">Read, Grep, Glob</span>
<span class="comment"># Full access agent</span>
<span class="key">tools</span>: <span class="string">Read, Write, Edit, Bash, WebFetch</span>
<span class="comment"># Research-only agent</span>
<span class="key">tools</span>: <span class="string">Read, Grep, Glob, WebSearch, WebFetch</span></div>
<div class="trigger-box">
<h4>Key Pattern</h4>
<p>Skills provide <strong>static knowledge</strong> (what to do). Agents provide <strong>execution context</strong> (how to do it, with which tools). Together, they're powerful.</p>
</div>
<h3>Choosing a Model</h3>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#129504;</span><div class="use-case-text"><strong>opus</strong><span>Complex reasoning, architecture decisions</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9889;</span><div class="use-case-text"><strong>sonnet</strong><span>Good balance of speed and capability</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#127950;</span><div class="use-case-text"><strong>haiku</strong><span>Fast, cheap &mdash; great for simple, focused tasks</span></div></div>
</div>
</div>
<!-- Slide 40: Subagents -->
<div class="slide" data-slide="40">
<h1>Subagents via Task Tool</h1>
<div class="trigger-box">
<h4>Key Concept</h4>
<p>Subagents run in an <strong>isolated context</strong> &mdash; separate from the main conversation. They do their work, return a summary, and their context is discarded.</p>
</div>
<div class="code-block"><span class="comment"># Claude spawns a subagent automatically or you can ask:</span>
<span class="cmd">&gt;</span> Use the frontend-engineer agent to add a settings page
<span class="comment"># Claude uses the Agent tool internally:</span>
Task(
subagent_type=<span class="string">"frontend-engineer"</span>,
prompt=<span class="string">"Add a user settings page to the TodoApp"</span>
)</div>
<h3>Built-in Subagent Types</h3>
<p>
<span class="matcher-tag">Explore</span>
<span class="matcher-tag">Plan</span>
<span class="matcher-tag">Bash</span>
<span class="matcher-tag">Your Custom Agents</span>
</p>
</div>
<!-- Slide 41: Commands & Orchestration -->
<div class="slide" data-slide="41">
<h1>Commands &amp; Orchestration</h1>
<p>Commands are the entry points for complex workflows &mdash; the <strong>Command &rarr; Agent &rarr; Skills</strong> pattern:</p>
<div class="code-block"><span class="comment"># .claude/commands/add-feature.md</span>
---
<span class="key">description</span>: <span class="string">Add a new feature to the TodoApp</span>
<span class="key">model</span>: <span class="string">opus</span>
---
<span class="comment"># Add Feature Command</span>
1. Ask the user what feature to add (AskUserQuestion)
2. Invoke the backend-engineer agent for API work:
- Task(subagent_type="backend-engineer", ...)
3. Invoke the frontend-engineer agent for UI work:
- Task(subagent_type="frontend-engineer", ...)
4. Run tests to verify: pytest + npm test
5. Summarize what was built</div>
<div class="trigger-box">
<h4>Invoke It</h4>
<p>Commands live in <code>.claude/commands/</code>. Users invoke them as slash commands: <code>&gt; /add-feature</code></p>
</div>
</div>
<!-- Slide 42: Hooks + MCP -->
<div class="slide" data-slide="42">
<h1>Hooks &amp; MCP Servers</h1>
<div class="two-col">
<div class="col-card">
<h4>Hooks</h4>
<p>Custom scripts at specific moments in Claude's lifecycle:</p>
<p><strong>PreToolUse</strong> &mdash; validate commands</p>
<p><strong>PostToolUse</strong> &mdash; auto-format code</p>
<p><strong>Stop</strong> &mdash; check task completion</p>
<p><strong>SessionStart</strong> &mdash; load context</p>
<p style="margin-top: 12px; color: #666;">16 hook events, 5 can block execution.</p>
</div>
<div class="col-card">
<h4>MCP Servers</h4>
<p>Connect Claude to external tools via Model Context Protocol:</p>
<p><strong>Playwright</strong> &mdash; browser automation</p>
<p><strong>Chrome DevTools</strong> &mdash; console logs</p>
<p><strong>Databases</strong> &mdash; query data directly</p>
<div class="code-block"><span class="cmd">&gt;</span> /mcp</div>
</div>
</div>
</div>
<!-- Slide 43: Full Architecture -->
<div class="slide" data-slide="43">
<h1>Command &rarr; Agent &rarr; Skills</h1>
<p>The full architecture pattern for complex workflows:</p>
<div class="code-block"><span class="comment">+-----------------------------------------------+</span>
<span class="comment">|</span> <span class="key">/add-feature</span> (Command) <span class="comment">|</span>
<span class="comment">|</span> Entry point &mdash; user invokes this <span class="comment">|</span>
<span class="comment">|</span> | <span class="comment">|</span>
<span class="comment">|</span> +----------+----------+ <span class="comment">|</span>
<span class="comment">|</span> v v <span class="comment">|</span>
<span class="comment">|</span> <span class="key">backend-engineer</span> <span class="key">frontend-engineer</span> <span class="comment">|</span>
<span class="comment">|</span> (Agent) (Agent) <span class="comment">|</span>
<span class="comment">|</span> | | <span class="comment">|</span>
<span class="comment">|</span> <span class="string">backend-patterns</span> <span class="string">frontend-conventions</span> <span class="comment">|</span>
<span class="comment">|</span> (Skill) (Skill) <span class="comment">|</span>
<span class="comment">+-----------------------------------------------+</span></div>
<div class="trigger-box">
<h4>Why It Works</h4>
<p><strong>Commands</strong> = entry point. <strong>Agents</strong> = orchestration. <strong>Skills</strong> = domain knowledge. Clean separation, maximum reusability.</p>
</div>
</div>
<!-- Slide 44: The High Level Slide -->
<div class="slide section-slide" data-slide="44">
<p class="celebration">&#127881;</p>
<h1>High &mdash; Agentic Engineering</h1>
<p class="section-desc">Your TodoApp now has: CLAUDE.md for project context, Rules for path-scoped conventions, Skills for domain knowledge, Agents for consistent execution, Commands for orchestrated workflows, Hooks for lifecycle automation, and MCP servers for external tools.</p>
</div>
<!-- Slide 45: Agent Memory -->
<div class="slide" data-slide="45">
<h1>Agent Memory</h1>
<div class="trigger-box">
<h4>Key Feature</h4>
<p>Agents can <strong>learn across sessions</strong>. Add <code>memory: user</code> to the frontmatter and the agent builds its own persistent knowledge store.</p>
</div>
<div class="code-block"><span class="comment"># Agent remembers patterns it discovers</span>
~/.claude/agent-memory/code-reviewer/
MEMORY.md <span class="comment"># First 200 lines auto-loaded</span>
react-patterns.md <span class="comment"># Topic-specific notes</span>
security-checklist.md <span class="comment"># Learned over time</span></div>
<h3>Memory Scopes</h3>
<p>
<span class="matcher-tag">user &mdash; cross-project</span>
<span class="matcher-tag">project &mdash; team-shared</span>
<span class="matcher-tag">local &mdash; personal</span>
</p>
</div>
<!-- Slide 46: Agents Summary -->
<div class="slide" data-slide="46">
<h1>Agents Summary</h1>
<div class="info-grid">
<div class="info-card">
<h4>Creating Agents</h4>
<p>Drop <code>.md</code> files in <code>.claude/agents/</code></p>
<p>Set name, tools, model, skills, memory</p>
<p>Use <code>/agents</code> to manage interactively</p>
</div>
<div class="info-card">
<h4>Using Agents</h4>
<p><strong>Main agent:</strong> <code>"agent"</code> in settings.json</p>
<p><strong>Subagent:</strong> Agent tool spawns it</p>
<p><strong>CLI:</strong> <code>--agent name</code></p>
</div>
<div class="info-card">
<h4>Best Practices</h4>
<p>Feature-specific agents, not generic ones</p>
<p>Preload skills for domain knowledge</p>
<p>Use haiku model for simple focused tasks</p>
</div>
<div class="info-card">
<h4>Architecture</h4>
<p>Command &rarr; Agent &rarr; Skills</p>
<p>Progressive disclosure of knowledge</p>
<p>Single execution context per agent</p>
</div>
</div>
</div>
<!-- ============================================================ -->
<!-- APPENDIX: REFERENCE (Slides 47+, no weight) -->
<!-- ============================================================ -->
<!-- Slide 47: Section Divider - Appendix -->
<div class="slide section-slide" data-slide="47">
<p class="section-number">Appendix</p>
<h1>Reference</h1>
<p class="section-desc">Command references, workflows, settings, and customization options.</p>
</div>
<!-- Slide 48: How Claude Uses Tools -->
<div class="slide" data-slide="48">
<h1>How Claude Uses Tools</h1>
<p>Claude Code doesn't just generate text &mdash; it <strong>takes actions</strong> using tools:</p>
<div class="info-grid">
<div class="info-card">
<h4>File Tools</h4>
<p><strong>Read</strong> &mdash; Read file contents</p>
<p><strong>Edit</strong> &mdash; Modify existing files</p>
<p><strong>Write</strong> &mdash; Create new files</p>
<p><strong>Glob</strong> &mdash; Find files by pattern</p>
<p><strong>Grep</strong> &mdash; Search file contents</p>
</div>
<div class="info-card">
<h4>Action Tools</h4>
<p><strong>Bash</strong> &mdash; Run shell commands</p>
<p><strong>Task</strong> &mdash; Spawn subagents</p>
<p><strong>WebFetch</strong> &mdash; Fetch URLs</p>
<p><strong>WebSearch</strong> &mdash; Search the web</p>
<p><strong>Skill</strong> &mdash; Invoke skills</p>
</div>
</div>
<div class="warning-box">
<h4>Important</h4>
<p>Claude asks for permission before running potentially dangerous commands. Always review what it's about to do.</p>
</div>
</div>
<!-- Slide 49: File Operations -->
<div class="slide" data-slide="49">
<h1>File Operations</h1>
<h3>Reading Files</h3>
<div class="code-block"><span class="cmd">&gt;</span> Read the package.json file</div>
<h3>Editing Files</h3>
<div class="code-block"><span class="cmd">&gt;</span> In src/utils/format.ts, change the date format from MM/DD to DD/MM</div>
<h3>Creating Files</h3>
<div class="code-block"><span class="cmd">&gt;</span> Create a new test file for the user service at tests/user.test.ts</div>
<div class="trigger-box">
<h4>Pro Tip</h4>
<p>Always tell Claude <strong>which file</strong> to edit. Don't say "fix the bug" &mdash; say "fix the null check in <code>src/handlers/auth.ts</code> line 42".</p>
</div>
</div>
<!-- Slide 50: Bash & Search -->
<div class="slide" data-slide="50">
<h1>Bash Commands &amp; Search</h1>
<h3>Running Commands</h3>
<div class="code-block"><span class="cmd">&gt;</span> Run the test suite: npm test
<span class="cmd">&gt;</span> Check which port the server is using
<span class="cmd">&gt;</span> Install express as a dependency</div>
<h3>Searching the Codebase</h3>
<div class="code-block"><span class="cmd">&gt;</span> Find all files that import the UserService class
<span class="cmd">&gt;</span> Search for any TODO comments in the src directory
<span class="cmd">&gt;</span> Find where the API_KEY environment variable is used</div>
<div class="trigger-box">
<h4>Pro Tip</h4>
<p>Use <code>!</code> prefix for quick bash commands: <code>!git status</code> runs the command and shows output without Claude analyzing it.</p>
</div>
</div>
<!-- Slide 51: /help -->
<div class="slide" data-slide="51">
<h1>/help</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /help</div>
</div>
<p>Shows all available slash commands. This is your starting point when you forget a command.</p>
<div class="info-grid">
<div class="info-card">
<h4>Daily Use</h4>
<p><code>/model</code> &mdash; Switch models</p>
<p><code>/plan</code> &mdash; Plan before coding</p>
<p><code>/compact</code> &mdash; Free up context</p>
<p><code>/cost</code> &mdash; Check spending</p>
</div>
<div class="info-card">
<h4>Project Setup</h4>
<p><code>/init</code> &mdash; Create CLAUDE.md</p>
<p><code>/memory</code> &mdash; Edit memory</p>
<p><code>/config</code> &mdash; Settings</p>
<p><code>/doctor</code> &mdash; Diagnostics</p>
</div>
</div>
</div>
<!-- Slide 52: Effort Level -->
<div class="slide" data-slide="52">
<h1>/model &mdash; Effort Level</h1>
<p>When Opus 4.6 is selected, you can adjust the <strong>effort level</strong>:</p>
<div class="how-to-trigger">
<h4>How to Set</h4>
<p>Run <code>/model</code>, select Opus, then use <code>&larr; &rarr;</code> arrow keys to change effort.</p>
</div>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128293;</span><div class="use-case-text"><strong>High (Default)</strong><span>Full reasoning depth &mdash; complex architecture, tricky bugs, large refactors</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9878;</span><div class="use-case-text"><strong>Medium</strong><span>Balanced &mdash; everyday coding tasks</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128168;</span><div class="use-case-text"><strong>Low</strong><span>Minimal reasoning &mdash; quick, simple tasks where speed matters</span></div></div>
</div>
</div>
<!-- Slide 53: /fast -->
<div class="slide" data-slide="53">
<h1>/fast &mdash; Faster Output</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /fast</div>
</div>
<div class="trigger-box">
<h4>What It Does</h4>
<p>Toggles fast mode &mdash; same Opus 4.6 model with faster token output. It does NOT switch to a different model.</p>
</div>
</div>
<!-- Slide 54: /context & /cost -->
<div class="slide" data-slide="54">
<h1>/context &amp; /cost</h1>
<div class="two-col">
<div class="col-card">
<h4>/context &mdash; Visualize Usage</h4>
<div class="code-block"><span class="cmd">&gt;</span> /context</div>
<p>Shows a colored grid of your context window &mdash; how much is used, what's taking space.</p>
</div>
<div class="col-card">
<h4>/cost &mdash; Track Spending</h4>
<div class="code-block"><span class="cmd">&gt;</span> /cost</div>
<p>Shows token usage and cost for the current session.</p>
</div>
</div>
</div>
<!-- Slide 55: /clear & /rewind -->
<div class="slide" data-slide="55">
<h1>/clear &amp; /rewind</h1>
<div class="two-col">
<div class="col-card">
<h4>/clear &mdash; Fresh Start</h4>
<div class="code-block"><span class="cmd">&gt;</span> /clear</div>
<p>Clears conversation history completely. Use when switching tasks.</p>
</div>
<div class="col-card">
<h4>/rewind &mdash; Go Back</h4>
<div class="code-block"><span class="cmd">&gt;</span> /rewind</div>
<p>Rewinds conversation and/or code to an earlier point.</p>
</div>
</div>
<div class="trigger-box">
<h4>When to Use Which</h4>
<p><strong>/clear</strong> = new topic. <strong>/rewind</strong> = same topic, wrong turn. <strong>/compact</strong> = same topic, low on context.</p>
</div>
</div>
<!-- Slide 56: /resume -->
<div class="slide" data-slide="56">
<h1>/resume &mdash; Resume Sessions</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="comment"># Resume most recent session</span>
<span class="cmd">$</span> claude --resume
<span class="comment"># Or from inside Claude Code:</span>
<span class="cmd">&gt;</span> /resume</div>
</div>
<p>Opens a session picker showing your recent conversations. Select one to continue where you left off.</p>
</div>
<!-- Slide 57: /doctor -->
<div class="slide" data-slide="57">
<h1>/doctor &mdash; Diagnostics</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /doctor</div>
</div>
<p>Checks the health of your Claude Code installation:</p>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#9989;</span><div class="use-case-text"><strong>Authentication</strong><span>Verifies your login is valid</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9989;</span><div class="use-case-text"><strong>Configuration</strong><span>Checks settings.json for errors</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9989;</span><div class="use-case-text"><strong>Permissions</strong><span>Detects unreachable permission rules</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9989;</span><div class="use-case-text"><strong>Updates</strong><span>Checks if a newer version is available</span></div></div>
</div>
</div>
<!-- Slide 58: /config -->
<div class="slide" data-slide="58">
<h1>/config &mdash; Configuration</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /config</div>
</div>
<p>Opens the interactive settings UI. Key things you can configure:</p>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#127912;</span><div class="use-case-text"><strong>Theme</strong><span>Light or dark mode</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128221;</span><div class="use-case-text"><strong>Output Style</strong><span>Explanatory, Learning, or Custom</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128276;</span><div class="use-case-text"><strong>Notifications</strong><span>Enable desktop notifications</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128274;</span><div class="use-case-text"><strong>Permission Mode</strong><span>How Claude asks for approval</span></div></div>
</div>
</div>
<!-- Slide 59: /permissions -->
<div class="slide" data-slide="59">
<h1>/permissions &mdash; Tool Access Control</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /permissions</div>
</div>
<p>Manage what Claude can do without asking. Supports <strong>wildcard syntax</strong>:</p>
<div class="code-block"><span class="comment">// Allow patterns</span>
Bash(npm run *) <span class="comment">// Any npm script</span>
Bash(git *) <span class="comment">// All git commands</span>
Edit(src/**) <span class="comment">// Edit any file in src/</span>
<span class="comment">// Deny patterns</span>
Bash(rm -rf *) <span class="comment">// Block destructive commands</span>
Read(.env) <span class="comment">// Block reading secrets</span></div>
</div>
<!-- Slide 60: /sandbox -->
<div class="slide" data-slide="60">
<h1>/sandbox &mdash; Sandboxing</h1>
<div class="how-to-trigger">
<h4>Try This</h4>
<div class="code-block"><span class="cmd">&gt;</span> /sandbox</div>
</div>
<div class="trigger-box">
<h4>What It Does</h4>
<p>Enables file and network isolation for bash commands. Safer, with fewer permission prompts.</p>
</div>
</div>
<!-- Slide 61: Commands Cheat Sheet -->
<div class="slide" data-slide="61">
<h1>Commands Cheat Sheet</h1>
<div class="info-grid">
<div class="info-card">
<h4>Session</h4>
<p><code>/clear</code> &mdash; Fresh start</p>
<p><code>/compact</code> &mdash; Free context</p>
<p><code>/resume</code> &mdash; Continue session</p>
<p><code>/rewind</code> &mdash; Undo changes</p>
</div>
<div class="info-card">
<h4>Model &amp; Mode</h4>
<p><code>/model</code> &mdash; Switch models</p>
<p><code>/fast</code> &mdash; Toggle speed</p>
<p><code>/plan</code> &mdash; Plan mode</p>
<p><code>/config</code> &mdash; Settings</p>
</div>
<div class="info-card">
<h4>Project</h4>
<p><code>/init</code> &mdash; Create CLAUDE.md</p>
<p><code>/memory</code> &mdash; Edit memory</p>
<p><code>/permissions</code> &mdash; Tool access</p>
<p><code>/sandbox</code> &mdash; Sandboxing</p>
</div>
<div class="info-card">
<h4>Info &amp; Debug</h4>
<p><code>/context</code> &mdash; Context usage</p>
<p><code>/cost</code> &mdash; Token spending</p>
<p><code>/doctor</code> &mdash; Health check</p>
<p><code>/help</code> &mdash; All commands</p>
</div>
</div>
</div>
<!-- Slide 62: Commit Workflow -->
<div class="slide" data-slide="62">
<h1>The Commit Workflow</h1>
<div class="how-to-trigger">
<h4>Ask Claude to Commit</h4>
<div class="code-block"><span class="cmd">&gt;</span> Commit these changes with a descriptive message</div>
</div>
<p>Claude will:</p>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">1&#65039;&#8419;</span><div class="use-case-text"><strong>Run git status &amp; diff</strong><span>Reviews all staged and unstaged changes</span></div></div>
<div class="use-case-item"><span class="use-case-icon">2&#65039;&#8419;</span><div class="use-case-text"><strong>Draft a commit message</strong><span>Focuses on "why" not "what", following your repo's style</span></div></div>
<div class="use-case-item"><span class="use-case-icon">3&#65039;&#8419;</span><div class="use-case-text"><strong>Stage and commit</strong><span>Adds specific files (not git add -A) and creates the commit</span></div></div>
</div>
</div>
<!-- Slide 63: PR Workflow -->
<div class="slide" data-slide="63">
<h1>The PR Workflow</h1>
<div class="how-to-trigger">
<h4>Ask Claude to Create a PR</h4>
<div class="code-block"><span class="cmd">&gt;</span> Create a pull request for these changes</div>
</div>
<p>Claude will:</p>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">1&#65039;&#8419;</span><div class="use-case-text"><strong>Review all commits on the branch</strong><span>Analyzes the full diff from base branch</span></div></div>
<div class="use-case-item"><span class="use-case-icon">2&#65039;&#8419;</span><div class="use-case-text"><strong>Write PR title &amp; description</strong><span>Summary, test plan, and changes overview</span></div></div>
<div class="use-case-item"><span class="use-case-icon">3&#65039;&#8419;</span><div class="use-case-text"><strong>Push and create PR via gh CLI</strong><span>Uses GitHub CLI to create the pull request</span></div></div>
</div>
</div>
<!-- Slide 64: Default Main Agent -->
<div class="slide" data-slide="64">
<h1>Setting a Default Agent</h1>
<div class="how-to-trigger">
<h4>Via settings.json</h4>
<div class="code-block"><span class="comment">// .claude/settings.json</span>
{
<span class="key">"agent"</span>: <span class="string">"frontend-engineer"</span>
}</div>
</div>
<p>Now every time you run <code>claude</code> in this project, you'll talk to the <code>frontend-engineer</code> agent instead of default Claude.</p>
<h3>Per-Session Override</h3>
<div class="code-block"><span class="cmd">$</span> claude --agent backend-engineer</div>
<div class="trigger-box">
<h4>Manage Agents</h4>
<p>Run <code>/agents</code> to view, create, edit, or delete agents interactively.</p>
</div>
</div>
<!-- Slide 65: settings.json -->
<div class="slide" data-slide="65">
<h1>settings.json Overview</h1>
<div class="trigger-box">
<h4>Settings Hierarchy</h4>
<p>Settings cascade from most specific to least specific. Higher priority wins.</p>
</div>
<div class="code-block"><span class="comment"># User-writable override order (highest to lowest):</span>
1. Command line flags <span class="comment"># --model opus</span>
2. .claude/settings.local.json <span class="comment"># Personal, git-ignored</span>
3. .claude/settings.json <span class="comment"># Team-shared, committed</span>
4. ~/.claude/settings.local.json <span class="comment"># Global personal override</span>
5. ~/.claude/settings.json <span class="comment"># Global personal default</span>
<span class="comment"># Policy layer:</span>
managed-settings.json <span class="comment"># Organization policy (enforced)</span></div>
</div>
<!-- Slide 66: Spinner Verbs -->
<div class="slide" data-slide="66">
<h1>Spinner Verbs</h1>
<p>Customize the loading messages that appear while Claude thinks:</p>
<div class="code-block"><span class="comment">// .claude/settings.json</span>
{
<span class="key">"spinnerVerbs"</span>: {
<span class="key">"mode"</span>: <span class="string">"replace"</span>,
<span class="key">"verbs"</span>: [
<span class="string">"Cooking"</span>,
<span class="string">"Brewing"</span>,
<span class="string">"Crafting"</span>,
<span class="string">"Conjuring"</span>,
<span class="string">"Manifesting"</span>
]
}
}</div>
</div>
<!-- Slide 67: Status Line -->
<div class="slide" data-slide="67">
<h1>Status Line</h1>
<p>A custom info bar below the composer showing model, context, cost, git branch, etc.</p>
<div class="how-to-trigger">
<h4>Quick Setup</h4>
<div class="code-block"><span class="cmd">&gt;</span> /statusline</div>
</div>
<div class="code-block"><span class="comment">// .claude/settings.json</span>
{
<span class="key">"statusLine"</span>: {
<span class="key">"type"</span>: <span class="string">"command"</span>,
<span class="key">"command"</span>: <span class="string">"git branch --show-current 2>/dev/null"</span>
}
}</div>
</div>
<!-- Slide 68: Output Styles -->
<div class="slide" data-slide="68">
<h1>Output Styles</h1>
<div class="how-to-trigger">
<h4>Set via /config</h4>
<div class="code-block"><span class="cmd">&gt;</span> /config
<span class="comment"># Navigate to Output Style</span></div>
</div>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128214;</span><div class="use-case-text"><strong>Explanatory</strong><span>Claude explains code patterns and frameworks as it works</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#127891;</span><div class="use-case-text"><strong>Learning</strong><span>Claude coaches you through making changes yourself</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#9999;</span><div class="use-case-text"><strong>Custom</strong><span>Define your own output style</span></div></div>
</div>
</div>
<!-- Slide 69: Keybindings -->
<div class="slide" data-slide="69">
<h1>Keybindings</h1>
<div class="how-to-trigger">
<h4>Customize Keys</h4>
<div class="code-block"><span class="cmd">&gt;</span> /keybindings</div>
</div>
<div class="info-grid">
<div class="info-card">
<h4>Navigation</h4>
<p><code>Option+P</code> &mdash; Switch model</p>
<p><code>Ctrl+L</code> &mdash; Clear screen</p>
<p><code>Esc Esc</code> &mdash; Rewind</p>
</div>
<div class="info-card">
<h4>Editing</h4>
<p><code>Ctrl+G</code> &mdash; Open in editor</p>
<p><code>Ctrl+V</code> &mdash; Paste image</p>
<p><code>Shift+Tab</code> &mdash; Toggle permissions</p>
</div>
</div>
</div>
<!-- Slide 70: Terminal & Vim -->
<div class="slide" data-slide="70">
<h1>Terminal Setup &amp; Vim Mode</h1>
<div class="two-col">
<div class="col-card">
<h4>/terminal-setup</h4>
<div class="code-block"><span class="cmd">&gt;</span> /terminal-setup</div>
<p>Enables <code>Shift+Enter</code> for newlines in IDE terminals.</p>
</div>
<div class="col-card">
<h4>/vim</h4>
<div class="code-block"><span class="cmd">&gt;</span> /vim</div>
<p>Enables vim-style editing mode in the Claude Code prompt.</p>
</div>
</div>
</div>
<!-- Slide 71: Customization Summary -->
<div class="slide" data-slide="71">
<h1>Customization Summary</h1>
<div class="info-grid">
<div class="info-card">
<h4>Quick Wins</h4>
<p><code>spinnerVerbs</code> &mdash; Fun loading messages</p>
<p><code>/statusline</code> &mdash; Info bar</p>
<p><code>/config</code> &rarr; Output Style</p>
<p><code>/keybindings</code> &mdash; Custom keys</p>
</div>
<div class="info-card">
<h4>Power Features</h4>
<p>Hooks &mdash; Custom lifecycle scripts</p>
<p>Plugins &mdash; Installable packages</p>
<p>MCP Servers &mdash; External tools</p>
<p>Sandbox &mdash; Security isolation</p>
</div>
</div>
</div>
<!-- Slide 72: Debugging Tips -->
<div class="slide" data-slide="72">
<h1>Debugging Tips</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#129658;</span><div class="use-case-text"><strong>Run /doctor</strong><span>First thing to try when something isn't working</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128421;</span><div class="use-case-text"><strong>Background tasks for logs</strong><span>Ask Claude to run the server as a background task so you can see logs while working</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#127760;</span><div class="use-case-text"><strong>Browser MCPs for console logs</strong><span>Use Playwright, Chrome DevTools, or Claude in Chrome to let Claude see browser console</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128248;</span><div class="use-case-text"><strong>Screenshots for UI issues</strong><span>Paste screenshots directly &mdash; Ctrl+V. Worth a thousand words.</span></div></div>
</div>
</div>
<!-- Slide 73: Golden Rules -->
<div class="slide" data-slide="73">
<h1>The Golden Rules</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">1&#65039;&#8419;</span><div class="use-case-text"><strong>Always start with plan mode</strong><span>For any non-trivial task. Review the plan before Claude writes code.</span></div></div>
<div class="use-case-item"><span class="use-case-icon">2&#65039;&#8419;</span><div class="use-case-text"><strong>Keep CLAUDE.md under 150 lines</strong><span>Longer instructions get diluted. Use skills and rules for detail.</span></div></div>
<div class="use-case-item"><span class="use-case-icon">3&#65039;&#8419;</span><div class="use-case-text"><strong>Manual /compact at ~50%</strong><span>Don't wait for auto-compact. Stay in control of what's preserved.</span></div></div>
<div class="use-case-item"><span class="use-case-icon">4&#65039;&#8419;</span><div class="use-case-text"><strong>Commit after each subtask</strong><span>Small, frequent commits. Clean rollback points.</span></div></div>
<div class="use-case-item"><span class="use-case-icon">5&#65039;&#8419;</span><div class="use-case-text"><strong>One task at a time</strong><span>Small, focused requests get better results than mega-prompts.</span></div></div>
<div class="use-case-item"><span class="use-case-icon">6&#65039;&#8419;</span><div class="use-case-text"><strong>Be specific about files</strong><span>"Fix the null check in backend/routes/todos.py line 42" not "fix the bug".</span></div></div>
</div>
</div>
<!-- Slide 74: Resources -->
<div class="slide" data-slide="74">
<h1>Resources</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">&#128214;</span><div class="use-case-text"><strong>Claude Code Docs</strong><span>code.claude.com/docs/en</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128161;</span><div class="use-case-text"><strong>Boris Cherny's 12 Tips</strong><span>tips/claude-boris-12-tips-12-feb-26.md</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#127959;</span><div class="use-case-text"><strong>This Repository</strong><span>Working examples of skills, agents, hooks, and the Command &rarr; Agent &rarr; Skills pattern</span></div></div>
<div class="use-case-item"><span class="use-case-icon">&#128295;</span><div class="use-case-text"><strong>Claude Code Hooks</strong><span>github.com/shanraisshan/claude-code-hooks</span></div></div>
</div>
</div>
<!-- Slide 75: Next Steps -->
<div class="slide" data-slide="75">
<h1>Your Next Steps</h1>
<div class="use-cases">
<div class="use-case-item"><span class="use-case-icon">1&#65039;&#8419;</span><div class="use-case-text"><strong>Install &amp; Login</strong><span>Get Claude Code running on your machine today</span></div></div>
<div class="use-case-item"><span class="use-case-icon">2&#65039;&#8419;</span><div class="use-case-text"><strong>Run /init on your project</strong><span>Create a CLAUDE.md &mdash; give Claude context about your codebase</span></div></div>
<div class="use-case-item"><span class="use-case-icon">3&#65039;&#8419;</span><div class="use-case-text"><strong>Use plan mode for your first real task</strong><span>Pick a bug or small feature and work through it with planning</span></div></div>
<div class="use-case-item"><span class="use-case-icon">4&#65039;&#8419;</span><div class="use-case-text"><strong>Create your first skill</strong><span>Document a workflow your team repeats and make it a skill</span></div></div>
<div class="use-case-item"><span class="use-case-icon">5&#65039;&#8419;</span><div class="use-case-text"><strong>Build a feature-specific agent</strong><span>Give Claude domain knowledge about your codebase</span></div></div>
</div>
</div>
<!-- Slide 76: Thank You -->
<div class="slide title-slide" data-slide="76">
<div class="title-logo">
<img src="../../!/claude-jumping.svg" alt="Claude Code mascot jumping" />
</div>
<h1>Thank You!</h1>
<p class="subtitle">Questions?</p>
<p style="margin-top: 40px; font-size: 1rem; color: #666;">github.com/shanraisshan/claude-code-best-practice</p>
</div>
<!-- Header Logo -->
<div class="header-logo">
<img src="../../!/claude-jumping.svg" alt="Claude Code mascot" />
</div>
<div class="navigation">
<button class="nav-btn" id="prevBtn" onclick="prevSlide()">&#8592;</button>
<button class="nav-btn" id="nextBtn" onclick="nextSlide()">&#8594;</button>
</div>
<div class="slide-counter" id="slideCounter">1 / --</div>
<div class="keyboard-hint"><kbd>&#8592;</kbd> <kbd>&#8594;</kbd> or <kbd>Space</kbd> to navigate</div>
<script>
let currentSlide = 1;
const slides = document.querySelectorAll('[data-slide]');
const totalSlides = slides.length;
// Level definitions (order 1=bottom, 4=top)
const LEVELS = {
'low': { order: 1, color: 'hsl(0, 70%, 45%)', height: '25%', label: 'Low' },
'medium': { order: 2, color: 'hsl(40, 70%, 45%)', height: '50%', label: 'Medium' },
'high': { order: 3, color: 'hsl(80, 70%, 45%)', height: '75%', label: 'High' },
'pro': { order: 4, color: 'hsl(120, 70%, 45%)', height: '100%', label: 'Pro' }
};
// Build slide-to-level map: inherit level from previous data-level slide
const SLIDE_LEVELS = {};
let lastLevel = null;
slides.forEach((s) => {
const num = parseInt(s.dataset.slide);
if (s.dataset.level) { lastLevel = s.dataset.level; }
SLIDE_LEVELS[num] = lastLevel;
});
let prevDisplayedLevel = null;
function updateJourneyBar(slideNum) {
const bar = document.getElementById('journeyBar');
const fill = document.getElementById('journeyFill');
const labelEl = document.getElementById('journeyLevelLabel');
if (slideNum <= 1) { bar.classList.add('hidden'); prevDisplayedLevel = null; return; }
bar.classList.remove('hidden');
const levelKey = SLIDE_LEVELS[slideNum];
if (!levelKey || !LEVELS[levelKey]) {
fill.style.height = '0%';
if (labelEl) { labelEl.innerHTML = ''; }
return;
}
const lvl = LEVELS[levelKey];
fill.style.height = lvl.height;
fill.style.backgroundColor = lvl.color;
if (labelEl) { labelEl.innerHTML = 'Current = <strong style="color:' + lvl.color + '">' + lvl.label + '</strong>'; }
// Show level badge when level changes
document.querySelectorAll('.level-badge').forEach(b => b.remove());
const slideEl = document.querySelector(`[data-slide="${slideNum}"]`);
if (slideEl && slideEl.dataset.level && slideEl.dataset.level !== prevDisplayedLevel) {
const h1 = slideEl.querySelector('h1');
if (h1) {
const badge = document.createElement('span');
badge.className = 'level-badge';
badge.textContent = '\u2192 ' + lvl.label;
h1.appendChild(badge);
}
}
prevDisplayedLevel = levelKey;
}
function showSlide(n) {
slides.forEach(s => s.classList.remove('active'));
if (n > totalSlides) currentSlide = totalSlides;
if (n < 1) currentSlide = 1;
document.querySelector(`[data-slide="${currentSlide}"]`).classList.add('active');
document.getElementById('slideCounter').textContent = `${currentSlide} / ${totalSlides}`;
document.getElementById('progress').style.width = `${(currentSlide / totalSlides) * 100}%`;
document.getElementById('prevBtn').disabled = currentSlide === 1;
document.getElementById('nextBtn').disabled = currentSlide === totalSlides;
updateJourneyBar(currentSlide);
}
function nextSlide() { currentSlide++; showSlide(currentSlide); }
function prevSlide() { currentSlide--; showSlide(currentSlide); }
function goToSlide(n) { currentSlide = n; showSlide(currentSlide); }
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowRight' || e.key === ' ') { e.preventDefault(); nextSlide(); }
else if (e.key === 'ArrowLeft') { e.preventDefault(); prevSlide(); }
});
let touchStartX = 0;
document.addEventListener('touchstart', (e) => { touchStartX = e.touches[0].clientX; });
document.addEventListener('touchend', (e) => {
const diff = touchStartX - e.changedTouches[0].clientX;
if (Math.abs(diff) > 50) { if (diff > 0) nextSlide(); else prevSlide(); }
});
showSlide(currentSlide);
</script>
</body>
</html>