ποΈ νλ€μ€ + μ¨ν¨λ‘μ§ κΈ°λ° AI Agent μ΄μ
μ΄ νλ‘μ νΈμ .agents λλ ν°λ¦¬λ λ¨μν ν둬ννΈ λͺ¨μμ΄ μλλλ€. νλ€μ€(Harness) μ μ¨ν¨λ‘μ§(Ontology) λ κ°λ
μ΄ κ²°ν©λ μ΄μ 체κ³μ
λλ€.
νλ€μ€λβ
νλ€μ€λ AIκ° λ§€λ² μμ λ‘κ² νλ¨νμ§ μλλ‘ μ€ν μμ, μν , μΆλ ₯ νμμ μ¬μ μ κ³ μ νλ μ΄μ μ₯μΉμ λλ€.
| κ³ μ νλͺ© | λ΄μ© |
|---|---|
| μν | implementer, reviewer, worklog |
| μ μ°¨ | ꡬν β κ²μ¦ β κΈ°λ‘ μμ μ€μ |
| νμ | MERGE: PASS λλ MERGE: HOLD λ μ€ νλλ§ νμ© |
| μΆλ ₯ | 리뷰 κ²°κ³Ό νμ, λ³κ²½ μμ½ νμ, Notion κΈ°λ‘ νμ κ³ μ |
νλ€μ€κ° μμΌλ©΄ AIλ μμ²λ§λ€ λ€λ₯Έ λ°©μμΌλ‘ λμν©λλ€. κ°μ μμ μ΄λΌλ κ²μ¦ κΈ°μ€μ΄ λ¬λΌμ§κ³ , μΆλ ₯ νμμ΄ μ κ°κ°μ΄ λ©λλ€. νλ€μ€λ μ΄ λ³λμ±μ μ€μ΄λ λͺ μμ μ΄μ κ·μΉμ λλ€.
νλ€μ€λ AIκ° μμ μλμΌλ‘ μ€ννλ νμ΄νλΌμΈμ΄ μλλλ€. λͺ μμ μ΄μ κ·μΉκ³Ό μμ΄μ νΈ μ§μΉ¨μ λ°λΌ μλνλ ꡬ쑰μ λλ€.
μ¨ν¨λ‘μ§λβ
μ¨ν¨λ‘μ§λ μμ λλ©μΈκ³Ό νμν μ§μμ λΆλ₯νλ 체κ³μ λλ€. μ΄λ€ μμ²μ΄ λ€μ΄μμ λ μ΄λ€ μ€ν¬μ μ°κ³ , μ΄λ€ μ°Έμ‘° λ¬Έμλ₯Ό μ½μ΄μΌ νλμ§ κ²°μ νλ ꡬ쑰μ λλ€.
λλ©μΈ λΆλ₯β
| μ€ν¬ | λ΄λΉ λλ©μΈ |
|---|---|
saju-frontend | μλΉμ€ μ± μ 체 (λΌμ°νΈ, API μ°λ, React Query, BFF) |
saju-docs | λ¬Έμ μ¬μ΄νΈ μ΄μ |
design-system-hybrid | λμμΈ μμ€ν / ν ν° / μ»΄ν¬λνΈ |
codex-review-workflow | κ²μ¦ μ μ°¨ λ° κ²μ΄νΈ λ§€νΈλ¦μ€ |
code-review-guard | λ³ν© μ μ½λ 리뷰 |
notion-weekly-worklog | μμ κΈ°λ‘ |
μ§μ κ·Έλν ꡬ쑰β
κ° μ€ν¬μ λλ©μΈ μ§μ
μ (SKILL.md) κ³Ό μΈλΆ μ§μ κ·Έλν(references/) λ‘ κ΅¬μ±λ©λλ€.
.agents/skills/saju-frontend/
βββ SKILL.md β λλ©μΈ μ§μ
μ + μ½κΈ° κ·μΉ
βββ references/
βββ architecture.md β μ 체 ꡬ쑰/λ μ΄μ΄ κ²½κ³
βββ api.md β API μ°λ/BFF κ²½κ³
βββ auth.md β μΈμ¦/λ‘κ·ΈμΈ νλ¦
βββ saju.md β /saju μ
λ ₯ νλ¦
βββ saju-result.md β /saju/result κ²°κ³Ό μ‘°ν
βββ infrastructure.md β λ°°ν¬/Cloudflare Workers
βββ ...
SKILL.md μμ "μ΄ μμ
μ΄λ©΄ μ΄ referenceλ₯Ό μ½μ΄λΌ"λ λΆκΈ° κ·μΉμ΄ μμ΄μ, μμ
μ νμν νμΌλ§ μ νμ μΌλ‘ μ½μ΅λλ€.
νΈλ¦¬κ±° λ¬Έμ₯ β μ€ν¬ λΌμ°ν μ κΈ°μ€β
κ° μ€ν¬ SKILL.mdμ frontmatter descriptionμ λ¨μν μ€λͺ
μ΄ μλλλ€. μ¬μ©μ μμ²μ μ΄λ€ λλ©μΈμΌλ‘ λΆλ₯ν μ§ κ²°μ νλ νΈλ¦¬κ±° λ¬Έμ₯μ
λλ€.
---
name: saju-frontend
description: >-
μ΄ μ μ₯μμ μ¬μ£Ό νλ‘ νΈμλ ꡬν λλ λ³κ²½ μμ²μ μ¬μ©νλ€.
Next.js App Router νμ΄μ§μ νλ¦(/saju, /saju/result, /home, ...),
React Query μ¬μ©/μΊμ±, BFF route λ³κ²½ μμ
μ΄ ν΄λΉλλ€.
λ°±μλ μ μ© λ³κ²½, λ°±μλ μΈνλΌ μ μ© μμ
μλ μ¬μ©νμ§ μλλ€.
---
μ΄ λ¬Έμ₯μ νμ§μ΄ μ€ν¬ λΌμ°ν μ νλλ₯Ό κ²°μ ν©λλ€.
νλ€μ€μ μ¨ν¨λ‘μ§κ° κ°μ΄ μλνλ νλ¦β
μ¬μ©μ μμ²
β
βΌ
[μ¨ν¨λ‘μ§] skill description λ§€μΉ
β β μ΄λ€ μ€ν¬μΈκ°? (saju-frontend / design-system-hybrid / ...)
β
βΌ
[μ¨ν¨λ‘μ§] SKILL.md μ½κΈ° κ·μΉμΌλ‘ νμν reference μ ν
β β μ΄λ€ μ§μμ΄ νμνκ°? (api.md / auth.md / saju-result.md / ...)
β
βΌ
[νλ€μ€] implementer μν μν
β β ꡬν μ νμ μΆλ ₯ (μ½μ λ¬Έμ, λ μ΄μ΄ κ³ν)
β β μ½λ μμ±
β
βΌ
[μ¨ν¨λ‘μ§] gate-matrixλ‘ μμ
μ ν λΆλ₯
β β μ΄λ€ κ²μ¦ μ‘°ν©μΈκ°?
β
βΌ
[νλ€μ€] reviewer μν μν
β β code-review-guard + μ ν μ€ν¬ μ μ©
β β MERGE: PASS / MERGE: HOLD νμ
β
βΌ
[νλ€μ€] worklog μν μν
β λ³κ²½ μμ½ + Notion κΈ°λ‘
μ€μ μ μ© μμβ
/saju/result κ²°κ³Ό μ‘°ν μ€λ₯ λμβ
- μ νλλ μ€ν¬:
saju-frontend - μ νλλ reference:
references/saju-result.md - κ²μ΄νΈ:
/saju/resultκ²°κ³Ό μ‘°ν μ ν βsaju-frontend,code-review-guardνμ /vercel-react-best-practicesμ ν - κ²μ¦ ν¬μ»€μ€: G1(λΉμ¦λμ€ λ‘μ§), G2(API κ³μ½), G4(μνκ΄λ¦¬/μΊμ), G5(νκ·)
- κ²μ¦ λͺ
λ Ή: result route/client query unit +
typecheck
React Query μΊμ/무ν¨ν λ³κ²½β
- μ νλλ μ€ν¬:
saju-frontend - μ νλλ reference:
references/saju-result.mdλλ κ΄λ ¨ λλ©μΈ reference - κ²μ΄νΈ: React Query μΊμ/무ν¨ν μ ν β
saju-frontend,code-review-guardνμ /vercel-react-best-practicesμ ν - κ²μ¦ ν¬μ»€μ€: G1, G2, G4, G5
- κ²μ¦ λͺ
λ Ή: query key/invalidation unit +
typecheck
CI/CD YAML λ³κ²½β
- μ νλλ μ€ν¬:
saju-frontend - μ νλλ reference:
references/infrastructure.md - κ²μ΄νΈ: CI/CD μν¬νλ‘μ° μ ν β
saju-frontend,code-review-guardνμ - κ²μ¦ ν¬μ»€μ€: G1(λ‘μ§), G3(보μ), G4(μν), G5(νκ·)
- κ²μ¦ λͺ λ Ή: YAML diff, νΈλ¦¬κ±°/secret/branch 쑰건 νμΈ
λμμΈ μμ€ν /ν ν° λ³κ²½β
- μ νλλ μ€ν¬:
design-system-hybrid,code-review-guard - μ νλλ reference: λμμΈ μμ€ν κ΄λ ¨ λ¬Έμ
- κ²μ΄νΈ: λμμΈ μμ€ν
/ν ν° μ ν β
design-system-hybrid,code-review-guardνμ /web-design-guidelinesμ ν - κ²μ¦ ν¬μ»€μ€: G1, G2, G4, G5 + μ κ·Όμ±
- κ²μ¦ λͺ
λ Ή: Storybook build +
typecheck
νΈλ¦¬κ±° νμ§ κ²μ¦ β prompt-trigger-evalβ
μ νμνκ°β
μ€ν¬ λΌμ°ν
μ description λ¬Έμ₯μ νμ§μ λ¬λ € μμ΅λλ€.
- νΈλ¦¬κ±° λ¬Έμ₯μ΄ λ무 λμΌλ©΄ β κ΄λ ¨ μλ μμ²μμ μλͺ» λ°λ(μ€ν, FP)
- νΈλ¦¬κ±° λ¬Έμ₯μ΄ λ무 μ’μΌλ©΄ β λ°λν΄μΌ ν μμ²μμ λ°λ μ€ν¨(λ―Έν, FN)
prompt-trigger-evalμ should_trigger / should_not_trigger μν μΈνΈλ‘ μ€ν¬ λ°λ μ νλλ₯Ό κ²μ¦νλ νκ°μ© μ€ν¬μ
λλ€.
νκ° μ§νβ
| νκ° νλͺ© | μλ―Έ |
|---|---|
| TP (μ ν) | λ°λν΄μΌ νλ μμ²μμ μ μ λ°λ |
| TN (μ κ±°λΆ) | λ°λνμ§ λ§μμΌ νλ μμ²μμ μ μ λ―Έλ°λ |
| FP (μ€ν) | λ°λνμ§ λ§μμΌ νλ μμ²μμ μλͺ» λ°λ |
| FN (λ―Έν) | λ°λν΄μΌ νλ μμ²μμ λ°λ μ€ν¨ |
μ΄μ λ°©μβ
β νκ° λμ μ€ν¬ μ§μ
β‘ should_trigger / should_not_trigger μν μΈνΈ μ€λΉ
β’ λΆλ₯ μ νλ μ κ² (TP / TN / FP / FN μ§κ³)
β£ μ€ν/λ―Ένμ΄ μμΌλ©΄ description λ¬Έμ₯ μ‘°μ
β€ κ°μ μΈνΈλ‘ μ¬κ²μ¦ β κ°μ μ¬λΆ νμΈ
β₯ κ²°κ³Όλ₯Ό references/test-results.mdμ λμ
κ²°κ³Όλ test-results.mdμ μμ΄λ©΄μ μ΄λ€ μ€ν¬μ΄ μ΄λ€ κ²½κ³μμ μ€ν/λ―Ένμ λλμ§ κ΄λ¦¬λ©λλ€. μ΄ κ³Όμ μ λ°λ³΅ν΄ μ¨ν¨λ‘μ§μ λλ©μΈ κ²½κ³λ₯Ό μ§μμ μΌλ‘ μ‘°μ ν©λλ€.
:::tip μ¬μ© μμ
prompt-trigger-evalμ μΌλ° ꡬν μμ
μ€ μμ μ€ννλ μ€ν¬μ΄ μλλλ€. "ν둬ννΈ ν
μ€νΈ νμ", "νΈλ¦¬κ±° κ²μ¦ν΄μ€", "μ€ν/λ―Έν μ κ²"μ²λΌ μ€ν¬ κ²½κ³λ₯Ό μ κ²ν λλ§ μ¬μ©ν©λλ€.
:::
μ₯μ κ³Ό νκ³β
μ₯μ β
| νλͺ© | μ€λͺ |
|---|---|
| ν ν° μ μ½ | νμν referenceλ§ μ νμ μΌλ‘ μ½μ΄ 컨ν μ€νΈ λλΉ μμ |
| κ·μΉ μΌκ΄μ± | νλ€μ€κ° μ μ°¨μ μΆλ ₯ νμμ κ³ μ ν΄ λ§€λ² κ°μ κΈ°μ€ μ μ© |
| 리뷰 λ λ¦½μ± | ꡬν AIμ κ²μ¦ AIλ₯Ό λΆλ¦¬ν΄ λ§Ήμ μλ 리뷰 κ°λ₯ |
| νκ· μν κ°μ | gate-matrixκ° μμ μ νλ³ νμ κ²μ¦μ κ°μ |
| μ°μΆλ¬Ό νμ§ μμ ν | λ°λ³΅ μμ μμ μΆλ ₯ ν¬λ§·κ³Ό νμ κΈ°μ€μ΄ νλ€λ¦¬μ§ μμ |
νκ³β
- description νμ§ μμ‘΄: νΈλ¦¬κ±° λ¬Έμ₯μ΄ λΆμ ννλ©΄ μ€ν/λ―Ένμ΄ μκΈ΄λ€. μ£ΌκΈ°μ μΌλ‘
prompt-trigger-evalλ‘ μ κ²ν΄μΌ νλ€. - λ¬Έμ μ΅μ ν νμ: μ½λκ° λ°λλ©΄
references/λ¬Έμλ ν¨κ» κ°±μ ν΄μΌ νλ€. λ¬Έμκ° λ‘μΌλ©΄ μλͺ»λ νλ¨μ΄ λμ¨λ€. - μμ μλ μ€νμ΄ μλ: λͺ μμ μ΄μ κ·μΉκ³Ό μμ΄μ νΈ μ§μΉ¨μ΄ νμνλ€. μ μ°¨λ μ¬λμ΄ μμμ μΌλ‘ λ°λΌμΌ μλνλ€.
- μ€ν¬ κ²½κ³ κ΄λ¦¬ λΆλ΄: νλ‘μ νΈκ° 컀μ§μλ‘ μ€ν¬ κ²½κ³λ₯Ό μ λλ μΌ μ€ν/λ―Ένμ΄ μ€μ΄λ λ€.