1. 들어가며: 에이전트에게 '절차적 지식'이 필요한 이유

대형 언어 모델(LLM)의 발전으로 우리는 단순히 질문에 답하는 챗봇을 넘어, 직접 컴퓨터 환경과 상호작용하는 '일반 목적형 에이전트(General-Purpose Agent)'의 시대를 맞이했다. 대표적으로 Claude Code는 로컬 파일 시스템에 접근하고, 터미널 명령을 실행하며, 독자적으로 코드를 디버깅하고 커밋하는 강력한 에이전틱 루프를 수행한다.
그러나 범용 에이전트가 강력하다고 해서 우리 조직의 특수한 업무 프로세스, 복잡한 코드 컨벤션, 혹은 꼼꼼한 배포 단계까지 처음부터 완벽히 이해하는 것은 아니다. 지금까지는 이러한 '절차적 지식'과 '컨텍스트'를 주입하기 위해 매번 대화방에 긴 지침을 복사해서 붙여넣거나, CLAUDE.md 파일에 방대한 규칙을 기록하곤 했다.
하지만 이 방식은 치명적인 한계를 지닌다. 대화가 길어질수록 콘텍스트 윈도우(Context Window)가 무섭게 차오르고, 이로 인해 대화 비용이 상승할 뿐 아니라 모델의 성능과 주의력마저 급격히 저하된다.
이러한 모순을 해결하기 위해 앤트로픽(Anthropic)이 제시한 솔루션이 바로 Agent Skills다. 이는 지침, 스크립트, 리소스를 하나의 디렉토리에 패키징하여, 에이전트가 필요할 때만 동적으로 발견하고 로드할 수 있게 만드는 오픈 표준 스펙이다
2. 핵심 아키텍처: 점진적 공개(Progressive Disclosure)
Agent Skills를 관통하는 핵심 디자인 철학은 '점진적 공개(Progressive Disclosure)'다. 마치 두꺼운 백과사전을 통째로 외우는 대신, 필요할 때 책장으로 가서 목차를 보고 관련 챕터만 펼쳐보는 지혜와 같다.

