์‹ฌ๋ฒŒ ๋งˆํฌ

Curify์— ๊ฐ€์ž…ํ•˜์—ฌ ๊ท€ํ•˜์˜ ๋น„๋””์˜ค๋ฅผ ์„ธ๊ณ„ํ™”ํ•˜์„ธ์š”

๋˜๋Š”

Curify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ์‚ฌํ•ญ์— ๋™์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์„œ๋น„์Šค ์•ฝ๊ด€ ๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…

๐Ÿ—๏ธ QA ๋ด‡์—์„œ ์ž‘์—… ์—์ด์ „ํŠธ๋กœ: ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ

TL;DR: ์งˆ๋ฌธ์—๋งŒ ๋‹ตํ•˜๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”. ์‹ค์ œ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜์„ธ์š”.

์ด ๊ฐ€์ด๋“œ๋Š” ์ •์  ๊ทœ์น™, ๋™์  ๊ธฐ์ˆ  ๋ฐ ๊ฒฐ์ •๋ก ์  ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ QA ๋ด‡์—์„œ ์ž‘์—… ์—์ด์ „ํŠธ๋กœ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ณ€ํ™”๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ์˜คํ”ˆ ์†Œ์Šค ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž‘์—… ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ด์…˜

1. ํ•ต์‹ฌ ๋ณ€ํ™”: QA ๋ด‡ โ†’ ์ž‘์—… ์—์ด์ „ํŠธ

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ AI ์‹œ์Šคํ…œ์€ ์—ฌ์ „ํžˆ ๋งฅ๋ฝ์ด ๊ฐ€๋“ํ•œ QA ๋ด‡์ž…๋‹ˆ๋‹ค:

โ€ข ์งˆ๋ฌธ์— ์ž˜ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

โ€ข ์••๋ฐ•์„ ๋ฐ›์„ ๋•Œ ํ™˜๊ฐ์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.

โ€ข ์‹คํ–‰, ์•ˆ์ „ ๋ฐ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํ•ต์‹ฌ ํ†ต์ฐฐ: ๋งฅ๋ฝ์„ ํ™•์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ตฌ์กฐํ™”ํ•˜์„ธ์š”.

2. 3๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜

๐Ÿงฑ 1. ์ •์  ๋งฅ๋ฝ โ€” ๊ทœ์น™ (ํ•ญ์ƒ ์ผœ์ง)

  • โ€ข์ •์‹  ๋ชจ๋ธ: ์ง์› ํ•ธ๋“œ๋ถ
  • โ€ขํ•ญ์ƒ ๋กœ๋“œ๋จ
  • โ€ข์ •์ฒด์„ฑ, ์ฝ”๋”ฉ ํ‘œ์ค€, ํ–‰๋™ ์ œ์•ฝ ์ •์˜
  • โ€ขํ™˜๊ฐ ๋ฐ ์Šคํƒ€์ผ ๋“œ๋ฆฌํ”„ํŠธ ๋ฐฉ์ง€
  • โ€ข์ž‘๊ณ , ์•ˆ์ •์ ์ด๋ฉฐ, ์ธ๊ฐ„์ด ํŽธ์ง‘ ๊ฐ€๋Šฅ

๐Ÿ› ๏ธ 2. ๋™์  ๋งฅ๋ฝ โ€” ๊ธฐ์ˆ  (ํ•„์š” ์‹œ)

  • โ€ข์ •์‹  ๋ชจ๋ธ: ๋„๊ตฌ ์ƒ์ž
  • โ€ขํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋จ
  • โ€ข๊ฐ ๊ธฐ์ˆ ์€ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • โ€ข์ปจํ…์ŠคํŠธ ์ฐฝ์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค

โš“ 3. ๊ฒฐ์ •๋ก ์  ํ›… โ€” ๊ฐ€๋“œ๋ ˆ์ผ

  • โ€ข์ •์‹  ๋ชจ๋ธ: ๋ณด์•ˆ + ์ปดํ”Œ๋ผ์ด์–ธ์Šค ๋ ˆ์ด์–ด
  • โ€ขํ™•๋ฅ ์ ์ด์ง€ ์•Š์Œ
  • โ€ขLLM ์ถ”๋ก  ์ „ํ›„์— ์‹คํ–‰๋จ
  • โ€ข๊ฒฐ์ฝ” ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ทœ์น™์„ ์‹œํ–‰ํ•ฉ๋‹ˆ๋‹ค

3. ๊ถŒ์žฅ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

my-task-agent/
โ”œโ”€โ”€ .cursorrules
โ”œโ”€โ”€ main.py
โ”œโ”€โ”€ tools/
โ”‚   โ””โ”€โ”€ linear_mcp.py
โ””โ”€โ”€ README.md

4. ์ •์  ์ปจํ…์ŠคํŠธ ์˜ˆ์ œ: .cursorrules

# ์—ญํ• 
๋‹น์‹ ์€ ํ”„๋กœ๋•์…˜๊ธ‰ ์‹œ์Šคํ…œ์— ์ง‘์ค‘ํ•˜๋Š” ์‹œ๋‹ˆ์–ด ํŒŒ์ด์ฌ ์—”์ง€๋‹ˆ์–ด์ž…๋‹ˆ๋‹ค.

# ๊ทœ์น™
- ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์ ˆ๋Œ€ print()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”
- ํ•ญ์ƒ ํ•จ์ˆ˜์— ํƒ€์ž… ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”
- 3๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ๊ณ„ํš์„ ์ œ์•ˆํ•˜์„ธ์š”

# ํ–‰๋™
- ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”
- ํ•„์š”์‹œ ๋ช…ํ™•ํ•œ ์งˆ๋ฌธ์„ ํ•˜์„ธ์š”

์ฐธ๊ณ : https://github.com/PatrickJS/awesome-cursorrules

5. ๋™์  ๊ธฐ์ˆ  ์˜ˆ์ œ (MCP)

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("DevTools")

@mcp.tool()
def create_linear_ticket(title: str, priority: str = "low") -> str:
    ticket_id = f"LIN-{hash(title) % 10000}"
    return f"Created ticket {ticket_id} with priority={priority}"

if __name__ == "__main__":
    mcp.run()

์ฐธ๊ณ : https://github.com/modelcontextprotocol/python-sdk

6. ๊ฒฐ์ •๋ก ์  ํ›… ์˜ˆ์ œ

def compliance_check_hook(state):
    user_input = state["messages"][-1].content.lower()
    if "password" in user_input or "api_key" in user_input:
        return {"error": "๋ณด์•ˆ ์œ„๋ฐ˜์ด ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค"}
    return agent_node(state)

์ฐธ๊ณ : https://langchain-ai.github.io/langgraph/

๋‹น์‹ ์˜ ์—์ด์ „ํŠธ๊ฐ€ ์งˆ๋ฌธ์—๋งŒ ๋‹ตํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์ž‘์—… ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค.

Take the next step

Putting what you read into practice.

๊ด€๋ จ ๊ธฐ์‚ฌ

DS & AI Engineering