AI 에이전트, 10개 IDE에서 활용하는 방법

Ashley Innocent

Ashley Innocent

19 March 2026

AI 에이전트, 10개 IDE에서 활용하는 방법

Apidog 엔터프라이즈

온프레미스 배포

SSO & RBAC

SOC 2 준수

Apidog Enterprise 살펴보기

요약

AI 에이전트 파일 하나를 3단계로 10개 IDE에 변환: (1) `get_field()`, `get_body()`, `to_kebab()` bash 함수를 사용하여 YAML 프런트매터 구문 분석, (2) `convert.sh`를 사용하여 도구별 형식으로 변환 (Claude Code `.md`, Cursor `.mdc`, Aider `CONVENTIONS.md`, Windsurf `.windsurfrules`), (3) `install.sh`를 사용하여 올바른 경로에 설치. 한 번 작성하고, 자동으로 변환하며, 어디든 배포하세요.

에이전트 파일 하나로 10개 IDE를 지원합니다. The Agency 프로젝트가 단일 마크다운 파일을 Claude Code, Cursor, Aider, Windsurf, GitHub Copilot 및 6개 이상의 다른 도구에서 작동하도록 변환하는 방법을 알아보세요.

AI 에이전트를 작성했습니다. 이제 다음에서 사용 가능하게 만들고 싶습니다:

10가지 버전을 작성하시겠습니까? 아닙니다. 한 번 작성하고 자동으로 변환하세요.

The Agency 프로젝트는 두 개의 bash 스크립트로 이 문제를 해결합니다:

이 튜토리얼에서는 두 스크립트를 리버스 엔지니어링합니다. YAML 프런트매터를 구문 분석하고, 본문 내용을 추출하며, 모든 도구에 대한 변환 파이프라인을 구축하는 방법을 배웁니다.

💡
Apidog 통합을 통해 API 개발 워크플로를 위한 에이전트를 배포하든, 특수 테스트 에이전트를 생성하든, 변환 시스템은 모든 팀이 선호하는 IDE에서 작동하도록 보장합니다.
버튼

에이전트 형식

The Agency의 모든 에이전트는 동일한 구조를 사용합니다:

---
name: API Tester
description: Specialized in API testing with Apidog, Postman, and automated validation
color: purple
emoji: 🧪
vibe: Breaks APIs before users do.
---

# API Tester Agent Personality

You are **API Tester**, an expert in API validation...

## Identity & Memory
- Role: API testing specialist
- Personality: Thorough, skeptical, evidence-focused
...

파일은 두 부분으로 구성됩니다:

  1. 프런트매터 — `---` 구분 기호 사이의 YAML 메타데이터
  2. 본문 — 두 번째 `---` 뒤의 마크다운 콘텐츠

변환은 다음을 의미합니다: 프런트매터 필드 추출, 본문을 대상 형식으로 변환, 올바른 경로에 작성.

1단계: YAML 프런트매터 구문 분석

`parse-frontmatter.sh` 생성:

#!/usr/bin/env bash
#
# parse-frontmatter.sh — Extract YAML frontmatter fields from agent files
#

set -euo pipefail

# Extract a single field value from YAML frontmatter
# Usage: get_field <field> <file>
get_field() {
  local field="$1" file="$2"
  awk -v f="$field" '
    /^---$/ { fm++; next }
    fm == 1 && $0 ~ "^" f ": " {
      sub("^" f ": ", "");
      print;
      exit
    }
  ' "$file"
}

# Strip frontmatter, return only body
# Usage: get_body <file>
get_body() {
  awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}

# Convert name to kebab-case slug
# Usage: to_kebab "API Tester" → api-tester
to_kebab() {
  echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g'
}