이 아키텍처는 컨텍스트 토큰을 절약하기 위해 정보를 총 3단계로 나누어 관리하고 노출한다.
[1단계: 메타데이터 노출] ──> [2단계: 핵심 SKILL.md 로드] ──> [3단계: 상세 지원 파일 탐색]
(설명 및 자동 트리거 조건) (핵심 지침 및 실행 스크립트) (상세 스펙, 예제 템플릿)
- 1단계: 메타데이터 노출 (Metadata Disclosure)
- 에이전트가 기동할 때, 등록된 모든 Skill의 이름(Name)과 설명(Description)만을 시스템 프롬프트에 미리 로드한다.
- 이때 소모되는 토큰은 극히 미미하다. 에이전트는 전체 내용을 모르지만, "아, 나에게 어떤 능력이 있구나"라는 지도의 아웃라인만 쥐고 있는 상태가 된다.
- 2단계: 핵심 SKILL.md 로드 (Core Loading)
- 대화 중 사용자의 요청이나 코드 맥락이 특정 Skill과 연관된다고 판단되면, Claude는 Bash 도구를 사용해 해당 Skill 폴더의 SKILL.md 파일을 동적으로 읽어 들여 대화 컨텍스트에 주입한다.
- 3단계: 상세 지원 파일 탐색 (Deep Discovery)
- SKILL.md 파일 내부에 선언된 다른 지원 파일들(reference.md, examples.md 등)의 경로와 용도를 명시해 둔다.
- Claude는 더 세부적인 정보나 예제 템플릿이 진짜로 필요한 순간에만 그 링크를 타고 들어가 파일을 추가적으로 읽어 들인다.
이 3단계 구조 덕분에 에이전트가 보유할 수 있는 기술의 양은 사실상 무한대로 확장될 수 있으며, 매 턴마다 발생하는 불필요한 토큰 낭비를 원천적으로 차단한다.
3. Agent Skill의 해부학 (Anatomy)
하나의 완성된 Skill은 SKILL.md를 필수 진입점으로 삼는 독립적인 디렉토리 구조를 가진다.
.claude/skills/my-awesome-skill/
├── SKILL.md # 필수: 메타데이터(Frontmatter) 및 주요 지침
├── template.md # 선택: Claude가 참고하거나 채워 넣을 결과물 포맷
├── reference.md # 선택: 대용량 API 명세서나 비즈니스 룰
├── examples/
│ └── sample.md # 선택: 잘 작성된 모범 예시(Few-Shot) 데이터
└── scripts/
└── run_validator.sh # 선택: 에이전트가 실행할 결정론적 스크립트/툴
3.1 YAML Frontmatter 상세 명세
SKILL.md 파일은 반드시 문서 최상단에 ---로 둘러싸인 YAML Frontmatter 영역을 포함해야 한다. 에이전트가 세션을 시작할 때 이 영역을 파싱하여 자신의 도구 목록에 장착한다.
| 필드명 | 타입 | 권장 여부 | 설명 |
| name | String | 선택 | Skill의 고유 식별자. 영문 소문자, 숫자, 하이픈만 허용(최대 64자). 생략 시 디렉토리 명을 사용. |
| description | String | 필수 권장 | 이 Skill이 무엇을 하는지, 에이전트가 언제 로드해야 하는지 기술한다. 에이전트가 자동 실행 여부를 판단하는 핵심 기준이 되므로 명확하게 작성해야 한다. |
| when_to_use | String | 선택 | Claude가 이 스킬을 트리거해야 하는 구체적인 상황이나 예시 발화를 추가 기재. description과 병합되어 1,536자 한도 내로 관리된다. |
| disable-model-invocation | Boolean | 선택 | true로 설정 시, Claude가 임의로 자동 로드하는 것을 막고 오직 사용자가 명령어(/skill-name)로 호출했을 때만 기동하도록 제어한다. |
| user-invocable | Boolean | 선택 | false로 설정 시, 터미널 자동 완성 메뉴(/ 슬래시 메뉴)에 나타나지 않게 숨긴다. 에이전트 전용 배경지식 스킬에 적합하다. |
| allowed-tools | List/String | 선택 | 스킬 실행 도중 사용자에게 매번 권한을 묻지 않고 즉시 자동 승인할 도구 목록을 지정 (예: Read, Grep, Bash(git *) 등). |
| context | String | 선택 | fork로 설정 시, 메인 대화 흐름과 격리된 별도의 하위 에이전트(Subagent) 환경을 생성하여 실행한다. |
| agent | String | 선택 | context: fork 환경에서 사용할 에이전트 유형 지정 (Explore, Plan, general-purpose 등). |
| paths | List/String | 선택 | 특정 경로의 파일들과 작업할 때만 이 스킬을 활성화하도록 지정을 제한하는 Glob 패턴 세트. |
4. [실습] 첫 번째 Agent Skill 구축하기
직접 실습해 보며 원리를 체득해 보자. 이 실습에서는 Git 프로젝트에서 변경된 사항을 분석하여 위험 요소를 지능적으로 감지해 내는 summarize-changes 스킬을 생성한다.
STEP 1: 디렉토리 생성
스킬을 전역(모든 프로젝트)에서 사용하려면 개인 디렉토리에 생성하고, 특정 프로젝트에 격리하려면 프로젝트 루트 하위에 생성한다. 여기서는 개인 전역 스킬로 빌드해 본다.
# 전역 스킬 디렉토리 생성
mkdir -p ~/.claude/skills/summarize-changes
STEP 2: SKILL.md 작성
~/.claude/skills/summarize-changes/SKILL.md 경로에 아래와 같이 구성 파일을 생성한다.
---
name: summarize-changes
description: Summarizes uncommitted changes and flags any risky modifications. Use when the user asks what changed, wants a commit message, or requests a review of their diff.
allowed-tools: Bash(git diff HEAD)
---
## 1. 현재 변경 사항 (Git Diff)
!`git diff HEAD`
## 2. 분석 가이드라인
상기 출력된 Git Diff 내용을 분석하여 다음 세 가지 관점에서 한국어로 보고서를 작성해라:
1. **변경 사항 요약:** 수정된 항목을 핵심 위주로 최대 3개의 불릿 포인트로 정리한다.
2. **잠재적 위험 감지(Risk):** 아래와 같은 취약한 코드가 포함되어 있는지 감시하고 발견 시 경고 아이콘(⚠️)과 함께 기술해라.
- 예외 처리(Try-Catch)가 누락된 외부 API 비동기 호출
- 하드코딩된 암호, API Key, 또는 중요 도메인 설정 값
- 테스트 코드 작성 및 업데이트가 누락되었을 가능성이 높은 비즈니스 핵심 로직 변경
3. **추천 커밋 메시지:** Conventional Commits 명세(feat, fix, refactor 등)를 따르는 간결한 한글 커밋 메시지를 하나 제안해라.
💡 코드 설계적 포인트:
- 파일 내부에 작성된 !`git diff HEAD` 문법은 동적 컨텍스트 주입(Dynamic Context Injection) 기술이다. Claude가 이 파일을 읽는 순간, 로컬 셸에서 해당 명령어가 실행되어 그 출력 결과물이 실시간으로 본문에 주입된다. 즉, 모델은 박제된 텍스트가 아니라 '살아 움직이는 리포지토리의 상태'를 바탕으로 추론을 개시하게 된다.
STEP 3: 스킬 기동 및 테스트
로컬 Git 리포지토리 폴더로 이동한 뒤, 코드 몇 줄을 임의로 수정하고 터미널에 claude를 입력해 세션을 시작한다. 두 가지 방식으로 테스트할 수 있다.
- 방법 A (지능형 자동 호출): 설명문(Description)과 결합한 자연스러운 질문 던지기Claude는 질문의 의미를 분석하여 summarize-changes 스킬이 필요함을 스스로 인지하고, 자동으로 백그라운드에서 스킬을 로드하여 결과를 출력한다.
- > 이번에 내가 수정한 코드들 중에서 혹시 위험한 비즈니스 로직이나 놓친 부분이 있는지 분석해 줘.
- 방법 B (명령어 다이렉트 호출): 슬래시 명령어를 통해 사용자가 강제로 실행수동으로 호출하면 디스크립션 매칭과 무관하게 즉시 스킬 본문이 컨텍스트로 진입해 분석이 실행된다.
- > /summarize-changes
5. 고급 설계 패턴 (Advanced Patterns)
단순한 지침 가이드를 넘어, 현업 프로젝트나 엔터프라이즈 환경에서 생산성을 극대화할 수 있는 강력한 고급 설계 패턴들을 소개한다.
5.1 동적 컨텍스트 주입 (Dynamic Context Injection)
단일 행 명령어는 !`command` 형식을 사용하고, 출력이 여러 행이거나 복잡한 셸 스크립팅이 가미된다면 ```! 펜스 코드 블록을 사용하여 런타임 정보를 주입한다.
## 현재 빌드 환경 정보
```!
echo "Node 버전: $(node --version)"
echo "NPM 버전: $(npm --version)"
git status --short
```
⚠️ 보안 및 제어 설정: 만약 협업 프로젝트에서 원격 저장소에 공유된 다른 개발자의 스킬을 무작위로 실행하다가 악성 셸 스크립트가 실행될 것이 우려된다면, 로컬 전역 설정 파일(~/.claude/settings.json)이나 에이전트 실행 옵션에서 실행 제어를 차단할 수 있다.
{ "disableSkillShellExecution": true }이 값이 활성화되면, 모든 동적 주입 셸 명령어는 실행되는 대신 [shell command execution disabled by policy]로 일괄 대체된다. 보안이 엄격한 금융권이나 엔터프라이즈 환경에서는 필수적인 방어막이다.
5.2 결정론적 도구 실행(Deterministic Tooling)의 융합

거대 모델은 문맥 이해와 복잡한 비즈니스 룰 판별에는 뛰어난 영리함을 보여주지만, 수만 개의 토큰을 정렬하거나 대규모 파일을 산술적으로 계산하는 등 '결정론적 신뢰성'이 필요한 영역에서는 의외의 실수(정렬 누락, 연산 오차)를 범하기도 한다.
따라서 가장 완벽한 에이전트 구조는 "어려운 계획 수립과 상태 판별은 Claude에게 맡기고, 무거운 물리 작업은 미리 짜인 전용 스크립트로 처리하게 만드는 구조"다.
5.3 격리된 하위 에이전트 실행 (context: fork)
메인 대화 흐름이 진행 중일 때, 아주 어렵고 무거운 분석 작업을 병렬로 처리하고 싶다면 메인 컨텍스트를 지저분하게 오염시키지 않는 독립된 가상 서브에이전트(Forked Subagent)를 띄워 백그라운드에서 돌릴 수 있다.
---
name: security-audit
description: Run a deep security audit on a codebase module.
context: fork
agent: Explore
allowed-tools: Bash(npm audit) Bash(semgrep *) Read Grep
---
Analyze the selected folder for potential OWASP Top 10 vulnerabilities.
Focus especially on SQL Injection or Broken Authentication.
Provide only a high-level severity summary back to the main chat.
- context: fork를 기재하면 Claude Code는 실행되는 시점에 완벽히 격리된 독립형 컨텍스트 세션을 내부적으로 포크(Fork)한다.
- agent: Explore로 설정함으로써 해당 하위 에이전트는 코드베이스를 샅샅이 헤집고 다닐 수 있는 읽기 권한 최적화 전용 도구 세트를 쥐게 된다.
- 서브에이전트가 방대한 탐색과 깊은 분석을 끝마치면, 오직 '최종 요약본'만을 메인 스레드로 반환하므로 메인 대화 세션의 토큰은 극적으로 절약된다.
6. 실전 프로젝트: 코드베이스 시각화(Visualizer) 스킬 제작
이제 배운 이론들을 모두 집약하여, 실제로 어떠한 복잡한 프로젝트에 투입되어도 한눈에 디렉토리 구조를 트리 맵 형태로 추출하여 브라우저에 띄워주는 고부가가치 실무 스킬을 완성해 보자.
이 스킬은 무거운 디렉토리 정적 탐색은 Python 3 기본 표준 라이브러리로 안전하고 정밀하게 해결하고, 결과물은 대화형 축소/확장(Collapsible Tree) 기능이 가미된 우아한 단일 HTML 파일로 변환하여 브라우저에 즉시 팝업해 준다.
디렉토리 구조 설정
mkdir -p ~/.claude/skills/codebase-visualizer/scripts
1) SKILL.md 작성
~/.claude/skills/codebase-visualizer/SKILL.md 경로로 파일을 생성한다. 스킬이 설치된 절대 경로를 찾기 위해 환경 변수 ${CLAUDE_SKILL_DIR}를 활용하는 지혜가 담겨 있다.
---
name: codebase-visualizer
description: Generate an interactive collapsible tree visualization of your codebase. Use when exploring a new repo, understanding project structure, or identifying large files.
allowed-tools: Bash(python3 *)
---
# Codebase Visualizer
현재 프로젝트의 폴더 및 파일 구조를 용량 크기 정보와 확장자별 색상 코드를 곁들인 멋진 대화형 HTML 트리 맵으로 시각화합니다.
## 실행 규칙
아래 주입된 절대 경로 명령어를 통해 현재 워크스페이스의 루트(.)를 시각화 분석기로 통과시키세요:
```bash
python3 ${CLAUDE_SKILL_DIR}/scripts/visualize.py .
실행이 성공하면 현재 디렉토리에 codebase-map.html 파일이 자동 빌드되며, 사용자의 운영체제 기본 웹 브라우저로 시각화 대시보드가 자동 팝업됩니다.
대시보드 포함 항목
- 요약 사이드바: 총 파일 수, 총 디렉토리 수, 전체 크기, 최다 빈도 확장자 정보
- 자료 구조 분석: 용량 기준으로 가장 큰 지분을 가진 파일 타입 TOP 8 막대 차트
- 대화형 트리 맵: 폴더 노드를 마우스로 클릭하여 접고 펼 수 있는 애니메이션 구조
### 2) visualize.py 스크립트 작성
`~/.claude/skills/codebase-visualizer/scripts/visualize.py` 파일에 외부 라이브러리 설치 의존성이 전혀 없는 고성능 정적 스캐너 스크립트를 작성한다.
```python
#!/usr/bin/env python3
import json
import sys
import webbrowser
from html import escape
from pathlib import Path
from collections import Counter
# 불필요하거나 용량이 너무 큰 시스템/의존성 폴더는 탐색에서 강제 배제
IGNORE = {'.git', 'node_modules', '__pycache__', '.venv', 'venv', 'dist', 'build', '.idea', '.vscode'}
def scan(path: Path, stats: dict) -> dict:
result = {"name": path.name, "children": [], "size": 0}
try:
for item in sorted(path.iterdir()):
if item.name in IGNORE or item.name.startswith('.'):
continue
if item.is_file():
size = item.stat().st_size
ext = item.suffix.lower() or '(no ext)'
result["children"].append({"name": item.name, "size": size, "ext": ext})
result["size"] += size
stats["files"] += 1
stats["extensions"][ext] += 1
stats["ext_sizes"][ext] += size
elif item.is_dir():
stats["dirs"] += 1
child = scan(item, stats)
if child["children"]:
result["children"].append(child)
result["size"] += child["size"]
except PermissionError:
pass
return result
def generate_html(data: dict, stats: dict, output: Path) -> None:
ext_sizes = stats["ext_sizes"]
total_size = sum(ext_sizes.values()) or 1
sorted_exts = sorted(ext_sizes.items(), key=lambda x: -x[1])[:8]
# 세련되고 정돈된 개발자용 테마 컬러 토큰 지정
colors = {
'.js': '#f7df1e', '.ts': '#3178c6', '.py': '#3776ab', '.go': '#00add8',
'.rs': '#dea584', '.rb': '#cc342d', '.css': '#264de4', '.html': '#e34c26',
'.json': '#6b7280', '.md': '#083fa1', '.yaml': '#cb171e', '.yml': '#cb171e',
'.tsx': '#3178c6', '.jsx': '#61dafb', '.sh': '#4eaa25', '.java': '#b07219'
}
lang_bars = "".join(
f'<div class="bar-row"><span class="bar-label">{ext}</span>'
f'<div class="bar" style="width:{(size/total_size)*100}%;background:{colors.get(ext,"#6b7280")}"></div>'
f'<span class="bar-pct">{(size/total_size)*100:.1f}%</span></div>'
for ext, size in sorted_exts
)
def fmt(b):
if b < 1024: return f"{b} B"
if b < 1048576: return f"{b/1024:.1f} KB"
return f"{b/1048576:.1f} MB"
html = f'''<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<title>Codebase Explorer 대시보드</title>
<style>
body {{ font-family: system-ui, -apple-system, sans-serif; margin: 0; background: #0f172a; color: #f1f5f9; }}
.container {{ display: flex; height: 100vh; }}
.sidebar {{ width: 300px; background: #1e293b; padding: 24px; border-right: 1px solid #334155; overflow-y: auto; flex-shrink: 0; }}
.main {{ flex: 1; padding: 32px; overflow-y: auto; }}
h1 {{ margin: 0 0 16px 0; font-size: 20px; font-weight: 700; color: #f8fafc; }}
h2 {{ margin: 24px 0 12px 0; font-size: 12px; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; }}
.stat {{ display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid #334155; }}
.stat-value {{ font-weight: 600; color: #38bdf8; }}
.bar-row {{ display: flex; align-items: center; margin: 8px 0; }}
.bar-label {{ width: 60px; font-size: 11px; color: #cbd5e1; font-family: monospace; }}
.bar {{ height: 14px; border-radius: 4px; }}
.bar-pct {{ margin-left: 8px; font-size: 11px; color: #64748b; }}
.tree {{ list-style: none; padding-left: 20px; margin: 0; }}
details {{ cursor: pointer; margin: 4px 0; }}
summary {{ padding: 6px 10px; border-radius: 6px; outline: none; transition: background 0.2s; }}
summary:hover {{ background: #334155; }}
.folder {{ color: #f59e0b; font-weight: 600; }}
.file {{ display: flex; align-items: center; padding: 5px 10px; border-radius: 6px; transition: background 0.1s; }}
.file:hover {{ background: #1e293b; }}
.size {{ color: #64748b; margin-left: auto; font-size: 11px; font-family: monospace; }}
.dot {{ width: 6px; height: 6px; border-radius: 50%; margin-right: 10px; flex-shrink: 0; }}
</style>
</head><body>
<div class="container">
<div class="sidebar">
<h1>📊 프로젝트 통계</h1>
<div class="stat"><span>총 파일 수</span><span class="stat-value">{stats["files"]:,}</span></div>
<div class="stat"><span>총 디렉토리 수</span><span class="stat-value">{stats["dirs"]:,}</span></div>
<div class="stat"><span>총 소스 크기</span><span class="stat-value">{fmt(data["size"])}</span></div>
<div class="stat"><span>감지된 포맷 수</span><span class="stat-value">{len(stats["extensions"])}</span></div>
<h2>확장자별 점유 비율</h2>
{lang_bars}
</div>
<div class="main">
<h1>📁 {escape(data["name"] or "Workspace ROOT")}</h1>
<ul class="tree" id="root"></ul>
</div>
</div>
<script>
const data = {json.dumps(data)};
const colors = {json.dumps(colors)};
function fmt(b) {{ if (b < 1024) return b + ' B'; if (b < 1048576) return (b/1024).toFixed(1) + ' KB'; return (b/1048576).toFixed(1) + ' MB'; }}
function esc(s) {{ return s.replace(/[&<>"']/g, c => ({{"&":"&","<":"<",">":">",'"':""","'":"'"}}[c])); }}
function render(node, parent) {{
if (node.children) {{
const det = document.createElement('details');
det.open = parent === document.getElementById('root');
det.innerHTML = `<summary><span class="folder">📁 ${{esc(node.name)}}</span><span class="size">${{fmt(node.size)}}</span></summary>`;
const ul = document.createElement('ul'); ul.className = 'tree';
node.children.sort((a,b) => (b.children?1:0)-(a.children?1:0) || a.name.localeCompare(b.name));
node.children.forEach(c => render(c, ul));
det.appendChild(ul);
const li = document.createElement('li'); li.appendChild(det); parent.appendChild(li);
}} else {{
const li = document.createElement('li'); li.className = 'file';
li.innerHTML = `<span class="dot" style="background:${{colors[node.ext]||'#64748b'}}"></span>${{esc(node.name)}}<span class="size">${{fmt(node.size)}}</span>`;
parent.appendChild(li);
}}
}}
if(data.children) {{
data.children.forEach(c => render(c, document.getElementById('root')));
}} else {{
document.getElementById('root').innerHTML = "<li>스캔 대상 파일이 없거나 하위 디렉토리가 격리되었습니다.</li>";
}}
</script>
</body></html>'''
output.write_text(html, encoding='utf-8')
if __name__ == '__main__':
target = Path(sys.argv[1] if len(sys.argv) > 1 else '.').resolve()
stats = {"files": 0, "dirs": 0, "extensions": Counter(), "ext_sizes": Counter()}
data = scan(target, stats)
out = Path('codebase-map.html')
generate_html(data, stats, out)
print(f'성공적으로 파일 맵을 생성했습니다: {out.absolute()}')
webbrowser.open(f'file://{out.absolute()}')

7. 실무 운영 노하우 및 트러블슈팅 (Tips)
7.1 토큰 압축과 복원 메커니즘을 명심하라
세션 중 한 번 활성화되어 대화창에 주입된 스킬의 컨텍스트는 해당 세션이 유지되는 한 영구적으로 유지된다. 하지만 대화 턴이 극단적으로 길어져 앤드로픽의 자체적인 자동 컨텍스트 압축 프로토콜이 동작하게 되면, 예산(기본 최대 25,000토큰 내외) 부족으로 오래된 스킬들이 메모리에서 가차 없이 밀려나 삭제될 위험이 있다.
만약 에이전트가 중반 이후 갑자기 규칙을 까먹은 것처럼 헤맨다면, 고민하지 말고 다시 한번 해당 스킬을 수동 호출(/skill-name)해 콘텍스트의 우선순위 최상단 영역으로 복원해 주는 것이 정석이다.
7.2 우선순위 계층도를 이해하여 충돌 방지하기
동일한 명칭을 가진 스킬이 로컬 디바이스에 중복으로 흩어져 존재할 때, Claude Code가 우선순위를 결정하는 정교한 덮어쓰기(Override) 위계질서는 아래와 같다.

7.3 skillOverrides를 통한 임시 제어
팀 프로젝트에서 코드베이스 형상 관리에 올려놓은 스킬 파일(SKILL.md)을 직접 훼손하지 않으면서, 내 로컬 터미널에서만 해당 스킬의 자동 기동을 잠시 끄거나 감추고 싶다면 .claude/settings.local.json 설정 파일에 가시성 제어값들을 인젝션할 수 있다.
{
"skillOverrides": {
"legacy-system-context": "name-only",
"dangerous-deploy": "off"
}
}
- "name-only": 설명문을 숨겨 에이전트가 자율적으로 자동 실행하는 것을 원천 차단하고 오직 사용자의 수동 명령어만 동작하게 가벼운 모드로 설정한다.
- "off": 해당 스킬을 현재 세션 동안 완전히 불능(Disable) 상태로 꺼둔다.
8. 마무리
인공지능 에이전트가 코드를 대신 짜주는 시대에, 우리에게 필요한 진정한 핵심 역량은 "누가 더 코딩을 빠르게 타이핑하는가"가 아니다. 복잡한 시스템의 경계를 정의하고, 에이전트가 최적의 지식과 도구를 바탕으로 결정론적이고 안전하게 일할 수 있도록 비즈니스 규칙과 자동화 파이프라인을 체계적으로 구조화하는 '인프라 오케스트레이터(Orchestrator)'로서의 능력이다.
앤트로픽이 제안한 개방형 표준인 Agent Skills는 복잡한 맥락의 바다 속에서 에이전트가 토큰 낭비 없이 극도의 효율을 낼 수 있는 든든한 뼈대와 규칙이 되어 준다.
'Claude' 카테고리의 다른 글
| [Claude Code] 에이전틱 루프와 EPIC 워크플로우 구축하기 (1) | 2026.05.24 |
|---|---|
| [Claude Code] 에이전트 확장 생태계 구축: Claude Code 플러그인 제작 및 커스텀 마켓플레이스 배포 (0) | 2026.05.24 |
| [Claude Code] Hooks 분석 : 개발 워크플로우를 통제하는 자동화 (0) | 2026.05.18 |
| [Claude Code] 서브에이전트(Subagents) 시스템 (0) | 2026.05.10 |
| [Claude Code] 명령어 및 스킬(Skills) 시스템 정리 (1) | 2026.05.10 |