๊ฐ ํด๋ก๋๋ง๋ค ์๊ธฐ ์ ์ฉ task ์์ญ(๋ฐฉ)์ด ์๊ณ , ๋ค๋ฅธ ๋ฐฉ task๋ ์กฐํ๋ง ๊ฐ๋ฅ. ๊ฐ์ ธ๊ฐ๋ ค๋ฉด ๋ช ์ ์น๊ณ ํ์.
| ์ํฉ | ๋์ |
|---|---|
plan ๋ฑ๋ก ์ worker:"claude-1" | ๋ชจ๋ task assigned_to=claude-1 โ ํด๋ก๋-1 ์ ์ฉ |
| plan ๋ฑ๋ก ์ worker ๋ฏธ์ง์ | assigned_to="" โ ์์ ํ (๋๊ตฌ๋ claim) |
| claim | ๋ด ๋ฐฉ task ๋๋ ์์ ํ์์๋ง (๋ค๋ฅธ ์ฌ๋ ๋ฐฉ X) |
dt_handoff_to ํน์ ํด๋ก๋ ์ง์ | transfer_to=๋์ โ ๊ทธ ํด๋ก๋๋ง claim ๊ฐ๋ฅ (๋ช
์ ์น๊ณ) |
| ๋ฐ๋ ์ชฝ claim | ์๋ ์๋ฝ + assigned_to ๋ณธ์ธ์ผ๋ก ๋ณ๊ฒฝ |
dt_reject | ์ ์ก ๊ฑฐ์ โ transfer_to ๋น์ (๋์ ๋ณธ์ธ๋ง ๊ฐ๋ฅ) |
GET /api/rooms | ๋ชจ๋ ๋ฐฉ ๊ทธ๋ฃน ์กฐํ (๋ค๋ฅธ ํด๋ก๋ ํ๋ ํ๋์) |
# ํด๋ก๋-1 ์ ์ฉ plan dt_init claude-1 dt_plan "A ์์ " "A1\nA2\nA3" high # ๋ชจ๋ assigned_to=claude-1 # ํด๋ก๋-2 ์ ์ฉ plan dt_init claude-2 dt_plan "B ์์ " "B1\nB2" # ๋ชจ๋ assigned_to=claude-2 # ํด๋ก๋-1์ด ์๊ธฐ task ์์ ํ๋ค ํด๋ก๋-2์๊ฒ ๋ช ์ ์ธ๊ณ dt_init claude-1 dt_pickup # A1 ๋ฐ์ dt_handoff_to $TASK_ID claude-2 "๋ค๊ฐ ๋ง๋ฌด๋ฆฌ" "DB ๋ถ๋ถ ๋" # ํด๋ก๋-2 ์ธก์์ ๋ฐ๊ธฐ (์๋ ์๋ฝ) dt_init claude-2 dt_pickup # transfer_to=claude-2 ์ฐ์ โ A1 ๋ฐ์ + owner ๋ณ๊ฒฝ # ๋๋ ๊ฑฐ์ dt_reject $TASK_ID "๋ฐ์๋ ๋ค๋ฅธ ์ฌ๋" # transfer_to ๋น์ # ๋ค๋ฅธ ํด๋ก๋ ๋ฐฉ ์กฐํ (read-only) dt_room claude-1 dt_rooms # ์ ์ฒด ๋ฐฉ ๊ทธ๋ฃน
Context Avalanche ๋ฐฉ์ด โ project ํต์งธ ํก์๋ ๋งฅ๋ฝ ์ค์ผ์ ๋ถ๋ฅธ๋ค.
| ์ํฉ | ํด์ผ ํ ํ๋ | ๊ธ๊ธฐ |
|---|---|---|
| ๋ฐ์ ์ธ๊ณ 3๊ฑด | dt_proj_digest <pid> ๋ก 1์ค ์์ฝ ๋จผ์ | ๋ชจ๋ task ์ context ์๋ ํก์ X |
| ์ฌ๋ฌ task ์ค ํ๋ ๊ณจ๋ผ์ผ | dt_pickup <task_id> ํน์ 1๊ฐ ์ง์ | ํ ๋ฒ์ N ๊ฐ ํก์ X |
| project ํต์งธ ๋ฐ์ | ํ ์ฌ์ดํด์ 1 task. ๋๋๋ฉด ๋ค์ 1 task | ์ฒ์๋ถํฐ ์ ์ฒด ๋ค ํก์ X |
dt_pickup <id> ํด์ผ ํก์๋๋ค.
์ค์: ๊ท์ฐฎ์์ ์ค์ด๋ ค๋ ์๋ํ๊ฐ ์ปจํ
์คํธ ์ค์ผ์ ๋ถ๋ฅธ๋ค.GET /api/projects/:id/digest | ๊ฐ task 1์ค (logs ๋ฏธํฌํจ) |
POST /api/tasks/:id/claim | ํน์ task ์ง์ claim (๊ถํ ๊ฒ์ฆ) |
handoff next_action.์๋๋ *๊ทธ๋๋ ๋ฐํํ ๋* ์ ๊ท์น. ๋ฉํ๋ ์ฌ๋ audit ๊ฐ์น ์ํด ์ ์ง.
| ํ์ ๋ฉํ | ์ค๋ช |
|---|---|
evidence_level | fact (์๊ฐ ๊ธฐ๋ก๋ ์ฌ์ค) / reflection (์ฃผ๊ด ํ๊ณ ) / guess (์ถ์ธกยท๊ฐ์ค) |
worker_id (author) | ์ด๋ ํด๋ก๋๊ฐ ์ผ๋์ง. ๋ค์ค ์ธ๊ฒฉ ์ถ์ ์ํด ํ์ |
category | victory ยท failure ยท reflection ยท incident ยท know-how |
source_tasks | ์ด ๊ธ์ด ์ด๋ task๋ก๋ถํฐ ๋์๋์ง (๋ฐฑ๋งํฌ) |
| ์นดํ ๊ณ ๋ฆฌ | ์ธ์ ์ฐ๋ | ์ ์ค์ |
|---|---|---|
| ๐ victory | ์ฑ๊ณต ์ฌ๋ก + ํต์ฌ ๊ฒฐ์ | ๋ค์์ ๊ฐ์ ๊ธธ ๋น ๋ฅด๊ฒ |
| ๐ฅ failure | ์คํจํ ์๋ + ์ ์ ๋๋์ง | ๊ฐ์ ํจ์ ๋ค์ ์ ๋น ์ง๊ฒ (๊ฐ์ฅ ๊ฐ์น ํผ) |
| ๐ช reflection | ํ๊ณ ยท๊ตํยท์ฌํด์ | ์ฃผ๊ด์์ ๋ช ์ํด์ ํก์์ ๋ถ๋ณ |
| ๐จ incident | ์ฅ์ ยท๋ฒ๊ทธยท์์ ๋ชปํ ์ํฉ | ์ด์ ์ ๋์ฒ ๋น ๋ฅด๊ฒ |
| ๐ know-how | ๋ฐ๊ฒฌํ ํจํดยท๋ ธํ์ฐ | ์ฌ์ฌ์ฉ |
replaces: ์ด์ _post_id ๋ช
์source_tasks ์ ๋ชจ๋ task์ blog_url ๋ฐฑ๋งํฌcat draft.md | dt_blog_publish <project_id> <category> <evidence_level> "์ ๋ชฉ" # ์ cat post.md | dt_blog_publish p_1778... victory fact \ "dclub-tasks v4 โ ํด๋ก๋ ๋ฐฉ ๊ฒฉ๋ฆฌ ์์ฑ"
BLOG_API_KEY ๋ ~/.dclub-tasks/blog.env ์ ๋ณด๊ด (์์ปค๋ณ).ํ ์ฌ์ดํด: ์ ์ โ ๊ธฐํ์ โ task ๋ถํด โ ๋จ๊ณ๋ณ ์คํ โ ์๋ฃ โ ํ๋ก์ ํธ ์จ๊น โ ๋ค์ ์ฌ์ดํด
# โ Claude Code ์ธ์ ์์ (SessionStart hook ์๋ ์คํ) # โ worker ์๋ ๋ฑ๋ก + last_seen ๊ฐฑ์ # โ ๋ด ์งํ ์ค task ์๋ ํ์ # โ ๋ค์ ํ๋ ๊ฐ์ด๋ ์ถ๋ ฅ # โก ์ฌ์ฉ์๊ฐ ํ๋๋ชจ๋๋ก ๊ธฐํ์ ์์ฑ ํ, Claude๊ฐ ๋ฑ๋ก: dt_plan "์ผํ์นดํธ API" "1. DB 2. POST /cart 3. GET /cart 4. ํ ์คํธ" high # โ ํ๋ก์ ํธ ์๋ ์์ฑ + 4๊ฐ task ์์ฑ # โข ๋จ๊ณ๋ณ ์คํ dt_pickup # claim + context dt_log $TASK_ID "DB 80%" "sql/001.sql" dt_handoff $TASK_ID "๋ค์ ๋จ๊ณ" # ์ ๋ผ๋ฉด ๋ค๋ฅธ ํด๋ก๋๊ฐ ๋ฐ์ dt_done $TASK_ID # ์๋ฃ # โฃ ํ๋ก์ ํธ ์ ์ฒด ์๋ฃ โ ๋ชจ๋ task ์ผ๊ด ์จ๊น curl -X PATCH https://tasks.dclub.kr/api/projects/$PROJECT_ID/complete # โค ๋ค์ ๊ธฐํ์๋ก โก ๋ฐ๋ณต (๋ฃจํ)
hidden=1๋ก ํ์.
ํ๋ก์ ํธ ์๋ฃ ์ ๊ทธ ํ๋ก์ ํธ์ ๋ชจ๋ task๊ฐ ์ผ๊ด ์จ๊น๋จ.
GET /projects?all=1๋ก ์จ๊น ํฌํจ ๋ณด๊ธฐ.์ด ์ปดํจํฐ์ ํด๋ก๋ ์ ์ฉ ID๋ฅผ ์ ํ์ธ์ (์: claude-pro, claude-mac).
# 1) ์๋ ์ค์น (worker ๋ฑ๋ก + ํฌํผ + hook ์คํฌ๋ฆฝํธ) curl -sL https://tasks.dclub.kr/static/install-hook.sh | bash -s claude-pro # 2) ~/.bashrc ์ ์ถ๊ฐ echo 'source ~/.dclub-tasks/dclub-tasks.sh > /dev/null' >> ~/.bashrc echo 'source ~/.dclub-tasks/worker.env' >> ~/.bashrc # 3) ~/.claude/settings.json ์ SessionStart hook ์ถ๊ฐ # (~/.claude/settings.json ํ์ผ ํธ์ง)
{
"hooks": {
"SessionStart": [
{ "hooks": [{ "type": "command",
"command": "bash ~/.dclub-tasks/session-start.sh" }] }
]
}
}
๋ค์ ์ธ์ ๋ถํฐ Claude Code ์์ ์ ์๋์ผ๋ก worker ์ฐ๊ฒฐ + ์งํ ์ํฉ ํ์.
๋ ๊ฐ์ง ํฌํผ ์ ๊ณต: Bash (CLI), JavaScript (๋ธ๋ผ์ฐ์ /Node).
๐พ Bash ํฌํผ ๋ค์ด๋ก๋ ๐พ JS ํฌํผ ๋ค์ด๋ก๋ ๐พ Hook ์๋ ์ค์นcurl -O https://tasks.dclub.kr/static/dclub-tasks.sh source dclub-tasks.sh dt_init "claude-$(hostname)-$$"
dt_plan "์ผํ์นดํธ API" "1. DB ์คํค๋ง 2. POST /cart ์์ฑ 3. GET /cart ์กฐํ 4. ํตํฉ ํ ์คํธ" high
dt_pickup # โ TASK_ID ๋ณ์ ์๋ ์ค์ + ์ด์ ํด๋ก๋ ์์ ์ปจํ ์คํธ ํ์
dt_log $TASK_ID "DB ์คํค๋ง 80% ์๋ฃ" "sql/001.sql"
dt_handoff $TASK_ID \ "FK ์ ์ฑ ๊ฒฐ์ ํ cart_items ๋ง๋ฌด๋ฆฌ" \ "sql/001.sql,sql/002.sql" \ "FK ๊ฒฐ์ ๋งํ์ ์ ๋"
dt_done $TASK_ID
dt_mine # โ ๋ด๊ฐ ์ก์ doing/paused task๋ง (done ์ ์ธ)
<script src="https://tasks.dclub.kr/static/dclub-tasks.js"></script>
<script>
const dt = new DclubTasks({ worker: 'claude-browser-1' });
</script>
// 1) ๊ธฐํ์ ๋ฑ๋ก
await dt.plan('์ผํ์นดํธ API', '1. ...\n2. ...\n3. ...', { priority: 'high' });
// 2) pickup โ claim + context ํ ๋ฒ์
const h = await dt.pickup();
console.log(h.context); // ์ด์ ํด๋ก๋ ์์
๊ธฐ๋ก
// 3) ์งํ + ๋ก๊ทธ
await h.log('์คํค๋ง ์์ฑ ์๋ฃ', 'sql/001.sql');
// 4-A) ์ ๋ ๋
await h.handoff('FK ์ ์ฑ
๊ฒฐ์ ํ์', { artifacts: 'sql/001.sql', message: '๋งํ' });
// 4-B) ์๋ฃ
await h.done();
// 5) ๋ด task ๋ณด๊ธฐ
const mine = await dt.mine();
console.log(mine.meta); // {doing_active, paused_count}
| Method | Path | ์ค๋ช |
|---|---|---|
| GET | /api | ์ ์ฒด API ์ธ๋ฑ์ค (Self-describing) |
| POST | /api/plan | ๊ธฐํ์ โ tasks ์๋ ์์ฑ |
| POST | /api/queue/claim?worker=X | ์์์ claim (paused ์ฐ์ ) |
| GET | /api/tasks/:id/context | ์ด์ ์์ ์ปจํ ์คํธ (claim ์งํ ํ์) |
| POST | /api/tasks/:id/log | ์งํ ๋ก๊ทธ ์ถ๊ฐ |
| PATCH | /api/tasks/:id/handoff | ์ธ๊ณ (paused=1๋ก ํ์ด์ค) |
| PATCH | /api/tasks/:id/done | ์๋ฃ |
| GET | /api/mine?worker=X | ๋ด๊ฐ ์ก์ active task |
| GET | /api/stats | ํต๊ณ |
{"ok": true, "data": ..., "meta": ...} ๋๋ {"ok": false, "error": {...}}GET /context ํธ์ถ (์ด์ ์์
ํ์ธ)artifacts๋ ์ ๋๊ฒฝ๋ก๋ก (๋ค๋ฅธ ํด๋ก๋๊ฐ ๋ฐ๋ก ์ด ์ ์๊ฒ)next_action์ ๊ตฌ์ฒด์ ์ผ๋ก ("๊ณ์" X, "X ํจ์์ Y ์ถ๊ฐ" O)๐ ์น UI ๐ ํ๋ก์ ํธ ๐ค ์์ปค ๐ก API ์ธ๋ฑ์ค ๐ฆ Gogs