# Demo
if [[ "${1:-}" == "--demo" ]]; then
  AGENT_FILE="${2:-test-agent.md}"
  echo "File: $AGENT_FILE"
  echo "Name: $(get_field 'name' "$AGENT_FILE")"
  echo "Description: $(get_field 'description' "$AGENT_FILE")"
  echo "Slug: $(to_kebab "$(get_field 'name' "$AGENT_FILE")")"
  echo "---"
  echo "Body preview:"
  get_body "$AGENT_FILE" | head -10
fi

테스트:

chmod +x parse-frontmatter.sh
./parse-frontmatter.sh --demo engineering-backend-architect.md

출력:

File: engineering-backend-architect.md
Name: Backend Architect
Description: Senior backend architect specializing in scalable system design...
Slug: backend-architect
---
Body preview:
# Backend Architect Agent Personality

You are **Backend Architect**, a senior backend architect...

2단계: Claude Code 형식으로 변환

Claude Code는 원본 `.md` 파일을 사용합니다. 변환이 필요 없습니다 — 그냥 복사하면 됩니다:

convert_claude_code() {
  local agent_file="$1"
  local dest="$HOME/.claude/agents/"
  mkdir -p "$dest"
  cp "$agent_file" "$dest/"
  echo "  Claude Code: $(basename "$agent_file")"
}

3단계: Cursor 형식으로 변환

Cursor는 프런트매터 `description` 필드를 가진 `.mdc` 파일을 사용합니다:

convert_cursor() {
  local agent_file="$1"
  local name=$(get_field 'name' "$agent_file")
  local description=$(get_field 'description' "$agent_file")
  local slug=$(to_kebab "$name")
  local body=$(get_body "$agent_file")

  local output=".cursor/rules/agency-${slug}.mdc"
  mkdir -p "$(dirname "$output")"

  cat > "$output" << EOF
---
description: Agency agent: $description
---
$body
EOF

  echo "  Cursor: agency-${slug}.mdc"
}

입력:

---
name: API Tester
description: Specialized in API testing...
---

# API Tester Agent...

출력 (`.mdc`):

---
description: Agency agent: Specialized in API testing...
---

# API Tester Agent...

4단계: Aider 형식으로 변환

Aider는 모든 에이전트를 포함하는 단일 `CONVENTIONS.md` 파일을 사용합니다:

convert_aider() {
  local agent_file="$1"
  local output="CONVENTIONS.md"

  # Append with separator
  echo "" >> "$output"
  echo "---" >> "$output"
  echo "" >> "$output"
  cat "$agent_file" >> "$output"

  echo "  Aider: appended to $output"
}

전체 파일 구축:

