Created
January 12, 2026 16:19
-
-
Save vivekhaldar/e0830c624164357208d86cb169cb145b to your computer and use it in GitHub Desktop.
Claude Code Primitives: Skills, Commands & Subagents - A Pedagogical Guide
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Claude Code Primitives — Skills, Commands & Subagents</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com"> | |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,400&family=DM+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet"> | |
| <style> | |
| :root { | |
| --bg: #faf9f7; | |
| --bg-subtle: #f5f3f0; | |
| --text: #1a1a1a; | |
| --text-muted: #6b6b6b; | |
| --text-subtle: #999; | |
| /* Primitive colors */ | |
| --command-primary: #b8860b; | |
| --command-bg: #fef9e7; | |
| --command-border: #e6d5a8; | |
| --skill-primary: #0d7377; | |
| --skill-bg: #e8f6f6; | |
| --skill-border: #a8d8d8; | |
| --agent-primary: #6b46c1; | |
| --agent-bg: #f3effc; | |
| --agent-border: #c9b8e8; | |
| --accent: #c44536; | |
| --font-display: 'Fraunces', Georgia, serif; | |
| --font-body: 'DM Sans', -apple-system, sans-serif; | |
| --font-mono: 'DM Mono', 'SF Mono', monospace; | |
| --slide-transition: 0.5s cubic-bezier(0.4, 0, 0.2, 1); | |
| } | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| html, body { | |
| height: 100%; | |
| overflow: hidden; | |
| } | |
| body { | |
| font-family: var(--font-body); | |
| background: var(--bg); | |
| color: var(--text); | |
| line-height: 1.6; | |
| } | |
| /* Grain overlay */ | |
| body::before { | |
| content: ''; | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| opacity: 0.03; | |
| pointer-events: none; | |
| background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); | |
| z-index: 9999; | |
| } | |
| /* Layout with sidebar */ | |
| .layout { | |
| display: flex; | |
| height: 100%; | |
| } | |
| /* Sidebar TOC */ | |
| .sidebar { | |
| width: 280px; | |
| min-width: 280px; | |
| height: 100%; | |
| background: white; | |
| border-right: 1px solid var(--bg-subtle); | |
| padding: 2rem 0; | |
| display: flex; | |
| flex-direction: column; | |
| z-index: 100; | |
| } | |
| .sidebar-header { | |
| padding: 0 1.5rem 1.5rem; | |
| border-bottom: 1px solid var(--bg-subtle); | |
| margin-bottom: 1rem; | |
| } | |
| .sidebar-header h3 { | |
| font-family: var(--font-display); | |
| font-size: 1.1rem; | |
| font-weight: 500; | |
| margin-bottom: 0.25rem; | |
| } | |
| .sidebar-header span { | |
| font-family: var(--font-mono); | |
| font-size: 0.7rem; | |
| color: var(--text-subtle); | |
| text-transform: uppercase; | |
| letter-spacing: 0.1em; | |
| } | |
| .toc { | |
| list-style: none; | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: 0 0.75rem; | |
| } | |
| .toc-item { | |
| position: relative; | |
| margin-bottom: 2px; | |
| } | |
| .toc-item a { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 0.75rem; | |
| padding: 0.6rem 0.75rem; | |
| text-decoration: none; | |
| color: var(--text-muted); | |
| font-size: 0.85rem; | |
| border-radius: 6px; | |
| transition: all 0.2s ease; | |
| line-height: 1.4; | |
| } | |
| .toc-item a:hover { | |
| background: var(--bg-subtle); | |
| color: var(--text); | |
| } | |
| .toc-item.active a { | |
| background: var(--text); | |
| color: white; | |
| } | |
| .toc-item.completed a { | |
| color: var(--text); | |
| } | |
| .toc-number { | |
| font-family: var(--font-mono); | |
| font-size: 0.7rem; | |
| min-width: 1.5rem; | |
| height: 1.5rem; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: var(--bg-subtle); | |
| border-radius: 4px; | |
| flex-shrink: 0; | |
| margin-top: 1px; | |
| } | |
| .toc-item.active .toc-number { | |
| background: rgba(255,255,255,0.2); | |
| color: white; | |
| } | |
| .toc-item.completed .toc-number { | |
| background: var(--text); | |
| color: white; | |
| } | |
| .toc-title { | |
| flex: 1; | |
| } | |
| /* Progress in sidebar */ | |
| .sidebar-progress { | |
| padding: 1rem 1.5rem; | |
| border-top: 1px solid var(--bg-subtle); | |
| margin-top: auto; | |
| } | |
| .sidebar-progress-bar { | |
| height: 4px; | |
| background: var(--bg-subtle); | |
| border-radius: 2px; | |
| overflow: hidden; | |
| } | |
| .sidebar-progress-fill { | |
| height: 100%; | |
| background: var(--text); | |
| transition: width 0.3s ease; | |
| } | |
| .sidebar-progress-text { | |
| font-family: var(--font-mono); | |
| font-size: 0.7rem; | |
| color: var(--text-subtle); | |
| margin-top: 0.5rem; | |
| text-align: center; | |
| } | |
| /* Slide container */ | |
| .slides-container { | |
| position: relative; | |
| flex: 1; | |
| height: 100%; | |
| overflow: hidden; | |
| } | |
| .slide { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| display: flex; | |
| flex-direction: column; | |
| justify-content: center; | |
| padding: 4rem 6rem; | |
| opacity: 0; | |
| visibility: hidden; | |
| transform: translateX(30px); | |
| transition: opacity var(--slide-transition), transform var(--slide-transition), visibility var(--slide-transition); | |
| } | |
| .slide.active { | |
| opacity: 1; | |
| visibility: visible; | |
| transform: translateX(0); | |
| } | |
| .slide.prev { | |
| transform: translateX(-30px); | |
| } | |
| /* Typography */ | |
| h1 { | |
| font-family: var(--font-display); | |
| font-weight: 500; | |
| font-size: 4rem; | |
| line-height: 1.1; | |
| letter-spacing: -0.02em; | |
| margin-bottom: 1.5rem; | |
| } | |
| h2 { | |
| font-family: var(--font-display); | |
| font-weight: 500; | |
| font-size: 2.75rem; | |
| line-height: 1.2; | |
| letter-spacing: -0.01em; | |
| margin-bottom: 2rem; | |
| } | |
| h3 { | |
| font-family: var(--font-display); | |
| font-weight: 500; | |
| font-size: 1.5rem; | |
| margin-bottom: 1rem; | |
| color: var(--text); | |
| } | |
| p { | |
| font-size: 1.25rem; | |
| color: var(--text-muted); | |
| max-width: 42rem; | |
| } | |
| .subtitle { | |
| font-size: 1.5rem; | |
| color: var(--text-muted); | |
| font-weight: 400; | |
| } | |
| .eyebrow { | |
| font-family: var(--font-mono); | |
| font-size: 0.8rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.15em; | |
| color: var(--text-subtle); | |
| margin-bottom: 0.75rem; | |
| } | |
| /* Source citations */ | |
| .slide-sources { | |
| position: absolute; | |
| bottom: 2rem; | |
| left: 6rem; | |
| right: 6rem; | |
| display: flex; | |
| gap: 1.5rem; | |
| flex-wrap: wrap; | |
| } | |
| .slide-sources a { | |
| font-family: var(--font-mono); | |
| font-size: 0.7rem; | |
| color: var(--text-subtle); | |
| text-decoration: none; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.35rem; | |
| transition: color 0.2s ease; | |
| } | |
| .slide-sources a:hover { | |
| color: var(--text); | |
| } | |
| .slide-sources a::before { | |
| content: '↗'; | |
| font-size: 0.8em; | |
| } | |
| code { | |
| font-family: var(--font-mono); | |
| font-size: 0.9em; | |
| background: var(--bg-subtle); | |
| padding: 0.15em 0.4em; | |
| border-radius: 4px; | |
| } | |
| /* Title slide special */ | |
| .slide-title { | |
| text-align: center; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| .slide-title h1 { | |
| font-size: 4.5rem; | |
| font-weight: 400; | |
| margin-bottom: 1rem; | |
| } | |
| .slide-title .version-badge { | |
| display: inline-block; | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| background: var(--text); | |
| color: var(--bg); | |
| padding: 0.4em 1em; | |
| border-radius: 100px; | |
| margin-top: 2rem; | |
| } | |
| /* Primitive cards */ | |
| .primitives-grid { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: 2rem; | |
| margin-top: 2rem; | |
| } | |
| .primitive-card { | |
| padding: 2rem; | |
| border-radius: 12px; | |
| border: 1px solid; | |
| } | |
| .primitive-card.command { | |
| background: var(--command-bg); | |
| border-color: var(--command-border); | |
| } | |
| .primitive-card.command h3 { | |
| color: var(--command-primary); | |
| } | |
| .primitive-card.skill { | |
| background: var(--skill-bg); | |
| border-color: var(--skill-border); | |
| } | |
| .primitive-card.skill h3 { | |
| color: var(--skill-primary); | |
| } | |
| .primitive-card.agent { | |
| background: var(--agent-bg); | |
| border-color: var(--agent-border); | |
| } | |
| .primitive-card.agent h3 { | |
| color: var(--agent-primary); | |
| } | |
| .primitive-card p { | |
| font-size: 1rem; | |
| margin-top: 0.5rem; | |
| } | |
| .primitive-card .location { | |
| font-family: var(--font-mono); | |
| font-size: 0.8rem; | |
| color: var(--text-subtle); | |
| margin-top: 1rem; | |
| padding-top: 1rem; | |
| border-top: 1px solid currentColor; | |
| opacity: 0.3; | |
| } | |
| /* Deep dive slides */ | |
| .deep-dive { | |
| display: grid; | |
| grid-template-columns: 1fr 1.2fr; | |
| gap: 4rem; | |
| align-items: start; | |
| } | |
| .deep-dive-content h2 { | |
| margin-bottom: 1rem; | |
| } | |
| .deep-dive-content p { | |
| margin-bottom: 1.5rem; | |
| } | |
| .feature-list { | |
| list-style: none; | |
| margin-top: 1.5rem; | |
| } | |
| .feature-list li { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 0.75rem; | |
| margin-bottom: 1rem; | |
| font-size: 1.1rem; | |
| } | |
| .feature-list li::before { | |
| content: '→'; | |
| color: var(--text-subtle); | |
| flex-shrink: 0; | |
| } | |
| .code-block { | |
| background: #1e1e1e; | |
| color: #d4d4d4; | |
| padding: 1.5rem; | |
| border-radius: 8px; | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| line-height: 1.7; | |
| overflow-x: auto; | |
| white-space: pre; | |
| } | |
| .code-block .comment { | |
| color: #6a9955; | |
| } | |
| .code-block .key { | |
| color: #9cdcfe; | |
| } | |
| .code-block .string { | |
| color: #ce9178; | |
| } | |
| .code-block .heading { | |
| color: #569cd6; | |
| } | |
| /* Convergence slide */ | |
| .convergence-table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| margin-top: 2rem; | |
| font-size: 0.95rem; | |
| } | |
| .convergence-table th { | |
| text-align: left; | |
| padding: 1rem; | |
| font-weight: 600; | |
| border-bottom: 2px solid var(--text); | |
| } | |
| .convergence-table td { | |
| padding: 1rem; | |
| border-bottom: 1px solid var(--bg-subtle); | |
| vertical-align: top; | |
| } | |
| .convergence-table tr:last-child td { | |
| border-bottom: none; | |
| } | |
| .convergence-table .check { | |
| color: #22c55e; | |
| font-weight: 600; | |
| } | |
| .convergence-table .cross { | |
| color: var(--text-subtle); | |
| } | |
| .convergence-table .new { | |
| background: #fef3c7; | |
| color: #92400e; | |
| font-size: 0.7rem; | |
| padding: 0.2em 0.5em; | |
| border-radius: 4px; | |
| font-weight: 600; | |
| margin-left: 0.5rem; | |
| } | |
| /* Decision tree */ | |
| .decision-tree { | |
| background: var(--bg-subtle); | |
| border-radius: 12px; | |
| padding: 2.5rem; | |
| margin-top: 1.5rem; | |
| } | |
| .tree-node { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| } | |
| .tree-question { | |
| background: white; | |
| border: 2px solid var(--text); | |
| border-radius: 8px; | |
| padding: 1rem 1.5rem; | |
| font-weight: 500; | |
| text-align: center; | |
| max-width: 500px; | |
| } | |
| .tree-branches { | |
| display: flex; | |
| justify-content: center; | |
| gap: 4rem; | |
| margin-top: 1.5rem; | |
| position: relative; | |
| } | |
| .tree-branches::before { | |
| content: ''; | |
| position: absolute; | |
| top: -1.5rem; | |
| left: 50%; | |
| width: 1px; | |
| height: 1.5rem; | |
| background: var(--text-subtle); | |
| } | |
| .tree-branch { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| position: relative; | |
| } | |
| .tree-branch::before { | |
| content: ''; | |
| position: absolute; | |
| top: -1.5rem; | |
| width: 100%; | |
| height: 1px; | |
| background: var(--text-subtle); | |
| } | |
| .tree-branch::after { | |
| content: ''; | |
| position: absolute; | |
| top: -1.5rem; | |
| left: 50%; | |
| width: 1px; | |
| height: 1.5rem; | |
| background: var(--text-subtle); | |
| } | |
| .tree-label { | |
| font-family: var(--font-mono); | |
| font-size: 0.75rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.1em; | |
| color: var(--text-subtle); | |
| margin-bottom: 0.5rem; | |
| } | |
| .tree-result { | |
| padding: 0.75rem 1.25rem; | |
| border-radius: 6px; | |
| font-weight: 600; | |
| font-size: 0.9rem; | |
| } | |
| .tree-result.command { | |
| background: var(--command-bg); | |
| color: var(--command-primary); | |
| border: 1px solid var(--command-border); | |
| } | |
| .tree-result.skill { | |
| background: var(--skill-bg); | |
| color: var(--skill-primary); | |
| border: 1px solid var(--skill-border); | |
| } | |
| .tree-result.agent { | |
| background: var(--agent-bg); | |
| color: var(--agent-primary); | |
| border: 1px solid var(--agent-border); | |
| } | |
| /* Mental model composition */ | |
| .composition-diagram { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 1.5rem; | |
| margin-top: 2rem; | |
| } | |
| .composition-row { | |
| display: grid; | |
| grid-template-columns: 140px 1fr 1fr 1fr; | |
| gap: 1rem; | |
| align-items: center; | |
| } | |
| .composition-label { | |
| font-family: var(--font-mono); | |
| font-size: 0.8rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.1em; | |
| color: var(--text-subtle); | |
| text-align: right; | |
| } | |
| .composition-box { | |
| padding: 1rem 1.25rem; | |
| border-radius: 8px; | |
| font-size: 0.95rem; | |
| } | |
| .composition-box.command { | |
| background: var(--command-bg); | |
| border: 1px solid var(--command-border); | |
| } | |
| .composition-box.skill { | |
| background: var(--skill-bg); | |
| border: 1px solid var(--skill-border); | |
| } | |
| .composition-box.agent { | |
| background: var(--agent-bg); | |
| border: 1px solid var(--agent-border); | |
| } | |
| .composition-box strong { | |
| display: block; | |
| margin-bottom: 0.25rem; | |
| } | |
| .composition-box small { | |
| color: var(--text-muted); | |
| font-size: 0.85rem; | |
| } | |
| .composition-arrow { | |
| display: flex; | |
| justify-content: center; | |
| color: var(--text-subtle); | |
| font-size: 1.5rem; | |
| } | |
| .composition-note { | |
| grid-column: 2 / -1; | |
| font-size: 0.9rem; | |
| color: var(--text-muted); | |
| font-style: italic; | |
| padding: 0.75rem 1rem; | |
| background: white; | |
| border-radius: 6px; | |
| border-left: 3px solid var(--skill-primary); | |
| } | |
| /* Quick reference table */ | |
| .quick-ref { | |
| width: 100%; | |
| margin-top: 1.5rem; | |
| border-collapse: collapse; | |
| font-size: 0.9rem; | |
| } | |
| .quick-ref th { | |
| text-align: left; | |
| padding: 0.75rem 1rem; | |
| font-weight: 600; | |
| background: var(--bg-subtle); | |
| border-bottom: 1px solid var(--text-subtle); | |
| } | |
| .quick-ref td { | |
| padding: 0.75rem 1rem; | |
| border-bottom: 1px solid var(--bg-subtle); | |
| vertical-align: top; | |
| } | |
| .quick-ref tr:hover td { | |
| background: var(--bg-subtle); | |
| } | |
| /* Progress bar */ | |
| .progress { | |
| position: fixed; | |
| bottom: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background: var(--bg-subtle); | |
| z-index: 1000; | |
| } | |
| .progress-bar { | |
| height: 100%; | |
| background: var(--text); | |
| transition: width 0.3s ease; | |
| } | |
| /* Navigation */ | |
| .nav { | |
| position: fixed; | |
| bottom: 2rem; | |
| right: 2rem; | |
| display: flex; | |
| gap: 0.5rem; | |
| z-index: 1000; | |
| } | |
| .nav button { | |
| width: 48px; | |
| height: 48px; | |
| border: 1px solid var(--text-subtle); | |
| background: white; | |
| border-radius: 50%; | |
| cursor: pointer; | |
| font-size: 1.25rem; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| transition: all 0.2s ease; | |
| } | |
| .nav button:hover { | |
| background: var(--text); | |
| color: white; | |
| border-color: var(--text); | |
| } | |
| .nav button:disabled { | |
| opacity: 0.3; | |
| cursor: not-allowed; | |
| } | |
| .nav button:disabled:hover { | |
| background: white; | |
| color: var(--text); | |
| } | |
| /* Slide counter */ | |
| .slide-counter { | |
| position: fixed; | |
| bottom: 2.25rem; | |
| left: 2rem; | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| color: var(--text-subtle); | |
| z-index: 1000; | |
| } | |
| /* Keyboard hint */ | |
| .keyboard-hint { | |
| position: fixed; | |
| bottom: 2rem; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| font-family: var(--font-mono); | |
| font-size: 0.75rem; | |
| color: var(--text-subtle); | |
| opacity: 0.5; | |
| z-index: 1000; | |
| } | |
| .keyboard-hint kbd { | |
| display: inline-block; | |
| padding: 0.2em 0.5em; | |
| background: var(--bg-subtle); | |
| border: 1px solid var(--text-subtle); | |
| border-radius: 4px; | |
| margin: 0 0.2em; | |
| } | |
| /* Two column layout */ | |
| .two-col { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 3rem; | |
| margin-top: 2rem; | |
| } | |
| /* Highlight box */ | |
| .highlight-box { | |
| background: white; | |
| border: 2px solid var(--text); | |
| border-radius: 8px; | |
| padding: 1.5rem; | |
| margin-top: 1.5rem; | |
| } | |
| .highlight-box h4 { | |
| font-family: var(--font-display); | |
| font-size: 1.1rem; | |
| margin-bottom: 0.75rem; | |
| } | |
| .highlight-box p { | |
| font-size: 1rem; | |
| } | |
| /* Version changes */ | |
| .changes-list { | |
| list-style: none; | |
| margin-top: 1.5rem; | |
| } | |
| .changes-list li { | |
| padding: 1rem 1.25rem; | |
| background: white; | |
| border-radius: 8px; | |
| margin-bottom: 0.75rem; | |
| border-left: 4px solid var(--accent); | |
| font-size: 1rem; | |
| } | |
| .changes-list li strong { | |
| display: block; | |
| margin-bottom: 0.25rem; | |
| } | |
| .changes-list li span { | |
| color: var(--text-muted); | |
| font-size: 0.9rem; | |
| } | |
| /* Key insight */ | |
| .key-insight { | |
| background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%); | |
| color: white; | |
| padding: 2rem; | |
| border-radius: 12px; | |
| margin-top: 2rem; | |
| } | |
| .key-insight h3 { | |
| color: white; | |
| font-size: 1rem; | |
| font-family: var(--font-mono); | |
| text-transform: uppercase; | |
| letter-spacing: 0.1em; | |
| opacity: 0.7; | |
| margin-bottom: 1rem; | |
| } | |
| .key-insight p { | |
| color: white; | |
| font-size: 1.35rem; | |
| font-family: var(--font-display); | |
| line-height: 1.5; | |
| max-width: none; | |
| } | |
| /* Mental Model Box - prominent dark panel */ | |
| .mental-model-box { | |
| background: linear-gradient(145deg, #1e1e1e 0%, #2a2a2a 100%); | |
| color: #e5e5e5; | |
| padding: 2.5rem 3rem; | |
| border-radius: 12px; | |
| font-family: var(--font-mono); | |
| font-size: 0.9rem; | |
| line-height: 1.8; | |
| } | |
| .mental-model-box .section { | |
| margin-bottom: 2rem; | |
| } | |
| .mental-model-box .section:last-child { | |
| margin-bottom: 0; | |
| } | |
| .mental-model-box .section-title { | |
| color: white; | |
| font-size: 0.95rem; | |
| font-weight: 600; | |
| margin-bottom: 0.75rem; | |
| letter-spacing: 0.05em; | |
| } | |
| .mental-model-box .section-title.skill-color { | |
| color: #5eead4; | |
| } | |
| .mental-model-box .section-title.agent-color { | |
| color: #c4b5fd; | |
| } | |
| .mental-model-box .section-title.composition-color { | |
| color: #fbbf24; | |
| } | |
| .mental-model-box ul { | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| .mental-model-box li { | |
| position: relative; | |
| padding-left: 1.25rem; | |
| margin-bottom: 0.4rem; | |
| color: #a3a3a3; | |
| } | |
| .mental-model-box li::before { | |
| content: '•'; | |
| position: absolute; | |
| left: 0; | |
| color: #525252; | |
| } | |
| .mental-model-box .composition-item { | |
| margin-bottom: 0.75rem; | |
| } | |
| .mental-model-box .composition-item code { | |
| background: rgba(255,255,255,0.1); | |
| color: #fbbf24; | |
| padding: 0.1em 0.4em; | |
| border-radius: 3px; | |
| font-size: 0.85em; | |
| } | |
| .mental-model-box .composition-arrow { | |
| color: #525252; | |
| margin-left: 0.5rem; | |
| } | |
| .mental-model-box .composition-result { | |
| color: #a3a3a3; | |
| display: block; | |
| padding-left: 1.25rem; | |
| margin-top: 0.25rem; | |
| } | |
| /* Composition Cheatsheet */ | |
| .cheatsheet { | |
| background: linear-gradient(145deg, #1e1e1e 0%, #2a2a2a 100%); | |
| border-radius: 12px; | |
| padding: 2rem; | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| color: #e5e5e5; | |
| } | |
| .cheatsheet-top { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: 2rem; | |
| padding-bottom: 1.5rem; | |
| border-bottom: 1px solid #404040; | |
| margin-bottom: 1.5rem; | |
| } | |
| .cheatsheet-col { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 1rem; | |
| } | |
| .cheatsheet-col-header { | |
| font-weight: 600; | |
| letter-spacing: 0.05em; | |
| } | |
| .cheatsheet-col-header.command-color { color: #fbbf24; } | |
| .cheatsheet-col-header.skill-color { color: #5eead4; } | |
| .cheatsheet-col-header.agent-color { color: #c4b5fd; } | |
| .cheatsheet-col-desc { | |
| color: #a3a3a3; | |
| font-size: 0.8rem; | |
| line-height: 1.5; | |
| } | |
| .cheatsheet-file-box { | |
| background: #2d2d2d; | |
| border: 1px solid #404040; | |
| border-radius: 6px; | |
| padding: 0.75rem 1rem; | |
| font-size: 0.8rem; | |
| line-height: 1.6; | |
| } | |
| .cheatsheet-file-box.command { border-left: 3px solid #fbbf24; } | |
| .cheatsheet-file-box.skill { border-left: 3px solid #5eead4; } | |
| .cheatsheet-file-box.agent { border-left: 3px solid #c4b5fd; } | |
| .cheatsheet-file-box .filename { | |
| color: #737373; | |
| margin-bottom: 0.25rem; | |
| } | |
| .cheatsheet-arrow-section { | |
| display: flex; | |
| justify-content: flex-end; | |
| align-items: center; | |
| gap: 0.5rem; | |
| padding: 0.75rem 0; | |
| color: #737373; | |
| font-size: 0.8rem; | |
| } | |
| .cheatsheet-arrow { | |
| color: #5eead4; | |
| font-size: 1.25rem; | |
| } | |
| .cheatsheet-bottom { | |
| border-top: 1px solid #404040; | |
| padding-top: 1.5rem; | |
| } | |
| .cheatsheet-section-title { | |
| color: #fbbf24; | |
| font-weight: 600; | |
| letter-spacing: 0.05em; | |
| margin-bottom: 1rem; | |
| } | |
| .cheatsheet-modes { | |
| background: #2d2d2d; | |
| border-radius: 6px; | |
| padding: 1.25rem 1.5rem; | |
| line-height: 1.8; | |
| } | |
| .cheatsheet-modes .mode-default { | |
| color: #a3a3a3; | |
| margin-bottom: 1rem; | |
| } | |
| .cheatsheet-modes .mode-fork { | |
| color: #5eead4; | |
| margin-bottom: 0.5rem; | |
| } | |
| .cheatsheet-modes .mode-agents { | |
| padding-left: 1.5rem; | |
| color: #a3a3a3; | |
| } | |
| .cheatsheet-modes .mode-agents .agent-type { | |
| color: #e5e5e5; | |
| } | |
| .cheatsheet-modes .mode-agents .agent-desc { | |
| color: #737373; | |
| margin-left: 0.5rem; | |
| } | |
| .cheatsheet-modes .mode-tools { | |
| margin-top: 1rem; | |
| color: #a3a3a3; | |
| } | |
| .cheatsheet-modes .mode-tools code { | |
| background: rgba(94, 234, 212, 0.15); | |
| color: #5eead4; | |
| padding: 0.1em 0.4em; | |
| border-radius: 3px; | |
| } | |
| .cheatsheet-modes .mode-tools .tools-desc { | |
| color: #737373; | |
| margin-left: 0.5rem; | |
| } | |
| /* Takeaway slide */ | |
| .takeaways { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: 2rem; | |
| margin-top: 2rem; | |
| } | |
| .takeaway { | |
| text-align: center; | |
| padding: 2rem; | |
| } | |
| .takeaway-icon { | |
| font-size: 3rem; | |
| margin-bottom: 1rem; | |
| } | |
| .takeaway h4 { | |
| font-family: var(--font-display); | |
| font-size: 1.25rem; | |
| margin-bottom: 0.75rem; | |
| } | |
| .takeaway p { | |
| font-size: 1rem; | |
| max-width: none; | |
| } | |
| /* Flow diagram */ | |
| .flow-diagram { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 1.5rem; | |
| margin-top: 2rem; | |
| flex-wrap: wrap; | |
| } | |
| .flow-box { | |
| padding: 1rem 1.5rem; | |
| border-radius: 8px; | |
| font-weight: 500; | |
| text-align: center; | |
| } | |
| .flow-arrow { | |
| font-size: 1.5rem; | |
| color: var(--text-subtle); | |
| } | |
| /* Compact tree for skill config */ | |
| .config-tree { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 1rem; | |
| } | |
| .config-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 1rem; | |
| } | |
| .config-question { | |
| background: white; | |
| padding: 0.75rem 1rem; | |
| border-radius: 6px; | |
| font-size: 0.9rem; | |
| min-width: 280px; | |
| } | |
| .config-options { | |
| display: flex; | |
| gap: 0.75rem; | |
| } | |
| .config-option { | |
| padding: 0.5rem 1rem; | |
| border-radius: 4px; | |
| font-family: var(--font-mono); | |
| font-size: 0.8rem; | |
| } | |
| .config-option.yes { | |
| background: #dcfce7; | |
| color: #166534; | |
| } | |
| .config-option.no { | |
| background: #fee2e2; | |
| color: #991b1b; | |
| } | |
| .config-result { | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| color: var(--skill-primary); | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="layout"> | |
| <!-- Sidebar TOC --> | |
| <aside class="sidebar"> | |
| <div class="sidebar-header"> | |
| <h3>Contents</h3> | |
| <span>16 slides</span> | |
| </div> | |
| <ul class="toc"> | |
| <li class="toc-item active" data-toc="1"> | |
| <a href="#" onclick="goToSlide(0); return false;"> | |
| <span class="toc-number">1</span> | |
| <span class="toc-title">Introduction</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="2"> | |
| <a href="#" onclick="goToSlide(1); return false;"> | |
| <span class="toc-number">2</span> | |
| <span class="toc-title">Three Primitives</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="3"> | |
| <a href="#" onclick="goToSlide(2); return false;"> | |
| <span class="toc-number">3</span> | |
| <span class="toc-title">Slash Commands</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="4"> | |
| <a href="#" onclick="goToSlide(3); return false;"> | |
| <span class="toc-number">4</span> | |
| <span class="toc-title">Skills</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="5"> | |
| <a href="#" onclick="goToSlide(4); return false;"> | |
| <span class="toc-number">5</span> | |
| <span class="toc-title">Subagents</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="6"> | |
| <a href="#" onclick="goToSlide(5); return false;"> | |
| <span class="toc-number">6</span> | |
| <span class="toc-title">The Convergence</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="7"> | |
| <a href="#" onclick="goToSlide(6); return false;"> | |
| <span class="toc-number">7</span> | |
| <span class="toc-title">Capabilities Comparison</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="8"> | |
| <a href="#" onclick="goToSlide(7); return false;"> | |
| <span class="toc-number">8</span> | |
| <span class="toc-title">Decision Tree</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="9"> | |
| <a href="#" onclick="goToSlide(8); return false;"> | |
| <span class="toc-number">9</span> | |
| <span class="toc-title">Skill Configuration</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="10"> | |
| <a href="#" onclick="goToSlide(9); return false;"> | |
| <span class="toc-number">10</span> | |
| <span class="toc-title">The Mental Model</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="11"> | |
| <a href="#" onclick="goToSlide(10); return false;"> | |
| <span class="toc-number">11</span> | |
| <span class="toc-title">Composition Cheatsheet</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="12"> | |
| <a href="#" onclick="goToSlide(11); return false;"> | |
| <span class="toc-number">12</span> | |
| <span class="toc-title">Quick Reference</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="13"> | |
| <a href="#" onclick="goToSlide(12); return false;"> | |
| <span class="toc-number">13</span> | |
| <span class="toc-title">Summary</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="14"> | |
| <a href="#" onclick="goToSlide(13); return false;"> | |
| <span class="toc-number">14</span> | |
| <span class="toc-title">A Simpler Model?</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="15"> | |
| <a href="#" onclick="goToSlide(14); return false;"> | |
| <span class="toc-number">15</span> | |
| <span class="toc-title">The Unified Proposal</span> | |
| </a> | |
| </li> | |
| <li class="toc-item" data-toc="16"> | |
| <a href="#" onclick="goToSlide(15); return false;"> | |
| <span class="toc-number">16</span> | |
| <span class="toc-title">What Gets Subsumed</span> | |
| </a> | |
| </li> | |
| </ul> | |
| <div class="sidebar-progress"> | |
| <div class="sidebar-progress-bar"> | |
| <div class="sidebar-progress-fill" style="width: 8.33%"></div> | |
| </div> | |
| <div class="sidebar-progress-text">1 of 12</div> | |
| </div> | |
| </aside> | |
| <!-- Main content --> | |
| <div class="slides-container"> | |
| <!-- Slide 1: Title --> | |
| <div class="slide slide-title active" data-slide="1"> | |
| <p class="eyebrow">A Pedagogical Guide</p> | |
| <h1>Skills, Commands<br>& Subagents</h1> | |
| <p class="subtitle">Understanding Claude Code's Three Primitives</p> | |
| <span class="version-badge">Updated for Claude Code 2.1.0</span> | |
| </div> | |
| <!-- Slide 2: The Three Primitives --> | |
| <div class="slide" data-slide="2"> | |
| <p class="eyebrow">The Foundation</p> | |
| <h2>Three Primitives, Three Purposes</h2> | |
| <p>Claude Code gives you three ways to extend its capabilities. Each serves a distinct role.</p> | |
| <div class="primitives-grid"> | |
| <div class="primitive-card command"> | |
| <h3>Slash Commands</h3> | |
| <p>Simple prompts you invoke explicitly. Think of them as keyboard shortcuts for common requests.</p> | |
| <div class="location">.claude/commands/</div> | |
| </div> | |
| <div class="primitive-card skill"> | |
| <h3>Skills</h3> | |
| <p>Portable knowledge that Claude discovers automatically based on what you're asking.</p> | |
| <div class="location">.claude/skills/</div> | |
| </div> | |
| <div class="primitive-card agent"> | |
| <h3>Subagents</h3> | |
| <p>Specialized workers that Claude delegates to. They have their own context and judgment.</p> | |
| <div class="location">.claude/agents/</div> | |
| </div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/slash-commands" target="_blank">Slash Commands Docs</a> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills Docs</a> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 3: Slash Commands Deep Dive --> | |
| <div class="slide" data-slide="3"> | |
| <div class="deep-dive"> | |
| <div class="deep-dive-content"> | |
| <p class="eyebrow" style="color: var(--command-primary);">Primitive 01</p> | |
| <h2>Slash Commands</h2> | |
| <p>The simplest primitive. A single markdown file that becomes a reusable prompt.</p> | |
| <ul class="feature-list"> | |
| <li><strong>User-invoked</strong> — You type <code>/command-name</code></li> | |
| <li><strong>Single file</strong> — One <code>.md</code> file per command</li> | |
| <li><strong>Explicit</strong> — Claude never discovers these automatically</li> | |
| <li><strong>Fast to create</strong> — Just write and save</li> | |
| </ul> | |
| </div> | |
| <div class="code-block"> | |
| <span class="comment"># ~/.claude/commands/standup.md</span> | |
| Generate my daily standup update based on: | |
| <span class="string">1. Git commits from the last 24 hours</span> | |
| <span class="string">2. Currently open pull requests</span> | |
| <span class="string">3. Work in progress on current branch</span> | |
| Format as bullet points, keep it brief. | |
| </div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/slash-commands" target="_blank">Slash Commands Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 4: Skills Deep Dive --> | |
| <div class="slide" data-slide="4"> | |
| <div class="deep-dive"> | |
| <div class="deep-dive-content"> | |
| <p class="eyebrow" style="color: var(--skill-primary);">Primitive 02</p> | |
| <h2>Skills</h2> | |
| <p>Portable knowledge modules. Claude reads descriptions at startup and activates them when relevant.</p> | |
| <ul class="feature-list"> | |
| <li><strong>Auto-discovered</strong> — Claude matches your request to skill descriptions</li> | |
| <li><strong>Directory structure</strong> — <code>SKILL.md</code> plus supporting files</li> | |
| <li><strong>Tool restrictions</strong> — Can limit which tools Claude uses</li> | |
| <li><strong>Execution isolation</strong> — Can run in forked context</li> | |
| </ul> | |
| </div> | |
| <div class="code-block"> | |
| <span class="comment"># ~/.claude/skills/audio-norm/SKILL.md</span> | |
| <span class="heading">---</span> | |
| <span class="key">name:</span> <span class="string">audio-normalization</span> | |
| <span class="key">description:</span> <span class="string">Normalize audio levels in video files using ffmpeg</span> | |
| <span class="key">allowed-tools:</span> | |
| <span class="string">- Bash</span> | |
| <span class="string">- Read</span> | |
| <span class="heading">---</span> | |
| When normalizing audio, use the EBU R128 standard: | |
| <span class="string">1. Analyze with loudnorm filter</span> | |
| <span class="string">2. Apply two-pass normalization</span> | |
| <span class="string">3. Verify output levels</span> | |
| See <span class="string">ffmpeg-presets.md</span> for command templates. | |
| </div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 5: Subagents Deep Dive --> | |
| <div class="slide" data-slide="5"> | |
| <div class="deep-dive"> | |
| <div class="deep-dive-content"> | |
| <p class="eyebrow" style="color: var(--agent-primary);">Primitive 03</p> | |
| <h2>Subagents</h2> | |
| <p>Specialized workers with their own context window. Claude delegates complex tasks to them.</p> | |
| <ul class="feature-list"> | |
| <li><strong>Own context</strong> — Isolated conversation, returns summary</li> | |
| <li><strong>Personality</strong> — Instructions define behavior and judgment</li> | |
| <li><strong>Can load skills</strong> — Reference knowledge via <code>skills:</code> field</li> | |
| <li><strong>Tool selection</strong> — Restrict available capabilities</li> | |
| </ul> | |
| </div> | |
| <div class="code-block"> | |
| <span class="comment"># ~/.claude/agents/code-reviewer.md</span> | |
| <span class="heading">---</span> | |
| <span class="key">name:</span> <span class="string">code-reviewer</span> | |
| <span class="key">description:</span> <span class="string">Meticulous code review specialist</span> | |
| <span class="key">skills:</span> <span class="string">security-audit, python-style</span> | |
| <span class="key">tools:</span> | |
| <span class="string">- Read</span> | |
| <span class="string">- Grep</span> | |
| <span class="string">- Glob</span> | |
| <span class="heading">---</span> | |
| You are a senior code reviewer. When reviewing: | |
| <span class="string">1. Check for logic errors first</span> | |
| <span class="string">2. Use security-audit skill for vulnerabilities</span> | |
| <span class="string">3. Apply python-style skill for conventions</span> | |
| <span class="string">4. Be constructive but thorough</span> | |
| </div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 6: The Convergence --> | |
| <div class="slide" data-slide="6"> | |
| <p class="eyebrow">Claude Code 2.1.0</p> | |
| <h2>The Great Convergence</h2> | |
| <p>Recent updates have blurred the traditional distinctions between these primitives.</p> | |
| <ul class="changes-list"> | |
| <li> | |
| <strong><code>user-invocable</code> (default: true)</strong> | |
| <span>Skills now appear in the <code>/</code> menu by default. They can be invoked like commands.</span> | |
| </li> | |
| <li> | |
| <strong><code>context: fork</code></strong> | |
| <span>Skills can run in isolated sub-agent contexts, keeping the main conversation clean.</span> | |
| </li> | |
| <li> | |
| <strong><code>agent:</code> field</strong> | |
| <span>Skills can specify which built-in agent type (Explore, Plan, etc.) executes them.</span> | |
| </li> | |
| </ul> | |
| <div class="key-insight"> | |
| <h3>Key Insight</h3> | |
| <p>The distinction is no longer about <em>discovery mechanism</em> (user vs. AI). It's now about <strong>capability complexity</strong> and <strong>execution model</strong>.</p> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#210" target="_blank">Claude Code 2.1.0 Changelog</a> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 7: Capability Comparison --> | |
| <div class="slide" data-slide="7"> | |
| <p class="eyebrow">The New Reality</p> | |
| <h2>Capabilities Comparison</h2> | |
| <table class="convergence-table"> | |
| <thead> | |
| <tr> | |
| <th>Capability</th> | |
| <th>Slash Commands</th> | |
| <th>Skills</th> | |
| <th>Subagents</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td>Manual invocation (<code>/name</code>)</td> | |
| <td><span class="check">✓</span></td> | |
| <td><span class="check">✓</span> <span class="new">2.1.0</span></td> | |
| <td><span class="cross">—</span></td> | |
| </tr> | |
| <tr> | |
| <td>Auto-discovery by Claude</td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="check">✓</span></td> | |
| <td><span class="check">✓</span></td> | |
| </tr> | |
| <tr> | |
| <td>Supporting files</td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="check">✓</span></td> | |
| <td><span class="cross">—</span></td> | |
| </tr> | |
| <tr> | |
| <td>Execution isolation (<code>context: fork</code>)</td> | |
| <td><span class="check">✓</span> <span class="new">2.1.0</span></td> | |
| <td><span class="check">✓</span></td> | |
| <td><span class="check">✓</span> always</td> | |
| </tr> | |
| <tr> | |
| <td>Tool restrictions</td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="check">✓</span></td> | |
| <td><span class="check">✓</span></td> | |
| </tr> | |
| <tr> | |
| <td>Load skills as knowledge</td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="check">✓</span></td> | |
| </tr> | |
| <tr> | |
| <td>Own personality/judgment</td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="cross">—</span></td> | |
| <td><span class="check">✓</span></td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/slash-commands" target="_blank">Slash Commands</a> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills</a> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents</a> | |
| </div> | |
| </div> | |
| <!-- Slide 8: Decision Tree - Main --> | |
| <div class="slide" data-slide="8"> | |
| <p class="eyebrow">Decision Framework</p> | |
| <h2>What Should I Create?</h2> | |
| <div class="decision-tree"> | |
| <div class="tree-node"> | |
| <div class="tree-question">Is this <strong>knowledge/expertise</strong> or a <strong>worker with judgment</strong>?</div> | |
| <div class="tree-branches"> | |
| <div class="tree-branch"> | |
| <div class="tree-label">Knowledge</div> | |
| <div class="tree-question" style="font-size: 0.9rem;">Should Claude auto-discover this?</div> | |
| <div class="tree-branches" style="gap: 2rem;"> | |
| <div class="tree-branch"> | |
| <div class="tree-label">Yes</div> | |
| <div class="tree-result skill">SKILL</div> | |
| </div> | |
| <div class="tree-branch"> | |
| <div class="tree-label">No</div> | |
| <div class="tree-result command">COMMAND</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="tree-branch"> | |
| <div class="tree-label">Worker</div> | |
| <div class="tree-result agent">SUBAGENT</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="highlight-box" style="margin-top: 2rem;"> | |
| <h4>The Heuristic</h4> | |
| <p><strong>Skills</strong> = "How to do X" (instructions, checklists, guides)<br> | |
| <strong>Subagents</strong> = "Someone who does X" (personality, judgment, persistence)</p> | |
| </div> | |
| </div> | |
| <!-- Slide 9: Skill Configuration --> | |
| <div class="slide" data-slide="9"> | |
| <p class="eyebrow">If You Choose Skill</p> | |
| <h2>Skill Configuration Options</h2> | |
| <div class="decision-tree"> | |
| <div class="config-tree"> | |
| <div class="config-row"> | |
| <div class="config-question">Should users invoke this manually?</div> | |
| <div class="config-options"> | |
| <div class="config-option yes">Yes (default)</div> | |
| <div class="config-option no">No</div> | |
| </div> | |
| <div class="config-result">→ <code>user-invocable: false</code></div> | |
| </div> | |
| <div class="config-row"> | |
| <div class="config-question">Need execution isolation?</div> | |
| <div class="config-options"> | |
| <div class="config-option yes">Yes</div> | |
| <div class="config-option no">No (default)</div> | |
| </div> | |
| <div class="config-result">→ <code>context: fork</code></div> | |
| </div> | |
| <div class="config-row"> | |
| <div class="config-question">Which agent type?</div> | |
| <div class="config-options"> | |
| <div class="config-option" style="background: #e0f2fe; color: #0369a1;">Explore</div> | |
| <div class="config-option" style="background: #fef3c7; color: #92400e;">Plan</div> | |
| <div class="config-option" style="background: #f3e8ff; color: #6b21a8;">general-purpose</div> | |
| </div> | |
| <div class="config-result">→ <code>agent: Explore</code></div> | |
| </div> | |
| <div class="config-row"> | |
| <div class="config-question">Restrict tools?</div> | |
| <div class="config-options"> | |
| <div class="config-option yes">Yes</div> | |
| <div class="config-option no">No (default)</div> | |
| </div> | |
| <div class="config-result">→ <code>allowed-tools: [...]</code></div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="two-col" style="margin-top: 2rem;"> | |
| <div> | |
| <h3 style="font-size: 1rem;">Built-in Agent Types</h3> | |
| <ul class="feature-list" style="font-size: 0.9rem;"> | |
| <li><code>Explore</code> — Read-only, fast codebase search</li> | |
| <li><code>Plan</code> — Architecture and planning</li> | |
| <li><code>general-purpose</code> — Full tool access</li> | |
| <li><code>Bash</code> — Command execution only</li> | |
| </ul> | |
| </div> | |
| <div class="code-block" style="font-size: 0.8rem;"> | |
| <span class="heading">---</span> | |
| <span class="key">name:</span> <span class="string">deep-analysis</span> | |
| <span class="key">description:</span> <span class="string">Comprehensive codebase analysis</span> | |
| <span class="key">context:</span> <span class="string">fork</span> | |
| <span class="key">agent:</span> <span class="string">Explore</span> | |
| <span class="key">allowed-tools:</span> | |
| <span class="string">- Read</span> | |
| <span class="string">- Grep</span> | |
| <span class="string">- Glob</span> | |
| <span class="heading">---</span> | |
| </div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills Docs</a> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 10: The Mental Model --> | |
| <div class="slide" data-slide="10"> | |
| <p class="eyebrow">The Big Picture</p> | |
| <h2>The Mental Model</h2> | |
| <div class="mental-model-box"> | |
| <div class="section"> | |
| <div class="section-title skill-color">SKILLS = Portable Knowledge Modules</div> | |
| <ul> | |
| <li>Instructions + domain expertise</li> | |
| <li>Can be auto-discovered by main Claude</li> | |
| <li>Can be LOADED into subagents via <code>skills:</code> field</li> | |
| <li>Can run in forked context with built-in agent TYPE</li> | |
| </ul> | |
| </div> | |
| <div class="section"> | |
| <div class="section-title agent-color">SUBAGENTS = Workers with Own Context</div> | |
| <ul> | |
| <li>Have their own instructions (personality, workflow)</li> | |
| <li>Can load skills as reference knowledge</li> | |
| <li>Spawned by Claude via Task tool</li> | |
| <li>Run independently, return results</li> | |
| </ul> | |
| </div> | |
| <div class="section"> | |
| <div class="section-title composition-color">COMPOSITION:</div> | |
| <div class="composition-item"> | |
| • Skill + <code>context: fork</code> + <code>agent: Explore</code> | |
| <span class="composition-result">→ Skill instructions run in Explore agent</span> | |
| </div> | |
| <div class="composition-item"> | |
| • Subagent + <code>skills: X, Y</code> | |
| <span class="composition-result">→ Subagent has own instructions + skills as reference</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="flow-diagram" style="margin-top: 2rem;"> | |
| <div class="flow-box skill" style="background: var(--skill-bg); border: 1px solid var(--skill-border);">Skills</div> | |
| <div class="flow-arrow">→</div> | |
| <div class="flow-box" style="background: white; border: 1px solid var(--text-subtle);">loaded into</div> | |
| <div class="flow-arrow">→</div> | |
| <div class="flow-box agent" style="background: var(--agent-bg); border: 1px solid var(--agent-border);">Subagents</div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills Docs</a> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 11: Composition Cheatsheet --> | |
| <div class="slide" data-slide="11"> | |
| <p class="eyebrow">Visual Summary</p> | |
| <h2>The Composition Cheatsheet</h2> | |
| <div class="cheatsheet"> | |
| <div class="cheatsheet-top"> | |
| <div class="cheatsheet-col"> | |
| <div class="cheatsheet-col-header command-color">SLASH COMMAND</div> | |
| <div class="cheatsheet-col-desc">Simple prompt<br>User invokes</div> | |
| <div class="cheatsheet-file-box command"> | |
| <div class="filename">/cmd.md</div> | |
| <div>prompt<br>text</div> | |
| </div> | |
| </div> | |
| <div class="cheatsheet-col"> | |
| <div class="cheatsheet-col-header skill-color">SKILL</div> | |
| <div class="cheatsheet-col-desc">Portable knowledge<br>Claude discovers OR<br>subagent loads</div> | |
| <div class="cheatsheet-file-box skill"> | |
| <div class="filename">skill/</div> | |
| <div>SKILL.md<br>+ refs</div> | |
| </div> | |
| </div> | |
| <div class="cheatsheet-col"> | |
| <div class="cheatsheet-col-header agent-color">SUBAGENT</div> | |
| <div class="cheatsheet-col-desc">Worker with judgment<br>Claude delegates</div> | |
| <div class="cheatsheet-file-box agent"> | |
| <div class="filename">agent.md</div> | |
| <div>personality<br>+ workflow<br>+ skills:</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="cheatsheet-arrow-section"> | |
| <span class="cheatsheet-arrow">←</span> | |
| <span>(subagents load skills)</span> | |
| </div> | |
| <div class="cheatsheet-bottom"> | |
| <div class="cheatsheet-section-title">SKILL EXECUTION MODES:</div> | |
| <div class="cheatsheet-modes"> | |
| <div class="mode-default">Default: Runs in main Claude context</div> | |
| <div class="mode-fork">context: fork</div> | |
| <div class="mode-agents"> | |
| <div>└─ <span class="agent-type">agent: Explore</span><span class="agent-desc">(read-only, fast)</span></div> | |
| <div>└─ <span class="agent-type">agent: Plan</span><span class="agent-desc">(read + planning)</span></div> | |
| <div>└─ <span class="agent-type">agent: general-purpose</span><span class="agent-desc">(full tools)</span></div> | |
| <div>└─ <span class="agent-type">agent: Bash</span><span class="agent-desc">(command execution)</span></div> | |
| </div> | |
| <div class="mode-tools">allowed-tools: <code>[Read, Grep]</code><span class="tools-desc">(restrict regardless of agent)</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills Docs</a> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents Docs</a> | |
| </div> | |
| </div> | |
| <!-- Slide 12: Quick Reference --> | |
| <div class="slide" data-slide="12"> | |
| <p class="eyebrow">Cheat Sheet</p> | |
| <h2>Quick Reference</h2> | |
| <table class="quick-ref"> | |
| <thead> | |
| <tr> | |
| <th>I want to...</th> | |
| <th>Create</th> | |
| <th>Configuration</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td>Quick prompt I type <code>/name</code></td> | |
| <td><strong style="color: var(--command-primary);">Slash Command</strong></td> | |
| <td>Single <code>.md</code> file</td> | |
| </tr> | |
| <tr> | |
| <td>Knowledge Claude auto-discovers</td> | |
| <td><strong style="color: var(--skill-primary);">Skill</strong></td> | |
| <td>Good <code>description</code> in frontmatter</td> | |
| </tr> | |
| <tr> | |
| <td>Knowledge only subagents use</td> | |
| <td><strong style="color: var(--skill-primary);">Skill</strong></td> | |
| <td><code>user-invocable: false</code></td> | |
| </tr> | |
| <tr> | |
| <td>Long-running isolated task</td> | |
| <td><strong style="color: var(--skill-primary);">Skill</strong></td> | |
| <td><code>context: fork</code></td> | |
| </tr> | |
| <tr> | |
| <td>Read-only exploration</td> | |
| <td><strong style="color: var(--skill-primary);">Skill</strong></td> | |
| <td><code>context: fork</code> + <code>agent: Explore</code></td> | |
| </tr> | |
| <tr> | |
| <td>Restrict available tools</td> | |
| <td><strong style="color: var(--skill-primary);">Skill</strong></td> | |
| <td><code>allowed-tools: [Read, Grep]</code></td> | |
| </tr> | |
| <tr> | |
| <td>Worker with personality</td> | |
| <td><strong style="color: var(--agent-primary);">Subagent</strong></td> | |
| <td>Own instructions in <code>.md</code></td> | |
| </tr> | |
| <tr> | |
| <td>Worker with domain expertise</td> | |
| <td><strong style="color: var(--agent-primary);">Subagent</strong></td> | |
| <td><code>skills: X, Y</code> in frontmatter</td> | |
| </tr> | |
| <tr> | |
| <td>Reusable expertise across workers</td> | |
| <td><strong style="color: var(--skill-primary);">Skill</strong></td> | |
| <td>Load into multiple subagents</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="slide-sources"> | |
| <a href="https://code.claude.com/docs/en/slash-commands" target="_blank">Slash Commands</a> | |
| <a href="https://code.claude.com/docs/en/skills" target="_blank">Skills</a> | |
| <a href="https://code.claude.com/docs/en/sub-agents" target="_blank">Subagents</a> | |
| </div> | |
| </div> | |
| <!-- Slide 13: Summary --> | |
| <div class="slide" data-slide="13"> | |
| <p class="eyebrow">Summary</p> | |
| <h2>Key Takeaways</h2> | |
| <div class="takeaways"> | |
| <div class="takeaway"> | |
| <div class="takeaway-icon">📝</div> | |
| <h4>Commands are Simple</h4> | |
| <p>Single file, explicit invocation, no auto-discovery. Use for quick prompts.</p> | |
| </div> | |
| <div class="takeaway"> | |
| <div class="takeaway-icon">🧠</div> | |
| <h4>Skills are Knowledge</h4> | |
| <p>Portable expertise that Claude discovers or subagents load. The building blocks.</p> | |
| </div> | |
| <div class="takeaway"> | |
| <div class="takeaway-icon">🤖</div> | |
| <h4>Subagents are Workers</h4> | |
| <p>Independent context, own judgment, can consume skills. Delegation targets.</p> | |
| </div> | |
| </div> | |
| <div class="key-insight"> | |
| <h3>Remember</h3> | |
| <p><strong>Skills are now a functional superset of commands</strong> — but commands remain simpler. <strong>Subagents consume skills</strong> — skills are the knowledge, subagents are the workers who use it.</p> | |
| </div> | |
| <div style="text-align: center; margin-top: 3rem; color: var(--text-muted);"> | |
| <p style="font-size: 1rem;">Official docs: <code>code.claude.com/docs</code></p> | |
| </div> | |
| </div> | |
| <!-- Slide 14: A Simpler Model? --> | |
| <div class="slide" data-slide="14"> | |
| <p class="eyebrow" style="color: var(--accent);">Proposal</p> | |
| <h2>A Simpler Model?</h2> | |
| <p>The current three-primitive system conflates orthogonal concerns. What if we separated them cleanly?</p> | |
| <div class="two-col" style="margin-top: 2rem;"> | |
| <div> | |
| <h3 style="font-size: 1.1rem; margin-bottom: 1rem;">The Current Confusion</h3> | |
| <ul class="feature-list" style="font-size: 0.95rem;"> | |
| <li><strong>Knowledge type</strong> mixed with <strong>invocation method</strong></li> | |
| <li><strong>Execution context</strong> mixed with <strong>personality</strong></li> | |
| <li>Three directories for what's really <em>all markdown</em></li> | |
| <li>Historical artifacts, not principled design</li> | |
| </ul> | |
| </div> | |
| <div> | |
| <h3 style="font-size: 1.1rem; margin-bottom: 1rem;">The Insight</h3> | |
| <ul class="feature-list" style="font-size: 0.95rem;"> | |
| <li>"Disposition" is just procedural knowledge in text</li> | |
| <li><code>agent:</code> field has unclear semantics</li> | |
| <li>Invocation (explicit vs auto) is orthogonal to everything</li> | |
| <li>Execution context (main vs fork) is the <em>one</em> real switch</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <div class="key-insight"> | |
| <h3>The Question</h3> | |
| <p>Can we collapse commands, skills, and subagents into <strong>one unified abstraction</strong> with <strong>one meaningful switch</strong>?</p> | |
| </div> | |
| </div> | |
| <!-- Slide 15: The Unified Proposal --> | |
| <div class="slide" data-slide="15"> | |
| <p class="eyebrow" style="color: var(--accent);">Proposal</p> | |
| <h2>The Unified Model</h2> | |
| <div class="mental-model-box" style="margin-top: 1.5rem;"> | |
| <div class="section"> | |
| <div class="section-title" style="color: #5eead4; font-size: 1.1rem;">ONE PRIMITIVE: Skills</div> | |
| <ul> | |
| <li>A skill is a <strong>knowledge pack</strong> (conceptual + procedural knowledge)</li> | |
| <li>"Disposition" or "personality" = strong procedural instructions</li> | |
| <li>Everything is markdown. Just write what you know.</li> | |
| </ul> | |
| </div> | |
| <div class="section"> | |
| <div class="section-title" style="color: #fbbf24; font-size: 1.1rem;">ONE SWITCH: context: main | fork</div> | |
| <ul> | |
| <li><code>main</code> — Skill augments the current conversation context</li> | |
| <li><code>fork</code> — Skill runs in isolated sub-agent context (results return)</li> | |
| </ul> | |
| </div> | |
| <div class="section"> | |
| <div class="section-title" style="color: #c4b5fd; font-size: 1.1rem;">ONE COMPOSITION: cf: skill1, skill2...</div> | |
| <ul> | |
| <li>Explicit cross-references: "when running this, also keep skill1, skill2 in mind"</li> | |
| <li>Model can <em>also</em> auto-discover and use other skills as needed</li> | |
| </ul> | |
| </div> | |
| <div class="section" style="margin-bottom: 0; padding-top: 1rem; border-top: 1px solid #404040;"> | |
| <div class="section-title" style="color: #737373; font-size: 0.9rem;">INVOCATION: Orthogonal concern</div> | |
| <ul> | |
| <li>Auto-discovered by task matching (default)</li> | |
| <li>Explicit via <code>/skillname</code></li> | |
| <li>Opt-out with <code>user-invocable: false</code></li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Slide 16: What Gets Subsumed --> | |
| <div class="slide" data-slide="16"> | |
| <p class="eyebrow" style="color: var(--accent);">Proposal</p> | |
| <h2>What Gets Subsumed</h2> | |
| <table class="convergence-table" style="margin-top: 1.5rem;"> | |
| <thead> | |
| <tr> | |
| <th>Current Primitive</th> | |
| <th>In Unified Model</th> | |
| <th>Configuration</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td><strong style="color: var(--command-primary);">Slash Command</strong></td> | |
| <td>Skill</td> | |
| <td><code>user-invocable: true</code> (default)</td> | |
| </tr> | |
| <tr> | |
| <td><strong style="color: var(--skill-primary);">Auto-discovered Skill</strong></td> | |
| <td>Skill</td> | |
| <td>Unchanged</td> | |
| </tr> | |
| <tr> | |
| <td><strong style="color: var(--agent-primary);">Subagent</strong></td> | |
| <td>Skill</td> | |
| <td><code>context: fork</code> + strong disposition text</td> | |
| </tr> | |
| <tr> | |
| <td><strong style="color: var(--text-subtle);">Built-in agent types</strong></td> | |
| <td><em>Dropped</em></td> | |
| <td>Unclear semantics → implementation detail</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="two-col" style="margin-top: 2rem;"> | |
| <div class="highlight-box" style="margin-top: 0; border-color: #22c55e;"> | |
| <h4 style="color: #22c55e;">✓ What's Preserved</h4> | |
| <ul class="feature-list" style="font-size: 0.9rem; margin-top: 0.75rem;"> | |
| <li>Tool restrictions via existing frontmatter</li> | |
| <li>Return semantics (same as current subagents)</li> | |
| <li>Composition via explicit <code>cf:</code> references</li> | |
| <li>All invocation patterns (explicit + auto)</li> | |
| </ul> | |
| </div> | |
| <div class="highlight-box" style="margin-top: 0; border-color: var(--accent);"> | |
| <h4 style="color: var(--accent);">✗ What's Simplified Away</h4> | |
| <ul class="feature-list" style="font-size: 0.9rem; margin-top: 0.75rem;"> | |
| <li>Three directories → One (<code>.claude/skills/</code>)</li> | |
| <li><code>agent:</code> field (unclear semantics)</li> | |
| <li>"Worker identity" fiction (it's just text)</li> | |
| <li>Command vs skill mental distinction</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| </div><!-- /slides-container --> | |
| </div><!-- /layout --> | |
| <!-- Keyboard hint --> | |
| <div class="keyboard-hint"> | |
| <kbd>←</kbd> <kbd>→</kbd> or <kbd>Space</kbd> to navigate | |
| </div> | |
| <!-- Navigation --> | |
| <div class="nav"> | |
| <button id="prev" disabled>←</button> | |
| <button id="next">→</button> | |
| </div> | |
| <script> | |
| const slides = document.querySelectorAll('.slide'); | |
| const tocItems = document.querySelectorAll('.toc-item'); | |
| const sidebarProgressFill = document.querySelector('.sidebar-progress-fill'); | |
| const sidebarProgressText = document.querySelector('.sidebar-progress-text'); | |
| const prevBtn = document.getElementById('prev'); | |
| const nextBtn = document.getElementById('next'); | |
| let currentSlide = 0; | |
| const totalSlides = slides.length; | |
| function updateSlide(direction = 'next') { | |
| // Remove active and prev classes from slides | |
| slides.forEach(slide => { | |
| slide.classList.remove('active', 'prev'); | |
| }); | |
| // Add appropriate classes | |
| if (direction === 'prev' && currentSlide < totalSlides - 1) { | |
| slides[currentSlide + 1].classList.add('prev'); | |
| } | |
| slides[currentSlide].classList.add('active'); | |
| // Update progress | |
| const progress = ((currentSlide + 1) / totalSlides) * 100; | |
| // Update sidebar TOC | |
| tocItems.forEach((item, index) => { | |
| item.classList.remove('active', 'completed'); | |
| if (index === currentSlide) { | |
| item.classList.add('active'); | |
| } else if (index < currentSlide) { | |
| item.classList.add('completed'); | |
| } | |
| }); | |
| // Update sidebar progress | |
| sidebarProgressFill.style.width = `${progress}%`; | |
| sidebarProgressText.textContent = `${currentSlide + 1} of ${totalSlides}`; | |
| // Update buttons | |
| prevBtn.disabled = currentSlide === 0; | |
| nextBtn.disabled = currentSlide === totalSlides - 1; | |
| } | |
| function goToSlide(index) { | |
| const direction = index > currentSlide ? 'next' : 'prev'; | |
| currentSlide = index; | |
| updateSlide(direction); | |
| } | |
| function nextSlide() { | |
| if (currentSlide < totalSlides - 1) { | |
| currentSlide++; | |
| updateSlide('next'); | |
| } | |
| } | |
| function prevSlide() { | |
| if (currentSlide > 0) { | |
| currentSlide--; | |
| updateSlide('prev'); | |
| } | |
| } | |
| // Button events | |
| nextBtn.addEventListener('click', nextSlide); | |
| prevBtn.addEventListener('click', prevSlide); | |
| // Keyboard navigation | |
| document.addEventListener('keydown', (e) => { | |
| if (e.key === 'ArrowRight' || e.key === ' ') { | |
| e.preventDefault(); | |
| nextSlide(); | |
| } else if (e.key === 'ArrowLeft') { | |
| e.preventDefault(); | |
| prevSlide(); | |
| } | |
| }); | |
| // Touch support for mobile | |
| let touchStartX = 0; | |
| let touchEndX = 0; | |
| document.addEventListener('touchstart', (e) => { | |
| touchStartX = e.changedTouches[0].screenX; | |
| }); | |
| document.addEventListener('touchend', (e) => { | |
| touchEndX = e.changedTouches[0].screenX; | |
| const diff = touchStartX - touchEndX; | |
| if (Math.abs(diff) > 50) { | |
| if (diff > 0) { | |
| nextSlide(); | |
| } else { | |
| prevSlide(); | |
| } | |
| } | |
| }); | |
| // Initialize | |
| updateSlide(); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment