agentic-os
affaan-m/ECC
Claude Code에서 커널 아키텍처, 전문 에이전트, 슬래시 명령어, 파일 기반 메모리, 예약형 자동화 기능을 활용하여 영구적인 다중 에이전트 운영 체제를 구축하세요.
...모든 것을 확장하십시오에이전틱 OS
Claude Code를 단순한 채팅 세션이 아닌, 상시 실행되는 런타임/운영 체제로 간주하십시오. 이 스킬은 실제 에이전틱 환경에서 사용되는 아키텍처를 구현합니다: 작업을 전문 에이전트로 라우팅하는 커널 구성, 상시 유지되는 파일 기반 메모리, 예약된 자동화, 그리고 JSON/마크다운 데이터 레이어가 포함됩니다.
활성화 시점
- Claude Code 내에서 다중 에이전트 워크플로우 구축
- 세션 재시작 후에도 유지되는 지속적 Claude Code 자동화 설정
- 반복적인 작업을 위한 “개인용 OS” 또는 “에이전틱 OS” 생성
- 사용자가 “에이전틱 OS”, “개인용 OS”, “다중 에이전트”, “에이전트 코디네이터”, “지속적 에이전트”라고 말할 때
- 세션 간에 컨텍스트가 유지되어야 하는 장기 프로젝트의 구조화
아키텍처 개요
에이전틱 OS는 네 개의 계층으로 구성됩니다. 각 계층은 프로젝트 루트 디렉터리에 해당하는 디렉터리입니다.
project-root/
├── CLAUDE.md # Kernel: identity, routing rules, agent registry
├── agents/ # Specialist agent definitions (markdown prompts)
├── .claude/commands/ # Slash commands: user-facing CLI
├── scripts/ # Daemon scripts: scheduled or event-driven tasks
└── data/ # State: JSON/markdown filesystem, no external DB
계층별 역할
| 계층 | 목적 | 영속화 |
|---|---|---|
커널 (CLAUDE.md) |
식별, 라우팅, 모델 정책, 에이전트 레지스트리 | Git으로 추적됨 |
에이전트 (agents/) |
범위가 지정된 도구와 메모리를 갖춘 전문 아이덴티티 | Git으로 관리됨 |
명령어 (.claude/commands/) |
사용자용 슬래시 명령어 (/daily-sync, /outreach) |
Git으로 추적됨 |
스크립트 (scripts/) |
cron 또는 웹훅에 의해 트리거되는 Python/JS 데몬 | Git으로 추적되는 |
상태 (data/) |
추가 전용 로그, 프로젝트 상태, 의사 결정 기록 | Git에서 무시되거나 추적됨 |
커널
CLAUDE.md 는 커널입니다. 이는 COO/오케스트레이터 역할을 합니다. 클로드는 세션 시작 시 이를 읽고, 이를 통해 작업을 라우팅합니다.
커널 구조
# CLAUDE.md - Agentic OS Kernel
## Identity
You are the COO of [project-name]. You route tasks to specialist agents.
You never write code directly. You delegate to the right agent and synthesize results.
## Agent Registry
| Agent | Role | Trigger |
|---|---|---|
| @dev | Code, architecture, debugging | User says "build", "fix", "refactor" |
| @writer | Documentation, content, emails | User says "write", "draft", "blog" |
| @researcher | Research, analysis, fact-checking | User says "research", "analyze", "compare" |
| @ops | DevOps, deployment, infrastructure | User says "deploy", "CI", "server" |
## Routing Rules
1. Parse the user request for intent keywords
2. Match to the Agent Registry trigger column
3. Load the corresponding agent file from `agents/.md`
4. Hand off execution with full context
5. Synthesize and present the result back to the user
## Model Policies
- Default model: use the repository or harness default.
- @dev tasks: prefer a higher-reasoning model for complex architecture.
- @researcher tasks: use the configured research-capable model and approved search tools.
- Cost ceiling: warn before exceeding the project's configured spend threshold.
핵심 원칙
커널은 작고 선언적이어야 합니다. 작업 배분 로직은 코드가 아닌 일반 마크다운 표에 포함됩니다. 이를 통해 디버깅 없이도 시스템을 검토하고 편집할 수 있습니다.
전문 에이전트
각 에이전트는 agents/. Claude는 작업을 라우팅할 때 관련 에이전트 파일을 불러옵니다.
에이전트 정의 형식
# @dev - Software Engineer
## Identity
You are a senior software engineer. You write clean, tested, production-grade code.
You prefer simple solutions. You ask clarifying questions when requirements are ambiguous.
## Memory Scope
- Read `data/projects/.md` for context
- Read `data/decisions/` for architectural decisions
- Append execution logs to `data/logs/[email protected]`
## Tool Access
- Full filesystem access within project root
- Git operations (status, diff, commit, branch)
- Test runner access
- MCP servers as configured in `.claude/mcp.json`
## Constraints
- Always write tests for new features
- Never commit directly to `main`; use feature branches
- Prefer editing existing files over creating new ones
- Keep functions under 50 lines when possible
다중 에이전트 협업 패턴
작업이 여러 에이전트에 걸쳐 있는 경우, 커널은 이를 순차적으로 또는 병렬로 실행합니다:
User: "Build a landing page and write the launch blog post"
Kernel routing:
1. @dev - "Build a landing page with [requirements]"
2. @writer - "Write a launch blog post for [product] using the landing page copy"
3. Kernel synthesizes both outputs into a unified response
병렬 실행을 위해서는 Claude Code의 백그라운드 작업 기능을 사용하거나, 특정 에이전트 컨텍스트로 Claude Code를 호출하는 셸 스크립트를 사용하십시오.
명령어 및 일상 업무 워크플로우
슬래시 명령어는 .claude/commands/. 이들은 재사용 가능한 워크플로를 정의합니다.
명령어 구조
# /daily-sync
Run the morning briefing:
1. Read `data/logs/last-sync.md` for context
2. Check project status: `git status`, pending PRs, CI health
3. Review `data/inbox/` for new tasks or decisions needed
4. Generate a summary of blockers, priorities, and next actions
5. Append the briefing to `data/logs/daily/.md`
표준 명령어 세트
| 명령어 | 목적 |
|---|---|
/daily-sync |
아침 브리핑: 현황, 장애 요인, 우선순위 |
/outreach |
외부 소통 워크플로우 실행 (이메일, LinkedIn 등) |
/research |
인용 추적을 통한 심층 조사 |
/apply-jobs |
목표 직무에 맞춰 이력서 및 자기소개서 수정 |
/analytics |
Stripe, GitHub 또는 사용자 지정 소스에서 지표 추출 |
/interview-prep |
플래시카드 또는 모의 면접 질문 생성 |
/decision |
장단점과 선택한 경로를 포함한 결정 사항 기록 |
명령 실행
명령어 파일을 .claude/commands/. Claude Code가 이를 자동으로 감지합니다. 사용자는 다음 명령어로 이를 호출합니다. /.
영구 저장소
메모리는 파일 기반입니다. 벡터 DB, Redis, PostgreSQL은 사용하지 않습니다. data/ 에 있는 JSON 및 마크다운 파일이 데이터베이스 역할을 합니다.
메모리 디렉터리 구조
data/
├── daily-logs/ # Append-only daily activity logs
├── projects/ # Per-project context files
├── decisions/ # Architectural and business decisions (ADR format)
├── inbox/ # New tasks or ideas awaiting triage
├── contacts/ # People, companies, relationship notes
└── templates/ # Reusable prompts and formats
일일 로그 형식
# 2026-04-22 - Daily Log
## Sessions
- 09:00 - Session 1: Refactored auth module (@dev)
- 11:30 - Session 2: Drafted investor update (@writer)
## Decisions
- Switched from JWT to session cookies (see `data/decisions/2026-04-22-auth.md`)
## Blockers
- Waiting on API key from vendor (follow up 2026-04-24)
## Next Actions
- [ ] Merge auth refactor PR
- [ ] Send investor update for review
자동 리플렉션 패턴
각 세션이 끝날 때마다 커널은 다음과 같은 리플렉션을 추가합니다:
## Reflection - Session 3
- What worked: Parallel agent execution saved 20 minutes
- What didn't: @researcher hit a paywalled source, need better source ranking
- What to change: Add `source-tier` field to research notes (A/B/C credibility)
이를 통해 코드 변경 없이도 시간이 지남에 따라 시스템을 개선하는 피드백 루프가 형성됩니다.
예약된 자동화
Agentic OS 작업은 Claude Code의 내장 크론(세션 종료 시 중단됨)이 아닌 외부 크론을 사용하여 일정에 따라 실행됩니다.
macOS: LaunchAgent
Label
com.agentic.daily-sync
ProgramArguments
/claude
--cwd
/path/to/project
--command
/daily-sync
StartCalendarInterval
Hour
8
Minute
0
StandardOutPath
/tmp/agentic-daily-sync.log
Linux: systemd Timer
# ~/.config/systemd/user/agentic-daily-sync.service
[Unit]
Description=Agentic OS Daily Sync
[Service]
Type=oneshot
ExecStart=/usr/local/bin/claude --cwd /path/to/project --command /daily-sync
# ~/.config/systemd/user/agentic-daily-sync.timer
[Unit]
Description=Run daily sync every morning
[Timer] 8:00:00
Persistent=true
[Install]
WantedBy=timers.target
크로스 플랫폼: pm2
# ecosystem.config.js
module.exports = {
apps: [{
name: 'agentic-daily-sync',
script: 'claude',
args: '--cwd /path/to/project --command /daily-sync',
cron_restart: '0 8 * * *',
autorestart: false
}]
};
데이터 계층
데이터 계층은 파일 시스템입니다. 구조화된 데이터에는 JSON을, 서술형 콘텐츠에는 마크다운을 사용하십시오.
구조화된 상태를 위한 JSON
// data/projects/website-v2.json
{
"name": "Website v2",
"status": "in-progress",
"milestone": "beta-launch",
"agents_involved": ["@dev", "@writer"],
"files": {
"spec": "docs/website-v2-spec.md",
"design": "designs/website-v2.fig"
},
"metrics": {
"commits": 47,
"last_session": "2026-04-22T11:30:00Z"
}
}
설명형 콘텐츠용 마크다운
사람이 읽는 모든 내용(결정 사항, 로그, 연구 노트, 연락처 기록 등)에는 마크다운을 사용하십시오.
스키마 진화
기존 필드의 이름을 절대 변경하지 마십시오. 새 필드를 추가하고 기존 필드는 더 이상 사용하지 않는 것으로 표시하십시오:
{
"name": "Website v2",
"status": "in-progress",
"milestone": "beta-launch",
"_deprecated_priority": "high",
"priority_v2": { "level": "high", "rationale": "Blocks investor demo" }
}
이렇게 하면 마이그레이션 스크립트 없이도 과거 데이터를 계속 읽을 수 있습니다.
반패턴
모놀리식 단일 에이전트
# BAD - One agent does everything
You are a full-stack developer, writer, researcher, and DevOps engineer.
전문 에이전트로 분할하십시오. 라우팅은 커널이 처리합니다.
상태 비저장 세션
# BAD - No memory between sessions
Starting fresh every time Claude Code opens.
항상 data/ 세션 시작 시 읽고, 세션 종료 시 다시 기록한다.
하드코딩된 인증 정보
# BAD - API keys in agent files or CLAUDE.md
Your OpenAI API key is sk-xxxxxxxx
환경 변수나 스크립트로 불러온 .env 스크립트를 통해 불러온 파일을 사용하십시오. 에이전트는 process.env.API_KEY.
간단한 상태 관리를 위한 외부 데이터베이스
# BAD - PostgreSQL for a solo user's agentic OS
동시 사용자가 여러 명이나 데이터가 GB 단위에 달할 때까지는 JSON/마크다운 파일을 사용하십시오.
과도하게 설계된 라우팅
# BAD - Routing logic in code instead of markdown tables
if (intent.includes('deploy')) { agent = opsAgent; }
라우팅은 CLAUDE.md 마크다운 테이블에 선언적으로 유지하십시오. 이렇게 하면 내용을 확인하고, 편집하고, 디버깅할 수 있습니다.
모범 사례
-
CLAUDE.md200줄 미만이며 컨텍스트 창에 들어갈 수 있어야 합니다 - 각 에이전트 파일은 100줄 미만이며 하나의 도메인에 집중해야 합니다
-
data/민감한 로그에 대해서는 git-ignore로 처리하고, 결정 사항 및 사양에 대해서는 git으로 추적해야 합니다 - 명령어는 명령형 이름을 사용합니다:
/daily-sync,/run-daily-sync - 로그는 추가 전용이며, 일별 이전 로그를 절대 수정하지 않습니다
- 모든 에이전트에는
Memory Scope어떤 파일을 읽을지 정의하는 섹션이 있습니다 - 반성 내용은 매 세션이 끝날 때마다 기록됩니다
- 예약된 작업은 Claude Code의 세션 크론이 아닌 외부 크론(LaunchAgent, systemd, pm2)을 사용합니다
- 비용 추적: 세션별 API 사용량을
data/logs/-costs.json - 하나의 프로젝트 = 하나의 Agentic OS입니다. 서로 관련 없는 프로젝트 간에
CLAUDE.md사용하지 마십시오.
---
name: agentic-os
description: Build persistent multi-agent operating systems on Claude Code with kernel architecture, specialist agents, slash commands, file-based memory, and scheduled automation.
---
# Agentic OS
Treat Claude Code as a persistent runtime / operating system rather than a chat session. This skill codifies the architecture used by production agentic setups: a kernel config that routes tasks to specialist agents, persistent file-based memory, scheduled automation, and a JSON/markdown data layer.
## When to Activate
- Building a multi-agent workflow inside Claude Code
- Setting up persistent Claude Code automation that survives session restarts
- Creating a "personal OS" or "agentic OS" for recurring tasks
- User says "agentic OS", "personal OS", "multi-agent", "agent coordinator", "persistent agent"
- Structuring long-running projects where context must survive across sessions
## Architecture Overview
The Agentic OS has four layers. Each layer is a directory in your project root.
```
project-root/
├── CLAUDE.md # Kernel: identity, routing rules, agent registry
├── agents/ # Specialist agent definitions (markdown prompts)
├── .claude/commands/ # Slash commands: user-facing CLI
├── scripts/ # Daemon scripts: scheduled or event-driven tasks
└── data/ # State: JSON/markdown filesystem, no external DB
```
### Layer Responsibilities
| Layer | Purpose | Persistence |
|---|---|---|
| Kernel (`CLAUDE.md`) | Identity, routing, model policies, agent registry | Git-tracked |
| Agents (`agents/`) | Specialist identities with scoped tools and memory | Git-tracked |
| Commands (`.claude/commands/`) | User-facing slash commands (`/daily-sync`, `/outreach`) | Git-tracked |
| Scripts (`scripts/`) | Python/JS daemons triggered by cron or webhooks | Git-tracked |
| State (`data/`) | Append-only logs, project state, decision records | Git-ignored or tracked |
## The Kernel
`CLAUDE.md` is the kernel. It acts as the COO / orchestrator. Claude reads it at session start and uses it to route work.
### Kernel Structure
```markdown
# CLAUDE.md - Agentic OS Kernel
## Identity
You are the COO of [project-name]. You route tasks to specialist agents.
You never write code directly. You delegate to the right agent and synthesize results.
## Agent Registry
| Agent | Role | Trigger |
|---|---|---|
| @dev | Code, architecture, debugging | User says "build", "fix", "refactor" |
| @writer | Documentation, content, emails | User says "write", "draft", "blog" |
| @researcher | Research, analysis, fact-checking | User says "research", "analyze", "compare" |
| @ops | DevOps, deployment, infrastructure | User says "deploy", "CI", "server" |
## Routing Rules
1. Parse the user request for intent keywords
2. Match to the Agent Registry trigger column
3. Load the corresponding agent file from `agents/<name>.md`
4. Hand off execution with full context
5. Synthesize and present the result back to the user
## Model Policies
- Default model: use the repository or harness default.
- @dev tasks: prefer a higher-reasoning model for complex architecture.
- @researcher tasks: use the configured research-capable model and approved search tools.
- Cost ceiling: warn before exceeding the project's configured spend threshold.
```
### Key Principle
The kernel should be **small and declarative**. Routing logic lives in plain markdown tables, not code. This makes the system inspectable and editable without debugging.
## Specialist Agents
Each agent is a standalone markdown file in `agents/`. Claude loads the relevant agent file when routing a task.
### Agent Definition Format
```markdown
# @dev - Software Engineer
## Identity
You are a senior software engineer. You write clean, tested, production-grade code.
You prefer simple solutions. You ask clarifying questions when requirements are ambiguous.
## Memory Scope
- Read `data/projects/<current-project>.md` for context
- Read `data/decisions/` for architectural decisions
- Append execution logs to `data/logs/<date>[email protected]`
## Tool Access
- Full filesystem access within project root
- Git operations (status, diff, commit, branch)
- Test runner access
- MCP servers as configured in `.claude/mcp.json`
## Constraints
- Always write tests for new features
- Never commit directly to `main`; use feature branches
- Prefer editing existing files over creating new ones
- Keep functions under 50 lines when possible
```
### Multi-Agent Collaboration Pattern
When a task spans multiple agents, the kernel runs them sequentially or in parallel:
```
User: "Build a landing page and write the launch blog post"
Kernel routing:
1. @dev - "Build a landing page with [requirements]"
2. @writer - "Write a launch blog post for [product] using the landing page copy"
3. Kernel synthesizes both outputs into a unified response
```
For parallel execution, use Claude Code's background task capability or shell scripts that invoke Claude Code with specific agent contexts.
## Commands and Daily Workflows
Slash commands are markdown files in `.claude/commands/`. They define reusable workflows.
### Command Structure
```markdown
# /daily-sync
Run the morning briefing:
1. Read `data/logs/last-sync.md` for context
2. Check project status: `git status`, pending PRs, CI health
3. Review `data/inbox/` for new tasks or decisions needed
4. Generate a summary of blockers, priorities, and next actions
5. Append the briefing to `data/logs/daily/<date>.md`
```
### Standard Command Set
| Command | Purpose |
|---|---|
| `/daily-sync` | Morning briefing: status, blockers, priorities |
| `/outreach` | Run outreach workflow (email, LinkedIn, etc.) |
| `/research <topic>` | Deep research with citation tracking |
| `/apply-jobs` | Tailor resume + cover letter for a target role |
| `/analytics` | Pull metrics from Stripe, GitHub, or custom sources |
| `/interview-prep` | Generate flashcards or mock interview questions |
| `/decision <topic>` | Log a decision with pros/cons and chosen path |
### Activating Commands
Place command files in `.claude/commands/<command-name>.md`. Claude Code auto-discovers them. Users invoke them with `/<command-name>`.
## Persistent Memory
Memory is file-based. No vector DB, no Redis, no PostgreSQL. JSON and markdown files in `data/` are the database.
### Memory Directory Structure
```
data/
├── daily-logs/ # Append-only daily activity logs
├── projects/ # Per-project context files
├── decisions/ # Architectural and business decisions (ADR format)
├── inbox/ # New tasks or ideas awaiting triage
├── contacts/ # People, companies, relationship notes
└── templates/ # Reusable prompts and formats
```
### Daily Log Format
```markdown
# 2026-04-22 - Daily Log
## Sessions
- 09:00 - Session 1: Refactored auth module (@dev)
- 11:30 - Session 2: Drafted investor update (@writer)
## Decisions
- Switched from JWT to session cookies (see `data/decisions/2026-04-22-auth.md`)
## Blockers
- Waiting on API key from vendor (follow up 2026-04-24)
## Next Actions
- [ ] Merge auth refactor PR
- [ ] Send investor update for review
```
### Auto-Reflection Pattern
At the end of each session, the kernel appends a reflection:
```markdown
## Reflection - Session 3
- What worked: Parallel agent execution saved 20 minutes
- What didn't: @researcher hit a paywalled source, need better source ranking
- What to change: Add `source-tier` field to research notes (A/B/C credibility)
```
This creates a feedback loop that improves the system over time without code changes.
## Scheduled Automation
Agentic OS tasks run on a schedule using external cron, not Claude Code's built-in cron (which dies when the session ends).
### macOS: LaunchAgent
```xml
<!-- ~/Library/LaunchAgents/com.agentic.daily-sync.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.agentic.daily-sync</string>
<key>ProgramArguments</key>
<array>
<string>/claude</string>
<string>--cwd</string>
<string>/path/to/project</string>
<string>--command</string>
<string>/daily-sync</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>8</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/tmp/agentic-daily-sync.log</string>
</dict>
</plist>
```
### Linux: systemd Timer
```ini
# ~/.config/systemd/user/agentic-daily-sync.service
[Unit]
Description=Agentic OS Daily Sync
[Service]
Type=oneshot
ExecStart=/usr/local/bin/claude --cwd /path/to/project --command /daily-sync
```
```ini
# ~/.config/systemd/user/agentic-daily-sync.timer
[Unit]
Description=Run daily sync every morning
[Timer]
OnCalendar=*-*-* 8:00:00
Persistent=true
[Install]
WantedBy=timers.target
```
### Cross-Platform: pm2
```bash
# ecosystem.config.js
module.exports = {
apps: [{
name: 'agentic-daily-sync',
script: 'claude',
args: '--cwd /path/to/project --command /daily-sync',
cron_restart: '0 8 * * *',
autorestart: false
}]
};
```
## Data Layer
The data layer is your filesystem. Use JSON for structured data and markdown for narrative content.
### JSON for Structured State
```json
// data/projects/website-v2.json
{
"name": "Website v2",
"status": "in-progress",
"milestone": "beta-launch",
"agents_involved": ["@dev", "@writer"],
"files": {
"spec": "docs/website-v2-spec.md",
"design": "designs/website-v2.fig"
},
"metrics": {
"commits": 47,
"last_session": "2026-04-22T11:30:00Z"
}
}
```
### Markdown for Narrative
Use markdown for anything a human reads: decisions, logs, research notes, contact records.
### Schema Evolution
Never rename existing fields. Add new fields and mark old ones deprecated:
```json
{
"name": "Website v2",
"status": "in-progress",
"milestone": "beta-launch",
"_deprecated_priority": "high",
"priority_v2": { "level": "high", "rationale": "Blocks investor demo" }
}
```
This keeps historical data readable without migration scripts.
## Anti-Patterns
### Monolithic Single Agent
```markdown
# BAD - One agent does everything
You are a full-stack developer, writer, researcher, and DevOps engineer.
```
Split into specialist agents. The kernel handles routing.
### Stateless Sessions
```markdown
# BAD - No memory between sessions
Starting fresh every time Claude Code opens.
```
Always read `data/` at session start and write back at session end.
### Hardcoded Credentials
```markdown
# BAD - API keys in agent files or CLAUDE.md
Your OpenAI API key is sk-xxxxxxxx
```
Use environment variables or a `.env` file loaded by scripts. Agents reference `process.env.API_KEY`.
### External Database for Simple State
```markdown
# BAD - PostgreSQL for a solo user's agentic OS
```
Use JSON/markdown files until you have multiple concurrent users or GBs of data.
### Over-Engineered Routing
```markdown
# BAD - Routing logic in code instead of markdown tables
if (intent.includes('deploy')) { agent = opsAgent; }
```
Keep routing declarative in `CLAUDE.md` markdown tables. It is inspectable, editable, and debuggable.
## Best Practices
- [ ] `CLAUDE.md` is under 200 lines and fits in context window
- [ ] Each agent file is under 100 lines and focused on one domain
- [ ] `data/` is git-ignored for sensitive logs, git-tracked for decisions and specs
- [ ] Commands use imperative names: `/daily-sync`, not `/run-daily-sync`
- [ ] Logs are append-only; never edit past daily logs
- [ ] Every agent has a `Memory Scope` section defining what files it reads
- [ ] Reflections are written at the end of every session
- [ ] Scheduled tasks use external cron (LaunchAgent, systemd, pm2), not Claude Code's session cron
- [ ] Cost tracking: log API spend per session in `data/logs/<date>-costs.json`
- [ ] One project = one Agentic OS. Do not share a single `CLAUDE.md` across unrelated projects.
모든 파일
1개 파일agentic-os 설치
스킬 파일을 다운로드하여 .claude/skills/ 디렉터리에 압축을 풀어주세요.
ZIP 다운로드저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.
git clone https://github.com/affaan-m/ECC/tree/main/skills/agentic-os # Copy SKILL.md to your .claude/skills/ directory
복사





집