build_aider() {
  local output="CONVENTIONS.md"
  echo "# Agency Agents for Aider" > "$output"
  echo "" >> "$output"
  echo "This file contains all Agency agents for Aider integration." >> "$output"
  echo "" >> "$output"

  for agent_file in engineering/*.md design/*.md testing/*.md; do
    convert_aider "$agent_file"
  done
}

5단계: Windsurf 형식으로 변환

Windsurf는 단일 `.windsurfrules` 파일을 사용합니다 (Aider와 유사):

convert_windsurf() {
  local agent_file="$1"
  local output=".windsurfrules"

  echo "" >> "$output"
  echo "---" >> "$output"
  echo "" >> "$output"
  cat "$agent_file" >> "$output"

  echo "  Windsurf: appended to $output"
}

6단계: Antigravity 형식으로 변환

Antigravity (Gemini)는 하위 디렉토리에 `SKILL.md` 파일을 사용합니다:

convert_antigravity() {
  local agent_file="$1"
  local name=$(get_field 'name' "$agent_file")
  local slug=$(to_kebab "$name")
  local output="integrations/antigravity/skills/agency-${slug}/SKILL.md"

  mkdir -p "$(dirname "$output")"

  cat > "$output" << EOF
# Agency Agent: $name

$(get_body "$agent_file")
EOF

  echo "  Antigravity: agency-${slug}/SKILL.md"
}

7단계: OpenClaw 형식으로 변환

OpenClaw는 에이전트당 세 개의 파일 (`SOUL.md`, `AGENTS.md`, `IDENTITY.md`)을 사용합니다:

convert_openclaw() {
  local agent_file="$1"
  local name=$(get_field 'name' "$agent_file")
  local description=$(get_field 'description' "$agent_file")
  local slug=$(to_kebab "$name")
  local body=$(get_body "$agent_file")

  local output_dir="integrations/openclaw/agency-${slug}"
  mkdir -p "$output_dir"

  # SOUL.md - Main agent definition
  cat > "$output_dir/SOUL.md" << EOF
# $name

$description

---

$body
EOF

  # AGENTS.md - Agent capabilities
  cat > "$output_dir/AGENTS.md" << EOF
# Agent Capabilities: $name

- Specialized expertise in domain
- Deliverable-focused output
- Success metrics defined

See SOUL.md for full definition.
EOF

  # IDENTITY.md - Agent identity
  cat > "$output_dir/IDENTITY.md" << EOF
# Identity: $name

- Name: $name
- Description: $description
- Source: The Agency (agency-agents repo)
EOF

  echo "  OpenClaw: agency-${slug}/"
}

8단계: 전체 convert.sh 스크립트

다음은 전체 변환 스크립트입니다 (간소화됨):

#!/usr/bin/env bash
#
# convert.sh — Convert all Agency agents to tool-specific formats
#

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
OUT_DIR="$REPO_ROOT/integrations"

# Frontmatter helpers
get_field() {
  local field="$1" file="$2"
  awk -v f="$field" '
    /^---$/ { fm++; next }
    fm == 1 && $0 ~ "^" f ": " { sub("^" f ": ", ""); print; exit }
  ' "$file"
}

get_body() {
  awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}

to_kebab() {
  echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g'
}

# Conversion functions
convert_claude_code() {
  local agent_file="$1"
  local dest="$OUT_DIR/claude-code/"
  mkdir -p "$dest"
  cp "$agent_file" "$dest/"
}

convert_cursor() {
  local agent_file="$1"
  local name=$(get_field 'name' "$agent_file")
  local slug=$(to_kebab "$name")
  local body=$(get_body "$agent_file")

  mkdir -p "$OUT_DIR/cursor/.cursor/rules/"
  cat > "$OUT_DIR/cursor/.cursor/rules/agency-${slug}.mdc" << EOF
---
description: Agency agent: $(get_field 'description' "$agent_file")
---
$body
EOF
}

convert_aider() {
  local output="$OUT_DIR/aider/CONVENTIONS.md"
  echo "" >> "$output"
  echo "---" >> "$output"
  cat "$agent_file" >> "$output"
}

convert_windsurf() {
  local output="$OUT_DIR/windsurf/.windsurfrules"
  echo "" >> "$output"
  echo "---" >> "$output"
  cat "$agent_file" >> "$output"
}

# Main conversion loop
echo "Converting Agency agents..."

AGENT_DIRS=(engineering design testing marketing sales)

for dir in "${AGENT_DIRS[@]}"; do
  for agent_file in "$REPO_ROOT/$dir"/*.md; do
    [[ -f "$agent_file" ]] || continue

    name=$(get_field 'name' "$agent_file")
    echo "Processing: $name"

    convert_claude_code "$agent_file"
    convert_cursor "$agent_file"
  done
done

# Build combined files
echo "# Agency Agents for Aider" > "$OUT_DIR/aider/CONVENTIONS.md"
for dir in "${AGENT_DIRS[@]}"; do
  for agent_file in "$REPO_ROOT/$dir"/*.md; do
    [[ -f "$agent_file" ]] || continue
    convert_aider "$agent_file"
  done
done

echo "# Agency Agents for Windsurf" > "$OUT_DIR/windsurf/.windsurfrules"
for dir in "${AGENT_DIRS[@]}"; do
  for agent_file in "$REPO_ROOT/$dir"/*.md; do
    [[ -f "$agent_file" ]] || continue
    convert_windsurf "$agent_file"
  done
done

echo "Conversion complete!"
echo "  Claude Code: $OUT_DIR/claude-code/"
echo "  Cursor: $OUT_DIR/cursor/.cursor/rules/"
echo "  Aider: $OUT_DIR/aider/CONVENTIONS.md"
echo "  Windsurf: $OUT_DIR/windsurf/.windsurfrules"

실행:

chmod +x convert.sh
./convert.sh

9단계: 각 도구에 설치

변환 후, 파일을 도구별 경로에 복사합니다:

#!/usr/bin/env bash
#
# install.sh — Install converted agents to your local tools
#

set -euo pipefail

# Claude Code
install_claude_code() {
  local src="$REPO_ROOT/integrations/claude-code/"
  local dest="$HOME/.claude/agents/"
  mkdir -p "$dest"
  cp "$src"/*.md "$dest/"
  echo "Claude Code: $(find "$dest" -name '*.md' | wc -l) agents installed"
}

# Cursor
install_cursor() {
  local src="$REPO_ROOT/integrations/cursor/.cursor/rules/"
  local dest="./.cursor/rules/"
  mkdir -p "$dest"
  cp "$src"/*.mdc "$dest/"
  echo "Cursor: $(find "$dest" -name '*.mdc' | wc -l) rules installed"
}

# Aider
install_aider() {
  local src="$REPO_ROOT/integrations/aider/CONVENTIONS.md"
  local dest="./CONVENTIONS.md"
  cp "$src" "$dest"
  echo "Aider: CONVENTIONS.md installed"
}

# Windsurf
install_windsurf() {
  local src="$REPO_ROOT/integrations/windsurf/.windsurfrules"
  local dest="./.windsurfrules"
  cp "$src" "$dest"
  echo "Windsurf: .windsurfrules installed"
}

# Install all detected tools
install_all() {
  if [[ -d "$HOME/.claude/agents/" ]]; then
    install_claude_code
  fi
  if command -v cursor &>/dev/null || [[ -d "./.cursor/" ]]; then
    install_cursor
  fi
  if command -v aider &>/dev/null; then
    install_aider
  fi
}

install_all

형식 비교

도구 형식 범위 변환
Claude Code .md 사용자 전체 (~/.claude/agents/) 있는 그대로 복사
Cursor .mdc 프로젝트 (.cursor/rules/) 설명 프런트매터 추가
Aider CONVENTIONS.md 프로젝트 루트 모든 에이전트 연결
Windsurf .windsurfrules 프로젝트 루트 모든 에이전트 연결
GitHub Copilot .md 사용자 전체 (~/.github/agents/) 있는 그대로 복사
Antigravity SKILL.md 사용자 전체 (~/.gemini/antigravity/) 스킬 디렉토리로 묶기
OpenClaw SOUL.md + 기타 사용자 전체 (~/.openclaw/) 3개 파일로 분할
Gemini CLI 확장 사용자 전체 (~/.gemini/extensions/) 매니페스트 + 스킬 생성
OpenCode .md 프로젝트 (.opencode/agents/) 있는 그대로 복사
Qwen Code .md 프로젝트 (.qwen/agents/) SubAgent로 복사

자신만의 변환 스크립트 구축

새 도구 추가를 위한 템플릿:

#!/usr/bin/env bash

# 1. Define conversion function
convert_your_tool() {
  local agent_file="$1"
  local name=$(get_field 'name' "$agent_file")
  local description=$(get_field 'description' "$agent_file")
  local slug=$(to_kebab "$name")
  local body=$(get_body "$agent_file")

  # 2. Create output path
  local output="path/to/your/tool/agency-${slug}.ext"
  mkdir -p "$(dirname "$output")"

  # 3. Write converted content
  cat > "$output" << EOF
# Your tool-specific format
# Use: $name, $description, $body
EOF

  echo "  YourTool: agency-${slug}.ext"
}

# 4. Add to main loop
for agent_file in engineering/*.md; do
  convert_your_tool "$agent_file"
done

구축한 내용

구성 요소 목적
get_field() YAML 프런트매터 값 추출
get_body() 프런트매터 제거, 마크다운 본문 반환
to_kebab() 이름을 URL-safe 슬러그로 변환
convert_cursor() .mdc 형식으로 변환
convert_aider() 단일 파일로 연결
convert_windsurf() 단일 파일로 연결
convert_antigravity() 스킬 디렉토리 생성
convert_openclaw() 에이전트당 3개 파일로 분할
install.sh 도구별 경로로 복사

다음 단계

스크립트 확장:

더 많은 도구 추가:

대규모 저장소에 대한 최적화:

일반적인 문제 해결

변환 스크립트가 “bad substitution” 오류로 실패:

프런트매터 필드가 추출되지 않음:

슬러그 생성 시 깨진 이름이 생성됨:

Cursor 규칙이 로드되지 않음:

Aider CONVENTIONS.md 파일이 너무 커짐:

대규모 변환을 위한 성능 최적화

병렬 처리:

100개 이상의 에이전트가 있는 저장소의 경우 GNU parallel 사용:

#!/usr/bin/env bash
# convert-parallel.sh

export OUT_DIR="$REPO_ROOT/integrations"

# Export functions for parallel use
export -f get_field get_body to_kebab convert_cursor convert_claude_code

# Find all agent files and process in parallel
find "$REPO_ROOT" -name "*.md" -type f | \
  parallel -j 8 --progress '
    name=$(get_field "name" {})
    slug=$(to_kebab "$name")
    echo "Converting: $name"
    convert_cursor "{}"
    convert_claude_code "{}"
  '

echo "Parallel conversion complete!"

증분 변환:

변경된 파일만 변환:

#!/usr/bin/env bash
# convert-incremental.sh

CACHE_FILE="$REPO_ROOT/.conversion-cache"

# Load previous state
declare -A PREV_HASHES
if [[ -f "$CACHE_FILE" ]]; then
  while IFS='=' read -r file hash; do
    PREV_HASHES["$file"]="$hash"
  done < "$CACHE_FILE"
fi

# Process each agent
for agent_file in engineering/*.md; do
  CURRENT_HASH=$(md5sum "$agent_file" | cut -d' ' -f1)
  PREV_HASH="${PREV_HASHES[$agent_file]:-}"

  if [[ "$CURRENT_HASH" != "$PREV_HASH" ]]; then
    echo "Changed: $agent_file"
    convert_cursor "$agent_file"
    convert_claude_code "$agent_file"
    NEW_HASHES["$agent_file"]="$CURRENT_HASH"
  else
    echo "Unchanged: $agent_file"
  fi
done

# Save cache
for file in "${!NEW_HASHES[@]}"; do
  echo "$file=${NEW_HASHES[$file]}"
done > "$CACHE_FILE"

진행 상황 추적:

긴 변환에 대한 시각적 진행 상황 추가:

#!/usr/bin/env bash

total_files=$(find "$REPO_ROOT" -name "*.md" -type f | wc -l)
current=0

for agent_file in "$REPO_ROOT"/**/*.md; do
  ((current++))
  percent=$((current * 100 / total_files))

  # Progress bar
  filled=$((percent / 5))
  empty=$((20 - filled))
  bar=$(printf '%*s' "$filled" | tr ' ' '#')
  spaces=$(printf '%*s' "$empty" | tr ' ' ' ')

  name=$(get_field 'name' "$agent_file")
  echo -ne "\r[${bar}${spaces}] ${percent}% - $name"

  convert_cursor "$agent_file"
done

echo -ne "\n"

공유 에이전트에 대한 보안 고려 사항

에이전트 소스 유효성 검사:

외부 소스에서 에이전트를 다운로드할 때:

#!/usr/bin/env bash
# validate-agent.sh

validate_agent() {
  local file="$1"

  # Check required frontmatter fields
  local name=$(get_field 'name' "$file")
  local description=$(get_field 'description' "$file")

  if [[ -z "$name" ]]; then
    echo "ERROR: Missing 'name' field in $file"
    return 1
  fi

  if [[ -z "$description" ]]; then
    echo "WARNING: Missing 'description' field in $file"
  fi

  # Check for malicious patterns in body
  local body=$(get_body "$file")

  if echo "$body" | grep -q 'rm -rf\|curl.*\|wget.*\|eval\|exec'; then
    echo "WARNING: Potentially dangerous patterns in $file"
    return 1
  fi

  echo "VALID: $name"
  return 0
}

에이전트 실행 샌드박싱:

신뢰할 수 없는 에이전트의 경우, 격리된 환경에서 실행:

에이전트 파일 하나. 10개 IDE. 두 개의 bash 스크립트.

이것이 변환 자동화의 힘입니다. 한 번 작성하고, 자동으로 변환하며, 어디든 설치하세요.

이제 당신의 차례입니다: 좋아하는 AI 도구에 변환 지원을 추가하세요. 스크립트를 공유하세요. 에이전트를 휴대 가능하게 만드세요.

핵심 요약

버튼

자주 묻는 질문

`convert.sh`는 무엇이며 어떻게 작동합니까? `convert.sh`는 에이전트 마크다운 파일에서 YAML 프런트매터를 구문 분석하고, 본문 내용을 추출하며, 각 에이전트를 도구별 형식으로 변환하는 bash 스크립트입니다. 구문 분석에는 `awk`를, 슬러그 변환에는 `sed`를, 출력 생성에는 heredoc을 사용합니다.

bash에서 프런트매터 구문 분석은 어떻게 작동합니까? `get_field()` 함수는 `awk`를 사용하여 프런트매터 구분 기호(`---`)를 추적하고, 필드 이름과 일치하는 줄을 찾아 값을 추출합니다. `get_body()`는 두 번째 `---` 구분 기호 뒤의 모든 줄을 출력합니다.

어떤 IDE 및 도구가 지원됩니까? Claude Code (`.md`), Cursor (`.mdc`), Aider (`CONVENTIONS.md`), Windsurf (`.windsurfrules`), GitHub Copilot (`.md`), Antigravity (`SKILL.md`), OpenClaw (`SOUL.md` + 2 files), Gemini CLI 확장, OpenCode, Qwen Code.

새 도구에 대한 변환 지원을 어떻게 추가합니까? `convert_yourtool()` 함수를 생성하여 프런트매터 필드를 추출하고, 본문을 도구의 형식으로 변환하며, 올바른 경로에 작성합니다. 이 함수 호출을 메인 변환 루프에 추가합니다.

더 빠른 처리를 위해 변환을 병렬로 실행할 수 있습니까? 예. `xargs -P` 또는 GNU parallel을 사용하여 여러 에이전트 파일을 동시에 처리할 수 있습니다. 100개 이상의 에이전트의 경우 병렬 변환은 실행 시간을 몇 분에서 몇 초로 단축할 수 있습니다.

프런트매터 필드가 존재하는지 어떻게 확인할 수 있습니까? `[[ -z "$name" ]] && echo "Missing name field" && exit 1`와 같은 유효성 검사 확인을 변환 함수에 추가합니다. 출력 파일을 작성하기 전에 유효성 검사를 실행합니다.

일부 에이전트에서 변환이 실패하면 어떻게 해야 합니까? 오류 발생 시 `set -euo pipefail`을 사용하여 빠르게 실패하도록 합니다. `|| continue`로 오류 처리를 추가하여 손상된 파일을 건너뛸 수 있습니다. 디버깅을 위해 실패를 별도의 파일에 기록합니다.

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요

AI 에이전트, 10개 IDE에서 활용하는 방법